fix(watchlist): add validation for creation request
This commit is contained in:
@@ -15,6 +15,7 @@ import {
|
|||||||
Unique,
|
Unique,
|
||||||
UpdateDateColumn,
|
UpdateDateColumn,
|
||||||
} from 'typeorm';
|
} from 'typeorm';
|
||||||
|
import type { ZodNumber, ZodOptional, ZodString } from 'zod';
|
||||||
|
|
||||||
export class DuplicateWatchlistRequestError extends Error {}
|
export class DuplicateWatchlistRequestError extends Error {}
|
||||||
export class NotFoundError extends Error {
|
export class NotFoundError extends Error {
|
||||||
@@ -65,10 +66,18 @@ export class Watchlist implements WatchlistItem {
|
|||||||
Object.assign(this, init);
|
Object.assign(this, init);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async createWatchlist(
|
public static async createWatchlist({
|
||||||
watchlistRequest: Watchlist,
|
watchlistRequest,
|
||||||
user: User
|
user,
|
||||||
): Promise<Watchlist> {
|
}: {
|
||||||
|
watchlistRequest: {
|
||||||
|
mediaType: MediaType;
|
||||||
|
ratingKey?: ZodOptional<ZodString>['_output'];
|
||||||
|
title?: ZodOptional<ZodString>['_output'];
|
||||||
|
tmdbId: ZodNumber['_output'];
|
||||||
|
};
|
||||||
|
user: User;
|
||||||
|
}): Promise<Watchlist> {
|
||||||
const watchlistRepository = getRepository(this);
|
const watchlistRepository = getRepository(this);
|
||||||
const mediaRepository = getRepository(Media);
|
const mediaRepository = getRepository(Media);
|
||||||
const tmdb = new TheMovieDb();
|
const tmdb = new TheMovieDb();
|
||||||
|
|||||||
9
server/interfaces/api/watchlistCreate.ts
Normal file
9
server/interfaces/api/watchlistCreate.ts
Normal file
@@ -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(),
|
||||||
|
});
|
||||||
@@ -7,6 +7,8 @@ import logger from '@server/logger';
|
|||||||
import { Router } from 'express';
|
import { Router } from 'express';
|
||||||
import { QueryFailedError } from 'typeorm';
|
import { QueryFailedError } from 'typeorm';
|
||||||
|
|
||||||
|
import { watchlistCreate } from '@server/interfaces/api/watchlistCreate';
|
||||||
|
|
||||||
const watchlistRoutes = Router();
|
const watchlistRoutes = Router();
|
||||||
|
|
||||||
watchlistRoutes.post<never, Watchlist, Watchlist>(
|
watchlistRoutes.post<never, Watchlist, Watchlist>(
|
||||||
@@ -19,7 +21,12 @@ watchlistRoutes.post<never, Watchlist, Watchlist>(
|
|||||||
message: 'You must be logged in to add watchlist.',
|
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);
|
return res.status(201).json(request);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (!(error instanceof Error)) {
|
if (!(error instanceof Error)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user