diff --git a/code/server/index.js b/code/server/index.js index 46db3c6..bc79d8a 100644 --- a/code/server/index.js +++ b/code/server/index.js @@ -3,6 +3,7 @@ import express from 'express'; import bodyParser from 'body-parser'; import { addReviewFromRequest } from './borne/handler.js'; import { addSocialReviewFromRequest } from './reseaux_sociaux/handler.js'; +import { startCronJobs } from './stats/update_stats.js'; const app = express(); @@ -11,6 +12,8 @@ dotenv.config() app.post('/add_review', (req,res) => addReviewFromRequest(req,res)); app.post('/add_social_review', (req,res) => addSocialReviewFromRequest(req,res)); +startCronJobs(); + app.listen(process.env.PORT, () => { console.log("Server démaré sur le port " + process.env.PORT) }) diff --git a/code/server/package-lock.json b/code/server/package-lock.json index eb1d4b6..0a56818 100644 --- a/code/server/package-lock.json +++ b/code/server/package-lock.json @@ -10,6 +10,7 @@ "license": "ISC", "dependencies": { "body-parser": "^1.20.1", + "cron": "^2.1.0", "dotenv": "^16.0.3", "express": "^4.18.2", "mysql2": "^2.3.3" @@ -107,6 +108,14 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cron": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.1.0.tgz", + "integrity": "sha512-Hq7u3P8y7UWYvsZbSKHHJDVG0VO9O7tp2qljxzTScelcTODBfCme8AIhnZsFwmQ9NchZ3hr2uNr+s3DSms7q6w==", + "dependencies": { + "luxon": "^1.23.x" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -356,6 +365,14 @@ "node": ">=10" } }, + "node_modules/luxon": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz", + "integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==", + "engines": { + "node": "*" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -785,6 +802,14 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "cron": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.1.0.tgz", + "integrity": "sha512-Hq7u3P8y7UWYvsZbSKHHJDVG0VO9O7tp2qljxzTScelcTODBfCme8AIhnZsFwmQ9NchZ3hr2uNr+s3DSms7q6w==", + "requires": { + "luxon": "^1.23.x" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -979,6 +1004,11 @@ "yallist": "^4.0.0" } }, + "luxon": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz", + "integrity": "sha512-TfTiyvZhwBYM/7QdAVDh+7dBTBA29v4ik0Ce9zda3Mnf8on1S5KJI8P2jKFZ8+5C0jhmr0KwJEO/Wdpm0VeWJQ==" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", diff --git a/code/server/package.json b/code/server/package.json index 4018e9b..e83cbbd 100644 --- a/code/server/package.json +++ b/code/server/package.json @@ -11,6 +11,7 @@ "license": "ISC", "dependencies": { "body-parser": "^1.20.1", + "cron": "^2.1.0", "dotenv": "^16.0.3", "express": "^4.18.2", "mysql2": "^2.3.3" diff --git a/code/server/stats/update_stats.sql b/code/server/stats/update_request.sql similarity index 100% rename from code/server/stats/update_stats.sql rename to code/server/stats/update_request.sql diff --git a/code/server/stats/update_stats.js b/code/server/stats/update_stats.js index cabf62c..2f3c24e 100644 --- a/code/server/stats/update_stats.js +++ b/code/server/stats/update_stats.js @@ -1,9 +1,17 @@ import conn from '../database.js'; import fs from "fs"; +import { CronJob } from 'cron'; -export const computeStats = async (timePeriod, generalTableName, otherTableName) => { +/** + * Calcules les stats sur une periode donnée et les stocke dans la BDD + * @param {Number} timePeriod Periode de temps sur laquelle calculer les données. Par exemple 7 si on veut faire les stats des 7 derniers jours + * @param {String} generalTableName Nom de la table dans laquelle mettre les statistiques générales (tables valides : stats_general_jour stats_general_semaine stats_general_mois stats_general_annee) + * @param {*} otherTableName Nom de la table dans laquelle mettre les statistiques spécifiques (tables valides : stats_autres_jour stats_autres_autres_autres_mois stats_general_annee) + * @returns Une Promise qui résout si la requête a fonctionnée + */ +const computeStats = async (timePeriod, generalTableName, otherTableName) => { return new Promise((resolve, reject) => { - let sql = fs.readFileSync("stats/update_stats.sql").toString(); + let sql = fs.readFileSync("stats/update_request.sql").toString(); sql = sql .replace(new RegExp("DAY_COUNT_DELAY",'g'), timePeriod.toString()) .replace(new RegExp("STATS_GENERAL_TABLE_NAME", 'g'), generalTableName) @@ -12,10 +20,50 @@ export const computeStats = async (timePeriod, generalTableName, otherTableName) if(err) { reject(err) }else { - resolve(res.insertId); + resolve(); } }); }) } +export const startCronJobs = () => { + //Update les stats journalières tout les jours a minuit + new CronJob( + '0 0 * * * * ', + () => { + computeStats(1,"stats_general_jour","stats_autres_jour"); + }, + null, + true + ) -// computeStats(7,"stats_general_semaine","stats_autres_semaine").then(() => {console.log("OK")}); \ No newline at end of file + //update les stats de la semaine tous les lundis a minuit + new CronJob( + '0 0 * * 1 * ', + () => { + computeStats(7,"stats_general_semaine","stats_autres_jour"); + }, + null, + true + ) + + //update les stats mensuelles les 1er du mois a minuit + new CronJob( + '0 0 1 * * * ', + () => { + computeStats(30, "stats_general_mois","stats_autres_mois"); + }, + null, + true + ) + + //update les stats annuelles les premire de l'an a minuit + new CronJob( + '0 0 1 1 * * ', + () => { + computeStats(365, "stats_general_annee","stats_autres_annee"); + }, + null, + true + ) + console.log("All cronjobs initiated") +} \ No newline at end of file