import mysql from 'mysql2/promise'; import dotenv from 'dotenv'; import { nanoid } from 'nanoid'; dotenv.config(); const FORGE_API_URL = process.env.BUILT_IN_FORGE_API_URL; const FORGE_API_KEY = process.env.BUILT_IN_FORGE_API_KEY; const BASE_URL = 'https://assoportail-eagcgspx.manus.space'; async function main() { const conn = await mysql.createConnection(process.env.DATABASE_URL); // 1. Submit request #2 (change status from brouillon to soumise) console.log('📝 Soumission de la demande #2...'); await conn.execute( `UPDATE requests SET status = 'soumise', dateSubmission = NOW() WHERE id = 2` ); console.log(' ✅ Demande #2 soumise avec succès'); // 2. Get request details const [requests] = await conn.execute( `SELECT r.id, r.titre, r.type, r.status, r.montantDemande, r.description, r.dateSubmission, a.nomAssociation, a.emailContact, a.ville FROM requests r LEFT JOIN associations a ON r.associationId = a.id WHERE r.id = 2` ); const req = requests[0]; console.log(`\n📨 Envoi de la notification pour: "${req.titre}"`); const typeLabels = { subvention_fonctionnement: 'Subvention de fonctionnement', subvention_projet: 'Subvention de projet', agrement_jeunesse_education: 'Agrément Jeunesse et Éducation Populaire', agrement_sport: 'Agrément Sport', autorisation_occupation: "Autorisation d'occupation", demande_salle: 'Demande de salle', autre: 'Autre demande', }; // 3. Generate tokens const validateToken = nanoid(48); const refuseToken = nanoid(48); const expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); await conn.execute( `INSERT INTO emailActionTokens (token, requestId, action, expiresAt, createdAt) VALUES (?, ?, 'validee', ?, NOW())`, [validateToken, req.id, expiresAt] ); await conn.execute( `INSERT INTO emailActionTokens (token, requestId, action, expiresAt, createdAt) VALUES (?, ?, 'refusee', ?, NOW())`, [refuseToken, req.id, expiresAt] ); console.log(` 🔑 Tokens créés (valides jusqu'au ${expiresAt.toLocaleDateString('fr-FR')})`); // 4. Build URLs const validateUrl = `${BASE_URL}/api/email-action/${validateToken}`; const refuseUrl = `${BASE_URL}/api/email-action/${refuseToken}`; const viewUrl = `${BASE_URL}/dashboard/requests/${req.id}`; const typeLabel = typeLabels[req.type] || req.type; // 5. Send notification const title = `📨 Nouvelle demande: ${req.titre}`; const content = `**Association:** ${req.nomAssociation || 'Non renseignée'} **Ville:** ${req.ville || 'Non renseignée'} **Type:** ${typeLabel} **Description:** ${req.description || 'Non spécifiée'} --- ### Actions rapides ✅ [**VALIDER la demande**](${validateUrl}) ❌ [**REFUSER la demande**](${refuseUrl}) 🔍 [**Voir le détail**](${viewUrl}) --- _Ces liens sont valides pendant 7 jours (jusqu'au ${expiresAt.toLocaleDateString('fr-FR', { day: 'numeric', month: 'long', year: 'numeric' })})._`; const endpoint = FORGE_API_URL.endsWith('/') ? `${FORGE_API_URL}webdevtoken.v1.WebDevService/SendNotification` : `${FORGE_API_URL}/webdevtoken.v1.WebDevService/SendNotification`; try { const response = await fetch(endpoint, { method: 'POST', headers: { 'accept': 'application/json', 'authorization': `Bearer ${FORGE_API_KEY}`, 'content-type': 'application/json', 'connect-protocol-version': '1', }, body: JSON.stringify({ title, content }), }); if (response.ok) { console.log(` ✅ Notification envoyée avec succès !`); console.log(`\n📋 Récapitulatif:`); console.log(` - Demande: ${req.titre}`); console.log(` - Association: ${req.nomAssociation}`); console.log(` - Type: ${typeLabel}`); console.log(` - Lien Valider: ${validateUrl}`); console.log(` - Lien Refuser: ${refuseUrl}`); console.log(` - Lien Voir: ${viewUrl}`); } else { const detail = await response.text(); console.error(` ❌ Échec: ${response.status} - ${detail}`); } } catch (error) { console.error(` ❌ Erreur:`, error.message); } await conn.end(); console.log('\n✅ Terminé !'); } main().catch(console.error);