diff --git a/api/src/controllers/movies.ts b/api/src/controllers/movies.ts index 78156fd5..af453607 100644 --- a/api/src/controllers/movies.ts +++ b/api/src/controllers/movies.ts @@ -26,6 +26,8 @@ import { isUuid, keysetPaginate, processLanguages, + createPage, + sortToSql, } from "~/models/utils"; import { comment } from "~/utils"; import { db } from "../db"; @@ -282,6 +284,8 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] }) ) .as("video"); + console.log(sort.isDefault) + const items = await db .select({ ...moviesCol, @@ -316,15 +320,9 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] }) ), ) .orderBy( - ...(query + ...(query && sort.isDefault ? [sql`word_similarity(${query}::text, ${showTranslations.name})`] - : []), - ...(sort.random - ? [sql`md5(${sort.random.seed} || ${shows.pk})`] - : []), - ...sort.sort.map((x) => - x.desc ? sql`${shows[x.key]} desc nulls last` : shows[x.key], - ), + : sortToSql(sort, shows)), shows.pk, ) .limit(limit); @@ -337,7 +335,6 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] }) sort: Sort(["slug", "rating", "airDate", "createdAt", "nextRefresh"], { remap: { airDate: "startAir" }, default: ["slug"], - description: "How to sort the query", }), filter: t.Optional(Filter({ def: movieFilters })), query: t.Optional( diff --git a/api/src/models/utils/sort.ts b/api/src/models/utils/sort.ts index 83e22d39..1525842e 100644 --- a/api/src/models/utils/sort.ts +++ b/api/src/models/utils/sort.ts @@ -1,3 +1,5 @@ +import { sql } from "drizzle-orm"; +import type { PgColumn } from "drizzle-orm/pg-core"; import { t } from "elysia"; export type Sort< @@ -10,6 +12,7 @@ export type Sort< desc: boolean; }[]; random?: { seed: number }; + isDefault?: boolean; }; export type NonEmptyArray = [T, ...T[]]; @@ -25,7 +28,7 @@ export const Sort = < remap, }: { default?: T[number][]; - description: string; + description?: string; remap: Remap; }, ) => @@ -49,6 +52,7 @@ export const Sort = < ), ) .Decode((sort): Sort => { + console.log(sort); const random = sort.find((x) => x.startsWith("random")); if (random) { const seed = random.includes(":") @@ -63,8 +67,26 @@ export const Sort = < if (key in remap) return { key: remap[key]!, remmapedKey: key, desc }; return { key: key as Exclude, desc }; }), + isDefault: "isDefault" in sort, }; }) .Encode(() => { throw new Error("Encode not supported for sort"); }); + +type Table = Record; + +export const sortToSql = < + T extends string[], + Remap extends Partial>, +>( + sort: Sort, + table: Table["sort"][number]["key"] | "pk">, +) => { + if (sort.random) { + return [sql`md5(${sort.random.seed} || ${table.pk})`]; + } + return sort.sort.map((x) => + x.desc ? sql`${table[x.key]} desc nulls last` : table[x.key], + ); +};