CollectionsController.ts 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
  2. import Collection from 'App/Models/Collection'
  3. import PaginationService from 'App/Services/PaginationService'
  4. import { schema } from '@ioc:Adonis/Core/Validator'
  5. import Episode from 'App/Models/Episode'
  6. import Series from 'App/Models/Series'
  7. export default class CollectionsController {
  8. private paginationService = new PaginationService(Collection)
  9. public async index({ request, auth }: HttpContextContract) {
  10. const page = await this.paginationService.paginate({
  11. ...request.all(),
  12. userId: auth.user!.id
  13. })
  14. const seriesIds = new Set(
  15. page
  16. .all()
  17. .map((record) => record.seriesId)
  18. .filter((id) => !!id)
  19. )
  20. const series = await Series.findMany(Array.from(seriesIds))
  21. const episodeIds = new Set(
  22. page
  23. .all()
  24. .map((record) => record.curEpId)
  25. .filter((id) => !!id)
  26. )
  27. const episodes = await Episode.findMany(Array.from(episodeIds))
  28. page.all().forEach((record) => {
  29. if (record.seriesId) {
  30. record.series = series.find((s) => s.id === record.seriesId)
  31. }
  32. if (record.curEpId) {
  33. record.episode = episodes.find((e) => e.id === record.curEpId)
  34. }
  35. })
  36. return page
  37. }
  38. public async store({ request, auth }: HttpContextContract) {
  39. const data = await request.validate({
  40. schema: schema.create({
  41. seriesId: schema.number(),
  42. curEpId: schema.number()
  43. })
  44. })
  45. let collection = await Collection.query()
  46. .where('user_id', auth.user!.id)
  47. .where('series_id', data.seriesId)
  48. .first()
  49. const ep = await Episode.findOrFail(data.curEpId)
  50. if (collection) {
  51. collection.curEpId = data.curEpId
  52. collection.curEpNum = ep.episodeNum
  53. await collection.save()
  54. } else {
  55. collection = await Collection.create({
  56. userId: auth.user!.id,
  57. seriesId: data.seriesId,
  58. curEpId: data.curEpId,
  59. curEpNum: ep.episodeNum
  60. })
  61. }
  62. return collection
  63. }
  64. public async show({ params, auth }: HttpContextContract) {
  65. return await Collection.query()
  66. .where('userId', auth.user!.id)
  67. .where('seriesId', params.id)
  68. .firstOrFail()
  69. }
  70. public async update({ request, params, bouncer }: HttpContextContract) {
  71. const data = await request.validate({
  72. schema: schema.create({
  73. userId: schema.number.optional(),
  74. seriesId: schema.number.optional(),
  75. curEpId: schema.number.optional()
  76. })
  77. })
  78. const collection = await Collection.findOrFail(params.id)
  79. await bouncer.authorize('owner', collection)
  80. collection.merge(data)
  81. return await collection.save()
  82. }
  83. public async destroy({ params, auth }: HttpContextContract) {
  84. await Collection.query()
  85. .where('userId', auth.user!.id)
  86. .where('seriesId', params.id)
  87. .delete()
  88. }
  89. }