From 05582221506c564b681df1156ade2234e6065f4a Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 4 Mar 2025 00:28:20 +0100 Subject: [PATCH] Add videos in /shows/:id/entries --- api/src/controllers/entries.ts | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/api/src/controllers/entries.ts b/api/src/controllers/entries.ts index f43b0751..3362a0ee 100644 --- a/api/src/controllers/entries.ts +++ b/api/src/controllers/entries.ts @@ -2,7 +2,13 @@ import type { StaticDecode } from "@sinclair/typebox"; import { type SQL, and, eq, ne, sql } from "drizzle-orm"; import { Elysia, t } from "elysia"; import { db } from "~/db"; -import { entries, entryTranslations, shows } from "~/db/schema"; +import { + entries, + entryTranslations, + entryVideoJoin, + shows, + videos, +} from "~/db/schema"; import { getColumns, sqlarr } from "~/db/utils"; import { Entry, @@ -99,6 +105,18 @@ async function getEntries({ .as("t"); const { pk, name, ...transCol } = getColumns(transQ); + const { guess, createdAt, updatedAt, ...videosCol } = getColumns(videos); + const videosQ = db + .select({ slug: entryVideoJoin.slug, ...videosCol }) + .from(entryVideoJoin) + .where(eq(entryVideoJoin.entryPk, entries.pk)) + .leftJoin(videos, eq(videos.pk, entryVideoJoin.videoPk)) + .as("video"); + const videosJ = db + .select({ videos: sql`json_agg("video")`.as("videos") }) + .from(videosQ) + .as("videos_json"); + const { kind, externalId, @@ -112,24 +130,25 @@ async function getEntries({ .select({ ...entryCol, ...transCol, + videos: sql`${videosJ.videos}`.as("videos"), // specials don't have an `episodeNumber` but a `number` field. - number: sql`${episodeNumber}`.as("order"), + number: sql`${episodeNumber}`.as("number"), // merge `extraKind` into `kind` kind: sql`case when ${kind} = 'extra' then ${extraKind} else ${kind}::text 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"), + seasonNumber: sql`${seasonNumber}`.as("seasonNumber"), + episodeNumber: sql`${episodeNumber}`.as("episodeNumber"), name: sql`${name}`.as("name"), }) .from(entries) .innerJoin(transQ, eq(entries.pk, transQ.pk)) + .leftJoin(videosJ, sql`true`) .where( and( filter,