import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext' import Order from 'App/Models/Order' import PaginationService from 'App/Services/PaginationService' import { schema } from '@ioc:Adonis/Core/Validator' import { BadRequestException, InternalServerException } from 'App/Exceptions/Common' import Series from 'App/Models/Series' import Episode from 'App/Models/Episode' import UserBalanceService from 'App/Services/UserBalanceService' export default class OrdersController { private paginationService = new PaginationService(Order) public async index({ request }: HttpContextContract) { return await this.paginationService.paginate(request.all()) } public async store({ request, auth }: HttpContextContract) { const user = auth.user! const data: any = await request.validate({ schema: schema.create({ seriesId: schema.number.optional(), episodeId: schema.number.optional() }) }) if (!data.seriesId && !data.episodeId) { throw new BadRequestException('seriesId or episodeId must be provided') } const userBalance = await UserBalanceService.getBalance(user.id) if (data.seriesId) { const series = await Series.findOrFail(data.seriesId) if (series.price.comparedTo(userBalance.balance) > 0) { throw new InternalServerException('not enough balance') } data.price = series.price data.type = 'series' } else { const episode = await Episode.findOrFail(data.episodeId) if (episode.price.comparedTo(userBalance.balance) > 0) { throw new InternalServerException('not enough balance') } data.price = episode.price data.type = 'episode' } data.userId = user.id await UserBalanceService.modifiyBalance({ userId: user.id, amount: data.price.negated(), type: data.type, seriesId: data.seriesId, episodeId: data.episodeId }) return await Order.create(data) } public async show({ params }: HttpContextContract) { return await Order.findOrFail(params.id) } public async update({ response }: HttpContextContract) { response.notImplemented() } public async destroy({ response }: HttpContextContract) { response.notImplemented() } }