mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-05-30 19:54:16 -04:00
Read `preferOriginal from jwt settings (#882)
This commit is contained in:
commit
68270c1343
@ -1,7 +1,9 @@
|
|||||||
import { TypeCompiler } from "@sinclair/typebox/compiler";
|
import { TypeCompiler } from "@sinclair/typebox/compiler";
|
||||||
|
import { Value } from "@sinclair/typebox/value";
|
||||||
import Elysia, { t } from "elysia";
|
import Elysia, { t } from "elysia";
|
||||||
import { createRemoteJWKSet, jwtVerify } from "jose";
|
import { createRemoteJWKSet, jwtVerify } from "jose";
|
||||||
import { KError } from "./models/error";
|
import { KError } from "./models/error";
|
||||||
|
import type { Prettify } from "./utils";
|
||||||
|
|
||||||
const jwtSecret = process.env.JWT_SECRET
|
const jwtSecret = process.env.JWT_SECRET
|
||||||
? new TextEncoder().encode(process.env.JWT_SECRET)
|
? new TextEncoder().encode(process.env.JWT_SECRET)
|
||||||
@ -13,12 +15,22 @@ const jwks = createRemoteJWKSet(
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const Settings = t.Object(
|
||||||
|
{
|
||||||
|
preferOriginal: t.Boolean({ default: true }),
|
||||||
|
},
|
||||||
|
{ additionalProperties: true },
|
||||||
|
);
|
||||||
|
type Settings = typeof Settings.static;
|
||||||
|
|
||||||
const Jwt = t.Object({
|
const Jwt = t.Object({
|
||||||
sub: t.String({ description: "User id" }),
|
sub: t.String({ description: "User id" }),
|
||||||
sid: t.String({ description: "Session id" }),
|
sid: t.String({ description: "Session id" }),
|
||||||
username: t.String(),
|
username: t.String(),
|
||||||
permissions: t.Array(t.String()),
|
permissions: t.Array(t.String()),
|
||||||
|
settings: t.Optional(t.Partial(Settings, { default: {} })),
|
||||||
});
|
});
|
||||||
|
type Jwt = typeof Jwt.static;
|
||||||
const validator = TypeCompiler.Compile(Jwt);
|
const validator = TypeCompiler.Compile(Jwt);
|
||||||
|
|
||||||
export const auth = new Elysia({ name: "auth" })
|
export const auth = new Elysia({ name: "auth" })
|
||||||
@ -44,7 +56,10 @@ export const auth = new Elysia({ name: "auth" })
|
|||||||
const { payload } = await jwtVerify(bearer, jwtSecret ?? jwks, {
|
const { payload } = await jwtVerify(bearer, jwtSecret ?? jwks, {
|
||||||
issuer: process.env.JWT_ISSUER,
|
issuer: process.env.JWT_ISSUER,
|
||||||
});
|
});
|
||||||
const jwt = validator.Decode(payload);
|
const raw = validator.Decode(payload);
|
||||||
|
const jwt = Value.Default(Jwt, raw) as Prettify<
|
||||||
|
Jwt & { settings: Settings }
|
||||||
|
>;
|
||||||
|
|
||||||
return { jwt };
|
return { jwt };
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -100,7 +100,7 @@ export const watchlistH = new Elysia({ tags: ["profiles"] })
|
|||||||
query: { limit, after, query, sort, filter, preferOriginal },
|
query: { limit, after, query, sort, filter, preferOriginal },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
request: { url },
|
request: { url },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
}) => {
|
}) => {
|
||||||
const langs = processLanguages(languages);
|
const langs = processLanguages(languages);
|
||||||
const items = await getShows({
|
const items = await getShows({
|
||||||
@ -114,7 +114,7 @@ export const watchlistH = new Elysia({ tags: ["profiles"] })
|
|||||||
filter,
|
filter,
|
||||||
),
|
),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
return createPage(items, { url, sort, limit });
|
return createPage(items, { url, sort, limit });
|
||||||
@ -138,6 +138,7 @@ export const watchlistH = new Elysia({ tags: ["profiles"] })
|
|||||||
async ({
|
async ({
|
||||||
params: { id },
|
params: { id },
|
||||||
query: { limit, after, query, sort, filter, preferOriginal },
|
query: { limit, after, query, sort, filter, preferOriginal },
|
||||||
|
jwt: { settings },
|
||||||
headers: { "accept-language": languages, authorization },
|
headers: { "accept-language": languages, authorization },
|
||||||
request: { url },
|
request: { url },
|
||||||
error,
|
error,
|
||||||
@ -157,7 +158,7 @@ export const watchlistH = new Elysia({ tags: ["profiles"] })
|
|||||||
filter,
|
filter,
|
||||||
),
|
),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
userId: uInfo.id,
|
userId: uInfo.id,
|
||||||
});
|
});
|
||||||
return createPage(items, { url, sort, limit });
|
return createPage(items, { url, sort, limit });
|
||||||
|
@ -40,7 +40,7 @@ export const collections = new Elysia({
|
|||||||
params: { id },
|
params: { id },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
query: { preferOriginal, with: relations },
|
query: { preferOriginal, with: relations },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
error,
|
error,
|
||||||
set,
|
set,
|
||||||
}) => {
|
}) => {
|
||||||
@ -53,7 +53,7 @@ export const collections = new Elysia({
|
|||||||
),
|
),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
fallbackLanguage: langs.includes("*"),
|
fallbackLanguage: langs.includes("*"),
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
relations,
|
relations,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
@ -144,7 +144,7 @@ export const collections = new Elysia({
|
|||||||
async ({
|
async ({
|
||||||
query: { limit, after, query, sort, filter, preferOriginal },
|
query: { limit, after, query, sort, filter, preferOriginal },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
request: { url },
|
request: { url },
|
||||||
}) => {
|
}) => {
|
||||||
const langs = processLanguages(languages);
|
const langs = processLanguages(languages);
|
||||||
@ -155,7 +155,7 @@ export const collections = new Elysia({
|
|||||||
sort,
|
sort,
|
||||||
filter: and(eq(shows.kind, "collection"), filter),
|
filter: and(eq(shows.kind, "collection"), filter),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
return createPage(items, { url, sort, limit });
|
return createPage(items, { url, sort, limit });
|
||||||
@ -228,7 +228,7 @@ export const collections = new Elysia({
|
|||||||
params: { id },
|
params: { id },
|
||||||
query: { limit, after, query, sort, filter, preferOriginal },
|
query: { limit, after, query, sort, filter, preferOriginal },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
request: { url },
|
request: { url },
|
||||||
error,
|
error,
|
||||||
}) => {
|
}) => {
|
||||||
@ -262,7 +262,7 @@ export const collections = new Elysia({
|
|||||||
filter,
|
filter,
|
||||||
),
|
),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
return createPage(items, { url, sort, limit });
|
return createPage(items, { url, sort, limit });
|
||||||
@ -285,7 +285,7 @@ export const collections = new Elysia({
|
|||||||
params: { id },
|
params: { id },
|
||||||
query: { limit, after, query, sort, filter, preferOriginal },
|
query: { limit, after, query, sort, filter, preferOriginal },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
request: { url },
|
request: { url },
|
||||||
error,
|
error,
|
||||||
}) => {
|
}) => {
|
||||||
@ -319,7 +319,7 @@ export const collections = new Elysia({
|
|||||||
filter,
|
filter,
|
||||||
),
|
),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
return createPage(items, { url, sort, limit });
|
return createPage(items, { url, sort, limit });
|
||||||
@ -342,7 +342,7 @@ export const collections = new Elysia({
|
|||||||
params: { id },
|
params: { id },
|
||||||
query: { limit, after, query, sort, filter, preferOriginal },
|
query: { limit, after, query, sort, filter, preferOriginal },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
request: { url },
|
request: { url },
|
||||||
error,
|
error,
|
||||||
}) => {
|
}) => {
|
||||||
@ -372,7 +372,7 @@ export const collections = new Elysia({
|
|||||||
sort,
|
sort,
|
||||||
filter: and(eq(shows.collectionPk, collection.pk), filter),
|
filter: and(eq(shows.collectionPk, collection.pk), filter),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
return createPage(items, { url, sort, limit });
|
return createPage(items, { url, sort, limit });
|
||||||
|
@ -30,7 +30,7 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] })
|
|||||||
params: { id },
|
params: { id },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
query: { preferOriginal, with: relations },
|
query: { preferOriginal, with: relations },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
error,
|
error,
|
||||||
set,
|
set,
|
||||||
}) => {
|
}) => {
|
||||||
@ -43,7 +43,7 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] })
|
|||||||
),
|
),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
fallbackLanguage: langs.includes("*"),
|
fallbackLanguage: langs.includes("*"),
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
relations,
|
relations,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
@ -135,7 +135,7 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] })
|
|||||||
query: { limit, after, query, sort, filter, preferOriginal },
|
query: { limit, after, query, sort, filter, preferOriginal },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
request: { url },
|
request: { url },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
}) => {
|
}) => {
|
||||||
const langs = processLanguages(languages);
|
const langs = processLanguages(languages);
|
||||||
const items = await getShows({
|
const items = await getShows({
|
||||||
@ -145,7 +145,7 @@ export const movies = new Elysia({ prefix: "/movies", tags: ["movies"] })
|
|||||||
sort,
|
sort,
|
||||||
filter: and(eq(shows.kind, "movie"), filter),
|
filter: and(eq(shows.kind, "movie"), filter),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
return createPage(items, { url, sort, limit });
|
return createPage(items, { url, sort, limit });
|
||||||
|
@ -30,7 +30,7 @@ export const series = new Elysia({ prefix: "/series", tags: ["series"] })
|
|||||||
params: { id },
|
params: { id },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
query: { preferOriginal, with: relations },
|
query: { preferOriginal, with: relations },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
error,
|
error,
|
||||||
set,
|
set,
|
||||||
}) => {
|
}) => {
|
||||||
@ -43,7 +43,7 @@ export const series = new Elysia({ prefix: "/series", tags: ["series"] })
|
|||||||
),
|
),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
fallbackLanguage: langs.includes("*"),
|
fallbackLanguage: langs.includes("*"),
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
relations,
|
relations,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
@ -138,7 +138,7 @@ export const series = new Elysia({ prefix: "/series", tags: ["series"] })
|
|||||||
query: { limit, after, query, sort, filter, preferOriginal },
|
query: { limit, after, query, sort, filter, preferOriginal },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
request: { url },
|
request: { url },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
}) => {
|
}) => {
|
||||||
const langs = processLanguages(languages);
|
const langs = processLanguages(languages);
|
||||||
const items = await getShows({
|
const items = await getShows({
|
||||||
@ -148,7 +148,7 @@ export const series = new Elysia({ prefix: "/series", tags: ["series"] })
|
|||||||
sort,
|
sort,
|
||||||
filter: and(eq(shows.kind, "serie"), filter),
|
filter: and(eq(shows.kind, "serie"), filter),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
return createPage(items, { url, sort, limit });
|
return createPage(items, { url, sort, limit });
|
||||||
|
@ -65,7 +65,7 @@ export const showsH = new Elysia({ prefix: "/shows", tags: ["shows"] })
|
|||||||
},
|
},
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
request: { url },
|
request: { url },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
}) => {
|
}) => {
|
||||||
const langs = processLanguages(languages);
|
const langs = processLanguages(languages);
|
||||||
const items = await getShows({
|
const items = await getShows({
|
||||||
@ -78,7 +78,7 @@ export const showsH = new Elysia({ prefix: "/shows", tags: ["shows"] })
|
|||||||
filter,
|
filter,
|
||||||
),
|
),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
return createPage(items, { url, sort, limit });
|
return createPage(items, { url, sort, limit });
|
||||||
|
@ -191,7 +191,7 @@ export const staffH = new Elysia({ tags: ["staff"] })
|
|||||||
query: { limit, after, query, sort, filter, preferOriginal },
|
query: { limit, after, query, sort, filter, preferOriginal },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
request: { url },
|
request: { url },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
error,
|
error,
|
||||||
}) => {
|
}) => {
|
||||||
const [member] = await db
|
const [member] = await db
|
||||||
@ -243,7 +243,7 @@ export const staffH = new Elysia({ tags: ["staff"] })
|
|||||||
kind: sql<any>`${shows.kind}`,
|
kind: sql<any>`${shows.kind}`,
|
||||||
isAvailable: sql<boolean>`${shows.availableCount} != 0`,
|
isAvailable: sql<boolean>`${shows.availableCount} != 0`,
|
||||||
|
|
||||||
...(preferOriginal && {
|
...((preferOriginal ?? settings.preferOriginal) && {
|
||||||
poster: sql<Image>`coalesce(nullif(${shows.original}->'poster', 'null'::jsonb), ${transQ.poster})`,
|
poster: sql<Image>`coalesce(nullif(${shows.original}->'poster', 'null'::jsonb), ${transQ.poster})`,
|
||||||
thumbnail: sql<Image>`coalesce(nullif(${shows.original}->'thumbnail', 'null'::jsonb), ${transQ.thumbnail})`,
|
thumbnail: sql<Image>`coalesce(nullif(${shows.original}->'thumbnail', 'null'::jsonb), ${transQ.thumbnail})`,
|
||||||
banner: sql<Image>`coalesce(nullif(${shows.original}->'banner', 'null'::jsonb), ${transQ.banner})`,
|
banner: sql<Image>`coalesce(nullif(${shows.original}->'banner', 'null'::jsonb), ${transQ.banner})`,
|
||||||
|
@ -303,7 +303,7 @@ export const studiosH = new Elysia({ prefix: "/studios", tags: ["studios"] })
|
|||||||
params: { id },
|
params: { id },
|
||||||
query: { limit, after, query, sort, filter, preferOriginal },
|
query: { limit, after, query, sort, filter, preferOriginal },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
request: { url },
|
request: { url },
|
||||||
error,
|
error,
|
||||||
}) => {
|
}) => {
|
||||||
@ -341,7 +341,7 @@ export const studiosH = new Elysia({ prefix: "/studios", tags: ["studios"] })
|
|||||||
filter,
|
filter,
|
||||||
),
|
),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
return createPage(items, { url, sort, limit });
|
return createPage(items, { url, sort, limit });
|
||||||
@ -364,7 +364,7 @@ export const studiosH = new Elysia({ prefix: "/studios", tags: ["studios"] })
|
|||||||
params: { id },
|
params: { id },
|
||||||
query: { limit, after, query, sort, filter, preferOriginal },
|
query: { limit, after, query, sort, filter, preferOriginal },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
request: { url },
|
request: { url },
|
||||||
error,
|
error,
|
||||||
}) => {
|
}) => {
|
||||||
@ -403,7 +403,7 @@ export const studiosH = new Elysia({ prefix: "/studios", tags: ["studios"] })
|
|||||||
filter,
|
filter,
|
||||||
),
|
),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
return createPage(items, { url, sort, limit });
|
return createPage(items, { url, sort, limit });
|
||||||
@ -426,7 +426,7 @@ export const studiosH = new Elysia({ prefix: "/studios", tags: ["studios"] })
|
|||||||
params: { id },
|
params: { id },
|
||||||
query: { limit, after, query, sort, filter, preferOriginal },
|
query: { limit, after, query, sort, filter, preferOriginal },
|
||||||
headers: { "accept-language": languages },
|
headers: { "accept-language": languages },
|
||||||
jwt: { sub },
|
jwt: { sub, settings },
|
||||||
request: { url },
|
request: { url },
|
||||||
error,
|
error,
|
||||||
}) => {
|
}) => {
|
||||||
@ -465,7 +465,7 @@ export const studiosH = new Elysia({ prefix: "/studios", tags: ["studios"] })
|
|||||||
filter,
|
filter,
|
||||||
),
|
),
|
||||||
languages: langs,
|
languages: langs,
|
||||||
preferOriginal,
|
preferOriginal: preferOriginal ?? settings.preferOriginal,
|
||||||
userId: sub,
|
userId: sub,
|
||||||
});
|
});
|
||||||
return createPage(items, { url, sort, limit });
|
return createPage(items, { url, sort, limit });
|
||||||
|
@ -126,7 +126,7 @@ describe("Set & get history", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// extras, unknowns
|
// TODO: extras, unknowns
|
||||||
|
|
||||||
it("Update watchlist", async () => {
|
it("Update watchlist", async () => {
|
||||||
const [resp, body] = await getWatchlist("me", {});
|
const [resp, body] = await getWatchlist("me", {});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user