diff --git a/api/src/auth.ts b/api/src/auth.ts index 10cb1fb0..ba1d9932 100644 --- a/api/src/auth.ts +++ b/api/src/auth.ts @@ -46,6 +46,7 @@ async function verifyJwt(bearer: string) { export const auth = new Elysia({ name: "auth" }) .guard({ + schema: "standalone", headers: t.Object( { authorization: t.Optional(t.TemplateLiteral("Bearer ${string}")), diff --git a/api/src/base.ts b/api/src/base.ts index ee8f608a..2df28920 100644 --- a/api/src/base.ts +++ b/api/src/base.ts @@ -16,7 +16,7 @@ import { staffH } from "./controllers/staff"; import { studiosH } from "./controllers/studios"; import { videosReadH, videosWriteH } from "./controllers/videos"; import { dbRaw } from "./db"; -import type { KError } from "./models/error"; +import { KError } from "./models/error"; import { appWs } from "./websockets"; const logger = getLogger(); @@ -98,11 +98,10 @@ export const handlers = new Elysia({ prefix }) detail: { security: [{ bearer: ["core.read"] }, { api: ["core.read"] }], }, - // See https://github.com/elysiajs/elysia/issues/1158 - // response: { - // 401: { ...KError, description: "" }, - // 403: { ...KError, description: "" }, - // }, + response: { + 401: { ...KError, description: "" }, + 403: { ...KError, description: "" }, + }, permissions: ["core.read"], }, (app) => @@ -126,11 +125,10 @@ export const handlers = new Elysia({ prefix }) detail: { security: [{ bearer: ["core.write"] }, { api: ["core.write"] }], }, - // See https://github.com/elysiajs/elysia/issues/1158 - // response: { - // 401: { ...KError, description: "" }, - // 403: { ...KError, description: "" }, - // }, + response: { + 401: { ...KError, description: "" }, + 403: { ...KError, description: "" }, + }, permissions: ["core.write"], }, (app) => app.use(videosWriteH).use(seed), diff --git a/api/src/controllers/entries.ts b/api/src/controllers/entries.ts index d8a8b671..f0709ddc 100644 --- a/api/src/controllers/entries.ts +++ b/api/src/controllers/entries.ts @@ -396,12 +396,9 @@ export const entriesH = new Elysia({ tags: ["series"] }) }), after: t.Optional(t.String({ description: description.after })), }), - headers: t.Object( - { - "accept-language": AcceptLanguage({ autoFallback: true }), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage({ autoFallback: true }), + }), response: { 200: Page(Entry), 404: { @@ -516,12 +513,9 @@ export const entriesH = new Elysia({ tags: ["series"] }) }, { detail: { description: "Get new movies/episodes added recently." }, - headers: t.Object( - { - "accept-language": AcceptLanguage({ autoFallback: true }), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage({ autoFallback: true }), + }), query: t.Object({ filter: t.Optional(Filter({ def: entryFilters })), query: t.Optional(t.String({ description: description.query })), diff --git a/api/src/controllers/profiles/history.ts b/api/src/controllers/profiles/history.ts index 12646e4f..a4f80be4 100644 --- a/api/src/controllers/profiles/history.ts +++ b/api/src/controllers/profiles/history.ts @@ -374,12 +374,9 @@ export const historyH = new Elysia({ tags: ["profiles"] }) detail: { description: "List your watch history (episodes/movies seen)", }, - headers: t.Object( - { - "accept-language": AcceptLanguage({ autoFallback: true }), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage({ autoFallback: true }), + }), response: { 200: Page(Entry), }, diff --git a/api/src/controllers/profiles/nextup.ts b/api/src/controllers/profiles/nextup.ts index f8a25a3d..c2ffffbe 100644 --- a/api/src/controllers/profiles/nextup.ts +++ b/api/src/controllers/profiles/nextup.ts @@ -130,12 +130,9 @@ export const nextup = new Elysia({ tags: ["profiles"] }) detail: { description: "", }, - headers: t.Object( - { - "accept-language": AcceptLanguage({ autoFallback: true }), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage({ autoFallback: true }), + }), response: { 200: Page(Entry), }, diff --git a/api/src/controllers/profiles/watchlist.ts b/api/src/controllers/profiles/watchlist.ts index 3184c790..7e9dc9cb 100644 --- a/api/src/controllers/profiles/watchlist.ts +++ b/api/src/controllers/profiles/watchlist.ts @@ -165,12 +165,9 @@ export const watchlistH = new Elysia({ tags: ["profiles"] }) }, { detail: { description: "Get all movies/series in your watchlist" }, - headers: t.Object( - { - "accept-language": AcceptLanguage({ autoFallback: true }), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage({ autoFallback: true }), + }), response: { 200: Page( t.Union([ diff --git a/api/src/controllers/seasons.ts b/api/src/controllers/seasons.ts index d96110ba..d08a29b7 100644 --- a/api/src/controllers/seasons.ts +++ b/api/src/controllers/seasons.ts @@ -132,12 +132,9 @@ export const seasonsH = new Elysia({ tags: ["series"] }) }), after: t.Optional(t.String({ description: desc.after })), }), - headers: t.Object( - { - "accept-language": AcceptLanguage({ autoFallback: true }), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage({ autoFallback: true }), + }), response: { 200: Page(Season), 404: { diff --git a/api/src/controllers/shows/collections.ts b/api/src/controllers/shows/collections.ts index 17953dd5..babc4846 100644 --- a/api/src/controllers/shows/collections.ts +++ b/api/src/controllers/shows/collections.ts @@ -92,12 +92,9 @@ export const collections = new Elysia({ description: "Include related resources in the response.", }), }), - headers: t.Object( - { - "accept-language": AcceptLanguage(), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage(), + }), response: { 200: { ...FullCollection, description: "Found" }, 404: { @@ -191,12 +188,9 @@ export const collections = new Elysia({ }), ), }), - headers: t.Object( - { - "accept-language": AcceptLanguage({ autoFallback: true }), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage({ autoFallback: true }), + }), response: { 200: Page(Collection), 422: KError, @@ -227,12 +221,9 @@ export const collections = new Elysia({ }), ), }), - headers: t.Object( - { - "accept-language": AcceptLanguage({ autoFallback: true }), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage({ autoFallback: true }), + }), }) .get( "/:id/movies", diff --git a/api/src/controllers/shows/movies.ts b/api/src/controllers/shows/movies.ts index 2487fe84..79bf33bb 100644 --- a/api/src/controllers/shows/movies.ts +++ b/api/src/controllers/shows/movies.ts @@ -82,12 +82,9 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] }) description: "Include related resources in the response.", }), }), - headers: t.Object( - { - "accept-language": AcceptLanguage(), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage(), + }), response: { 200: { ...FullMovie, description: "Found" }, 404: { @@ -179,12 +176,9 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] }) }), ), }), - headers: t.Object( - { - "accept-language": AcceptLanguage({ autoFallback: true }), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage({ autoFallback: true }), + }), response: { 200: Page(Movie), 422: KError, diff --git a/api/src/controllers/shows/series.ts b/api/src/controllers/shows/series.ts index d750e5ac..73769481 100644 --- a/api/src/controllers/shows/series.ts +++ b/api/src/controllers/shows/series.ts @@ -85,12 +85,9 @@ export const series = new Elysia({ prefix: "/series", tags: ["series"] }) }, ), }), - headers: t.Object( - { - "accept-language": AcceptLanguage(), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage(), + }), response: { 200: { ...FullSerie, description: "Found" }, 404: { @@ -185,12 +182,9 @@ export const series = new Elysia({ prefix: "/series", tags: ["series"] }) }), ), }), - headers: t.Object( - { - "accept-language": AcceptLanguage({ autoFallback: true }), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage({ autoFallback: true }), + }), response: { 200: Page(Serie), 422: KError, diff --git a/api/src/controllers/shows/shows.ts b/api/src/controllers/shows/shows.ts index 0e5e49d0..0452d4c5 100644 --- a/api/src/controllers/shows/shows.ts +++ b/api/src/controllers/shows/shows.ts @@ -147,12 +147,9 @@ export const showsH = new Elysia({ prefix: "/shows", tags: ["shows"] }) }), ), }), - headers: t.Object( - { - "accept-language": AcceptLanguage({ autoFallback: true }), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage({ autoFallback: true }), + }), response: { 200: Page(Show), 422: KError, diff --git a/api/src/controllers/staff.ts b/api/src/controllers/staff.ts index 6f424f62..2d113f21 100644 --- a/api/src/controllers/staff.ts +++ b/api/src/controllers/staff.ts @@ -298,12 +298,9 @@ export const staffH = new Elysia({ tags: ["staff"] }) }), ), }), - headers: t.Object( - { - "accept-language": AcceptLanguage(), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage(), + }), response: { 200: Page(RoleWShow), 404: { diff --git a/api/src/controllers/studios.ts b/api/src/controllers/studios.ts index f8a9d71a..7b090403 100644 --- a/api/src/controllers/studios.ts +++ b/api/src/controllers/studios.ts @@ -178,12 +178,9 @@ export const studiosH = new Elysia({ prefix: "/studios", tags: ["studios"] }) description: "Include related resources in the response.", }), }), - headers: t.Object( - { - "accept-language": AcceptLanguage(), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage(), + }), response: { 200: "studio", 404: { @@ -261,12 +258,9 @@ export const studiosH = new Elysia({ prefix: "/studios", tags: ["studios"] }) }), after: t.Optional(t.String({ description: desc.after })), }), - headers: t.Object( - { - "accept-language": AcceptLanguage({ autoFallback: true }), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage({ autoFallback: true }), + }), response: { 200: Page(Studio), 422: KError, @@ -297,12 +291,9 @@ export const studiosH = new Elysia({ prefix: "/studios", tags: ["studios"] }) }), ), }), - headers: t.Object( - { - "accept-language": AcceptLanguage({ autoFallback: true }), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage({ autoFallback: true }), + }), }) .get( "/:id/shows", diff --git a/api/src/controllers/videos.ts b/api/src/controllers/videos.ts index 24b8b28d..60ebcc89 100644 --- a/api/src/controllers/videos.ts +++ b/api/src/controllers/videos.ts @@ -513,12 +513,9 @@ export const videosReadH = new Elysia({ prefix: "/videos", tags: ["videos"] }) }), ), }), - headers: t.Object( - { - "accept-language": AcceptLanguage(), - }, - { additionalProperties: true }, - ), + headers: t.Object({ + "accept-language": AcceptLanguage(), + }), response: { 200: t.Composite([ Video, diff --git a/api/src/models/utils/sort.ts b/api/src/models/utils/sort.ts index 70bbd6f1..f0f2b5da 100644 --- a/api/src/models/utils/sort.ts +++ b/api/src/models/utils/sort.ts @@ -41,12 +41,12 @@ export const Sort = ( .Transform( t.Array( t.Union([ - t.TemplateLiteral("random:${number}"), t.UnionEnum([ "random", ...Object.keys(values), ...Object.keys(values).map((x) => `-${x}`), ]), + t.TemplateLiteral("random:${number}"), ]), { default: def, diff --git a/api/src/models/video.ts b/api/src/models/video.ts index 3b2ad90b..c012f213 100644 --- a/api/src/models/video.ts +++ b/api/src/models/video.ts @@ -140,13 +140,10 @@ export const Video = t.Composite([ export type Video = Prettify; // type used in entry responses (the slug comes from the entryVideoJoin) -export const EmbeddedVideo = t.Composite( - [ - t.Object({ slug: t.String({ format: "slug" }) }), - t.Omit(Video, ["guess", "createdAt", "updatedAt"]), - ], - { additionalProperties: true }, -); +export const EmbeddedVideo = t.Composite([ + t.Object({ slug: t.String({ format: "slug" }) }), + t.Omit(Video, ["guess", "createdAt", "updatedAt"]), +]); export type EmbeddedVideo = Prettify; registerExamples(Video, bubbleVideo);