Initial local backup snapshot
This commit is contained in:
commit
acd9e14ba5
367 changed files with 118038 additions and 0 deletions
124
scripts/submit-and-notify.mjs
Normal file
124
scripts/submit-and-notify.mjs
Normal file
|
|
@ -0,0 +1,124 @@
|
|||
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);
|
||||
Loading…
Add table
Add a link
Reference in a new issue