intelidomWebsite/src/routes/admin/(dashboard)/users/+page.server.ts

105 lines
3.1 KiB
TypeScript

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.' };
}
};