Moves the login screen from /login to /auth, logout from /logout to /auth/logout (alongside the existing /auth/login and /auth/callback endpoints), and the public profile route from /u/[id] to /user/[id]. AUTH_REDIRECT_URI and AUTH_POST_LOGOUT_URI already point at /auth/callback and / respectively, so no Zitadel config change is needed for the auth move.
61 lines
1.7 KiB
TypeScript
61 lines
1.7 KiB
TypeScript
import createClient from 'openapi-fetch';
|
|
import { error, fail, redirect, type ActionFailure } from '@sveltejs/kit';
|
|
import type { paths } from '$lib/api/schema';
|
|
import type { SessionUser } from '$lib/types';
|
|
import { apiConfig } from '$lib/server/config';
|
|
|
|
interface ApiClientOptions {
|
|
fetch: typeof fetch;
|
|
accessToken?: string;
|
|
}
|
|
|
|
export function createApiClient({ fetch, accessToken }: ApiClientOptions) {
|
|
return createClient<paths>({
|
|
baseUrl: apiConfig.baseUrl,
|
|
fetch,
|
|
headers: accessToken ? { Authorization: `Bearer ${accessToken}` } : undefined
|
|
});
|
|
}
|
|
|
|
export function requireUser(locals: App.Locals, url: URL): SessionUser {
|
|
if (!locals.user)
|
|
redirect(302, `/auth?returnTo=${encodeURIComponent(url.pathname + url.search)}`);
|
|
return locals.user;
|
|
}
|
|
|
|
export function optionalUser(
|
|
locals: App.Locals,
|
|
url: URL,
|
|
allowAnonymousListening: boolean
|
|
): SessionUser | null {
|
|
if (locals.user) return locals.user;
|
|
if (!allowAnonymousListening)
|
|
redirect(302, `/auth?returnTo=${encodeURIComponent(url.pathname + url.search)}`);
|
|
return null;
|
|
}
|
|
|
|
export function requireAccessTokenAction(
|
|
locals: App.Locals,
|
|
message = 'Inicia sesión.'
|
|
): string | ActionFailure<{ message: string }> {
|
|
return locals.accessToken ?? fail(401, { message });
|
|
}
|
|
|
|
export function unwrapOrError<T>(
|
|
result: { data?: T; error?: unknown; response?: Response },
|
|
message: string,
|
|
status?: number
|
|
): T {
|
|
if (result.error || result.data === undefined) {
|
|
error(status ?? result.response?.status ?? 502, message);
|
|
}
|
|
return result.data;
|
|
}
|
|
|
|
export function unwrapOrFail(
|
|
result: { error?: unknown },
|
|
message: string
|
|
): ActionFailure<{ message: string }> | undefined {
|
|
return result.error ? fail(502, { message }) : undefined;
|
|
}
|