import { error, fail, redirect } from '@sveltejs/kit'; import type { Actions, PageServerLoad } from './$types'; import { countAdmins, createUser, deleteUser, getUser, getUserByEmail, listUsers, parseRole, setUserPassword, updateUserRole } from '$lib/server/users'; function requireAdmin(locals: App.Locals) { if (!locals.user || locals.user.role !== 'admin') { throw error(403, 'Samo administratorji lahko upravljajo uporabnike.'); } return locals.user; } export const load: PageServerLoad = ({ locals }) => { // Editors don't manage users — send them back to the gallery. if (!locals.user || locals.user.role !== 'admin') { throw redirect(303, '/admin/gallery'); } return { users: listUsers(), currentUserId: locals.user.id }; }; export const actions: Actions = { create: async ({ request, locals }) => { requireAdmin(locals); const form = await request.formData(); const email = String(form.get('email') ?? '') .trim() .toLowerCase(); const name = String(form.get('name') ?? '').trim(); const password = String(form.get('password') ?? ''); const role = parseRole(form.get('role')); if (!email || !name || !password || !role) { return fail(400, { error: 'Izpolnite vsa polja.' }); } if (password.length < 8) { return fail(400, { error: 'Geslo mora imeti vsaj 8 znakov.' }); } if (getUserByEmail(email)) { return fail(400, { error: 'Uporabnik s tem e-naslovom že obstaja.' }); } await createUser({ email, name, password, role }); return { success: `Uporabnik ${email} dodan.` }; }, setRole: async ({ request, locals }) => { requireAdmin(locals); const form = await request.formData(); const id = String(form.get('id') ?? ''); const role = parseRole(form.get('role')); if (!role) return fail(400, { error: 'Neveljavna vloga.' }); const target = getUser(id); if (!target) return fail(404, { error: 'Uporabnik ne obstaja.' }); if (target.role === 'admin' && role === 'editor' && countAdmins() <= 1) { return fail(400, { error: 'Vsaj en administrator mora ostati.' }); } updateUserRole(id, role); return { success: 'Vloga posodobljena.' }; }, resetPassword: async ({ request, locals }) => { requireAdmin(locals); const form = await request.formData(); const id = String(form.get('id') ?? ''); const password = String(form.get('password') ?? ''); if (password.length < 8) { return fail(400, { error: 'Geslo mora imeti vsaj 8 znakov.' }); } if (!getUser(id)) return fail(404, { error: 'Uporabnik ne obstaja.' }); await setUserPassword(id, password); return { success: 'Geslo posodobljeno.' }; }, delete: async ({ request, locals }) => { const admin = requireAdmin(locals); const form = await request.formData(); const id = String(form.get('id') ?? ''); if (id === admin.id) { return fail(400, { error: 'Ne morete izbrisati lastnega računa.' }); } const target = getUser(id); if (!target) return fail(404, { error: 'Uporabnik ne obstaja.' }); if (target.role === 'admin' && countAdmins() <= 1) { return fail(400, { error: 'Vsaj en administrator mora ostati.' }); } deleteUser(id); return { success: 'Uporabnik izbrisan.' }; } };