SeriesController.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
  2. import Series from 'App/Models/Series'
  3. import PaginationService from 'App/Services/PaginationService'
  4. import { schema } from '@ioc:Adonis/Core/Validator'
  5. import Decimal from 'decimal.js'
  6. export default class SeriesController {
  7. private paginationService = new PaginationService(Series)
  8. public async index({ request }: HttpContextContract) {
  9. const data = request.all()
  10. return await this.paginationService.paginate(request.all(), (q) => {
  11. q.preload('categories')
  12. this.queryCategories(q, data.categories)
  13. })
  14. }
  15. private queryCategories(q: any, categories: any) {
  16. if (categories) {
  17. if (categories instanceof Array) {
  18. categories.forEach((item, index) => {
  19. if (index === 0)
  20. q.whereHas('categories', (wh) => {
  21. wh.where('categories.id', item)
  22. })
  23. else
  24. q.orWhereHas('categories', (wh) => {
  25. wh.where('categories.id', item)
  26. })
  27. })
  28. } else {
  29. q.whereHas('categories', (wh) => {
  30. wh.where('categories.id', categories)
  31. })
  32. }
  33. }
  34. }
  35. public async store({ request, bouncer }: HttpContextContract) {
  36. await bouncer.authorize('admin')
  37. await request.validate({
  38. schema: schema.create({
  39. title: schema.string(),
  40. description: schema.string.optional(),
  41. cover: schema.string.optional(),
  42. landscapeCover: schema.string.optional(),
  43. tags: schema.array.optional().members(schema.string()),
  44. releaseDate: schema.date.optional(),
  45. meta: schema.object.optional().anyMembers()
  46. })
  47. })
  48. return await Series.create(request.all())
  49. }
  50. public async show({ params }: HttpContextContract) {
  51. const data = await Series.findOrFail(params.id)
  52. await data.load('categories')
  53. return data
  54. }
  55. public async update({ params, request, bouncer }: HttpContextContract) {
  56. await bouncer.authorize('admin')
  57. const serie = await Series.findOrFail(params.id)
  58. const payload = (await request.validate({
  59. schema: schema.create({
  60. title: schema.string.optional(),
  61. description: schema.string.optional(),
  62. cover: schema.string.optional(),
  63. landscapeCover: schema.string.optional(),
  64. tags: schema.array.optional().members(schema.string()),
  65. releaseDate: schema.date.optional(),
  66. meta: schema.object.optional().anyMembers(),
  67. price: schema.string.optional(),
  68. categories: schema.array.optional().anyMembers(),
  69. totalEpisodes: schema.number.optional()
  70. })
  71. })) as any
  72. if (payload.price) {
  73. payload.price = new Decimal(payload.price)
  74. }
  75. if (payload.categories) {
  76. await serie.related('categories').sync(payload.categories.map((item: any) => item.id))
  77. delete payload.categories
  78. }
  79. serie.merge(payload)
  80. return await serie.save()
  81. }
  82. public async destroy({ params, bouncer }: HttpContextContract) {
  83. await bouncer.authorize('admin')
  84. const serie = await Series.findOrFail(params.id)
  85. await serie.delete()
  86. }
  87. public async search({ request }: HttpContextContract) {
  88. const data = request.all()
  89. return await this.paginationService.paginate(data, (q) => {
  90. if (data.title) {
  91. q.where('title', 'like', `%${data.title}%`)
  92. }
  93. this.queryCategories(q, data.categories)
  94. })
  95. }
  96. }