feat: bootstrap project
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
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.')}`);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user