import { db } from '$lib/server/db'; import * as schema from '$lib/server/db/schema'; import { eq } from 'drizzle-orm'; import { fail, redirect } from '@sveltejs/kit'; import type { Actions } from './$types'; import bcrypt from 'bcrypt'; export const actions: Actions = { default: async ({ request }) => { const data = await request.formData(); const username = data.get('username')?.toString().trim(); const role = data.get('role')?.toString().trim(); const password = data.get('password')?.toString(); const confirmPassword = data.get('confirmPassword')?.toString(); if (!username || !role || !password || !confirmPassword) { return fail(400, { success: false, username, role, error: 'Todos os campos obrigatórios devem ser preenchidos.' }); } if (role !== 'admin' && role !== 'shift_manager' && role !== 'volunteer') { return fail(400, { success: false, username, role, error: 'Perfil selecionado é inválido.' }); } if (password !== confirmPassword) { return fail(400, { success: false, username, role, error: 'As palavras-passe introduzidas não coincidem.' }); } if (password.length < 4) { return fail(400, { success: false, username, role, error: 'A palavra-passe deve ter pelo menos 4 caracteres.' }); } try { // Check if username already exists const existing = db .select() .from(schema.users) .where(eq(schema.users.username, username)) .get(); if (existing) { return fail(400, { success: false, username, role, error: 'O nome de utilizador já está a ser utilizado.' }); } // Insert user const passwordHash = bcrypt.hashSync(password, 10); db.insert(schema.users) .values({ username, role, passwordHash, createdAt: Date.now() }) .run(); } catch (err) { console.error('Error creating user:', err); return fail(500, { success: false, username, role, error: 'Erro interno ao guardar o utilizador. Tente novamente.' }); } throw redirect(303, `/admin/utilizadores?success=${encodeURIComponent('Utilizador criado com sucesso.')}`); } };