/ api / src / controller / animeController.ts
animeController.ts
 1  import Elysia, { t } from 'elysia'
 2  import { filterAnimeList, getAnimeById, getEpisode, getEpisodeVideo } from '../service/animeService'
 3  import { animeCache } from '../cache/animeCache'
 4  
 5  const router = new Elysia()
 6  export default router
 7  
 8  router.get(
 9    '/animes',
10    ({ query }) => {
11      return filterAnimeList(animeCache, {
12        title: query.title,
13        releaseDate: query.releaseDate,
14        genreList: query.genreList?.split(','),
15      })
16    },
17    {
18      query: t.Object({
19        title: t.Optional(t.String()),
20        genreList: t.Optional(t.String()),
21        releaseDate: t.Optional(t.Numeric()),
22      }),
23    },
24  )
25  
26  router.get(
27    '/animes/:id',
28    ({ params, error }) => {
29      const retrievedAnime = getAnimeById(params.id)
30      if (!retrievedAnime) return error(404, 'Not Found')
31  
32      return retrievedAnime
33    },
34    {
35      params: t.Object({
36        id: t.Numeric(),
37      }),
38    },
39  )
40  
41  router.get(
42    '/animes/:id/:episode',
43    async ({ params, error }) => {
44      const retrievedAnime = await getAnimeById(params.id)
45      if (!retrievedAnime) return error(404, 'Anime Not Found')
46  
47      const retrievedEpisode = getEpisode(retrievedAnime, params.episode)
48      if (!retrievedEpisode) return error(404, 'Episode Not Found')
49  
50      const retrievedEpisodeVideo = await getEpisodeVideo(retrievedEpisode.url)
51      if (!retrievedEpisodeVideo) return error(404, 'Episode Video Not Found')
52  
53      return {
54        anime: retrievedAnime,
55        episode: { ...retrievedEpisode, video_url: retrievedEpisodeVideo },
56      }
57    },
58    {
59      params: t.Object({
60        id: t.Numeric(),
61        episode: t.Numeric(),
62      }),
63    },
64  )