feat: bootstrap project
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
import { db } from '$lib/server/db';
|
||||
import * as schema from '$lib/server/db/schema';
|
||||
import { eq, and, ne } from 'drizzle-orm';
|
||||
import { error, fail, redirect } from '@sveltejs/kit';
|
||||
import type { Actions, PageServerLoad } from './$types';
|
||||
|
||||
export const load: PageServerLoad = async ({ params }) => {
|
||||
const id = params.id;
|
||||
|
||||
try {
|
||||
const beneficiary = db
|
||||
.select()
|
||||
.from(schema.beneficiaries)
|
||||
.where(eq(schema.beneficiaries.id, id))
|
||||
.get();
|
||||
|
||||
if (!beneficiary) {
|
||||
throw error(404, 'Beneficiário não encontrado');
|
||||
}
|
||||
|
||||
return {
|
||||
beneficiary
|
||||
};
|
||||
} catch (err) {
|
||||
if (err && typeof err === 'object' && 'status' in err && err.status === 404) {
|
||||
throw err;
|
||||
}
|
||||
console.error('Error loading beneficiary details:', err);
|
||||
throw error(500, 'Ocorreu um erro ao carregar os dados do beneficiário.');
|
||||
}
|
||||
};
|
||||
|
||||
export const actions: Actions = {
|
||||
default: async ({ params, request }) => {
|
||||
const id = params.id;
|
||||
const data = await request.formData();
|
||||
const numberStr = data.get('number')?.toString().trim();
|
||||
const name = data.get('name')?.toString().trim();
|
||||
const contact = data.get('contact')?.toString().trim();
|
||||
const householdSizeStr = data.get('householdSize')?.toString().trim();
|
||||
const observations = data.get('observations')?.toString().trim();
|
||||
const status = data.get('status')?.toString().trim();
|
||||
|
||||
// Basic validation
|
||||
if (!numberStr || !name || !contact || !householdSizeStr || !status) {
|
||||
return fail(400, {
|
||||
success: false,
|
||||
error: 'Todos os campos obrigatórios devem ser preenchidos.'
|
||||
});
|
||||
}
|
||||
|
||||
const number = parseInt(numberStr, 10);
|
||||
const householdSize = parseInt(householdSizeStr, 10);
|
||||
|
||||
if (isNaN(number) || number <= 0) {
|
||||
return fail(400, {
|
||||
success: false,
|
||||
error: 'O número de beneficiário deve ser um número inteiro positivo.'
|
||||
});
|
||||
}
|
||||
|
||||
if (isNaN(householdSize) || householdSize < 1) {
|
||||
return fail(400, {
|
||||
success: false,
|
||||
error: 'O agregado familiar deve ter pelo menos 1 pessoa.'
|
||||
});
|
||||
}
|
||||
|
||||
if (status !== 'ativo' && status !== 'inativo') {
|
||||
return fail(400, {
|
||||
success: false,
|
||||
error: 'Estado inválido selecionado.'
|
||||
});
|
||||
}
|
||||
|
||||
try {
|
||||
// Check if new number conflicts with another beneficiary (excluding self)
|
||||
const existingConflict = db
|
||||
.select()
|
||||
.from(schema.beneficiaries)
|
||||
.where(
|
||||
and(
|
||||
eq(schema.beneficiaries.number, number),
|
||||
ne(schema.beneficiaries.id, id)
|
||||
)
|
||||
)
|
||||
.get();
|
||||
|
||||
if (existingConflict) {
|
||||
return fail(400, {
|
||||
success: false,
|
||||
error: `O número de beneficiário #${number} já está atribuído a outro registo.`
|
||||
});
|
||||
}
|
||||
|
||||
// Update details
|
||||
db.update(schema.beneficiaries)
|
||||
.set({
|
||||
number,
|
||||
name,
|
||||
contact,
|
||||
householdSize,
|
||||
observations,
|
||||
status,
|
||||
updatedAt: Date.now()
|
||||
})
|
||||
.where(eq(schema.beneficiaries.id, id))
|
||||
.run();
|
||||
} catch (err) {
|
||||
console.error('Error updating beneficiary details:', err);
|
||||
return fail(500, {
|
||||
success: false,
|
||||
error: 'Erro ao guardar as alterações na base de dados.'
|
||||
});
|
||||
}
|
||||
|
||||
// Redirect on success
|
||||
throw redirect(303, `/admin/beneficiarios?success=${encodeURIComponent('Alterações guardadas com sucesso.')}`);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user