xiongzhu 2 tahun lalu
induk
melakukan
1abced24ef

+ 3 - 3
app/Controllers/Http/EpisodesController.ts

@@ -3,7 +3,7 @@ import Episode from 'App/Models/Episode'
 import PaginationService from 'App/Services/PaginationService'
 import { schema } from '@ioc:Adonis/Core/Validator'
 import Decimal from 'decimal.js'
-import Order from 'App/Models/Order'
+import Order, { OrderType } from 'App/Models/Order'
 import Drive from '@ioc:Adonis/Core/Drive'
 
 export default class EpisodesController {
@@ -39,13 +39,13 @@ export default class EpisodesController {
         } else if (auth.user) {
             let order = await Order.query()
                 .where('userId', auth.user.id)
-                .where('type', 'series')
+                .where('type', OrderType.Series)
                 .where('seriesId', episode.seriesId)
                 .first()
             if (!order) {
                 order = await Order.query()
                     .where('userId', auth.user.id)
-                    .where('type', 'episode')
+                    .where('type', OrderType.Episode)
                     .where('episodeId', episode.id)
                     .first()
             }

+ 19 - 18
app/Controllers/Http/OrdersController.ts

@@ -1,5 +1,5 @@
 import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
-import Order from 'App/Models/Order'
+import Order, { OrderType } from 'App/Models/Order'
 import PaginationService from 'App/Services/PaginationService'
 import { schema } from '@ioc:Adonis/Core/Validator'
 import { BadRequestException } from 'App/Exceptions/Common'
@@ -7,7 +7,7 @@ import Series from 'App/Models/Series'
 import Episode from 'App/Models/Episode'
 import UserBalanceService from 'App/Services/UserBalanceService'
 import Decimal from 'decimal.js'
-import { BalanceRecordType } from 'App/Models/BalanceRecord'
+import BalanceRecord, { BalanceRecordType } from 'App/Models/BalanceRecord'
 
 export default class OrdersController {
     private paginationService = new PaginationService(Order)
@@ -43,13 +43,7 @@ export default class OrdersController {
 
     public async store({ request, auth }: HttpContextContract) {
         const user = auth.user!
-        const data: {
-            seriesId?: number
-            episodeId?: number
-            price?: Decimal
-            type?: BalanceRecordType
-            userId?: number
-        } = await request.validate({
+        const data = await request.validate({
             schema: schema.create({
                 seriesId: schema.number.optional(),
                 episodeId: schema.number.optional()
@@ -60,34 +54,41 @@ export default class OrdersController {
         }
 
         const userBalance = await UserBalanceService.getBalance(user.id)
+        const order = new Order()
+
+        order.merge(data)
+        order.userId = user.id
+
+        let price: Decimal
 
         if (data.seriesId) {
             const series = await Series.findOrFail(data.seriesId)
             if (series.price.comparedTo(userBalance.balance) > 0) {
                 throw new Error('not enough balance')
             }
-            data.price = series.price
-            data.type = BalanceRecordType.Purchase
+            price = series.price
         } else {
             const episode = await Episode.findOrFail(data.episodeId)
             if (episode.price.comparedTo(userBalance.balance) > 0) {
                 throw new Error('not enough balance')
             }
-            data.seriesId = episode.seriesId
-            data.price = episode.price
-            data.type = BalanceRecordType.Purchase
+            price = episode.price
         }
-        data.userId = user.id
 
         await UserBalanceService.modifiyBalance({
             userId: user.id,
-            amount: data.price.negated(),
-            type: data.type,
+            amount: price.negated(),
+            type: BalanceRecordType.Purchase,
             seriesId: data.seriesId,
             episodeId: data.episodeId
         })
 
-        return await Order.create(data)
+        return await Order.create({
+            userId: user.id,
+            price,
+            type: data.seriesId ? OrderType.Series : OrderType.Episode,
+            ...data
+        })
     }
 
     public async show({ params }: HttpContextContract) {

+ 1 - 1
app/Models/BalanceRecord.ts

@@ -30,7 +30,7 @@ export default class BalanceRecord extends AppBaseModel {
     public amount: Decimal
 
     @column()
-    public type: string
+    public type: BalanceRecordType
 
     @column()
     public description?: string

+ 6 - 1
app/Models/Order.ts

@@ -6,6 +6,11 @@ import AppBaseModel from './AppBaseModel'
 import Series from 'App/Models/Series'
 import Episode from 'App/Models/Episode'
 
+export enum OrderType {
+    Series = 'series',
+    Episode = 'episode'
+}
+
 export default class Order extends AppBaseModel {
     @column({ isPrimary: true })
     public id: number
@@ -23,7 +28,7 @@ export default class Order extends AppBaseModel {
     public price: Decimal
 
     @column()
-    public type: string
+    public type: OrderType
 
     @column()
     public seriesId: number