PlayHistoriesController.ts 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. export default class PlayHistoriesController {
  8. private paginationService = new PaginationService(PlayHistory)
  9. public async index({ request, auth }: HttpContextContract) {
  10. const page = await this.paginationService.paginate({
  11. ...request.all(),
  12. userId: auth.user!.id,
  13. order: 'updatedAt,desc'
  14. })
  15. const seriesIds = new Set(
  16. page
  17. .all()
  18. .map((record) => record.seriesId)
  19. .filter((id) => !!id)
  20. )
  21. const series = await Series.findMany(Array.from(seriesIds))
  22. const episodeIds = new Set(
  23. page
  24. .all()
  25. .map((record) => record.episodeId)
  26. .filter((id) => !!id)
  27. )
  28. const episodes = await Episode.findMany(Array.from(episodeIds))
  29. page.all().forEach((record) => {
  30. if (record.seriesId) {
  31. record.series = series.find((s) => s.id === record.seriesId)
  32. }
  33. if (record.episodeId) {
  34. record.episode = episodes.find((e) => e.id === record.episodeId)
  35. }
  36. })
  37. return page
  38. }
  39. public async store({ request, auth }: HttpContextContract) {
  40. const data: any = await request.validate({
  41. schema: schema.create({
  42. episodeId: schema.number(),
  43. duration: schema.number()
  44. })
  45. })
  46. const episode = await Episode.findOrFail(data.episodeId)
  47. const series = await Series.findOrFail(episode.seriesId)
  48. data.seriesId = series.id
  49. data.userId = auth.user!.id
  50. let history = await PlayHistory.query()
  51. .where('userId', auth.user!.id)
  52. .where('seriesId', data.seriesId)
  53. .first()
  54. if (history) {
  55. history.episodeId = data.episodeId
  56. history.duration = data.duration
  57. await history.save()
  58. } else {
  59. history = await PlayHistory.create({
  60. ...data,
  61. userId: auth.user!.id
  62. })
  63. }
  64. await Series.query().where('id', series.id).increment('playCount', 1)
  65. await Episode.query().where('id', episode.id).increment('playCount', 1)
  66. return history
  67. }
  68. public async show({ params }: HttpContextContract) {
  69. return await PlayHistory.findOrFail(params.id)
  70. }
  71. public async destroy({ params, bouncer }: HttpContextContract) {
  72. const playHistory = await PlayHistory.findOrFail(params.id)
  73. await bouncer.authorize('owner', playHistory)
  74. await playHistory.delete()
  75. return playHistory
  76. }
  77. }