105 lines
3.1 KiB
TypeScript
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.' };
|
|
}
|
|
};
|