Use sql builder instead of orm for /movie

This commit is contained in:
Zoe Roux 2025-03-08 16:26:24 +01:00
parent 16fb638231
commit cca0da4bf6
No known key found for this signature in database
2 changed files with 26 additions and 9 deletions

View File

@ -62,6 +62,7 @@ export async function getShows({
sort, sort,
filter, filter,
languages, languages,
fallbackLanguage = true,
preferOriginal = false, preferOriginal = false,
}: { }: {
after: string | undefined; after: string | undefined;
@ -70,11 +71,17 @@ export async function getShows({
sort: StaticDecode<typeof showSort>; sort: StaticDecode<typeof showSort>;
filter: SQL | undefined; filter: SQL | undefined;
languages: string[]; languages: string[];
fallbackLanguage?: boolean;
preferOriginal?: boolean; preferOriginal?: boolean;
}) { }) {
const transQ = db const transQ = db
.selectDistinctOn([showTranslations.pk]) .selectDistinctOn([showTranslations.pk])
.from(showTranslations) .from(showTranslations)
.where(
!fallbackLanguage
? eq(showTranslations.language, sql`any(${sqlarr(languages)})`)
: undefined,
)
.orderBy( .orderBy(
showTranslations.pk, showTranslations.pk,
sql`array_position(${sqlarr(languages)}, ${showTranslations.language})`, sql`array_position(${sqlarr(languages)}, ${showTranslations.language})`,
@ -86,6 +93,8 @@ export async function getShows({
.select({ .select({
...getColumns(shows), ...getColumns(shows),
...transCol, ...transCol,
lanugage: transQ.language,
// movie columns (status is only a typescript hint) // movie columns (status is only a typescript hint)
status: sql<MovieStatus>`${shows.status}`, status: sql<MovieStatus>`${shows.status}`,
airDate: shows.startAir, airDate: shows.startAir,
@ -93,14 +102,17 @@ export async function getShows({
isAvailable: sql<boolean>`${shows.availableCount} != 0`, isAvailable: sql<boolean>`${shows.availableCount} != 0`,
...(preferOriginal && { ...(preferOriginal && {
poster: sql<Image>`coalesce(${shows.original}->'poster', ${showTranslations.poster})`, poster: sql<Image>`coalesce(${shows.original}->'poster', ${transQ.poster})`,
thumbnail: sql<Image>`coalesce(${shows.original}->'thumbnail', ${showTranslations.thumbnail})`, thumbnail: sql<Image>`coalesce(${shows.original}->'thumbnail', ${transQ.thumbnail})`,
banner: sql<Image>`coalesce(${shows.original}->'banner', ${showTranslations.banner})`, banner: sql<Image>`coalesce(${shows.original}->'banner', ${transQ.banner})`,
logo: sql<Image>`coalesce(${shows.original}->'logo', ${showTranslations.logo})`, logo: sql<Image>`coalesce(${shows.original}->'logo', ${transQ.logo})`,
}), }),
}) })
.from(shows) .from(shows)
.innerJoin(transQ, eq(shows.pk, transQ.pk)) [fallbackLanguage ? "leftJoin" : "innerJoin"](
transQ,
eq(shows.pk, transQ.pk),
)
.where( .where(
and( and(
filter, filter,

View File

@ -10,10 +10,11 @@ import {
Filter, Filter,
Page, Page,
createPage, createPage,
isUuid,
processLanguages, processLanguages,
} from "~/models/utils"; } from "~/models/utils";
import { desc } from "~/models/utils/descriptions"; import { desc } from "~/models/utils/descriptions";
import { getShow, getShows, showFilters, showSort } from "./logic"; import { getShows, showFilters, showSort } from "./logic";
export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] }) export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] })
.model({ .model({
@ -30,11 +31,15 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] })
set, set,
}) => { }) => {
const langs = processLanguages(languages); const langs = processLanguages(languages);
const ret = await getShow(id, { const [ret] = await getShows({
filter: and(
isUuid(id) ? eq(shows.id, id) : eq(shows.slug, id),
eq(shows.kind, "movie"),
),
languages: langs, languages: langs,
fallbackLanguage: langs.includes("*"),
preferOriginal, preferOriginal,
relations, relations,
filters: eq(shows.kind, "movie"),
}); });
if (!ret) { if (!ret) {
return error(404, { return error(404, {
@ -49,7 +54,7 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] })
}); });
} }
set.headers["content-language"] = ret.language; set.headers["content-language"] = ret.language;
return ret.show; return ret;
}, },
{ {
detail: { detail: {