diff options
Diffstat (limited to 'src/routes/api/badges')
| -rw-r--r-- | src/routes/api/badges/+server.ts | 296 |
1 files changed, 163 insertions, 133 deletions
diff --git a/src/routes/api/badges/+server.ts b/src/routes/api/badges/+server.ts index 35ed4512..46b98cbc 100644 --- a/src/routes/api/badges/+server.ts +++ b/src/routes/api/badges/+server.ts @@ -1,149 +1,179 @@ -import { userIdentity } from '$lib/Data/AniList/identity'; +import { safeUserIdentity } from "$lib/Data/AniList/identity"; +import { decodeAuthCookieOrNull } from "$lib/Effect/authCookie"; +import { decodeRequestJsonOrThrow } from "$lib/Effect/requestBody"; import { - removeAllUserBadges, - removeUserBadge, - updateUserBadge, - getUserBadges, - addUserBadge, - type Badge, - migrateCategory, - setShadowHidden, - setShadowHiddenBadge, - incrementClickCount -} from '$lib/Database/SB/User/badges'; -import privilegedUser from '$lib/Utility/privilegedUser'; - -const unauthorised = new Response('Unauthorised', { status: 401 }); + removeAllUserBadges, + removeUserBadge, + updateUserBadge, + getUserBadges, + addUserBadge, + type Badge, + type BadgeInput, + migrateCategory, + setShadowHidden, + setShadowHiddenBadge, + incrementClickCount, +} from "$lib/Database/SB/User/badges"; +import { Schema } from "effect"; +import { appOrigin, appOriginHeaders } from "$lib/Utility/appOrigin"; +import privilegedUser from "$lib/Utility/privilegedUser"; + +const unauthorised = () => new Response("Unauthorised", { status: 401 }); +const importedBadgeSchema = Schema.Record(Schema.String, Schema.Unknown); const badges = async (id: number) => - Response.json(await getUserBadges(id), { - headers: { - 'Access-Control-Allow-Origin': 'https://due.moe' - } - }); + Response.json(await getUserBadges(id), { + headers: appOriginHeaders(), + }); export const GET = async ({ url }) => { - return await badges(Number(url.searchParams.get('id') || 0)); + return await badges(Number(url.searchParams.get("id") || 0)); }; export const DELETE = async ({ url, cookies }) => { - const userCookie = cookies.get('user'); + const userCookie = cookies.get("user"); - if (!userCookie) return unauthorised; + if (!userCookie) return unauthorised(); - const user = JSON.parse(userCookie); - const identity = await userIdentity({ - tokenType: user['token_type'], - expiresIn: user['expires_in'], - accessToken: user['access_token'], - refreshToken: user['refresh_token'] - }); + const user = decodeAuthCookieOrNull(userCookie); - if ((url.searchParams.get('prune') || 0) === 'true') { - await removeAllUserBadges(identity.id); - } else { - await removeUserBadge(identity.id, Number(url.searchParams.get('id'))); - } + if (!user) return unauthorised(); - return await badges(identity.id); + const identity = await safeUserIdentity(user); + + if (!identity) return unauthorised(); + + if ((url.searchParams.get("prune") || 0) === "true") { + await removeAllUserBadges(identity.id); + } else { + await removeUserBadge(identity.id, Number(url.searchParams.get("id"))); + } + + return await badges(identity.id); }; export const PUT = async ({ cookies, url, request }) => { - if (url.searchParams.get('incrementClickCount') || undefined) { - await incrementClickCount(Number(url.searchParams.get('incrementClickCount'))); - - return new Response('Incremented', { status: 200 }); - } - - const userCookie = cookies.get('user'); - - if (!userCookie) return unauthorised; - - const user = JSON.parse(userCookie); - const identity = await userIdentity({ - tokenType: user['token_type'], - expiresIn: user['expires_in'], - accessToken: user['access_token'], - refreshToken: user['refresh_token'] - }); - const authorised = privilegedUser(identity.id); - - if (url.searchParams.get('shadowHide')) - setShadowHidden(Number(url.searchParams.get('shadowHide')), authorised); - - if (url.searchParams.get('import') || undefined) { - await Promise.all( - (await request.json()).map(async (badge: Badge) => await addUserBadge(identity.id, badge)) - ); - - return await badges(identity.id); - } else if (url.searchParams.get('migrate') || undefined) { - await migrateCategory( - identity.id, - url.searchParams.get('original') || '', - url.searchParams.get('new') || '' - ); - - return await badges(identity.id); - } - - if (url.searchParams.get('hide') || undefined) { - const allBadges = await getUserBadges(identity.id); - - await Promise.all( - allBadges - .filter((badge) => badge.category === (url.searchParams.get('category') || '')) - .map(async (badge) => { - await updateUserBadge(identity.id, badge.id as number, { - ...badge, - hidden: - allBadges - .filter((badge) => badge.category === (url.searchParams.get('category') || '')) - .filter((badge) => badge.hidden).length > - allBadges.filter( - (badge) => badge.category === (url.searchParams.get('category') || '') - ).length / - 2 - ? false - : true - }); - }) - ); - - return await badges(identity.id); - } - - if (url.searchParams.get('shadowHideBadge') || undefined) { - if (!authorised) return unauthorised; - - await setShadowHiddenBadge( - Number(url.searchParams.get('shadowHideBadge')), - url.searchParams.get('status') == 'true' ? false : true - ); - - return await badges(Number(url.searchParams.get('id'))); - } - - const badge = { - post: url.searchParams.get('post') || undefined, - image: url.searchParams.get('image') || undefined, - description: url.searchParams.get('description') || null, - time: url.searchParams.get('time') || undefined, - category: url.searchParams.get('category') || null, - hidden: url.searchParams.get('hidden') || false, - source: url.searchParams.get('source') || null, - designer: url.searchParams.get('designer') || null - }; - - if ( - (await getUserBadges(identity.id)).find( - (badge) => Number(badge.id) === Number(url.searchParams.get('update')) - ) - ) { - await updateUserBadge(identity.id, Number(url.searchParams.get('update')), badge as Badge); - } else { - await addUserBadge(identity.id, badge as Badge); - } - - return await badges(identity.id); + if (url.searchParams.get("incrementClickCount") || undefined) { + if (request.headers.get("origin") !== appOrigin()) return unauthorised(); + + await incrementClickCount( + Number(url.searchParams.get("incrementClickCount")), + ); + + return new Response("Incremented", { status: 200 }); + } + + const userCookie = cookies.get("user"); + + if (!userCookie) return unauthorised(); + + const user = decodeAuthCookieOrNull(userCookie); + + if (!user) return unauthorised(); + + const identity = await safeUserIdentity(user); + + if (!identity) return unauthorised(); + const authorised = privilegedUser(identity.id); + + if (url.searchParams.get("shadowHide")) + await setShadowHidden( + Number(url.searchParams.get("shadowHide")), + authorised, + ); + + if (url.searchParams.get("import") || undefined) { + const importedBadges = await decodeRequestJsonOrThrow( + request, + Schema.Array(importedBadgeSchema), + ); + + await Promise.all( + importedBadges.map( + async (badge) => + await addUserBadge(identity.id, badge as unknown as BadgeInput), + ), + ); + + return await badges(identity.id); + } else if (url.searchParams.get("migrate") || undefined) { + await migrateCategory( + identity.id, + url.searchParams.get("original") || "", + url.searchParams.get("new") || "", + ); + + return await badges(identity.id); + } + + if (url.searchParams.get("hide") || undefined) { + const allBadges = await getUserBadges(identity.id); + + await Promise.all( + allBadges + .filter( + (badge) => + badge.category === (url.searchParams.get("category") || ""), + ) + .map(async (badge) => { + await updateUserBadge(identity.id, badge.id as number, { + ...badge, + hidden: + allBadges + .filter( + (badge) => + badge.category === (url.searchParams.get("category") || ""), + ) + .filter((badge) => badge.hidden).length > + allBadges.filter( + (badge) => + badge.category === (url.searchParams.get("category") || ""), + ).length / + 2 + ? false + : true, + }); + }), + ); + + return await badges(identity.id); + } + + if (url.searchParams.get("shadowHideBadge") || undefined) { + if (!authorised) return unauthorised(); + + await setShadowHiddenBadge( + Number(url.searchParams.get("shadowHideBadge")), + url.searchParams.get("status") === "true" ? false : true, + ); + + return await badges(Number(url.searchParams.get("id"))); + } + + const badge = { + post: url.searchParams.get("post") || undefined, + image: url.searchParams.get("image") || undefined, + description: url.searchParams.get("description") || null, + time: url.searchParams.get("time") || undefined, + category: url.searchParams.get("category") || null, + hidden: url.searchParams.get("hidden") || false, + source: url.searchParams.get("source") || null, + designer: url.searchParams.get("designer") || null, + }; + + if ( + (await getUserBadges(identity.id)).find( + (badge) => Number(badge.id) === Number(url.searchParams.get("update")), + ) + ) { + await updateUserBadge( + identity.id, + Number(url.searchParams.get("update")), + badge as Badge, + ); + } else { + await addUserBadge(identity.id, badge as Badge); + } + + return await badges(identity.id); }; |