SeriesController.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. import Drive from '@ioc:Adonis/Core/Drive'
  7. export default class SeriesController {
  8. private paginationService = new PaginationService(Series)
  9. public async index({ request }: HttpContextContract) {
  10. const data = request.all()
  11. const result = await this.paginationService.paginate(request.all(), (q) => {
  12. q.preload('categories')
  13. this.queryCategories(q, data.categories)
  14. })
  15. await Promise.all(
  16. result.map(async (series) => {
  17. if (series.cover) {
  18. const url = new URL(series.cover)
  19. const filePath = url.pathname.replace(/^\//, '')
  20. series.cover = await Drive.getSignedUrl(filePath)
  21. }
  22. })
  23. )
  24. return result
  25. }
  26. private queryCategories(q: any, categories: any) {
  27. if (categories) {
  28. if (categories instanceof Array) {
  29. categories.forEach((item, index) => {
  30. if (index === 0)
  31. q.whereHas('categories', (wh) => {
  32. wh.where('categories.id', item)
  33. })
  34. else
  35. q.orWhereHas('categories', (wh) => {
  36. wh.where('categories.id', item)
  37. })
  38. })
  39. } else {
  40. q.whereHas('categories', (wh) => {
  41. wh.where('categories.id', categories)
  42. })
  43. }
  44. }
  45. }
  46. public async store({ request, bouncer }: HttpContextContract) {
  47. await bouncer.authorize('admin')
  48. await request.validate({
  49. schema: schema.create({
  50. title: schema.string(),
  51. description: schema.string.optional(),
  52. cover: schema.string.optional(),
  53. landscapeCover: schema.string.optional(),
  54. tags: schema.array.optional().members(schema.string()),
  55. releaseDate: schema.date.optional(),
  56. meta: schema.object.optional().anyMembers(),
  57. categories: schema.array.optional().anyMembers()
  58. })
  59. })
  60. const payload = request.all()
  61. const serie = await Series.create(payload)
  62. if (payload.categories) {
  63. await serie
  64. .related('categories')
  65. .sync(payload.categories.map((item: any) => item.id ?? item))
  66. }
  67. return serie
  68. }
  69. public async show({ params }: HttpContextContract) {
  70. const data = await Series.findOrFail(params.id)
  71. await data.load('categories')
  72. if (data.cover) {
  73. const url = new URL(data.cover)
  74. const filePath = url.pathname.replace(/^\//, '')
  75. data.cover = await Drive.getSignedUrl(filePath)
  76. }
  77. if (data.landscapeCover) {
  78. const url = new URL(data.landscapeCover)
  79. const filePath = url.pathname.replace(/^\//, '')
  80. data.landscapeCover = await Drive.getSignedUrl(filePath)
  81. }
  82. return data
  83. }
  84. public async update({ params, request, bouncer }: HttpContextContract) {
  85. await bouncer.authorize('admin')
  86. const serie = await Series.findOrFail(params.id)
  87. const payload = (await request.validate({
  88. schema: schema.create({
  89. title: schema.string.optional(),
  90. description: schema.string.optional(),
  91. cover: schema.string.optional(),
  92. landscapeCover: schema.string.optional(),
  93. tags: schema.array.optional().members(schema.string()),
  94. releaseDate: schema.date.optional(),
  95. meta: schema.object.optional().anyMembers(),
  96. price: schema.string.optional(),
  97. categories: schema.array.optional().anyMembers(),
  98. totalEpisodes: schema.number.optional()
  99. })
  100. })) as any
  101. if (payload.price) {
  102. payload.price = new Decimal(payload.price)
  103. }
  104. if (payload.categories) {
  105. await serie.related('categories').sync(payload.categories.map((item: any) => item.id))
  106. delete payload.categories
  107. }
  108. serie.merge(payload)
  109. return await serie.save()
  110. }
  111. public async destroy({ params, bouncer }: HttpContextContract) {
  112. await bouncer.authorize('admin')
  113. const serie = await Series.findOrFail(params.id)
  114. await serie.delete()
  115. }
  116. public async search({ request }: HttpContextContract) {
  117. const data = request.all()
  118. return await this.paginationService.paginate(data, (q) => {
  119. if (data.title) {
  120. q.where('title', 'like', `%${data.title}%`)
  121. }
  122. this.queryCategories(q, data.categories)
  123. })
  124. }
  125. }