Vollständige Migration weg von PocketBase. Neuer Stack: - better-sqlite3 (WAL-Mode, direkte SQLite-Abfragen) - jose (JWT HS256, 30 Tage Laufzeit) - bcryptjs (Passwort-Hashing, cost 12) Neue Dateien: - src/lib/server/db.ts → SQLite-Singleton + Schema + Helpers - src/lib/server/auth.ts → JWT sign/verify, bcrypt, Bearer-Token - src/lib/user.ts → Svelte-Store (ersetzt pb.authStore) - src/lib/api.ts → fetch()-Wrapper (ersetzt pb.collection()) - src/app.d.ts → App.Locals TypeScript-Deklaration - 30 neue API-Routes unter src/routes/api/ Entfernt: - Abhängigkeit von pocketbase npm-Paket (bleibt im package.json bis alle Referenzen bereinigt sind) - PocketBase-Container aus docker-compose.yml - Migrations und Hooks aus Deploy-Pipeline Docker: Ein einziger Container, SQLite-Volume unter /data/ Makefile: PocketBase-spezifische Targets entfernt seed.js: Komplett neu für neue REST-API
24 lines
1.3 KiB
TypeScript
24 lines
1.3 KiB
TypeScript
import { json, error } from '@sveltejs/kit';
|
|
import { getDb, newId } from '$lib/server/db';
|
|
import { hashPassword, signJwt } from '$lib/server/auth';
|
|
|
|
export async function POST({ request }) {
|
|
const { vereinName, email, password, name } = await request.json();
|
|
if (!vereinName || !email || !password) throw error(400, 'Pflichtfelder fehlen');
|
|
if (password.length < 8) throw error(400, 'Passwort mindestens 8 Zeichen');
|
|
|
|
const db = getDb();
|
|
const existing = db.prepare('SELECT id FROM users WHERE email = ?').get(email.toLowerCase());
|
|
if (existing) throw error(409, 'E-Mail bereits registriert');
|
|
|
|
const vereinId = newId();
|
|
const userId = newId();
|
|
const hash = await hashPassword(password);
|
|
|
|
db.prepare('INSERT INTO vereine (id, name) VALUES (?, ?)').run(vereinId, vereinName);
|
|
db.prepare('INSERT INTO users (id, verein_id, email, password_hash, name, rolle) VALUES (?, ?, ?, ?, ?, NULL)')
|
|
.run(userId, vereinId, email.toLowerCase(), hash, name || email.split('@')[0]);
|
|
|
|
const token = await signJwt({ sub: userId, verein_id: vereinId, rolle: null, name: name || email.split('@')[0], email: email.toLowerCase() });
|
|
return json({ token, id: userId, verein_id: vereinId, rolle: null, name: name || email.split('@')[0], email: email.toLowerCase() }, { status: 201 });
|
|
}
|