Mise à jours du script, il permet maintenant de requeter la liste des membres qui doivent effectuer leur renouvellement avant ‹ d › jours, d étant un paramètre GET dans l’url.
Merci à @cgeek de m’avoir montrer comment récupérer un paramètre GET en nodejs.
Ce nœud spécialisé n’est pas hyper utile en soi j’en convient, mais c’était pour plus pour m’entraîner et découvrir nodejs et la bdd sqlite de duniter ^^
Résultat avec d=15 :
37 membres doivent se renouveller dans moins de 15 jours ! Et 9 membres ne sont plus membres…
le script complet :
#!/usr/bin/env node
"use strict";
const co = require('co');
const duniter = require('duniter');
const http = require('http');
const express = require('express');
const HOME_DUNITER_DATA_FOLDER = 'rml8';
// Use netobs data folder
if (!process.argv.includes('--mdb')) {
process.argv.push('--mdb');
process.argv.push(HOME_DUNITER_DATA_FOLDER);
}
// Default action = start
if (process.argv.length === 4) process.argv.push('start');
// Disable Duniter logs
duniter.statics.logger.mute();
duniter.statics.cli((duniterServer) => co(function*() {
try {
/****************************************
* SPECIALISATION
***************************************/
const app = express();
const HOTE = 'localhost';
const PORT = 10500;
/**
* Sur appel de l'URL /bloc_courant
*/
app.get('/bloc_courant', (req, res) => co(function *() {
try {
// Allons chercher le bloc courant
const bloc = yield duniterServer.dal.blockDAL.getCurrent();
// Générons un contenu de page à afficher
const contenu = 'Hash du bloc courant : ' + bloc.hash;
// Envoyons la réponse
res.status(200).send('<pre>' + (contenu) + '</pre>');
} catch (e) {
// En cas d'exception, afficher le message
res.status(500).send('<pre>' + (e.stack || e.message) + '</pre>');
}
}));
/**
* Sur appel de l'URL /expire
*/
app.get('/expire/:abc', (req, res) => co(function *() {
try {
// Initaliser les variables
var contenu = "";
var nbExpirMembers = 0;
var membersTab = [];
var membershipsBlockNumberList = [];
var membershipsTimeList = [];
// Récupéré les paramètres
var days = 30;
if( typeof(req.query.d) == 'undefined' ) {
days = 30; // Valeur par défaut
} else {
days = req.query.d;
}
console.log("days = %s", days);
console.log("d = %s", req.query.d);
console.log(req.params);
console.log(req.query);
// Récupérer la liste des membres
const membersList = yield duniterServer.dal.peerDAL.query('SELECT `uid` FROM idty WHERE `wasMember`=1');
// Récupérer pour chaque membre, le membership le plus récent
for (const member of membersList) {
membershipsBlockNumberList.push(yield duniterServer.dal.peerDAL.query(
'SELECT `blockNumber` FROM membership WHERE `userid`=\''+member.uid+'\' ORDER BY `blockNumber` DESC LIMIT 1') );
}
// Convertir chaque blockNumber de membership en timestamp
for (const membershipBlockNumber of membershipsBlockNumberList) {
membershipsTimeList.push(yield duniterServer.dal.peerDAL.query(
'SELECT `time` FROM block WHERE `number`=\''+membershipBlockNumber[0].blockNumber+'\' LIMIT 1') );
}
// Afficher le formulaire
contenu += '<form action="expire" method="GET"><input type="text" name="d" value="'+days+'"/>jours</form><br><br>';
// Déterminer le timestamp d'il y a 6 mois
var currentTimestamp = Math.round(new Date().getTime() / 1000) ;
var _6monthPastTimestamp = currentTimestamp - (180*86400);
// On parcour tout les membres pour afficher ceux dont le dernier membership à plus de 6 mois
nbExpirMembers = 0;
contenu += '<b>Membres dont le statut de membre à déjà expirer :</b><br><table border=1>';
// console.log("_6monthPastTimestamp = %s", _6monthPastTimestamp);
for (var i=0;i<membersList.length;i++) {
if (membershipsTimeList[i][0].time < _6monthPastTimestamp) {
// Printer les nom des colonnes
if (nbExpirMembers == 0) {
contenu += "<tr><td align='center'>uid</td><td align='center'>date dernier renouvellement</td><td align='center'>blockNumber</td></tr>";
}
// Convertir timestamp en date
var tmpDate = new Date(membershipsTimeList[i][0].time*1000);
contenu += "<tr><td align='center'>"+membersList[i].uid+"</td><td align='center'>"+tmpDate.getDate()+"/"+tmpDate.getMonth()+"/"
+tmpDate.getFullYear()+"</td><td align='center'>"+membershipsBlockNumberList[i][0].blockNumber+"</td></tr>";
nbExpirMembers++;
}
}
contenu += "<tr><td align='center' colspan=3> total : <b>"+nbExpirMembers+"</b> membres.</td><t/tr></table><br><br>";
// Déterminer le timestamp d'il y a 6 mois - 'd' jours
var limitTimestamp = _6monthPastTimestamp + (days*86400);
// On parcour tout les membres pour afficher ceux dont le dernier membership à plus de 6 mois - 'd' jours
nbExpirMembers = 0;
contenu += '<b>Membres dont le statut de membre va expirer dans moins de '+days+' jours :</b><table border=1>';
// console.log("limitTimestamp = %s", limitTimestamp);
for (var i=0;i<membersList.length;i++) {
if (membershipsTimeList[i][0].time < limitTimestamp && membershipsTimeList[i][0].time > _6monthPastTimestamp) {
// Printer les nom des colonnes
if (nbExpirMembers == 0) {
contenu += "<tr><td align='center'>uid</td><td align='center'>date dernier renouvellement</td><td align='center'>blockNumber</td></tr>";
}
// Convertir timestamp en date
var tmpDate = new Date(membershipsTimeList[i][0].time*1000);
contenu += "<tr><td align='center'>"+membersList[i].uid+"</td><td align='center'>"
+tmpDate.getDate()+"/"+tmpDate.getMonth()+"/"+tmpDate.getFullYear()+"</td><td align='center'>"
+membershipsBlockNumberList[i][0].blockNumber+"</td></tr>";
nbExpirMembers++;
}
}
contenu += "<tr><td colspan=3> total : <b>"+nbExpirMembers+"</b> membres.</td><t/tr></table>";
// Déterminer la date correspondante
var dateLimitTimestamp = new Date();
dateLimitTimestamp.setTime(limitTimestamp);
// Envoyons la réponse
res.status(200).send('<pre>' + (contenu) + '</pre>');
} catch (e) {
// En cas d'exception, afficher le message
res.status(500).send('<pre>' + (e.stack || e.message) + '</pre>');
}
}));
const httpServer = http.createServer(app);
httpServer.listen(PORT, HOTE);
console.log("Serveur web disponible a l'adresse http://%s:%s", HOTE, PORT);
console.log("Page web 1 : http://%s:%s/bloc_courant", HOTE, PORT);
console.log("Page web 2 : http://%s:%s/expire/1", HOTE, PORT);
/****************************************/
} catch (e) {
console.error(e);
process.exit(1);
}
}));