PlayHistoriesController.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
  2. import PlayHistory from 'App/Models/PlayHistory'
  3. import PaginationService from 'App/Services/PaginationService'
  4. import { schema } from '@ioc:Adonis/Core/Validator'
  5. import Series from 'App/Models/Series'
  6. import Episode from 'App/Models/Episode'
  7. import Drive from '@ioc:Adonis/Core/Drive'
  8. export default class PlayHistoriesController {
  9. private paginationService = new PaginationService(PlayHistory)
  10. public async index({ request, auth }: HttpContextContract) {
  11. const page = await this.paginationService.paginate({
  12. ...request.all(),
  13. userId: auth.user!.id,
  14. order: 'updatedAt,desc'
  15. })
  16. const seriesIds = new Set(
  17. page
  18. .all()
  19. .map((record) => record.seriesId)
  20. .filter((id) => !!id)
  21. )
  22. const series = await Series.findMany(Array.from(seriesIds))
  23. await Promise.all(
  24. series.map(async (s) => {
  25. try {
  26. if (s.cover) {
  27. const url = new URL(s.cover)
  28. const filePath = url.pathname.replace(/^\//, '')
  29. s.cover = await Drive.getSignedUrl(filePath)
  30. }
  31. } catch (e) {}
  32. try {
  33. if (s.landscapeCover) {
  34. const url = new URL(s.landscapeCover)
  35. const filePath = url.pathname.replace(/^\//, '')
  36. s.landscapeCover = await Drive.getSignedUrl(filePath)
  37. }
  38. } catch (e) {}
  39. })
  40. )
  41. const episodeIds = new Set(
  42. page
  43. .all()
  44. .map((record) => record.episodeId)
  45. .filter((id) => !!id)
  46. )
  47. const episodes = await Episode.findMany(Array.from(episodeIds))
  48. page.all().forEach((record) => {
  49. if (record.seriesId) {
  50. record.series = series.find((s) => s.id === record.seriesId)
  51. }
  52. if (record.episodeId) {
  53. record.episode = episodes.find((e) => e.id === record.episodeId)
  54. }
  55. })
  56. return page
  57. }
  58. public async store({ request, auth }: HttpContextContract) {
  59. const data: any = await request.validate({
  60. schema: schema.create({
  61. episodeId: schema.number(),
  62. duration: schema.number()
  63. })
  64. })
  65. const episode = await Episode.findOrFail(data.episodeId)
  66. const series = await Series.findOrFail(episode.seriesId)
  67. data.seriesId = series.id
  68. data.userId = auth.user!.id
  69. let history = await PlayHistory.query()
  70. .where('userId', auth.user!.id)
  71. .where('seriesId', data.seriesId)
  72. .first()
  73. if (history) {
  74. history.episodeId = data.episodeId
  75. history.duration = data.duration
  76. await history.save()
  77. } else {
  78. history = await PlayHistory.create({
  79. ...data,
  80. userId: auth.user!.id
  81. })
  82. }
  83. await Series.query().where('id', series.id).increment('playCount', 1)
  84. await Episode.query().where('id', episode.id).increment('playCount', 1)
  85. return history
  86. }
  87. public async show({ params }: HttpContextContract) {
  88. return await PlayHistory.findOrFail(params.id)
  89. }
  90. public async destroy({ params, bouncer }: HttpContextContract) {
  91. const playHistory = await PlayHistory.findOrFail(params.id)
  92. await bouncer.authorize('owner', playHistory)
  93. await playHistory.delete()
  94. return playHistory
  95. }
  96. }