Add staff migrations & basic tests

This commit is contained in:
Zoe Roux 2025-03-10 11:29:12 +01:00
parent 25f042fbd7
commit e3a537896a
No known key found for this signature in database
10 changed files with 1596 additions and 8 deletions

View File

@ -0,0 +1,28 @@
CREATE TYPE "kyoo"."role_kind" AS ENUM('actor', 'director', 'writter', 'producer', 'music', 'other');--> statement-breakpoint
CREATE TABLE "kyoo"."roles" (
"pk" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "kyoo"."roles_pk_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
"show_pk" integer NOT NULL,
"staff_pk" integer NOT NULL,
"kind" "kyoo"."role_kind" NOT NULL,
"order" integer NOT NULL,
"character" jsonb
);
--> statement-breakpoint
CREATE TABLE "kyoo"."staff" (
"pk" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "kyoo"."staff_pk_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
"id" uuid DEFAULT gen_random_uuid() NOT NULL,
"slug" varchar(255) NOT NULL,
"name" text NOT NULL,
"latin_name" text,
"image" jsonb,
"external_id" jsonb DEFAULT '{}'::jsonb NOT NULL,
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
"updated_at" timestamp with time zone NOT NULL,
CONSTRAINT "staff_id_unique" UNIQUE("id"),
CONSTRAINT "staff_slug_unique" UNIQUE("slug")
);
--> statement-breakpoint
ALTER TABLE "kyoo"."roles" ADD CONSTRAINT "roles_show_pk_shows_pk_fk" FOREIGN KEY ("show_pk") REFERENCES "kyoo"."shows"("pk") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "kyoo"."roles" ADD CONSTRAINT "roles_staff_pk_staff_pk_fk" FOREIGN KEY ("staff_pk") REFERENCES "kyoo"."staff"("pk") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
CREATE INDEX "role_kind" ON "kyoo"."roles" USING hash ("kind");--> statement-breakpoint
CREATE INDEX "role_order" ON "kyoo"."roles" USING btree ("order");

File diff suppressed because it is too large Load Diff

View File

@ -99,6 +99,13 @@
"when": 1741444868735,
"tag": "0013_original",
"breakpoints": true
},
{
"idx": 14,
"version": "7",
"when": 1741601145901,
"tag": "0014_staff",
"breakpoints": true
}
]
}

View File

@ -1,4 +1,3 @@
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";
@ -105,7 +104,7 @@ async function getEntries({
after: string | undefined;
limit: number;
query: string | undefined;
sort: StaticDecode<typeof entrySort>;
sort: Sort;
filter: SQL | undefined;
languages: string[];
}): Promise<(Entry | Extra | UnknownEntry)[]> {

View File

@ -1,4 +1,3 @@
import type { StaticDecode } from "@sinclair/typebox";
import { type SQL, and, eq, exists, sql } from "drizzle-orm";
import { db } from "~/db";
import {
@ -159,7 +158,7 @@ export async function getShows({
after?: string;
limit: number;
query?: string;
sort?: StaticDecode<typeof showSort>;
sort?: Sort;
filter?: SQL;
languages: string[];
fallbackLanguage?: boolean;

View File

@ -1,4 +1,3 @@
import type { StaticDecode } from "@sinclair/typebox";
import { type SQL, and, eq, sql } from "drizzle-orm";
import Elysia, { t } from "elysia";
import { db } from "~/db";
@ -82,7 +81,7 @@ async function getStaffRoles({
after?: string;
limit: number;
query?: string;
sort?: StaticDecode<typeof staffRoleSort>;
sort?: Sort;
filter?: SQL;
}) {
return await db

View File

@ -1,4 +1,3 @@
import type { StaticDecode } from "@sinclair/typebox";
import { type SQL, and, eq, exists, sql } from "drizzle-orm";
import Elysia, { t } from "elysia";
import { db } from "~/db";
@ -74,7 +73,7 @@ export async function getStudios({
after?: string;
limit: number;
query?: string;
sort?: StaticDecode<typeof studioSort>;
sort?: Sort,
filter?: SQL;
languages: string[];
fallbackLanguage?: boolean;

View File

@ -1,6 +1,7 @@
export * from "./movies-helper";
export * from "./series-helper";
export * from "./studio-helper";
export * from "./staff-helper";
export * from "./videos-helper";
export * from "~/elysia";

View File

@ -0,0 +1,41 @@
import { buildUrl } from "tests/utils";
import { app } from "~/elysia";
export const getStaff = async (id: string, query: {}) => {
const resp = await app.handle(
new Request(buildUrl(`staff/${id}`, query), {
method: "GET",
}),
);
const body = await resp.json();
return [resp, body] as const;
};
export const getStaffRoles = async (
staff: string,
{
langs,
...opts
}: {
filter?: string;
limit?: number;
after?: string;
sort?: string | string[];
query?: string;
langs?: string;
preferOriginal?: boolean;
},
) => {
const resp = await app.handle(
new Request(buildUrl(`staff/${staff}/roles`, opts), {
method: "GET",
headers: langs
? {
"Accept-Language": langs,
}
: {},
}),
);
const body = await resp.json();
return [resp, body] as const;
};

View File

@ -0,0 +1,28 @@
import { beforeAll, describe, expect, it } from "bun:test";
import { createSerie, getStaff, getStaffRoles } from "tests/helpers";
import { expectStatus } from "tests/utils";
import { madeInAbyss } from "~/models/examples";
beforeAll(async () => {
await createSerie(madeInAbyss);
});
describe("Get a staff member", () => {
it("Invalid slug", async () => {
const [resp, body] = await getStaff("sotneuhn", {});
expectStatus(resp, body).toBe(404);
expect(body).toMatchObject({
status: 404,
message: expect.any(String),
});
});
it("Get staff by id", async () => {
const member = madeInAbyss.staff[0].staff;
const [resp, body] = await getStaff(member.slug, {});
expectStatus(resp, body).toBe(200);
expect(body.slug).toBe(member.slug);
expect(body.latinName).toBe(member.latinName);
});
});