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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
1
todo.md
1
todo.md
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user