diff --git a/api/src/controllers/entries.ts b/api/src/controllers/entries.ts index b828cf23..5c9ece8f 100644 --- a/api/src/controllers/entries.ts +++ b/api/src/controllers/entries.ts @@ -6,6 +6,7 @@ import { entries, entryTranslations, shows } from "~/db/schema"; import { getColumns, sqlarr } from "~/db/utils"; import { Entry, + EntryKind, Episode, Extra, ExtraType, @@ -82,7 +83,7 @@ async function getEntries( filter: SQL | undefined; languages: string[]; }, -) { +): Promise<(Entry | Extra | UnknownEntry)[]> { const show = db.$with("serie").as( db .select({ pk: shows.pk }) @@ -104,13 +105,27 @@ async function getEntries( sql`array_position(${sqlarr(languages)}, ${entryTranslations.language})`, ) .as("t"); - const { pk, ...transCol } = getColumns(transQ); + const { pk, name, ...transCol } = getColumns(transQ); + const { kind, externalId, order, seasonNumber, episodeNumber, extraKind, ...entryCol } = getColumns(entries); return await db .with(show) .select({ - ...getColumns(entries), + ...entryCol, ...transCol, + // specials don't have an `episodeNumber` but a `number` field. + number: sql`${episodeNumber}`.as("order"), + + // merge `extraKind` into `kind` + kind: sql`case when ${kind} = 'extra' then ${extraKind} else ${kind} end`.as("kind"), + isExtra: sql`${kind} = "extra"`.as("isExtra"), + + // assign more restrained types to make typescript happy. + externalId: sql`${externalId}`.as("externalId"), + order: sql`${order}`.as("order"), + seasonNumber: sql`${seasonNumber}`.as("order"), + episodeNumber: sql`${episodeNumber}`.as("order"), + name: sql`${name}`.as("name"), }) .from(entries) .innerJoin(transQ, eq(entries.pk, transQ.pk)) @@ -164,7 +179,8 @@ export const entriesH = new Elysia() filter, ), languages: langs, - }); + }) as Entry[]; + return createPage(items, { url, sort, limit }); }, { diff --git a/api/src/models/entry/index.ts b/api/src/models/entry/index.ts index 75f500b1..f8722478 100644 --- a/api/src/models/entry/index.ts +++ b/api/src/models/entry/index.ts @@ -1,12 +1,9 @@ import { t } from "elysia"; -import { - Episode, - MovieEntry, - SeedEpisode, - SeedMovieEntry, - SeedSpecial, - Special, -} from "../entry"; +import { Extra } from "./extra"; +import { UnknownEntry } from "./unknown-entry"; +import { Episode, SeedEpisode } from "./episode"; +import { MovieEntry, SeedMovieEntry } from "./movie-entry"; +import { SeedSpecial, Special } from "./special"; export const Entry = t.Union([Episode, MovieEntry, Special]); export type Entry = Episode | MovieEntry | Special; @@ -14,6 +11,8 @@ export type Entry = Episode | MovieEntry | Special; export const SeedEntry = t.Union([SeedEpisode, SeedMovieEntry, SeedSpecial]); export type SeedEntry = SeedEpisode | SeedMovieEntry | SeedSpecial; +export type EntryKind = Entry["kind"] | Extra["kind"] | UnknownEntry["kind"]; + export * from "./episode"; export * from "./movie-entry"; export * from "./special";