Files
providers-api/src/schema.ts

42 lines
1.0 KiB
TypeScript

import { z } from 'zod';
export const tmdbIdSchema = z.string().regex(/^\d+$/);
export const mediaSchema = z
.discriminatedUnion('type', [
z.object({
type: z.literal('movie'),
title: z.string().min(1),
releaseYear: z.coerce.number().int().gt(0),
tmdbId: tmdbIdSchema,
}),
z.object({
type: z.literal('show'),
title: z.string().min(1),
releaseYear: z.coerce.number().int().gt(0),
tmdbId: tmdbIdSchema,
episodeNumber: z.coerce.number().int(),
episodeTmdbId: tmdbIdSchema,
seasonNumber: z.coerce.number().int(),
seasonTmdbId: tmdbIdSchema,
}),
])
.transform((query) => {
if (query.type == 'movie') return query;
return {
type: query.type,
title: query.title,
releaseYear: query.releaseYear,
tmdbId: query.tmdbId,
episode: {
number: query.episodeNumber,
tmdbId: query.episodeTmdbId,
},
season: {
number: query.seasonNumber,
tmdbId: query.seasonTmdbId,
},
};
});