2020-08-07 12:23:59 +02:00
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 ) =>
{
2020-08-28 12:18:22 +02:00
// exemple d'url Ok : WP-infos.html?dom=wikilerni.com&ref=21&mt=24&cmd=de11de&cl=monsieur+dugenoux&hKey=1b42653d28ecd07b9b3ba202770a1a45
2020-08-07 12:23:59 +02:00
try
{
2020-09-07 18:19:45 +02:00
// l'utilisateur étant incité à venir sur l'API après paiement, dans ce cas on le redirige vers le site
2020-08-28 12:18:22 +02:00
// ex url retour : /payment/WP-infos.html?article=nomArticle&ht=montantHT&client=nomClient
if ( req . query . article != undefined )
2020-08-07 12:23:59 +02:00
{
2020-08-28 12:18:22 +02:00
res . writeHead ( 302 , { "Location" : config . siteUrl + "/merci.html" } ) ;
res . end ( ) ;
}
else
{
require ( 'dotenv' ) . config ( ) ;
2020-09-07 18:19:45 +02:00
const ndDaysSubscription = 180 ; // nombre de jour de l'abonnement
2020-08-28 12:18:22 +02:00
const ndDaysGodFather = 30 ; // nombre de jour en plus si parrainage
const db = require ( "../models/index" ) ;
const md5 = require ( "md5" ) ;
2020-09-07 18:19:45 +02:00
const montantsAbonnement = [ "9" , "18" , "36" , "54" ] ;
2020-08-28 12:18:22 +02:00
// !! 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 ( "&" ) ) ;
2020-09-07 18:19:45 +02:00
//console.log(testUrl);
//console.log(md5(testUrl+process.env.MD5_WP));
2020-08-28 12:18:22 +02:00
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 } ;
2020-08-07 12:23:59 +02:00
else
{
2020-08-28 12:18:22 +02:00
const client = await userCtrl . searchUserById ( req . query . ref ) ;
if ( ! client )
throw { message : txt . paymentUserNotFound + testUrl } ;
else
2020-08-07 12:23:59 +02:00
{
2020-08-28 12:18:22 +02:00
// 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 )
2020-08-07 12:23:59 +02:00
{
2020-08-28 12:18:22 +02:00
const parrain = await userCtrl . searchUserById ( client . User . GodfatherId ) ;
if ( parrain )
2020-08-07 12:23:59 +02:00
{
2020-08-28 12:18:22 +02:00
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 ) ;
2020-08-07 12:23:59 +02:00
}
2020-08-28 12:18:22 +02:00
else
res . alerte = txt . paymentGodfatherNotFound + client . User . GodfatherId ;
2020-08-07 12:23:59 +02:00
}
2020-08-28 12:18:22 +02:00
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 ) ;
2020-08-07 12:23:59 +02:00
}
}
2020-08-28 12:18:22 +02:00
next ( ) ;
2020-08-07 12:23:59 +02:00
}
}
catch ( e )
{
next ( e ) ;
}
2020-08-28 12:18:22 +02:00
}
// 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 ;
2020-08-07 12:23:59 +02:00
}