mirror of
https://github.com/bretzel-app/crumbs.git
synced 2026-10-12 20:06:57 +02:00
Track session metadata (createdAt, userAgent, ip, lastUsedAt). Add API for listing and revoking sessions. Settings page shows active sessions with "Revoke" per session and "Log out everywhere else" option. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
38 lines
1.0 KiB
TypeScript
38 lines
1.0 KiB
TypeScript
import { json, error } from '@sveltejs/kit';
|
|
import type { RequestHandler } from './$types.js';
|
|
import { setupUser, createSession, isSetupComplete } from '$lib/server/auth.js';
|
|
|
|
export const POST: RequestHandler = async ({ request, cookies, getClientAddress }) => {
|
|
const alreadySetup = await isSetupComplete();
|
|
if (alreadySetup) {
|
|
throw error(400, 'Setup already completed');
|
|
}
|
|
|
|
const { email, displayName, password } = await request.json();
|
|
|
|
if (!email) {
|
|
throw error(400, 'Email is required');
|
|
}
|
|
|
|
if (!password || password.length < 8) {
|
|
throw error(400, 'Password must be at least 8 characters');
|
|
}
|
|
|
|
const user = await setupUser(email, password, displayName);
|
|
if (!user) {
|
|
throw error(500, 'Failed to create user');
|
|
}
|
|
|
|
const userAgent = request.headers.get('user-agent') || undefined;
|
|
const ip = getClientAddress();
|
|
const token = await createSession(user.id, { userAgent, ip });
|
|
cookies.set('session', token, {
|
|
path: '/',
|
|
httpOnly: true,
|
|
sameSite: 'lax',
|
|
maxAge: 30 * 24 * 60 * 60
|
|
});
|
|
|
|
return json({ success: true }, { status: 201 });
|
|
};
|