From b89d0e7dada186e31be37e62a7a75efc2dbe9c99 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sat, 26 Aug 2023 22:29:03 -0700 Subject: feat: initial build --- src/routes/+layout.server.ts | 5 +++ src/routes/+layout.svelte | 45 +++++++++++++++++++ src/routes/+page.svelte | 60 +++++++++++++++++++++++++ src/routes/anilist/increment/+server.ts | 27 +++++++++++ src/routes/authentication/log-out/+server.ts | 7 +++ src/routes/oauth/callback/+server.ts | 34 ++++++++++++++ src/routes/settings/+page.svelte | 67 ++++++++++++++++++++++++++++ 7 files changed, 245 insertions(+) create mode 100644 src/routes/+layout.server.ts create mode 100644 src/routes/+layout.svelte create mode 100644 src/routes/+page.svelte create mode 100644 src/routes/anilist/increment/+server.ts create mode 100644 src/routes/authentication/log-out/+server.ts create mode 100644 src/routes/oauth/callback/+server.ts create mode 100644 src/routes/settings/+page.svelte (limited to 'src/routes') diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts new file mode 100644 index 00000000..9f05cf68 --- /dev/null +++ b/src/routes/+layout.server.ts @@ -0,0 +1,5 @@ +export const load = ({ locals }) => { + const { user } = locals; + + return { user }; +}; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 00000000..2445967e --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,45 @@ + + +

+ +

期限

+ +{#if data.user === undefined} + Log in with AniList +{:else} + Log out from AniList {currentUserIdentity.name} +{/if} + +{#if !lastActivityWasToday} +

+ +

You don't have any new activity statuses from the past day! Create one to keep your streak!

+{/if} + +

+ +


+ + diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte new file mode 100644 index 00000000..ccd4b119 --- /dev/null +++ b/src/routes/+page.svelte @@ -0,0 +1,60 @@ + + +Settings + +{#if data.user === undefined} + Please log in to view due media. +{:else} +

+ +

+ {#if currentUserIdentity.id != -1} + + {:else} + Anime +
  • Loading ...
+ {/if} +
+ +

+ +

+ {#if currentUserIdentity.id != -1} + + {:else} + Manga +
  • Loading ...
+ {/if} +
+{/if} diff --git a/src/routes/anilist/increment/+server.ts b/src/routes/anilist/increment/+server.ts new file mode 100644 index 00000000..4680236b --- /dev/null +++ b/src/routes/anilist/increment/+server.ts @@ -0,0 +1,27 @@ +export const GET = async ({ url, cookies }) => { + const userCookie = cookies.get('user'); + + if (!userCookie) { + return new Response('Unauthenticated', { status: 401 }); + } + + const user = JSON.parse(userCookie); + + return Response.json( + await ( + await fetch('https://graphql.anilist.co', { + method: 'POST', + headers: { + Authorization: `${user['token_type']} ${user['access_token']}`, + 'Content-Type': 'application/json', + Accept: 'application/json' + }, + body: JSON.stringify({ + query: `mutation { SaveMediaListEntry(mediaId: ${ + url.searchParams.get('id') || 'null' + }, progress: ${url.searchParams.get('progress') || 'null'}) { id } }` + }) + }) + ).json() + ); +}; diff --git a/src/routes/authentication/log-out/+server.ts b/src/routes/authentication/log-out/+server.ts new file mode 100644 index 00000000..22ef49d8 --- /dev/null +++ b/src/routes/authentication/log-out/+server.ts @@ -0,0 +1,7 @@ +import { redirect } from '@sveltejs/kit'; + +export const GET = ({ cookies }) => { + cookies.delete('user', { path: '/' }); + + throw redirect(303, '/'); +}; diff --git a/src/routes/oauth/callback/+server.ts b/src/routes/oauth/callback/+server.ts new file mode 100644 index 00000000..4b0b6739 --- /dev/null +++ b/src/routes/oauth/callback/+server.ts @@ -0,0 +1,34 @@ +import { dev } from '$app/environment'; +import { ANILIST_CLIENT_SECRET } from '$env/static/private'; +import { PUBLIC_ANILIST_CLIENT_ID, PUBLIC_ANILIST_REDIRECT_URI } from '$env/static/public'; +import { redirect } from '@sveltejs/kit'; + +export const GET = async ({ url, cookies }) => { + const formData = new FormData(); + + formData.append('grant_type', 'authorization_code'); + formData.append('client_id', PUBLIC_ANILIST_CLIENT_ID); + formData.append('client_secret', ANILIST_CLIENT_SECRET); + formData.append('redirect_uri', PUBLIC_ANILIST_REDIRECT_URI); + formData.append('code', url.searchParams.get('code') || "null"); + cookies.set( + 'user', + JSON.stringify( + await ( + await fetch('https://anilist.co/api/v2/oauth/token', { + method: 'POST', + body: formData + }) + ).json() + ), + { + path: '/', + maxAge: 60 * 60 * 24 * 7, + httpOnly: true, + sameSite: 'strict', + secure: !dev + } + ); + + throw redirect(303, '/'); +}; diff --git a/src/routes/settings/+page.svelte b/src/routes/settings/+page.svelte new file mode 100644 index 00000000..cdd268f9 --- /dev/null +++ b/src/routes/settings/+page.svelte @@ -0,0 +1,67 @@ + + +Home + +

+ +{#if data.user === undefined} + not +{:else} +

+{/if} -- cgit v1.2.3