diff --git a/server/entity/Watchlist.ts b/server/entity/Watchlist.ts index bf362acb4..df820120e 100644 --- a/server/entity/Watchlist.ts +++ b/server/entity/Watchlist.ts @@ -15,6 +15,7 @@ import { Unique, UpdateDateColumn, } from 'typeorm'; +import type { ZodNumber, ZodOptional, ZodString } from 'zod'; export class DuplicateWatchlistRequestError extends Error {} export class NotFoundError extends Error { @@ -65,10 +66,18 @@ export class Watchlist implements WatchlistItem { Object.assign(this, init); } - public static async createWatchlist( - watchlistRequest: Watchlist, - user: User - ): Promise { + public static async createWatchlist({ + watchlistRequest, + user, + }: { + watchlistRequest: { + mediaType: MediaType; + ratingKey?: ZodOptional['_output']; + title?: ZodOptional['_output']; + tmdbId: ZodNumber['_output']; + }; + user: User; + }): Promise { const watchlistRepository = getRepository(this); const mediaRepository = getRepository(Media); const tmdb = new TheMovieDb(); diff --git a/server/interfaces/api/watchlistCreate.ts b/server/interfaces/api/watchlistCreate.ts new file mode 100644 index 000000000..6cc6af3bb --- /dev/null +++ b/server/interfaces/api/watchlistCreate.ts @@ -0,0 +1,9 @@ +import { MediaType } from '@server/constants/media'; +import { z } from 'zod'; + +export const watchlistCreate = z.object({ + ratingKey: z.coerce.string().optional(), + tmdbId: z.coerce.number(), + mediaType: z.nativeEnum(MediaType), + title: z.coerce.string().optional(), +}); diff --git a/server/routes/watchlist.ts b/server/routes/watchlist.ts index b8ca0b909..bbb44da01 100644 --- a/server/routes/watchlist.ts +++ b/server/routes/watchlist.ts @@ -7,6 +7,8 @@ import logger from '@server/logger'; import { Router } from 'express'; import { QueryFailedError } from 'typeorm'; +import { watchlistCreate } from '@server/interfaces/api/watchlistCreate'; + const watchlistRoutes = Router(); watchlistRoutes.post( @@ -19,7 +21,12 @@ watchlistRoutes.post( message: 'You must be logged in to add watchlist.', }); } - const request = await Watchlist.createWatchlist(req.body, req.user); + const values = watchlistCreate.parse(req.body); + + const request = await Watchlist.createWatchlist({ + watchlistRequest: values, + user: req.user, + }); return res.status(201).json(request); } catch (error) { if (!(error instanceof Error)) {