199 lines
No EOL
5.8 KiB
TypeScript
199 lines
No EOL
5.8 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { createSbServiceRole } from "@/lib/supabaseServer";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
// GET - Récupérer les données d'un salarié par token sécurisé
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const { searchParams } = new URL(request.url);
|
|
const token = searchParams.get('token');
|
|
|
|
if (!token) {
|
|
return NextResponse.json(
|
|
{ error: 'Token d\'accès manquant' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
const sb = createSbServiceRole();
|
|
|
|
// Vérifier le token et récupérer les données du salarié
|
|
const { data: tokenData, error: tokenError } = await sb
|
|
.from('auto_declaration_tokens')
|
|
.select(`
|
|
id,
|
|
salarie_id,
|
|
expires_at,
|
|
used,
|
|
salaries (
|
|
id,
|
|
code_salarie,
|
|
num_salarie,
|
|
salarie,
|
|
nom,
|
|
nom_de_naissance,
|
|
prenom,
|
|
civilite,
|
|
pseudonyme,
|
|
adresse_mail,
|
|
tel,
|
|
adresse,
|
|
date_naissance,
|
|
lieu_de_naissance,
|
|
nir,
|
|
iban,
|
|
bic,
|
|
conges_spectacles,
|
|
derniere_profession,
|
|
employer_id,
|
|
justificatifs_personnels,
|
|
organizations(name)
|
|
)
|
|
`)
|
|
.eq('token', token)
|
|
.single();
|
|
|
|
if (tokenError || !tokenData) {
|
|
return NextResponse.json(
|
|
{ error: 'Token d\'accès invalide' },
|
|
{ status: 403 }
|
|
);
|
|
}
|
|
|
|
// Vérifier l'expiration du token
|
|
if (new Date() > new Date(tokenData.expires_at)) {
|
|
return NextResponse.json(
|
|
{ error: 'Token d\'accès expiré. Demandez un nouveau lien à votre employeur.' },
|
|
{ status: 403 }
|
|
);
|
|
}
|
|
|
|
const salarie = tokenData.salaries;
|
|
|
|
if (!salarie) {
|
|
return NextResponse.json(
|
|
{ error: 'Salarié non trouvé' },
|
|
{ status: 404 }
|
|
);
|
|
}
|
|
|
|
return NextResponse.json(salarie);
|
|
|
|
} catch (error) {
|
|
console.error('Erreur API:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Erreur interne du serveur' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|
|
// PATCH - Mettre à jour les données d'un salarié
|
|
export async function PATCH(request: NextRequest) {
|
|
try {
|
|
const body = await request.json();
|
|
const { token, ...updateData } = body;
|
|
|
|
if (!token) {
|
|
return NextResponse.json(
|
|
{ error: 'Token d\'accès manquant' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
const sb = createSbServiceRole();
|
|
|
|
// Vérifier le token et récupérer l'ID du salarié
|
|
const { data: tokenData, error: tokenError } = await sb
|
|
.from('auto_declaration_tokens')
|
|
.select('salarie_id, expires_at, used')
|
|
.eq('token', token)
|
|
.single();
|
|
|
|
if (tokenError || !tokenData) {
|
|
return NextResponse.json(
|
|
{ error: 'Token d\'accès invalide' },
|
|
{ status: 403 }
|
|
);
|
|
}
|
|
|
|
// Vérifier l'expiration du token
|
|
if (new Date() > new Date(tokenData.expires_at)) {
|
|
return NextResponse.json(
|
|
{ error: 'Token d\'accès expiré. Demandez un nouveau lien à votre employeur.' },
|
|
{ status: 403 }
|
|
);
|
|
}
|
|
|
|
// Préparer les données de mise à jour
|
|
const dataToUpdate: any = {
|
|
updated_at: new Date().toISOString()
|
|
};
|
|
|
|
// Mapper les champs autorisés à mettre à jour
|
|
if (updateData.civilite) dataToUpdate.civilite = updateData.civilite;
|
|
if (updateData.nom) dataToUpdate.nom = updateData.nom;
|
|
if (updateData.prenom) dataToUpdate.prenom = updateData.prenom;
|
|
if (updateData.nom_de_naissance !== undefined) dataToUpdate.nom_de_naissance = updateData.nom_de_naissance;
|
|
if (updateData.pseudonyme !== undefined) dataToUpdate.pseudonyme = updateData.pseudonyme;
|
|
if (updateData.adresse_mail) dataToUpdate.adresse_mail = updateData.adresse_mail;
|
|
if (updateData.tel !== undefined) dataToUpdate.tel = updateData.tel;
|
|
if (updateData.adresse !== undefined) dataToUpdate.adresse = updateData.adresse;
|
|
if (updateData.date_naissance !== undefined) dataToUpdate.date_naissance = updateData.date_naissance;
|
|
if (updateData.lieu_de_naissance !== undefined) dataToUpdate.lieu_de_naissance = updateData.lieu_de_naissance;
|
|
if (updateData.nir !== undefined) dataToUpdate.nir = updateData.nir;
|
|
if (updateData.conges_spectacles !== undefined) dataToUpdate.conges_spectacles = updateData.conges_spectacles;
|
|
if (updateData.iban !== undefined) dataToUpdate.iban = updateData.iban;
|
|
if (updateData.bic !== undefined) dataToUpdate.bic = updateData.bic;
|
|
if (updateData.derniere_profession !== undefined) dataToUpdate.derniere_profession = updateData.derniere_profession;
|
|
if (updateData.notes) {
|
|
// Ajouter les notes aux justificatifs personnels (format JSON)
|
|
const currentDate = new Date().toISOString().split('T')[0];
|
|
const noteEntry = {
|
|
date: currentDate,
|
|
source: 'auto-declaration',
|
|
notes: updateData.notes
|
|
};
|
|
|
|
dataToUpdate.justificatifs_personnels = JSON.stringify([noteEntry]);
|
|
}
|
|
|
|
// Mettre à jour le salarié
|
|
const { data, error } = await sb
|
|
.from('salaries')
|
|
.update(dataToUpdate)
|
|
.eq('id', tokenData.salarie_id)
|
|
.select()
|
|
.single();
|
|
|
|
if (error) {
|
|
console.error('Erreur Supabase update:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Erreur lors de la mise à jour' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
|
|
// Marquer le token comme utilisé (optionnel)
|
|
await sb
|
|
.from('auto_declaration_tokens')
|
|
.update({
|
|
used: true,
|
|
used_at: new Date().toISOString()
|
|
})
|
|
.eq('token', token);
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
data: data
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('Erreur API:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Erreur interne du serveur' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
} |