OrdersController.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. episodeNum: data.episodeNum
  49. })
  50. return await Order.create(data)
  51. }
  52. public async show({ params }: HttpContextContract) {
  53. return await Order.findOrFail(params.id)
  54. }
  55. public async update({ response }: HttpContextContract) {
  56. response.notImplemented()
  57. }
  58. public async destroy({ response }: HttpContextContract) {
  59. response.notImplemented()
  60. }
  61. }