92 lines
2.1 KiB
TypeScript
92 lines
2.1 KiB
TypeScript
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.')}`);
|
|
}
|
|
};
|