From 0fbeaaf6237b62d5220da0418d05cae4487f29bf Mon Sep 17 00:00:00 2001 From: Fuwn Date: Mon, 12 Feb 2024 08:55:11 -0800 Subject: feat(settings): settings sync --- src/routes/+layout.svelte | 13 +++++++++ src/routes/api/configuration/+server.ts | 33 ++++++++++++++++----- src/routes/settings/+page.svelte | 52 +++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 8 deletions(-) (limited to 'src/routes') diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 835b59f7..64f3d28d 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -23,6 +23,7 @@ import Dropdown from '$lib/Dropdown.svelte'; import { injectSpeedInsights } from '@vercel/speed-insights/sveltekit'; import subtitles from '$lib/Data/Static/subtitles.json'; + import settingsSyncPulled from '$stores/settingsSyncPulled'; injectSpeedInsights(); @@ -72,6 +73,18 @@ if (data.user !== undefined && $userIdentity.id === -2) getUserIdentity(data.user).then((h) => userIdentity.set(h)); + + if ($settings.settingsSync && $userIdentity.id !== -2) + fetch(root(`/api/configuration?id=${$userIdentity.id}`)).then((response) => { + if (response.ok) + response.json().then((data) => { + if (data && data.configuration) { + console.log('Pulled remote configuration'); + settings.set(data.configuration); + settingsSyncPulled.set(true); + } + }); + }); }); $: { diff --git a/src/routes/api/configuration/+server.ts b/src/routes/api/configuration/+server.ts index a42d9c54..418742a8 100644 --- a/src/routes/api/configuration/+server.ts +++ b/src/routes/api/configuration/+server.ts @@ -1,5 +1,8 @@ +import { userIdentity } from '$lib/Data/AniList/identity'; import { getUserConfiguration, setUserConfiguration } from '$lib/Database/userConfiguration.js'; +const unauthorised = new Response('Unauthorised', { status: 401 }); + export const GET = async ({ url }) => Response.json(await getUserConfiguration(Number(url.searchParams.get('id') || 0)), { headers: { @@ -7,17 +10,31 @@ export const GET = async ({ url }) => } }); -export const PUT = async ({ url, request }) => - Response.json( - await setUserConfiguration(Number(url.searchParams.get('id') || 0), { - configuration: await request.json(), - updated_at: new Date().toISOString(), - user_id: Number(url.searchParams.get('id') || 0), - created_at: new Date().toISOString() - }), +export const PUT = async ({ cookies, request }) => { + const userCookie = cookies.get('user'); + + if (!userCookie) return unauthorised; + + const user = JSON.parse(userCookie); + + return Response.json( + await setUserConfiguration( + ( + await userIdentity({ + tokenType: user['token_type'], + expiresIn: user['expires_in'], + accessToken: user['access_token'], + refreshToken: user['refresh_token'] + }) + ).id, + { + configuration: await request.json() + } + ), { headers: { 'Access-Control-Allow-Origin': 'https://due.moe' } } ); +}; diff --git a/src/routes/settings/+page.svelte b/src/routes/settings/+page.svelte index 03dcedde..342e73a3 100644 --- a/src/routes/settings/+page.svelte +++ b/src/routes/settings/+page.svelte @@ -16,6 +16,8 @@ import locale from '$stores/locale.js'; import settings from '$stores/settings'; import LogInRestricted from '$lib/Error/LogInRestricted.svelte'; + import root from '$lib/Utility/root'; + import identity from '$stores/identity.js'; export let data; @@ -66,6 +68,56 @@ {#if data.user === undefined} {:else} + + +

+