Fix typing & extra handling when fetching entries from db

This commit is contained in:
Zoe Roux 2025-02-19 19:33:26 +01:00
parent c70e11d36a
commit a5483b4ca1
2 changed files with 27 additions and 12 deletions

View File

@ -6,6 +6,7 @@ import { entries, entryTranslations, shows } from "~/db/schema";
import { getColumns, sqlarr } from "~/db/utils"; import { getColumns, sqlarr } from "~/db/utils";
import { import {
Entry, Entry,
EntryKind,
Episode, Episode,
Extra, Extra,
ExtraType, ExtraType,
@ -82,7 +83,7 @@ async function getEntries(
filter: SQL | undefined; filter: SQL | undefined;
languages: string[]; languages: string[];
}, },
) { ): Promise<(Entry | Extra | UnknownEntry)[]> {
const show = db.$with("serie").as( const show = db.$with("serie").as(
db db
.select({ pk: shows.pk }) .select({ pk: shows.pk })
@ -104,13 +105,27 @@ async function getEntries(
sql`array_position(${sqlarr(languages)}, ${entryTranslations.language})`, sql`array_position(${sqlarr(languages)}, ${entryTranslations.language})`,
) )
.as("t"); .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 return await db
.with(show) .with(show)
.select({ .select({
...getColumns(entries), ...entryCol,
...transCol, ...transCol,
// specials don't have an `episodeNumber` but a `number` field.
number: sql<number>`${episodeNumber}`.as("order"),
// merge `extraKind` into `kind`
kind: sql<EntryKind>`case when ${kind} = 'extra' then ${extraKind} else ${kind} end`.as("kind"),
isExtra: sql<boolean>`${kind} = "extra"`.as("isExtra"),
// assign more restrained types to make typescript happy.
externalId: sql<any>`${externalId}`.as("externalId"),
order: sql<number>`${order}`.as("order"),
seasonNumber: sql<number>`${seasonNumber}`.as("order"),
episodeNumber: sql<number>`${episodeNumber}`.as("order"),
name: sql<string>`${name}`.as("name"),
}) })
.from(entries) .from(entries)
.innerJoin(transQ, eq(entries.pk, transQ.pk)) .innerJoin(transQ, eq(entries.pk, transQ.pk))
@ -164,7 +179,8 @@ export const entriesH = new Elysia()
filter, filter,
), ),
languages: langs, languages: langs,
}); }) as Entry[];
return createPage(items, { url, sort, limit }); return createPage(items, { url, sort, limit });
}, },
{ {

View File

@ -1,12 +1,9 @@
import { t } from "elysia"; import { t } from "elysia";
import { import { Extra } from "./extra";
Episode, import { UnknownEntry } from "./unknown-entry";
MovieEntry, import { Episode, SeedEpisode } from "./episode";
SeedEpisode, import { MovieEntry, SeedMovieEntry } from "./movie-entry";
SeedMovieEntry, import { SeedSpecial, Special } from "./special";
SeedSpecial,
Special,
} from "../entry";
export const Entry = t.Union([Episode, MovieEntry, Special]); export const Entry = t.Union([Episode, MovieEntry, Special]);
export type Entry = 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 const SeedEntry = t.Union([SeedEpisode, SeedMovieEntry, SeedSpecial]);
export type SeedEntry = SeedEpisode | SeedMovieEntry | SeedSpecial; export type SeedEntry = SeedEpisode | SeedMovieEntry | SeedSpecial;
export type EntryKind = Entry["kind"] | Extra["kind"] | UnknownEntry["kind"];
export * from "./episode"; export * from "./episode";
export * from "./movie-entry"; export * from "./movie-entry";
export * from "./special"; export * from "./special";