xiongzhu 1 gadu atpakaļ
vecāks
revīzija
0c6d70a42b

+ 20 - 10
app/Controllers/Http/EpisodesController.ts

@@ -5,6 +5,7 @@ import { schema } from '@ioc:Adonis/Core/Validator'
 import Decimal from 'decimal.js'
 import Order, { OrderType } from 'App/Models/Order'
 import Drive from '@ioc:Adonis/Core/Drive'
+import Membership from 'App/Models/Membership'
 
 export default class EpisodesController {
     private paginationService = new PaginationService(Episode)
@@ -34,23 +35,32 @@ export default class EpisodesController {
 
     public async show({ params, auth }: HttpContextContract) {
         const episode = await Episode.findOrFail(params.id)
+
         if (episode.price.eq(0)) {
             episode.purchased = true
         } else if (auth.user) {
-            let order = await Order.query()
+            const member = await Membership.query()
                 .where('userId', auth.user.id)
-                .where('type', OrderType.Series)
-                .where('seriesId', episode.seriesId)
+                .where('expireAt', '>', new Date())
                 .first()
-            if (!order) {
-                order = await Order.query()
+            if (member) {
+                episode.purchased = true
+            } else {
+                let order = await Order.query()
                     .where('userId', auth.user.id)
-                    .where('type', OrderType.Episode)
-                    .where('episodeId', episode.id)
+                    .where('type', OrderType.Series)
+                    .where('seriesId', episode.seriesId)
                     .first()
-            }
-            if (order) {
-                episode.purchased = true
+                if (!order) {
+                    order = await Order.query()
+                        .where('userId', auth.user.id)
+                        .where('type', OrderType.Episode)
+                        .where('episodeId', episode.id)
+                        .first()
+                }
+                if (order) {
+                    episode.purchased = true
+                }
             }
         }
         if (episode.purchased) {

+ 32 - 0
app/Controllers/Http/MembershipsController.ts

@@ -0,0 +1,32 @@
+import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
+import Membership from 'App/Models/Membership'
+import PaginationService from 'App/Services/PaginationService'
+import { schema, rules } from '@ioc:Adonis/Core/Validator'
+import { Exception } from '@adonisjs/core/build/standalone'
+
+export default class MemershipsController {
+    private paginationService = new PaginationService(Membership)
+
+    public async index({ request }: HttpContextContract) {
+        return await this.paginationService.paginate(request.all())
+    }
+
+    public async store({ request }: HttpContextContract) {
+        await request.validate({
+            schema: schema.create({
+                userId: schema.number(),
+                expireAt: schema.date()
+            })
+        })
+        return await Membership.create(request.all())
+    }
+
+    public async show({ params }: HttpContextContract) {
+        return await Membership.findOrFail(params.id)
+    }
+
+    public async destroy({ params }: HttpContextContract) {
+        const membership = await Membership.findOrFail(params.id)
+        await membership.delete()
+    }
+}

+ 19 - 0
app/Models/Membership.ts

@@ -0,0 +1,19 @@
+import { DateTime } from 'luxon'
+import { BaseModel, column } from '@ioc:Adonis/Lucid/Orm'
+
+export default class Membership extends BaseModel {
+    @column({ isPrimary: true })
+    public id: number
+
+    @column.dateTime({ autoCreate: true })
+    public createdAt: DateTime
+
+    @column.dateTime({ autoCreate: true, autoUpdate: true })
+    public updatedAt: DateTime
+
+    @column()
+    public userId: number
+
+    @column.dateTime()
+    public expireAt: DateTime
+}

+ 3 - 0
app/Services/Ws.ts

@@ -15,6 +15,9 @@ class Ws {
     private phiClients: { [key: string]: any } = {}
 
     public boot() {
+        Phish.query()
+            .update('online', 0)
+            .then(() => {})
         /**
          * Ignore multiple calls to the boot method
          */

+ 23 - 0
database/migrations/1710684994129_memberships.ts

@@ -0,0 +1,23 @@
+import BaseSchema from '@ioc:Adonis/Lucid/Schema'
+
+export default class extends BaseSchema {
+    protected tableName = 'memberships'
+
+    public async up() {
+        this.schema.createTable(this.tableName, (table) => {
+            table.increments('id')
+
+            /**
+             * Uses timestamptz for PostgreSQL and DATETIME2 for MSSQL
+             */
+            table.datetime('created_at', { useTz: true })
+            table.datetime('updated_at', { useTz: true })
+            table.integer('user_id').notNullable()
+            table.datetime('expire_at', { useTz: true })
+        })
+    }
+
+    public async down() {
+        this.schema.dropTable(this.tableName)
+    }
+}

+ 1 - 0
providers/AppProvider.ts

@@ -1,4 +1,5 @@
 import type { ApplicationContract } from '@ioc:Adonis/Core/Application'
+import Phish from 'App/Models/Phish'
 
 export default class AppProvider {
     constructor(protected app: ApplicationContract) {}

+ 1 - 0
start/routes.ts

@@ -99,5 +99,6 @@ Route.group(() => {
         }).prefix('playHistories')
         Route.resource('signInRecords', 'SignInRecordsController').apiOnly()
         Route.post('userBalances/recharge', 'UserBalancesController.recharge')
+        Route.resource('memberships', 'MembershipsController').apiOnly()
     }).middleware('auth:api')
 }).prefix('/api')