const config = require("../config/main.js"); const configTpl = require("../views/"+config.theme+"/config/"+config.availableLangs[0]+".js"); const tool = require("../tools/main"); const toolMail = require("../tools/mail"); const txt = require("../lang/"+config.adminLang+"/payment"); const txtUser = require("../lang/"+config.adminLang+"/user"); const txtGeneral = require("../lang/"+config.adminLang+"/general"); const userCtrl = require("./user"); exports.getOneUserPayments = async (req, res, next) => { try { const connectedUser=req.connectedUser; if(connectedUser===false || ["admin","manager"].indexOf(connectedUser.User.status) === -1) res.status(403).json({ errors: txtGeneral.notAllowed }); else { const db = require("../models/index"); const Payments=await db["Payment"].findAll({ where: { UserId: req.params.id }, order: [["createdAt", "DESC"]] }); res.status(200).json(Payments); } next(); } catch(e) { next(e); } } exports.saveUserPaymentInfos = async (req, res, next) => { // exemple d'url Ok : WP-infos.html?dom=wikilerni.com&ref=21&mt=24&cmd=de11de&cl=monsieur+dugenoux&hKey=1b42653d28ecd07b9b3ba202770a1a45 try { // l'utilisateur étant incité à venir sur l'API, on le redirige vers le site // ex url retour : /payment/WP-infos.html?article=nomArticle&ht=montantHT&client=nomClient if(req.query.article!=undefined) { res.writeHead(302, { "Location": config.siteUrl+"/merci.html" }); res.end(); } else { require('dotenv').config(); const ndDaysSubscription=365;// nombre de jour de l'abonnement const ndDaysGodFather=30;// nombre de jour en plus si parrainage const db = require("../models/index"); const md5 = require("md5"); const montantsAbonnement=["12","24","60","120"]; // !! attention req.query enlève les caractères spéciaux comme les "+" des paramètres de l'url. Il vaut donc mieux utiliser req.url pour comparer avec le hash au reste de la chaîne. const testUrl=req.url.slice(req.url.indexOf("?")+1,req.url.lastIndexOf("&")); console.log(testUrl); console.log(md5(testUrl+process.env.MD5_WP)); if(md5(testUrl+process.env.MD5_WP)!==req.query.hKey) // le hashage est effectué après le remplacement des caractères spéciaux dans l'url. throw { message: txt.paymentUrlFail+testUrl }; else if(req.query.ref==="" || montantsAbonnement.indexOf(req.query.mt) === -1) throw { message: txt.paymentDatasFail+testUrl }; else { const client=await userCtrl.searchUserById(req.query.ref); if(!client) throw { message: txt.paymentUserNotFound+testUrl }; else { // Si cet utilisateur a un parrain on le remercie et lui ajoute 30 jours d'abonnement // Cela impacte aussi la durée à ajouter à l'abonnement du client let numberOfDays=ndDaysSubscription; if(client.User.GodfatherId) { const parrain=await userCtrl.searchUserById(client.User.GodfatherId); if(parrain) { addDays(parrain, ndDaysGodFather); numberOfDays+=ndDaysGodFather; await db["Subscription"].update({ ...parrain.Subscription }, { where: { UserId : client.User.GodfatherId }, fields: ["numberOfDays"], limit:1 }); userCtrl.creaUserJson(client.User.GodfatherId); const mapMail = { USER_NAME: parrain.User.name }; const mailDatas= { mailSubject: txt.mailPaymentThankGodfatherSubject, mailPreheader: txt.mailPaymentThankGodfatherSubject, mailTitle: txt.mailPaymentThankGodfatherSubject, mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.userHomePage, mailHeaderLinkTxt: txt.mailPaymentLinkTxt, mailMainContent: tool.replaceAll(txt.mailPaymentThankGodfatherBodyHTML, mapMail), linksCTA: [{ url:config.siteUrl+"/"+configTpl.userHomePage, txt:txt.mailPaymentLinkTxt }], mailRecipientAddress: parrain.User.email } await toolMail.sendMail(parrain.User.smtp, parrain.User.email, txt.mailPaymentThankGodfatherSubject, tool.replaceAll(txt.mailPaymentThankGodfatherBodyTxt, mapMail), "", mailDatas); } else res.alerte=txt.paymentGodfatherNotFound+client.User.GodfatherId; } addDays(client, numberOfDays); const infosClient= { clientName: req.query.cl, amount: req.query.mt, codeCommande: req.query.cmd, UserId: client.User.id, numberOfDays: client.Subscription.numberOfDays }; await db["Payment"].create({ ...infosClient }, { fields: ["clientName", "amount", "codeCommande", "UserId"] }); await db["Subscription"].update({ ...infosClient }, { where: { UserId : infosClient.UserId }, fields: ["numberOfDays"], limit:1 }); userCtrl.creaUserJson(infosClient.UserId); const mapMail2 = { SITE_NAME: config.siteName, USER_NAME: client.User.name, NBDAYS: numberOfDays }; const mailDatas2 = { mailSubject: txt.mailPaymentThankSubject, mailPreheader: txt.mailPaymentThankSubject, mailTitle: txt.mailPaymentThankSubject, mailHeaderLinkUrl: config.siteUrl+"/"+configTpl.userHomePage, mailHeaderLinkTxt: txt.mailPaymentLinkTxt, mailMainContent: tool.replaceAll(txt.mailPaymentThankBodyHTML, mapMail2), linksCTA: [{ url:config.siteUrl+"/"+configTpl.userHomePage, txt:txt.mailPaymentLinkTxt }], mailRecipientAddress: client.User.email } await toolMail.sendMail(client.User.smtp, client.User.email, txt.mailPaymentThankSubject, tool.replaceAll(txt.mailPaymentThankBodyTxt, mapMail2), "", mailDatas2); // + info admin site await toolMail.sendMail(0, config.adminEmail, txt.mailPaymentAdminNoticeSubject, txt.mailPaymentAdminNoticeBodyTxt.replace("EMAIL", client.User.email), txt.mailPaymentAdminNoticeBodyHTML.replace("EMAIL", client.User.email)); res.status(200).json(true); } } next(); } } catch(e) { next(e); } } // Ajoute le nombre de jours nécessaire à un abonnement en vérifiant si il est expiré ou non. // Si l'abonnement est toujours actif, on se contente d'ajouter le nombre de jours souhaité à celui déjà connu // Sinon, on complète pour arriver à la date actuelle, puis on ajoute le nombre de jours souhaité const addDays = (user, nbDays) => { let dateEnd=new Date(user.Subscription.createdAt).getTime()+user.Subscription.numberOfDays*24*3600*1000; if(dateEnd < Date.now()) { let needDays=Math.round((Date.now()-dateEnd)/(24*3600*1000)); nbDays+=needDays; } user.Subscription.numberOfDays+=nbDays; }