From abbbc90340329074b958dce30e55420cef9be452 Mon Sep 17 00:00:00 2001
From: librelois <elois@ifee.fr>
Date: Tue, 22 Aug 2017 02:00:26 +0200
Subject: [PATCH] [enh] membersCount : Personalize the maximum number of shown
 points and the choice of the parameter on which to play to respect this limit

---
 lib/updateCache.js     | 33 ++++++++++++++++++++++++++++-----
 routes/membersCount.js | 23 +++++++++++++++--------
 2 files changed, 43 insertions(+), 13 deletions(-)

diff --git a/lib/updateCache.js b/lib/updateCache.js
index 0097092..0f2fd07 100755
--- a/lib/updateCache.js
+++ b/lib/updateCache.js
@@ -97,7 +97,7 @@ module.exports = (req, res, next) => co(function *() {
       {
 				cache.endBlock = yield duniterServer.dal.peerDAL.query('SELECT `hash`,`medianTime`,`number`,`membersCount` FROM block WHERE `fork`=0 ORDER BY `medianTime` DESC LIMIT 1 ');
       }
-    }
+		}
     
     // fix begin value
     if ( typeof(req.query.begin) == 'undefined' || req.query.begin < 0 )
@@ -107,13 +107,36 @@ module.exports = (req, res, next) => co(function *() {
 			let beginTime = cache.endBlock[0].medianTime-(parseInt(cache.step)*unitTime*constants.STEP_COUNT_MIN);
       cache.beginBlock =  yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `medianTime` >= \''+beginTime+'\' ORDER BY `medianTime` ASC LIMIT 1 ');
     }
-    else { cache.beginBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `number`='+req.query.begin+' LIMIT 1 '); }
-    
-    // Apply STEP_COUNT_MAX and calculate stepTime
-    if ( Math.ceil((cache.endBlock[0].medianTime-cache.beginBlock[0].medianTime)/(cache.step*unitTime)) > constants.STEP_COUNT_MAX  )
+		else { cache.beginBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `number`='+req.query.begin+' LIMIT 1 '); }
+
+		// Define nbMaxPoints and adaptMaxPoints
+		if ( typeof(req.query.nbMaxPoints) != 'undefined' && req.query.nbMaxPoints > 0 ) {
+			cache.nbMaxPoints = req.query.nbMaxPoints;
+		} else {
+			cache.nbMaxPoints = constants.STEP_COUNT_MAX;
+		}
+		if ( typeof(req.query.adaptMaxPoints) != 'undefined' && (req.query.adaptMaxPoints == "step" || req.query.adaptMaxPoints == "end")) {
+			cache.adaptMaxPoints = req.query.adaptMaxPoints;
+		} else {
+			cache.adaptMaxPoints = "begin";
+		}
+		
+		// Apply nbMaxPoints and adaptMaxPoints
+		if (cache.adaptMaxPoints == "begin")
 		{
+			if ( Math.ceil((cache.endBlock[0].medianTime-cache.beginBlock[0].medianTime)/(cache.step*unitTime)) > cache.nbMaxPoints  )
+			{
+				let newBeginTime = cache.endBlock[0].medianTime-cache.step*cache.nbMaxPoints*unitTime;
+				cache.beginBlock =  yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `medianTime` >= \''+newBeginTime+'\' ORDER BY `medianTime` ASC LIMIT 1 ');
+			}
+		} else if (cache.adaptMaxPoints == "step") {
 			cache.step = Math.ceil((cache.endBlock[0].medianTime-cache.beginBlock[0].medianTime)/(constants.STEP_COUNT_MAX*unitTime));
+		} else {
+			let newEndTime = cache.beginBlock[0].medianTime+cache.step*cache.nbMaxPoints*unitTime;
+			cache.endBlock =  yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `medianTime` <= \''+newEndTime+'\' ORDER BY `medianTime` DESC LIMIT 1 ');
 		}
+    
+		// Calculate stepTime
     cache.stepTime = parseInt(cache.step)*unitTime;
 
     // if new blocks and MIN_CACHE_UPDATE_FREQ pass, update cache
diff --git a/routes/membersCount.js b/routes/membersCount.js
index 0315e94..ada13f4 100755
--- a/routes/membersCount.js
+++ b/routes/membersCount.js
@@ -3,8 +3,9 @@
 const co = require('co')
 const timestampToDatetime = require(__dirname + '/../lib/timestampToDatetime')
 const getLang = require(__dirname + '/../lib/getLang')
+//const constants = require(__dirname + '/../lib/constants.js')
 
-const STEP_COUNT_MAX = 150;
+//const STEP_COUNT_MAX = 150;
 
 module.exports = (req, res, next) => co(function *() {
   
@@ -16,7 +17,7 @@ module.exports = (req, res, next) => co(function *() {
 		var pow = req.query.pow || 'no';
     
     // get lg file
-    const LANG = getLang(`${__dirname}/../lg/membersCount_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`);
+		const LANG = getLang(`${__dirname}/../lg/membersCount_${req.query.lg||constants.DEFAULT_LANGUAGE}.txt`);
     
     // get medianTime of beginBlock
     var beginBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`hash` FROM block WHERE `fork`=0 AND `number` = '+cache.beginBlock[0].number+' LIMIT 1');
@@ -32,7 +33,7 @@ module.exports = (req, res, next) => co(function *() {
     // Traiter le cas stepUnit == "blocks"
     if (cache.stepUnit == "blocks")
     {
-      if ( Math.ceil((cache.endBlock[0].number-cache.beginBlock[0].number)/cache.step) > STEP_COUNT_MAX  ) { cache.step = Math.ceil((cache.endBlock[0].number-cache.beginBlock[0].number)/STEP_COUNT_MAX); }
+      if ( Math.ceil((cache.endBlock[0].number-cache.beginBlock[0].number)/cache.step) > constants.STEP_COUNT_MAX  ) { cache.step = Math.ceil((cache.endBlock[0].number-cache.beginBlock[0].number)/constants.STEP_COUNT_MAX); }
     }
     
     // Initialize nextStepTime, stepIssuerCount and bStep
@@ -185,17 +186,23 @@ module.exports = (req, res, next) => co(function *() {
         tabMembersCount,
         begin: cache.beginBlock[0].number,
         end: cache.endBlock[0].number,
-        form: `${LANG["BEGIN"]} #<input type="number" name="begin" value="${cache.beginBlock[0].number}" min="0"> - ${LANG["END"]} #<input type="number" name="end" value="${cache.endBlock[0].number}" > - 		${LANG["STEP"]} <input type="number" name="step" value="${cache.step}" min="1">
+        form: `${LANG["BEGIN"]} #<input type="number" name="begin" value="${cache.beginBlock[0].number}" min="0" size="7" style="width:60px;"> - ${LANG["END"]} #<input type="number" name="end" value="${cache.endBlock[0].number}" size="7" style="width:60px;"> - 		${LANG["STEP"]} <input type="number" name="step" value="${cache.step}" min="1" size="4" style="width:50px;">
 					<select name="stepUnit">
-						<option name="stepUnit" value ="blocks"${cache.stepUnit == 'blocks' ? 'selected' : ''}>${LANG["BLOCKS"]}
-						<option name="stepUnit" value ="hours"${cache.stepUnit == 'hours' ? 'selected' : ''}>${LANG["HOURS"]}
+						<option name="stepUnit" value ="blocks" ${cache.stepUnit == 'blocks' ? 'selected' : ''}>${LANG["BLOCKS"]}
+						<option name="stepUnit" value ="hours" ${cache.stepUnit == 'hours' ? 'selected' : ''}>${LANG["HOURS"]}
 						<option name="stepUnit" value ="days" ${cache.stepUnit == 'days' ? 'selected' : ''}>${LANG["DAYS"]}
 						<option name="stepUnit" value ="weeks" ${cache.stepUnit == 'weeks' ? 'selected' : ''}>${LANG["WEEKS"]}
 						<option name="stepUnit" value ="months" ${cache.stepUnit == 'months' ? 'selected' : ''}>${LANG["MONTHS"]}
 						<option name="stepUnit" value ="years" ${cache.stepUnit == 'years' ? 'selected' : ''}>${LANG["YEARS"]}
-					</select>`,
+					</select> - max <input type="number" name="nbMaxPoints" value="${cache.nbMaxPoints}" min="1" size="4" style="width:50px;"> points (réguler en adaptant
+					<select name="adaptMaxPoints">
+						<option name="adaptMaxPoints" value ="begin"> ${LANG["BEGIN"]}
+						<option name="adaptMaxPoints" value ="step" ${cache.adaptMaxPoints == 'step' ? 'selected' : ''}> ${LANG["STEP"]}
+						<option name="adaptMaxPoints" value ="end" ${cache.adaptMaxPoints == 'end' ? 'selected' : ''}> ${LANG["END"]}
+					</select>)`,
 				description: `${LANG["DESCRIPTION1"]+'<br>'+LANG["DESCRIPTION2"]+'<b>'+cache.Yn+'</b>.'}`,
-				form2: `<input type="checkbox" name="pow" value="yes" ${pow == 'yes' ? 'checked' : ''}> ${LANG["SHOW_POW_MIN"]}`,
+				form2: `
+					<input type="checkbox" name="pow" value="yes" ${pow == 'yes' ? 'checked' : ''}> ${LANG["SHOW_POW_MIN"]}`,
         chart: {
           type: 'line',
           data: {
-- 
GitLab