124 lines
4.2 KiB
JavaScript
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);
|