|
|
@@ -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) {
|