diff --git a/projects/api/deno.json b/projects/api/deno.json index cb86447a..b9afa48b 100644 --- a/projects/api/deno.json +++ b/projects/api/deno.json @@ -1,7 +1,7 @@ { "name": "@trakt/api", "exports": "./src/index.ts", - "version": "0.3.10", + "version": "0.4.0", "imports": { "@anatine/zod-openapi": "npm:@anatine/zod-openapi@^2.2.6", "@std/testing": "jsr:@std/testing@^1.0.5", diff --git a/projects/api/src/contracts/checkin/index.ts b/projects/api/src/contracts/checkin/index.ts index 6e0dfdaf..23676195 100644 --- a/projects/api/src/contracts/checkin/index.ts +++ b/projects/api/src/contracts/checkin/index.ts @@ -7,21 +7,15 @@ import { movieCheckinResponseSchema } from './schema/response/movieCheckinRespon import { showCheckinResponseSchema } from './schema/response/showCheckinResponseSchema.ts'; export const checkin = builder.router({ - show: { + start: { method: 'POST', path: '', - body: showCheckinRequestSchema, + body: z.union([ + showCheckinRequestSchema, + movieCheckinRequestSchema, + ]), responses: { - 200: showCheckinResponseSchema, - 409: checkin409ErrorResponse, - }, - }, - movie: { - method: 'POST', - path: '', - body: movieCheckinRequestSchema, - responses: { - 200: movieCheckinResponseSchema, + 200: z.union([showCheckinResponseSchema, movieCheckinResponseSchema]), 409: checkin409ErrorResponse, }, }, diff --git a/projects/api/src/contracts/checkin/schema/request/movieCheckinRequestSchema.ts b/projects/api/src/contracts/checkin/schema/request/movieCheckinRequestSchema.ts index e5580f1d..0597b76e 100644 --- a/projects/api/src/contracts/checkin/schema/request/movieCheckinRequestSchema.ts +++ b/projects/api/src/contracts/checkin/schema/request/movieCheckinRequestSchema.ts @@ -9,7 +9,7 @@ export const movieCheckinRequestSchema = z.object({ title: z.string().nullish(), year: z.number().int().nullish(), ids: movieIdsRequestSchema, - }), + }).nullish(), sharing: sharingRequestSchema, message: z.string().nullish(), }); diff --git a/projects/api/src/contracts/checkin/schema/request/showCheckinRequestSchema.ts b/projects/api/src/contracts/checkin/schema/request/showCheckinRequestSchema.ts index 2eb82672..4fd0b008 100644 --- a/projects/api/src/contracts/checkin/schema/request/showCheckinRequestSchema.ts +++ b/projects/api/src/contracts/checkin/schema/request/showCheckinRequestSchema.ts @@ -7,14 +7,14 @@ const showAbsoluteCheckinRequestSchema = z.object({ title: z.string().nullish(), year: z.number().int().nullish(), ids: showIdsRequestSchema, - }), - episode: z.object({ number_abs: z.number().int() }), + }).nullish(), + episode: z.object({ number_abs: z.number().int() }).nullish(), sharing: sharingRequestSchema, message: z.string().nullish(), }); const episodeCheckinRequestSchema = z.object({ - episode: z.object({ ids: showIdsRequestSchema }), + episode: z.object({ ids: showIdsRequestSchema }).nullish(), sharing: sharingRequestSchema, message: z.string().nullish(), }); @@ -24,8 +24,9 @@ const episodeWithShowCheckinRequestSchema = z.object({ title: z.string().nullish(), year: z.number().int().nullish(), ids: showIdsRequestSchema, - }), - episode: z.object({ season: z.number().int(), number: z.number().int() }), + }).nullish(), + episode: z.object({ season: z.number().int(), number: z.number().int() }) + .nullish(), sharing: sharingRequestSchema, message: z.string().nullish(), }); diff --git a/projects/api/src/contracts/checkin/schema/response/movieCheckinResponseSchema.ts b/projects/api/src/contracts/checkin/schema/response/movieCheckinResponseSchema.ts index 7c2839ce..2c62432a 100644 --- a/projects/api/src/contracts/checkin/schema/response/movieCheckinResponseSchema.ts +++ b/projects/api/src/contracts/checkin/schema/response/movieCheckinResponseSchema.ts @@ -13,5 +13,5 @@ export const movieCheckinResponseSchema = z.object({ title: z.string(), year: z.number().int(), ids: movieIdsResponseSchema, - }), + }).nullish(), }); diff --git a/projects/api/src/contracts/checkin/schema/response/showCheckinResponseSchema.ts b/projects/api/src/contracts/checkin/schema/response/showCheckinResponseSchema.ts index ee1c80a8..51ac0631 100644 --- a/projects/api/src/contracts/checkin/schema/response/showCheckinResponseSchema.ts +++ b/projects/api/src/contracts/checkin/schema/response/showCheckinResponseSchema.ts @@ -15,10 +15,10 @@ export const showCheckinResponseSchema = z.object({ number: z.number().int(), title: z.string(), ids: episodeIdsResponseSchema, - }), + }).nullish(), show: z.object({ title: z.string(), year: z.number().int(), ids: showIdsResponseSchema, - }), + }).nullish(), }); diff --git a/projects/api/src/contracts/sync/schema/response/collectionResponseSchema.ts b/projects/api/src/contracts/sync/schema/response/collectionResponseSchema.ts index 1b420b16..fa3f48df 100644 --- a/projects/api/src/contracts/sync/schema/response/collectionResponseSchema.ts +++ b/projects/api/src/contracts/sync/schema/response/collectionResponseSchema.ts @@ -1,7 +1,7 @@ -import { typedEpisodeResponseSchema } from '../../../_internal/response/episodeResponseSchema.ts'; -import { typedMovieResponseSchema } from '../../../_internal/response/movieResponseSchema.ts'; +import { episodeResponseSchema } from '../../../_internal/response/episodeResponseSchema.ts'; +import { movieResponseSchema } from '../../../_internal/response/movieResponseSchema.ts'; import { - typedShowResponseSchema, + showResponseSchema, } from '../../../_internal/response/showResponseSchema.ts'; import { z } from '../../../_internal/z.ts'; import { availableOnEnumSchema } from '../request/availableOnEnumSchema.ts'; @@ -20,10 +20,17 @@ const collectedItemSchema = z.object({ updated_at: z.string().datetime(), }).merge(availableOnSchema); -export const collectedMovieSchema = typedMovieResponseSchema +export const collectedMovieSchema = z.object({ + type: z.literal('movie'), + movie: movieResponseSchema.nullish(), +}) .merge(collectedItemSchema); -export const collectedEpisodeSchema = typedEpisodeResponseSchema +export const collectedEpisodeSchema = z.object({ + type: z.literal('episode'), + episode: episodeResponseSchema.nullish(), + show: showResponseSchema.nullish(), +}) .merge(collectedItemSchema); const collectedSeasonEpisodeSchema = z.object({ @@ -37,11 +44,14 @@ const collectedSeasonResponseSchema = z.object({ }); export const collectedShowSchema = z.object({ - last_collected_at: z.string().datetime(), - last_updated_at: z.string().datetime(), - seasons: collectedSeasonResponseSchema.array(), + last_collected_at: z.string().datetime().nullish(), + last_updated_at: z.string().datetime().nullish(), + seasons: collectedSeasonResponseSchema.array().nullish(), }) - .merge(typedShowResponseSchema); + .merge(z.object({ + type: z.literal('show'), + show: showResponseSchema.nullish(), + })); export const collectionResponseSchema = z.union([ collectedMovieSchema, diff --git a/projects/api/src/contracts/users/schema/response/likedItemResponseSchema.ts b/projects/api/src/contracts/users/schema/response/likedItemResponseSchema.ts index cf716416..fc7d19f0 100644 --- a/projects/api/src/contracts/users/schema/response/likedItemResponseSchema.ts +++ b/projects/api/src/contracts/users/schema/response/likedItemResponseSchema.ts @@ -79,6 +79,8 @@ export const likedListResponseSchema = z.object({ /*** * When using extended 'min', only the id is returned */ - list: listResponseSchema.partial() - .extend({ id: z.number().int() }), + list: z.union([ + listResponseSchema.partial(), + z.object({ id: z.number().int().nullish() }), + ]), }); diff --git a/projects/api/src/contracts/users/schema/response/watchingResponseSchema.ts b/projects/api/src/contracts/users/schema/response/watchingResponseSchema.ts index 0aefdb37..c6cec7fb 100644 --- a/projects/api/src/contracts/users/schema/response/watchingResponseSchema.ts +++ b/projects/api/src/contracts/users/schema/response/watchingResponseSchema.ts @@ -1,5 +1,6 @@ -import { typedEpisodeResponseSchema } from '../../../_internal/response/episodeResponseSchema.ts'; -import { typedMovieResponseSchema } from '../../../_internal/response/movieResponseSchema.ts'; +import { episodeResponseSchema } from '../../../_internal/response/episodeResponseSchema.ts'; +import { movieResponseSchema } from '../../../_internal/response/movieResponseSchema.ts'; +import { showResponseSchema } from '../../../_internal/response/showResponseSchema.ts'; import { asString, z } from '../../../_internal/z.ts'; const commonWatchingResponseSchema = z.object({ @@ -9,12 +10,19 @@ const commonWatchingResponseSchema = z.object({ }); const movieWatchingResponseSchema = commonWatchingResponseSchema - .merge(typedMovieResponseSchema); + .merge(z.object({ + type: z.literal('movie'), + movie: movieResponseSchema.nullish(), + })); const episodeWatchingResponseSchema = commonWatchingResponseSchema - .merge(typedEpisodeResponseSchema); + .merge(z.object({ + type: z.literal('episode'), + episode: episodeResponseSchema.nullish(), + show: showResponseSchema.nullish(), + })); -export const watchingResponseSchema = z.discriminatedUnion('type', [ +export const watchingResponseSchema = z.union([ movieWatchingResponseSchema, episodeWatchingResponseSchema, ]);