Fix: Route-Namen (orte/ort-ausfaelle) und /api/users ergänzt
This commit is contained in:
parent
39981c0d17
commit
957c4a9707
4 changed files with 74 additions and 9 deletions
|
|
@ -32,8 +32,8 @@
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
[orte, ausfaelle] = await Promise.all([
|
[orte, ausfaelle] = await Promise.all([
|
||||||
api.get<Veranstaltungsort[]>('/veranstaltungsorte', { sort: 'name' }),
|
api.get<Veranstaltungsort[]>('/orte', { sort: 'name' }),
|
||||||
api.get<OrtAusfall[]>('/ort_ausfaelle', { sort: 'von' }),
|
api.get<OrtAusfall[]>('/ort-ausfaelle', { sort: 'von' }),
|
||||||
]);
|
]);
|
||||||
loading = false;
|
loading = false;
|
||||||
});
|
});
|
||||||
|
|
@ -55,10 +55,10 @@
|
||||||
try {
|
try {
|
||||||
const data = { name: fName.trim(), adresse: fAdresse.trim() || null, typ: fTyp, aktiv: fAktiv };
|
const data = { name: fName.trim(), adresse: fAdresse.trim() || null, typ: fTyp, aktiv: fAktiv };
|
||||||
if (editOrtId) {
|
if (editOrtId) {
|
||||||
const u = await api.put<Veranstaltungsort>('/veranstaltungsorte/' + editOrtId, data);
|
const u = await api.put<Veranstaltungsort>('/orte/' + editOrtId, data);
|
||||||
orte = orte.map(o => o.id === editOrtId ? u : o);
|
orte = orte.map(o => o.id === editOrtId ? u : o);
|
||||||
} else {
|
} else {
|
||||||
const n = await api.post<Veranstaltungsort>('/veranstaltungsorte', data);
|
const n = await api.post<Veranstaltungsort>('/orte', data);
|
||||||
orte = [...orte, n].sort((a, b) => a.name.localeCompare(b.name));
|
orte = [...orte, n].sort((a, b) => a.name.localeCompare(b.name));
|
||||||
}
|
}
|
||||||
showOrtForm = false;
|
showOrtForm = false;
|
||||||
|
|
@ -71,7 +71,7 @@
|
||||||
|
|
||||||
async function ortLoeschen(id: string) {
|
async function ortLoeschen(id: string) {
|
||||||
if (!confirm('Ort wirklich löschen? Alle verknüpften Termine verlieren die Ortzuordnung.')) return;
|
if (!confirm('Ort wirklich löschen? Alle verknüpften Termine verlieren die Ortzuordnung.')) return;
|
||||||
await api.del('/veranstaltungsorte/' + id);
|
await api.del('/orte/' + id);
|
||||||
orte = orte.filter(o => o.id !== id);
|
orte = orte.filter(o => o.id !== id);
|
||||||
ausfaelle = ausfaelle.filter(a => a.ort_id !== id);
|
ausfaelle = ausfaelle.filter(a => a.ort_id !== id);
|
||||||
}
|
}
|
||||||
|
|
@ -86,7 +86,7 @@
|
||||||
if (aVon > aBis) { ausfallError = 'Bis muss nach Von liegen.'; return; }
|
if (aVon > aBis) { ausfallError = 'Bis muss nach Von liegen.'; return; }
|
||||||
ausfallError = ''; ausfallSaving = true;
|
ausfallError = ''; ausfallSaving = true;
|
||||||
try {
|
try {
|
||||||
const n = await api.post<OrtAusfall>('/ort_ausfaelle', {
|
const n = await api.post<OrtAusfall>('/ort-ausfaelle', {
|
||||||
ort_id: aOrtId, von: aVon, bis: aBis, grund: aGrund.trim() || null,
|
ort_id: aOrtId, von: aVon, bis: aBis, grund: aGrund.trim() || null,
|
||||||
});
|
});
|
||||||
ausfaelle = [...ausfaelle, n].sort((a, b) => a.von.localeCompare(b.von));
|
ausfaelle = [...ausfaelle, n].sort((a, b) => a.von.localeCompare(b.von));
|
||||||
|
|
@ -99,7 +99,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
async function ausfallLoeschen(id: string) {
|
async function ausfallLoeschen(id: string) {
|
||||||
await api.del('/ort_ausfaelle/' + id);
|
await api.del('/ort-ausfaelle/' + id);
|
||||||
ausfaelle = ausfaelle.filter(a => a.id !== id);
|
ausfaelle = ausfaelle.filter(a => a.id !== id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -67,8 +67,8 @@
|
||||||
isAdmin()
|
isAdmin()
|
||||||
? api.get<any[]>('/users', { rolle: 'trainer' })
|
? api.get<any[]>('/users', { rolle: 'trainer' })
|
||||||
: Promise.resolve([]),
|
: Promise.resolve([]),
|
||||||
api.get<Veranstaltungsort[]>('/veranstaltungsorte', { sort: 'name', aktiv: 'true' }),
|
api.get<Veranstaltungsort[]>('/orte', { sort: 'name', aktiv: 'true' }),
|
||||||
api.get<OrtAusfall[]>('/ort_ausfaelle', { sort: 'von' }),
|
api.get<OrtAusfall[]>('/ort-ausfaelle', { sort: 'von' }),
|
||||||
]);
|
]);
|
||||||
loading = false;
|
loading = false;
|
||||||
});
|
});
|
||||||
|
|
|
||||||
18
app/src/routes/api/users/+server.ts
Normal file
18
app/src/routes/api/users/+server.ts
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
import { json } from '@sveltejs/kit';
|
||||||
|
import { getDb, rows } from '$lib/server/db';
|
||||||
|
import { requireAuth } from '$lib/server/auth';
|
||||||
|
|
||||||
|
export async function GET({ request, url }) {
|
||||||
|
const u = await requireAuth(request);
|
||||||
|
const db = getDb();
|
||||||
|
const rolle = url.searchParams.get('rolle');
|
||||||
|
|
||||||
|
let query = 'SELECT id, verein_id, email, name, rolle, created FROM users WHERE verein_id = ?';
|
||||||
|
const params: unknown[] = [u.verein_id];
|
||||||
|
|
||||||
|
if (rolle) { query += ' AND rolle = ?'; params.push(rolle); }
|
||||||
|
query += ' ORDER BY name';
|
||||||
|
|
||||||
|
const users = db.prepare(query).all(...params);
|
||||||
|
return json(users);
|
||||||
|
}
|
||||||
47
app/src/routes/api/users/[id]/+server.ts
Normal file
47
app/src/routes/api/users/[id]/+server.ts
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
import { json, error } from '@sveltejs/kit';
|
||||||
|
import { getDb } from '$lib/server/db';
|
||||||
|
import { requireAuth, hashPassword } from '$lib/server/auth';
|
||||||
|
|
||||||
|
export async function GET({ request, params }) {
|
||||||
|
const u = await requireAuth(request);
|
||||||
|
const db = getDb();
|
||||||
|
const row = db.prepare(
|
||||||
|
'SELECT id, verein_id, email, name, rolle, created FROM users WHERE id = ? AND verein_id = ?'
|
||||||
|
).get(params.id, u.verein_id);
|
||||||
|
if (!row) throw error(404, 'User nicht gefunden');
|
||||||
|
return json(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function PUT({ request, params }) {
|
||||||
|
const u = await requireAuth(request);
|
||||||
|
const db = getDb();
|
||||||
|
const body = await request.json();
|
||||||
|
|
||||||
|
const existing = db.prepare('SELECT id FROM users WHERE id = ? AND verein_id = ?').get(params.id, u.verein_id);
|
||||||
|
if (!existing) throw error(404, 'User nicht gefunden');
|
||||||
|
|
||||||
|
const fields: string[] = [];
|
||||||
|
const vals: unknown[] = [];
|
||||||
|
|
||||||
|
if (body.name !== undefined) { fields.push('name = ?'); vals.push(body.name); }
|
||||||
|
if (body.email !== undefined) { fields.push('email = ?'); vals.push(body.email.toLowerCase()); }
|
||||||
|
if (body.rolle !== undefined) { fields.push('rolle = ?'); vals.push(body.rolle || null); }
|
||||||
|
if (body.password) { fields.push('password_hash = ?'); vals.push(await hashPassword(body.password)); }
|
||||||
|
if (!fields.length) throw error(400, 'Keine Felder zum Aktualisieren');
|
||||||
|
|
||||||
|
fields.push("updated = strftime('%Y-%m-%dT%H:%M:%SZ','now')");
|
||||||
|
vals.push(params.id, u.verein_id);
|
||||||
|
|
||||||
|
db.prepare(`UPDATE users SET ${fields.join(', ')} WHERE id = ? AND verein_id = ?`).run(...vals);
|
||||||
|
const row = db.prepare('SELECT id, verein_id, email, name, rolle, created FROM users WHERE id = ?').get(params.id);
|
||||||
|
return json(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function DELETE({ request, params }) {
|
||||||
|
const u = await requireAuth(request);
|
||||||
|
if (u.sub === params.id) throw error(400, 'Eigenen Account nicht löschbar');
|
||||||
|
const db = getDb();
|
||||||
|
const result = db.prepare('DELETE FROM users WHERE id = ? AND verein_id = ?').run(params.id, u.verein_id);
|
||||||
|
if (result.changes === 0) throw error(404, 'User nicht gefunden');
|
||||||
|
return new Response(null, { status: 204 });
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue