OrdersController.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
  2. import Order from 'App/Models/Order'
  3. import PaginationService from 'App/Services/PaginationService'
  4. import { schema } from '@ioc:Adonis/Core/Validator'
  5. import { BadRequestException, InternalServerException } from 'App/Exceptions/Common'
  6. import Series from 'App/Models/Series'
  7. import Episode from 'App/Models/Episode'
  8. import UserBalanceService from 'App/Services/UserBalanceService'
  9. export default class OrdersController {
  10. private paginationService = new PaginationService(Order)
  11. public async index({ request }: HttpContextContract) {
  12. return await this.paginationService.paginate(request.all())
  13. }
  14. public async store({ request, auth }: HttpContextContract) {
  15. const user = auth.user!
  16. const data: any = await request.validate({
  17. schema: schema.create({
  18. seriesId: schema.number.optional(),
  19. episodeId: schema.number.optional()
  20. })
  21. })
  22. if (!data.seriesId && !data.episodeId) {
  23. throw new BadRequestException('seriesId or episodeId must be provided')
  24. }
  25. const userBalance = await UserBalanceService.getBalance(user.id)
  26. if (data.seriesId) {
  27. const series = await Series.findOrFail(data.seriesId)
  28. if (series.price.comparedTo(userBalance.balance) > 0) {
  29. throw new InternalServerException('not enough balance')
  30. }
  31. data.price = series.price
  32. data.type = 'series'
  33. } else {
  34. const episode = await Episode.findOrFail(data.episodeId)
  35. if (episode.price.comparedTo(userBalance.balance) > 0) {
  36. throw new InternalServerException('not enough balance')
  37. }
  38. data.price = episode.price
  39. data.type = 'episode'
  40. }
  41. data.userId = user.id
  42. await UserBalanceService.modifiyBalance({
  43. userId: user.id,
  44. amount: data.price.negated(),
  45. type: data.type,
  46. seriesId: data.seriesId,
  47. episodeId: data.episodeId
  48. })
  49. return await Order.create(data)
  50. }
  51. public async show({ params }: HttpContextContract) {
  52. return await Order.findOrFail(params.id)
  53. }
  54. public async update({ response }: HttpContextContract) {
  55. response.notImplemented()
  56. }
  57. public async destroy({ response }: HttpContextContract) {
  58. response.notImplemented()
  59. }
  60. }