///////////////////////////////////////////////// // LOGGING ///////////////////////////////////////////////// const logger = require("../../public/js/app/logger_lienventetemp"); ///////////////////////////////////////////////// // APPELS DES MODULES ///////////////////////////////////////////////// const moment = require('moment'); const ejs = require('ejs'); const nodemailer = require('nodemailer'); const path = require("path"); const fs = require("fs"); const mysql = require('mysql2'); const mysql_promise = require('mysql2/promise'); //////////////////////////////////////////////////// // FILE NAME //////////////////////////////////////////////////// const filename = path.parse(__filename).base; // Envoie mail const envoie_mail = require("../../modules/envoie_mail"); ///////////////////////////////////////////////// // GOOGLE SHEET PARAMETERS ///////////////////////////////////////////////// const { GoogleSpreadsheet } = require('google-spreadsheet'); const GS_creds = require('../../inscriptionsafps-53b60452f63d.json'); const { error } = require("console"); // Initialize the sheet - doc ID is the long id in the sheets URL const GS_boutique = new GoogleSpreadsheet(process.env.gsheet_boutique); //////////////////////////////////////////////////// // Configuration de la connexion à la base de données //////////////////////////////////////////////////// const dbConfig = { host: process.env.db_connection_host, port: process.env.db_connection_port, user: process.env.db_connection_user, password: process.env.db_connection_password, database: process.env.db_connection_database }; // OU const { connect_DB_promise } = require('../../modules/db/databaseconnect'); //////////////////////////////////////////////////// // VARIABLES //////////////////////////////////////////////////// // Stockage des fichiers avec une date d'expiration const fileLinks = {}; // DATE moment.locale('fr'); var date_formattee = moment().format('L') var today = date_formattee; //////////////////////////////////////////////////// // Générer le lien temporaire //////////////////////////////////////////////////// const generate_link = async function(req, res) { logger.info("======================================", { label: filename }); logger.info("generate_link", { label: filename }); logger.info("======================================", { label: filename }); try { // CONNEXION A LA BD const db_connection_promise = await mysql_promise.createConnection(dbConfig); const linkId = Date.now(); const filePath = path.join(__dirname, 'files', 'film_suzuki_unesco_2024.mp4'); // Chemin du fichier let expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); // 24 heures à partir de maintenant // Format de la date pour MySQL expiresAt = expiresAt.toISOString().slice(0, 19).replace('T', ' '); // 'YYYY-MM-DD HH:MM:SS' const link = `${process.env.DOMAIN_EXTERNE}boutique/unesco/download/${linkId}`; //const linkId = Date.now(); // Un identifiant unique basé sur le timestamp //fileLinks[linkId] = { // filePath: filePath, // expiresAt: Date.now() + 24 * 60 * 60 * 1000 // 24 heures //}; let sql = 'INSERT INTO TemporaryLinks (id, link, filePath, expiresAt) VALUES ('+ linkId +', "'+ link +'", "'+ filePath +'", "'+ expiresAt +'")'; console.log("sql : ", sql); const [results, fields] = await db_connection_promise.execute(sql); // L'ID généré par MySQL est accessible ici console.log("results.affectedRows : ", results.affectedRows); console.log("link : ", link); return link; } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); await db_connection_promise.end(); return error; //return res.status(403).send('Il y a un problème avec la connection à la base de données!'); } } ///////////////////////////////////////////////// // WEBHOOK STRIPE // APRÈS PAIEMENT PAIEMENT // ENVOIE Lien temporaire par mail ///////////////////////////////////////////////// async function wh_stripe_vente_video(req, res, event) { logger.info("======================================"); logger.info("======== FUNCTION wh_stripe_vente_video =========="); logger.info("======================================"); moment.locale('fr'); var now = moment().format("DD/MM/YYYY"); var dateheure = moment().format("YYYY-MM-DD HH-mm-ss"); //console.log("event.data.object = ", event.data.object); //console.log("event.data.object.customer_details.email = ", event.data.object.customer_details.email); //console.log("event.data.object.customer_details.name = ", event.data.object.customer_details.name); try { ///////////////////////////////////////////////// // SI PAIEMENT RÉUSSI if (event.data.object.payment_status === "paid") { // GÉNÉRATION DU LIEN DE TÉLÉCHARGEMENT TEMPORAIRE const linkId = Date.now(); const filePath = path.join(__dirname, 'files', 'film_suzuki_unesco_2024.mp4'); // Chemin du fichier let expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000); // 2 heures à partir de maintenant console.log("Date.now() =", Date.now()); console.log("expiresAt brut =", expiresAt); // Format de la date pour MySQL expiresAt = expiresAt.toISOString().slice(0, 19).replace('T', ' '); // 'YYYY-MM-DD HH:MM:SS' console.log("expiresAt formatée =", expiresAt); const link = `${process.env.DOMAIN_EXTERNE}boutique/unesco/download/${linkId}`; //Connexion DB let db_connection_promise = await connect_DB_promise(); // AJOUT DE LA VENTE DANS LA TABLE " VENTE VIDEOS" DE LA BASE DE DONNÉES ADUZUKI let sql = `INSERT INTO boutique (date, name, email, produit, originPath, link, expiresAt, montant, status_paiement, stripe) VALUES ('${dateheure}', '${event.data.object.customer_details.name}', '${event.data.object.customer_details.email}', 'Film UNESCO 2024', '${filePath}', '${link}', '${expiresAt}', ${event.data.object.amount_total}/100, '${event.data.object.payment_status}', '${event.data.object.id}')`; logger.info("#2 sql : " + sql, { numsession: req.session.id, label: filename}); // lancement de la requête const [result_sql, fields] = await db_connection_promise.execute(sql); logger.info("#2 result_sql Row ID added : " + result_sql.affectedRows, { numsession: req.session.id, label: filename}); ///////////////////////////////////////////////// // ENVOIE MAIL CONFIRM + JUSTIF var mail_objet = `ASSOCIATION FRANÇAISE POUR LA PÉDAGOGIE SUZUKI - ACHAT FILM - ${event.data.object.customer_details.name}`; var mail_html = `
Bonjour,
Suite à l'achat du film du Concert National Suzuki du 21 avril 2024 au Palais de l'UNESCO Paris, voici le lien de téléchargement du fichier vidéo. Ce lien est valable jusqu'au ${expiresAt} :
Cliquez sur ce lien pour accéder à la page de téléchargement du film : ${link}
Association Française pour la pédagogie Suzuki
`; var mailOptions = { from: 'afps.inscription@gmail.com', to: event.data.object.customer_details.email, subject: mail_objet, html: mail_html, }; envoie_mail.envoie_mail(mailOptions); ///////////////////////////////////////////////// // AJOUT GOOGLE SHEET await GS_boutique.useServiceAccountAuth(GS_creds); await GS_boutique.loadInfo(); let GS_sheet_boutique = GS_boutique.sheetsByTitle['achats']; await GS_sheet_boutique.addRows ( [ { date: dateheure, nom: event.data.object.customer_details.name, email: event.data.object.customer_details.email, produit: 'Film UNESCO 2024', lien: link, lien_expire_le: expiresAt, montant: event.data.object.amount_total/100, statut_paiement: event.data.object.payment_status, stripe: event.data.object.id } ] ); logger.info("AJOUT GOOGLESHEET FIN", { numsession: req.session.id, label: filename}); } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec wh_stripe_vente_video : " + error, { numsession: req.session.id }); return res.status(400).send(`Webhook Error: ${error.message}`); } res.json({ received: true }); } //////////////////////////////////////////////////// // Download le fichier //////////////////////////////////////////////////// const download_file = async function(req, res) { logger.info("======================================"); logger.info("======== FUNCTION download_file =========="); logger.info("======================================"); const link = process.env.DOMAIN_EXTERNE_SS_SLASH+req.originalUrl; logger.info("link : " + link, { numsession: req.session.id }); try { // CONNEXION A LA BD pour vérifier l'expiration du lien temporaire et récupérer le lien original pour downloader le fichier const db_connection_promise = await mysql_promise.createConnection(dbConfig); // Requête pour récupérer les infos d'après le code contenu dans le lien temporaire let sql = 'SELECT originPath, expiresAt FROM boutique WHERE link = "'+ link+'"'; logger.info("sql FROM boutique : " + sql, { numsession: req.session.id }); const [rows] = await db_connection_promise.execute(sql); logger.info("rows.length : " + rows.length, { numsession: req.session.id }); req.session.originPath = rows[0].originPath; // Si le lien temporaire à été trouvé (grâce au code contenu dans le lien qui est l'id) if (rows.length > 0) { logger.info("rows.expiresAt : " + rows[0].expiresAt, { numsession: req.session.id }); logger.info("Date.now() : " + Date.now(), { numsession: req.session.id }); const expiresAt = new Date(rows[0].expiresAt); req.session.expiresAt = rows[0].expiresAt; logger.info("expiresAt : " + expiresAt, { numsession: req.session.id }); // SI le lien n'a pas expiré on peut télécharger le fichier if (Date.now() < expiresAt.getTime()) { return rows[0].originPath; } else { return "Lien expiré" } } else { return "Lien non trouvé" } } catch (error) { // Echec de connection à la BD logger.error("Il y a un problème avec la connection à la base de données! : " + error, { numsession: req.session.id }); await db_connection_promise.end(); return error; } } ///////////////////////////////////////////////// // EXPORT DE MODULE POUR QU'IL SOIT LU DANS LES AUTRES FICHIERS JS ///////////////////////////////////////////////// module.exports = { generate_link, download_file, wh_stripe_vente_video }