195 lines
6 KiB
TypeScript
195 lines
6 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { sendUniversalEmailV2, EmailDataV2 } from '@/lib/emailTemplateService';
|
|
import { ENV } from '@/lib/cleanEnv';
|
|
import { createSbServiceRole } from '@/lib/supabaseServer';
|
|
|
|
/**
|
|
* POST /api/emails/signature-salarie
|
|
*
|
|
* Route API appelée par la Lambda postDocuSealSalarie pour envoyer l'email de signature au salarié
|
|
* Utilise le système universel d'emails v2 avec logging automatique
|
|
*
|
|
* Authentification : API Key dans le header X-API-Key
|
|
*/
|
|
export async function POST(request: NextRequest) {
|
|
console.log('=== API Email Signature Salarié ===');
|
|
|
|
try {
|
|
// 1. Vérification de l'authentification via API Key
|
|
const apiKey = request.headers.get('X-API-Key');
|
|
const validApiKey = ENV.LAMBDA_API_KEY;
|
|
|
|
if (!validApiKey) {
|
|
console.error('❌ Configuration error: LAMBDA_API_KEY not configured');
|
|
return NextResponse.json(
|
|
{ error: 'Server configuration error' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
|
|
if (!apiKey || apiKey !== validApiKey) {
|
|
console.error('❌ Unauthorized: Invalid or missing API key');
|
|
return NextResponse.json(
|
|
{ error: 'Unauthorized' },
|
|
{ status: 401 }
|
|
);
|
|
}
|
|
|
|
console.log('✅ Authentication successful');
|
|
|
|
// 2. Récupération et validation des données
|
|
const data = await request.json();
|
|
console.log('📦 Données reçues:', {
|
|
employeeEmail: data.employeeEmail,
|
|
reference: data.reference,
|
|
structure: data.structure,
|
|
firstName: data.firstName,
|
|
matricule: data.matricule
|
|
});
|
|
|
|
const {
|
|
employeeEmail,
|
|
signatureLink,
|
|
reference,
|
|
firstName: providedFirstName,
|
|
organizationName,
|
|
matricule,
|
|
typecontrat,
|
|
startDate,
|
|
profession,
|
|
productionName,
|
|
organizationId,
|
|
contractId
|
|
} = data;
|
|
|
|
// Validation des champs requis
|
|
if (!employeeEmail || !signatureLink || !reference || !organizationName) {
|
|
console.error('❌ Champs requis manquants');
|
|
return NextResponse.json(
|
|
{
|
|
error: 'Champs manquants',
|
|
required: ['employeeEmail', 'signatureLink', 'reference', 'organizationName']
|
|
},
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// 3. Récupération du prénom depuis Supabase si non fourni
|
|
let firstName = providedFirstName;
|
|
|
|
if (!firstName && (matricule || employeeEmail)) {
|
|
console.log('🔍 Récupération du prénom depuis la table salaries...');
|
|
try {
|
|
const supabase = createSbServiceRole();
|
|
|
|
// Recherche par matricule ou email
|
|
let query = supabase
|
|
.from('salaries')
|
|
.select('prenom')
|
|
.limit(1);
|
|
|
|
if (organizationId) {
|
|
query = query.eq('employer_id', organizationId);
|
|
}
|
|
|
|
// Priorité au matricule
|
|
if (matricule) {
|
|
query = query.or(`code_salarie.eq.${matricule},num_salarie.eq.${matricule}`);
|
|
} else if (employeeEmail) {
|
|
query = query.eq('adresse_mail', employeeEmail);
|
|
}
|
|
|
|
const { data: salaryData, error: salaryError } = await query;
|
|
|
|
if (!salaryError && salaryData && salaryData[0]?.prenom) {
|
|
firstName = salaryData[0].prenom;
|
|
console.log('✅ Prénom trouvé dans Supabase:', firstName);
|
|
} else {
|
|
console.warn('⚠️ Prénom non trouvé dans Supabase');
|
|
}
|
|
} catch (err) {
|
|
console.error('⚠️ Erreur lors de la récupération du prénom:', err);
|
|
}
|
|
}
|
|
|
|
// 4. Préparation des données de l'email
|
|
const emailData: EmailDataV2 = {
|
|
firstName: firstName || 'Salarié',
|
|
organizationName: organizationName,
|
|
matricule: matricule || 'N/A',
|
|
contractReference: reference,
|
|
typecontrat: typecontrat || 'CDDU',
|
|
startDate: startDate || '',
|
|
profession: profession || '',
|
|
productionName: productionName || '',
|
|
ctaUrl: signatureLink,
|
|
// Ajout des IDs pour le logging (si disponibles)
|
|
organizationId: organizationId,
|
|
contractId: contractId
|
|
};
|
|
|
|
console.log('📧 Préparation de l\'envoi de l\'email:', {
|
|
to: employeeEmail,
|
|
type: 'signature-request-salarie',
|
|
subject: `Signez votre contrat ${organizationName}`,
|
|
firstName: emailData.firstName
|
|
});
|
|
|
|
// 5. Envoi de l'email via le système universel v2
|
|
const messageId = await sendUniversalEmailV2({
|
|
type: 'signature-request-salarie',
|
|
toEmail: employeeEmail,
|
|
data: emailData,
|
|
});
|
|
|
|
console.log('✅ Email envoyé avec succès:', {
|
|
messageId,
|
|
recipient: employeeEmail,
|
|
reference
|
|
});
|
|
|
|
// 6. Stocker le signature_link dans cddu_contracts pour permettre la vérification
|
|
if (contractId && signatureLink) {
|
|
console.log('💾 Stockage du signature_link dans cddu_contracts...');
|
|
|
|
try {
|
|
const supabase = createSbServiceRole();
|
|
const { error: updateError } = await supabase
|
|
.from('cddu_contracts')
|
|
.update({ signature_link: signatureLink })
|
|
.eq('id', contractId);
|
|
|
|
if (updateError) {
|
|
console.error('⚠️ Erreur lors de la mise à jour du signature_link:', updateError);
|
|
// Ne pas bloquer le flux, l'email est déjà envoyé
|
|
} else {
|
|
console.log('✅ signature_link stocké avec succès');
|
|
}
|
|
} catch (err) {
|
|
console.error('⚠️ Exception lors du stockage du signature_link:', err);
|
|
// Ne pas bloquer le flux
|
|
}
|
|
}
|
|
|
|
// 7. Retour du succès avec le messageId SES
|
|
|
|
// 6. Retour du succès avec le messageId SES
|
|
return NextResponse.json({
|
|
success: true,
|
|
messageId,
|
|
recipient: employeeEmail,
|
|
reference
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('❌ Erreur lors de l\'envoi de l\'email de signature salarié:', error);
|
|
|
|
return NextResponse.json(
|
|
{
|
|
error: 'Échec de l\'envoi de l\'email',
|
|
message: error instanceof Error ? error.message : 'Unknown error'
|
|
},
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|