Browse Source

Ajout possibilité abonnements non limités dans le tempst

master
Fabrice PENHOËT 7 months ago
parent
commit
c63e3b2702
  1. 2
      config/instance-example.js
  2. 16
      controllers/subscription.js

2
config/instance-example.js

@ -26,7 +26,7 @@ module.exports =
tokenLoginChangingTimeInHours: "1h",// for email & password changing
tokenDeleteUserTimeInHours: "1h",
tokenUnsubscribeLinkTimeInDays: "7 days", // token send with subscription's emails
freeAccountTimingInDays: 15,
freeAccountTimingInDays: 15,// if 0 = unlimited
freeAccountExpirationNotificationInDays: 3,
accountExpirationFirstNotificationInDays: 10,
accountExpirationSecondNotificationInDays: 3,

16
controllers/subscription.js

@ -95,6 +95,7 @@ exports.getQuestionnairesForUser = async(req, res, next) =>
// CRONS
// Envoi des notifications aux abonnés arrivés à quelques jours de la fin de leur période d'abonnement gratuit.
// À ne pas appeler si abonnement non limité dans le temps
exports.notifyExpirationFreeAccount= async(req, res, next) =>
{
try
@ -156,6 +157,7 @@ exports.notifyExpirationFreeAccount= async(req, res, next) =>
}
// Envoi des notifications aux abonnés arrivés à quelques jours de la fin de leur période d'abonnement prémium.
// À ne pas appeler si abonnement non limité dans le temps
exports.notifyExpirationAccount= async(req, res, next) =>
{
try
@ -238,17 +240,17 @@ exports.addNewQuestionnaireUsers = async(req, res, next) =>
{
try
{
console.log("Je cherche les abonnements à traiter");
console.log("Je cherche les abonnements à traiter");// pour vérifier si cronjob ok
const db = require("../models/index");
// Utilisateurs dont l'abonnement est toujours actif et souhaitant recevoir des quizs le jour de la semaine en cours.
// Le tout en heure locale et en ignorant ceux qui ont déjà été traités durant les dernières 24H.
const subscriptionsOk = await db.sequelize.query("SELECT `Subscriptions`.`id` as SubscriptionId, `Subscriptions`.`lastProcessingAt`, `UserId`, `name`, `email`, `smtp`, `language`, `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 DATEDIFF(NOW(),`Subscriptions`.`lastProcessingAt`) >= 1 LIMIT "+config.maxQuestionnaireSendedAtSameTime, { type: QueryTypes.SELECT });
const subscriptionsOk = await db.sequelize.query("SELECT `Subscriptions`.`id` as SubscriptionId, `Subscriptions`.`lastProcessingAt`, `UserId`, `name`, `email`, `smtp`, `language`, `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) OR `numberOfDays`=0) 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 DATEDIFF(NOW(),`Subscriptions`.`lastProcessingAt`) >= 1 LIMIT "+config.maxQuestionnaireSendedAtSameTime, { type: QueryTypes.SELECT });
if(subscriptionsOk.length === 0)
res.status(200).json({ message: txt.allSubscriptionProcessed });
else
{
const now=new Date();
console.log("Je vais traiter "+subscriptionsOk.length+" abonnements - "+now);
console.log("Je m'en vais traiter "+subscriptionsOk.length+" abonnements - "+now);
for (let i in subscriptionsOk)
{
// On commence à chercher le dernier élément envoyé à l'utilisateur pour comparer sa date d'enregistrement à celle du dernier envoi
@ -287,8 +289,6 @@ exports.addNewQuestionnaireUsers = async(req, res, next) =>
}
// Token du lien de désinscription aux envois :
const token=jwt.sign({ userId: subscriptionsOk[i].UserId }, config.tokenPrivateKey, { expiresIn: config.tokenUnsubscribeLinkTimeInDays });
elementToSend="";
if(!tool.isEmpty(elementToSend))
{
if(elementToSend.Questionnaire !== undefined)// = Il s'agit de l'élément d'un group
@ -336,9 +336,9 @@ exports.addNewQuestionnaireUsers = async(req, res, next) =>
toolMail.sendMail(subscriptionsOk[i].smtp, subscriptionsOk[i].email, mailDatas.mailSubject, tool.replaceAll(txt.mailNewQuestionnaireBodyTxt, mapMail), "", mailDatas);
}
}
else
else if(config.freeAccountTimingInDays !== 0)
{
// L'utilisateur a déjà reçu tous les élements publiés. Dans ce cas, on tire au hasard un quiz groupé pour le lui envoyer une nouvelle fois.
// Il s'agit d'un abonnement payant et l'utilisateur a déjà reçu tous les élements publiés. Dans ce cas, on tire au hasard un quiz groupé pour le lui envoyer une nouvelle fois.
const getElementToSend = await db.sequelize.query("SELECT `id`, `title`, `slug` FROM `Groups` WHERE `publishingAt` < NOW() AND `language`='"+subscriptionsOk[i].language+"' ORDER BY RAND() LIMIT 1", { type: QueryTypes.SELECT });
const mapMail =
{
@ -359,7 +359,7 @@ exports.addNewQuestionnaireUsers = async(req, res, next) =>
}
toolMail.sendMail(subscriptionsOk[i].smtp, subscriptionsOk[i].email, mailDatas.mailSubject, tool.replaceAll(txtQuestionnaireAccess.questionnaireRetryInfoTxt, mapMail), "", mailDatas);
}
// Dans tout les cas, on enregistre le fait que l'abonnement a été traité :
// Dans tous les cas, on enregistre le fait que l'abonnement a été traité :
db["Subscription"].update({ lastProcessingAt: now }, { where: { id : subscriptionsOk[i].SubscriptionId }, limit:1 });
}
res.status(200).json(subscriptionsOk);

Loading…
Cancel
Save