portail-associations/scripts/submit-and-notify.mjs

124 lines
4.2 KiB
JavaScript

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);