SeriesController.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. tags: schema.array.optional().members(schema.string()),
  43. releaseDate: schema.date.optional(),
  44. meta: schema.object.optional().anyMembers()
  45. })
  46. })
  47. return await Series.create(request.all())
  48. }
  49. public async show({ params }: HttpContextContract) {
  50. const data = await Series.findOrFail(params.id)
  51. await data.load('categories')
  52. return data
  53. }
  54. public async update({ params, request, bouncer }: HttpContextContract) {
  55. await bouncer.authorize('admin')
  56. const serie = await Series.findOrFail(params.id)
  57. const payload = (await request.validate({
  58. schema: schema.create({
  59. title: schema.string.optional(),
  60. description: schema.string.optional(),
  61. cover: schema.string.optional(),
  62. tags: schema.array.optional().members(schema.string()),
  63. releaseDate: schema.date.optional(),
  64. meta: schema.object.optional().anyMembers(),
  65. price: schema.string.optional(),
  66. categories: schema.array.optional().anyMembers(),
  67. totalEpisodes: schema.number.optional()
  68. })
  69. })) as any
  70. if (payload.price) {
  71. payload.price = new Decimal(payload.price)
  72. }
  73. if (payload.categories) {
  74. await serie.related('categories').sync(payload.categories.map((item: any) => item.id))
  75. delete payload.categories
  76. }
  77. serie.merge(payload)
  78. return await serie.save()
  79. }
  80. public async destroy({ params, bouncer }: HttpContextContract) {
  81. await bouncer.authorize('admin')
  82. const serie = await Series.findOrFail(params.id)
  83. await serie.delete()
  84. }
  85. public async search({ request }: HttpContextContract) {
  86. const data = request.all()
  87. return await this.paginationService.paginate(data, (q) => {
  88. if (data.title) {
  89. q.where('title', 'like', `%${data.title}%`)
  90. }
  91. this.queryCategories(q, data.categories)
  92. })
  93. }
  94. }