Checkpoint: Correction de l'erreur "Failed to parse URL" lors de l'envoi d'attestation avec chemin local :

- Modification de la fonction sendAttestationEmail dans server/emailService.ts
- Ajout de la détection automatique entre URL complète (http/https) et chemin local
- Pour les URLs complètes : téléchargement via fetch (comme avant)
- Pour les chemins locaux : lecture directe depuis le système de fichiers avec fs.readFile
- Les fichiers uploadés localement (/uploads/rappels-attachments/...) sont maintenant correctement lus
- Utilisation de path.join(process.cwd(), pdfUrl) pour construire le chemin absolu
- Déployé sur le VPS de production (https://formations.itinova.org)
- L'envoi d'attestations uploadées localement fonctionne maintenant correctement
This commit is contained in:
Manus
2026-01-18 06:11:57 -05:00
parent b7abb929a5
commit ac9ece31a5
2 changed files with 21 additions and 7 deletions

View File

@@ -1144,17 +1144,30 @@ export async function sendAttestationEmail(params: {
<p>Cordialement,<br/>L'équipe Formation</p> <p>Cordialement,<br/>L'équipe Formation</p>
`; `;
// Télécharger le PDF depuis l'URL // Récupérer le PDF (depuis URL ou chemin local)
let pdfBuffer: Buffer; let pdfBuffer: Buffer;
try { try {
// Vérifier si c'est un chemin local ou une URL complète
if (params.pdfUrl.startsWith('http://') || params.pdfUrl.startsWith('https://')) {
// Télécharger depuis l'URL
const response = await fetch(params.pdfUrl); const response = await fetch(params.pdfUrl);
if (!response.ok) { if (!response.ok) {
throw new Error(`Failed to download PDF: ${response.statusText}`); throw new Error(`Failed to download PDF: ${response.statusText}`);
} }
const arrayBuffer = await response.arrayBuffer(); const arrayBuffer = await response.arrayBuffer();
pdfBuffer = Buffer.from(arrayBuffer); pdfBuffer = Buffer.from(arrayBuffer);
} else {
// Lire depuis le système de fichiers local
const fs = await import('fs/promises');
const path = await import('path');
// Construire le chemin absolu (le chemin commence par /uploads/...)
// Sur le VPS, les fichiers sont dans /var/www/formation-manager-itinova/uploads/
const absolutePath = path.join(process.cwd(), params.pdfUrl);
pdfBuffer = await fs.readFile(absolutePath);
}
} catch (error) { } catch (error) {
console.error('[sendAttestationEmail] Error downloading PDF:', error); console.error('[sendAttestationEmail] Error loading PDF:', error);
throw error; throw error;
} }

View File

@@ -862,3 +862,4 @@
- [x] Corriger l'erreur "aucune attestation disponible pour cet apprenant" lors de l'envoi manuel d'une attestation uploadée (vérification de documentUrl ou urlPdf) - [x] Corriger l'erreur "aucune attestation disponible pour cet apprenant" lors de l'envoi manuel d'une attestation uploadée (vérification de documentUrl ou urlPdf)
- [x] Modifier l'envoi d'attestation pour joindre le PDF directement en pièce jointe au lieu d'un lien de téléchargement - [x] Modifier l'envoi d'attestation pour joindre le PDF directement en pièce jointe au lieu d'un lien de téléchargement
- [x] Permettre le renvoi d'une attestation même après qu'elle ait été envoyée (afficher bouton Renvoyer au lieu de masquer Envoyer) - [x] Permettre le renvoi d'une attestation même après qu'elle ait été envoyée (afficher bouton Renvoyer au lieu de masquer Envoyer)
- [x] Corriger l'erreur "Failed to parse URL" lors de l'envoi d'attestation avec un chemin local (gérer les chemins locaux et URLs complètes)