From b47c38ca764258a3ace25b57ec2d3b24720214e8 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sat, 23 Nov 2024 16:02:37 +0100 Subject: [PATCH] Cleanup movie example in swagger --- api/bun.lockb | Bin 39908 -> 39908 bytes api/package.json | 10 +++--- api/src/controllers/movies.ts | 3 +- api/src/db/schema/shows.ts | 2 +- api/src/index.ts | 2 +- api/src/models/examples/bubble.ts | 50 ++++++++++++++++-------------- api/src/models/examples/index.ts | 4 +-- api/src/models/movie.ts | 23 +++++++------- api/src/models/utils/index.ts | 2 -- 9 files changed, 49 insertions(+), 47 deletions(-) diff --git a/api/bun.lockb b/api/bun.lockb index 4a5df0ec1fe08dd60425144f6e74a0916ed44688..7c84570b68663ab83fe343db37afb327f53287dd 100755 GIT binary patch delta 4535 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 I<6evZ0M&Fla{vGU diff --git a/api/package.json b/api/package.json index fc45391f..f9cbdac2 100644 --- a/api/package.json +++ b/api/package.json @@ -9,15 +9,15 @@ }, "dependencies": { "@elysiajs/jwt": "^1.1.1", - "@elysiajs/swagger": "^1.1.5", - "drizzle-kit": "^0.28.0", - "drizzle-orm": "^0.36.1", - "elysia": "^1.1.24", + "@elysiajs/swagger": "^1.1.6", + "drizzle-kit": "^0.28.1", + "drizzle-orm": "^0.36.4", + "elysia": "^1.1.25", "pg": "^8.13.1" }, "devDependencies": { "@types/pg": "^8.11.10", - "bun-types": "^1.1.34" + "bun-types": "^1.1.36" }, "module": "src/index.js" } diff --git a/api/src/controllers/movies.ts b/api/src/controllers/movies.ts index b0aa6c88..ce61824f 100644 --- a/api/src/controllers/movies.ts +++ b/api/src/controllers/movies.ts @@ -44,7 +44,7 @@ const findMovie = db .limit(1) .prepare("findMovie"); -export const movies = new Elysia({ prefix: "/movies" }) +export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] }) .model({ movie: Movie, "movie-translation": MovieTranslation, @@ -58,7 +58,6 @@ export const movies = new Elysia({ prefix: "/movies" }) }), }), response: { 200: "movie", 404: "error" }, - tags: ["Movies"], }) .get( "/:id", diff --git a/api/src/db/schema/shows.ts b/api/src/db/schema/shows.ts index d5902217..ce406f56 100644 --- a/api/src/db/schema/shows.ts +++ b/api/src/db/schema/shows.ts @@ -100,11 +100,11 @@ export const showTranslations = schema.table( tagline: text(), aliases: text().array().notNull(), tags: text().array().notNull(), - trailerUrl: text(), poster: image(), thumbnail: image(), banner: image(), logo: image(), + trailerUrl: text(), }, (t) => [primaryKey({ columns: [t.pk, t.language] })], ); diff --git a/api/src/index.ts b/api/src/index.ts index 07bd1d77..fd157273 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -58,7 +58,7 @@ const app = new Elysia() description: "Kyoo's demo server", }, ], - tags: [{ name: "Movies", description: "Routes about movies" }], + tags: [{ name: "movies", description: "Routes about movies" }], }, }), ) diff --git a/api/src/models/examples/bubble.ts b/api/src/models/examples/bubble.ts index ff9f8ad0..3e9c3850 100644 --- a/api/src/models/examples/bubble.ts +++ b/api/src/models/examples/bubble.ts @@ -10,25 +10,12 @@ export const bubble: SeedMovie = { "In an abandoned Tokyo overrun by bubbles and gravitational abnormalities, one gifted young man has a fateful meeting with a mysterious girl.", aliases: ["Baburu", "バブル:2022", "Bubble"], tags: ["adolescence", "disaster", "battle", "gravity", "anime"], - poster: { - id: "befdc7dd-2a67-0704-92af-90d49eee0315", - source: - "https://image.tmdb.org/t/p/original/65dad96VE8FJPEdrAkhdsuWMWH9.jpg", - blurhash: "LFC@2F;K$%xZ5?W.MwNF0iD~MxR:", - }, - thumbnail: { - id: "b29908f3-a64d-ae98-923b-18bf7995ab04", - source: - "https://image.tmdb.org/t/p/original/a8Q2g0g7XzAF6gcB8qgn37ccb9Y.jpg", - blurhash: "LpH3afE1XAveyGS7t6V[R4xZn+S6", - }, + poster: + "https://image.tmdb.org/t/p/original/65dad96VE8FJPEdrAkhdsuWMWH9.jpg", + thumbnail: + "https://image.tmdb.org/t/p/original/a8Q2g0g7XzAF6gcB8qgn37ccb9Y.jpg", banner: null, - logo: { - id: "3357fad0-de40-4ca5-15e6-eb065d35be86", - source: - "https://image.tmdb.org/t/p/original/ihIs7fayAmZieMlMQbs6TWM77uf.png", - blurhash: "LMDc5#MwE0,sTKE0R*S~4mxunhb_", - }, + logo: "https://image.tmdb.org/t/p/original/ihIs7fayAmZieMlMQbs6TWM77uf.png", trailerUrl: "https://www.youtube.com/watch?v=vs7zsyIZkMM", }, }, @@ -38,8 +25,6 @@ export const bubble: SeedMovie = { runtime: 101, airDate: "2022-02-14", originalLanguage: "ja", - createdAt: "2023-11-29T11:42:06.030838Z", - nextRefresh: "2025-01-07T22:40:59.960952Z", externalId: { themoviedatabase: { dataId: "912598", @@ -52,14 +37,33 @@ export const bubble: SeedMovie = { }, videos: [ { - id: "0934da28-4a49-404e-920b-a150404a3b6d", - slug: "bubble", path: "/video/Bubble/Bubble (2022).mkv", rendering: "459429fa062adeebedcc2bb04b9965de0262bfa453369783132d261be79021bd", part: null, version: 1, - createdAt: "2023-11-29T11:42:06.030838Z", }, ], }; + +export const bubbleImages = { + poster: { + id: "befdc7dd-2a67-0704-92af-90d49eee0315", + source: + "https://image.tmdb.org/t/p/original/65dad96VE8FJPEdrAkhdsuWMWH9.jpg", + blurhash: "LFC@2F;K$%xZ5?W.MwNF0iD~MxR:", + }, + thumbnail: { + id: "b29908f3-a64d-ae98-923b-18bf7995ab04", + source: + "https://image.tmdb.org/t/p/original/a8Q2g0g7XzAF6gcB8qgn37ccb9Y.jpg", + blurhash: "LpH3afE1XAveyGS7t6V[R4xZn+S6", + }, + banner: null, + logo: { + id: "3357fad0-de40-4ca5-15e6-eb065d35be86", + source: + "https://image.tmdb.org/t/p/original/ihIs7fayAmZieMlMQbs6TWM77uf.png", + blurhash: "LMDc5#MwE0,sTKE0R*S~4mxunhb_", + }, +}; diff --git a/api/src/models/examples/index.ts b/api/src/models/examples/index.ts index 2dd5b9f6..16bdb874 100644 --- a/api/src/models/examples/index.ts +++ b/api/src/models/examples/index.ts @@ -1,9 +1,9 @@ import type { TSchema } from "elysia"; -import { KindGuard } from "@sinclair/typebox" +import { KindGuard } from "@sinclair/typebox"; export const registerExamples = ( schema: T, - ...examples: (T["static"] | undefined)[] + ...examples: (Partial| undefined)[] ) => { if (KindGuard.IsUnion(schema)) { for (const union of schema.anyOf) { diff --git a/api/src/models/movie.ts b/api/src/models/movie.ts index c19ee5be..d5036079 100644 --- a/api/src/models/movie.ts +++ b/api/src/models/movie.ts @@ -1,19 +1,15 @@ import { t } from "elysia"; -import { - ExternalId, - Genre, - Image, - Language, - Resource, - SeedImage, -} from "./utils"; +import { ExternalId, Genre, Image, Language, SeedImage } from "./utils"; import { SeedVideo } from "./video"; import { bubble, registerExamples } from "./examples"; +import { bubbleImages } from "./examples/bubble"; export const MovieStatus = t.UnionEnum(["unknown", "finished", "planned"]); export type MovieStatus = typeof MovieStatus.static; const BaseMovie = t.Object({ + id: t.String({ format: "uuid" }), + slug: t.String({ format: "slug" }), genres: t.Array(Genre), rating: t.Nullable(t.Number({ minimum: 0, maximum: 100 })), status: MovieStatus, @@ -33,6 +29,7 @@ const BaseMovie = t.Object({ externalId: ExternalId, }); + export const MovieTranslation = t.Object({ name: t.String(), description: t.Nullable(t.String()), @@ -48,13 +45,12 @@ export const MovieTranslation = t.Object({ }); export type MovieTranslation = typeof MovieTranslation.static; -export const Movie = t.Intersect([Resource, MovieTranslation, BaseMovie]); +export const Movie = t.Intersect([BaseMovie, MovieTranslation]); export type Movie = typeof Movie.static; export const SeedMovie = t.Intersect([ - t.Omit(BaseMovie, ["createdAt", "nextRefresh"]), + t.Omit(BaseMovie, ["id", "createdAt", "nextRefresh"]), t.Object({ - slug: t.String({ format: "slug" }), translations: t.Record( Language(), t.Intersect([ @@ -75,4 +71,9 @@ export const SeedMovie = t.Intersect([ ]); export type SeedMovie = typeof SeedMovie.static; +registerExamples(Movie, { + ...bubble, + ...bubble.translations.en, + ...bubbleImages, +}); registerExamples(SeedMovie, bubble); diff --git a/api/src/models/utils/index.ts b/api/src/models/utils/index.ts index 0b7bef19..98134fc5 100644 --- a/api/src/models/utils/index.ts +++ b/api/src/models/utils/index.ts @@ -1,5 +1,3 @@ -export const ref = (id: string) => `#/components/schemas/${id}`; - export * from "./external-id"; export * from "./genres"; export * from "./image";