{// utiliser la vue puis des recherches en sql natif ou ajouter un modèle : https://stackoverflow.com/questions/48407329/cant-able-to-create-views-in-mysql-using-sequelize-orm
// Utilisateurs dont l'abonnement est toujours actif et souhaitant recevoir un nouveau quiz le jour de l'appel de cette méthode.
// Le tout en heure locale et en ignorant ceux qui ont déjà été servis ce jour.
constsubscriptionsOk=awaitdb.sequelize.query("SELECT `Subscriptions`.`id` as SubscriptionId, `UserId`, `name`, `email`, `smtp`, `language`, `noticeOk`, `receiptDays`, ADDDATE(UTC_TIMESTAMP, INTERVAL `timeDifference` MINUTE) AS localDate FROM `Subscriptions` INNER JOIN `Users` ON `Subscriptions`.`UserId`=`Users`.`id` WHERE `status`='user' AND ADDDATE(`Subscriptions`.`createdAt`, `numberOfDays`) > UTC_TIMESTAMP HAVING HOUR(localDate) > "+config.hourGiveNewQuestionnaireBegin+" AND HOUR(localDate) < "+config.hourGiveNewQuestionnaireEnd+" AND LOCATE(DAYOFWEEK(localDate),receiptDays)!=0 AND SubscriptionId NOT IN (SELECT DISTINCT `SubscriptionId` FROM `Pauses` WHERE ADDDATE(`startingAt`, INTERVAL `timeDifference` MINUTE) <= localDate AND ADDDATE(`endingAT`, INTERVAL `timeDifference` MINUTE) > localDate) AND `UserId` NOT IN (SELECT DISTINCT `UserId` FROM `QuestionnaireAccesses` WHERE DATEDIFF(NOW(),`createdAt`) < 1 AND `selfCreatedOk` = false) LIMIT "+config.numberNewQuestionnaireAtSameTime,{type:QueryTypes.SELECT});
newQuestionnaire=awaitdb.sequelize.query("SELECT `Questionnaires`.`id`, `title`, `slug`, `introduction`, `url`, `anchor`,`estimatedTime` FROM `Questionnaires` INNER JOIN `Links` ON `Links`.`QuestionnaireId`=`Questionnaires`.`id` WHERE `isPublished`=1 AND `language`='"+subscriptionsOk[i].language+"' AND `Questionnaires`.`id` NOT IN (SELECT `QuestionnaireId` FROM `QuestionnaireAccesses` WHERE `UserId`="+subscriptionsOk[i].UserId+") ORDER BY `id` LIMIT 1",{type:QueryTypes.SELECT});
awaittoolMail.sendMail(0,config.adminEmail,"Abonné sans nouveau quiz",txt.noNewQuestionnaireForUser+subscriptionsOk[i].email,"<p>"+txt.noNewQuestionnaireForUser+subscriptionsOk[i].email+"</p>");
}
}
res.status(200).json(subscriptionsOk);
}
next();
}
catch(e)
{
next(e);
}
}
// FONCTIONS UTILITAIRES
// Retourne un booléen suivant si l'utilisateur a accès ou non à un questionnaire
// Combien d'abonnements ont été enregistrés ces dernières 24 H ? depuis le début ? combien sont en premium ?
// Revoir : chercher les dates de paiement WP pour avoir stats 24 H ?
constgetStatsSubscriptions=async()=>
{
constdb=require("../models/index");
constgetSubscriptions24H=awaitdb.sequelize.query("SELECT `id` FROM `Subscriptions` WHERE `createdAt` > ADDDATE(NOW(), -1)",{type:QueryTypes.SELECT});
constgetSubscriptionsTot=awaitdb.sequelize.query("SELECT `id` FROM `Subscriptions`",{type:QueryTypes.SELECT});
constgetSubscriptionsPremium=awaitdb.sequelize.query("SELECT `id` FROM `Subscriptions` WHERE `numberOfDays` > :nb",{replacements:{nb:config.freeAccountTimingInDays},type:QueryTypes.SELECT});
constgetQuestionnaires=awaitdb.sequelize.query("SELECT `Questionnaires`.`id` FROM `Questionnaires` INNER JOIN `QuestionnaireAccesses` WHERE `Questionnaires`.`id`=`QuestionnaireAccesses`.`QuestionnaireId` AND `QuestionnaireAccesses`.`UserId`=:id AND `Questionnaires`.`isPublished` = 1 AND (`Questionnaires`.`title` LIKE :search OR `Questionnaires`.`introduction` LIKE :search)",{replacements:{id:req.connectedUser.User.id,search:"%"+search+"%"},type:QueryTypes.SELECT});
letbegin=0,end,output="";
if(!tool.isEmpty(req.body.begin))
begin=req.body.begin;
end=begin+configTpl.maxQuestionnairesByPage-1;// commence à 0 !
// Création du fichier des identifiants des questionnaires d'un utilisateur
// Les premiers étant les derniers
constcreaUserQuestionnairesJson=async(UserId)=>
{
UserId=tool.trimIfNotNull(UserId);
if(UserId===null)
returnfalse;
constdb=require("../models/index");
constuserQuestionnaires=awaitdb.sequelize.query("SELECT `QuestionnaireId` FROM `QuestionnaireAccesses` WHERE `UserId`=:id ORDER BY `createdAt` DESC",{replacements:{id:UserId},type:QueryTypes.SELECT});
if(userQuestionnaires)
{
constquestionnairesId=[];// les ids suffisent et allègent le fichier