| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
- import PlayHistory from 'App/Models/PlayHistory'
- import PaginationService from 'App/Services/PaginationService'
- import { schema } from '@ioc:Adonis/Core/Validator'
- import Series from 'App/Models/Series'
- import Episode from 'App/Models/Episode'
- import Drive from '@ioc:Adonis/Core/Drive'
- export default class PlayHistoriesController {
- private paginationService = new PaginationService(PlayHistory)
- public async index({ request, auth }: HttpContextContract) {
- const page = await this.paginationService.paginate({
- ...request.all(),
- userId: auth.user!.id,
- order: 'updatedAt,desc'
- })
- const seriesIds = new Set(
- page
- .all()
- .map((record) => record.seriesId)
- .filter((id) => !!id)
- )
- const series = await Series.findMany(Array.from(seriesIds))
- await Promise.all(
- series.map(async (s) => {
- try {
- if (s.cover) {
- const url = new URL(s.cover)
- const filePath = url.pathname.replace(/^\//, '')
- s.cover = await Drive.getSignedUrl(filePath)
- }
- } catch (e) {}
- try {
- if (s.landscapeCover) {
- const url = new URL(s.landscapeCover)
- const filePath = url.pathname.replace(/^\//, '')
- s.landscapeCover = await Drive.getSignedUrl(filePath)
- }
- } catch (e) {}
- })
- )
- const episodeIds = new Set(
- page
- .all()
- .map((record) => record.episodeId)
- .filter((id) => !!id)
- )
- const episodes = await Episode.findMany(Array.from(episodeIds))
- page.all().forEach((record) => {
- if (record.seriesId) {
- record.series = series.find((s) => s.id === record.seriesId)
- }
- if (record.episodeId) {
- record.episode = episodes.find((e) => e.id === record.episodeId)
- }
- })
- return page
- }
- public async store({ request, auth }: HttpContextContract) {
- const data: any = await request.validate({
- schema: schema.create({
- episodeId: schema.number(),
- duration: schema.number()
- })
- })
- const episode = await Episode.findOrFail(data.episodeId)
- const series = await Series.findOrFail(episode.seriesId)
- data.seriesId = series.id
- data.userId = auth.user!.id
- let history = await PlayHistory.query()
- .where('userId', auth.user!.id)
- .where('seriesId', data.seriesId)
- .first()
- if (history) {
- history.episodeId = data.episodeId
- history.duration = data.duration
- await history.save()
- } else {
- history = await PlayHistory.create({
- ...data,
- userId: auth.user!.id
- })
- }
- await Series.query().where('id', series.id).increment('playCount', 1)
- await Episode.query().where('id', episode.id).increment('playCount', 1)
- return history
- }
- public async show({ params }: HttpContextContract) {
- return await PlayHistory.findOrFail(params.id)
- }
- public async destroy({ params, bouncer }: HttpContextContract) {
- const playHistory = await PlayHistory.findOrFail(params.id)
- await bouncer.authorize('owner', playHistory)
- await playHistory.delete()
- return playHistory
- }
- }
|