Modified app-level files for auth

This commit is contained in:
Justin Edmund 2025-09-09 03:18:37 -07:00
parent 0edf8c4191
commit 76513f1fd5
4 changed files with 78 additions and 13 deletions

10
src/app.d.ts vendored
View file

@ -3,11 +3,17 @@
declare global {
namespace App {
// interface Error {}
// interface Locals {}
interface Locals {
session: {
account: AccountCookie | null
user: UserCookie | null
isAuthenticated: boolean
}
}
// interface PageData {}
// interface PageState {}
// interface Platform {}
}
}
export {};
export {}

View file

@ -1,12 +1,48 @@
import type { Handle } from '@sveltejs/kit';
import { paraglideMiddleware } from '$lib/paraglide/server';
import type { Handle, HandleFetch } from '@sveltejs/kit'
import { sequence } from '@sveltejs/kit/hooks'
import { paraglideMiddleware } from '$lib/paraglide/server'
import { getAccountFromCookies, getUserFromCookies } from '$lib/auth/cookies'
import { PUBLIC_SIERO_API_URL } from '$env/static/public'
const handleParaglide: Handle = ({ event, resolve }) => paraglideMiddleware(event.request, ({ request, locale }) => {
event.request = request;
export const handleSession: Handle = async ({ event, resolve }) => {
const account = getAccountFromCookies(event.cookies)
const user = getUserFromCookies(event.cookies)
return resolve(event, {
transformPageChunk: ({ html }) => html.replace('%paraglide.lang%', locale)
});
});
event.locals.session = {
account,
user,
isAuthenticated: Boolean(account?.token)
}
export const handle: Handle = handleParaglide;
return resolve(event)
}
const handleParaglide: Handle = ({ event, resolve }) =>
paraglideMiddleware(event.request, ({ request, locale }) => {
event.request = request
return resolve(event, {
transformPageChunk: ({ html }) => html.replace('%paraglide.lang%', locale)
})
})
export const handle: Handle = sequence(handleSession, handleParaglide)
const apiOrigin = new URL(PUBLIC_SIERO_API_URL || 'http://localhost:3000/api/v1').origin
export const handleFetch: HandleFetch = async ({ event, request, fetch }) => {
const url = new URL(request.url)
if (url.origin === apiOrigin) {
const token = event.locals.session?.account?.token
if (token) {
request = new Request(request, {
headers: new Headers({
...Object.fromEntries(request.headers),
authorization: `Bearer ${token}`
})
})
}
}
return fetch(request)
}

View file

@ -0,0 +1,20 @@
import type { LayoutServerLoad } from './$types'
export const load: LayoutServerLoad = async ({ locals }) => {
const account = locals.session.account
? {
userId: locals.session.account.userId,
username: locals.session.account.username,
role: locals.session.account.role
}
: null
const currentUser = locals.session.user ?? null
const isAuthenticated = locals.session.isAuthenticated
return {
isAuthenticated,
account,
currentUser
}
}

View file

@ -1,7 +1,10 @@
<script lang="ts">
import favicon from '$lib/assets/favicon.svg';
import favicon from '$lib/assets/favicon.svg'
import 'modern-normalize/modern-normalize.css'
let { children } = $props();
export const prerender = false
let { children } = $props()
</script>
<svelte:head>