From 6beca2f25e6fef8d9dd415ad38da2ca3d516d806 Mon Sep 17 00:00:00 2001
From: cgeek <cem.moreau@gmail.com>
Date: Sun, 19 Apr 2020 14:54:14 +0200
Subject: [PATCH] [mod] `members2` => allow to filter by UID or PUBKEY, **no
 more full scan**

---
 lg/members_en.txt  |  4 +++-
 lg/members_fr.txt  |  4 +++-
 routes/members2.ts | 27 ++++++++++++++++++++++++---
 views/members.html |  2 ++
 4 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/lg/members_en.txt b/lg/members_en.txt
index 5af1bf1..57165ed 100755
--- a/lg/members_en.txt
+++ b/lg/members_en.txt
@@ -68,4 +68,6 @@ MEMBER_FILTER search a member
 EXPIRE_TIME expiration datetime
 RANDOM_LIST Draw lots
 RANDOM_LIST_END membres (max. 100)
-MEMBERS members
\ No newline at end of file
+MEMBERS members
+UID_OR_PUB_LIST Whose pseudo or key contains
+UID_OR_PUB_LIST_END (3 chars. min.)
diff --git a/lg/members_fr.txt b/lg/members_fr.txt
index d330697..3843d5a 100755
--- a/lg/members_fr.txt
+++ b/lg/members_fr.txt
@@ -68,4 +68,6 @@ MEMBER_FILTER rechercher un membre
 EXPIRE_TIME date et heure d'expiration
 RANDOM_LIST Tirer au sort
 RANDOM_LIST_END membres (max. 100)
-MEMBERS membres
\ No newline at end of file
+MEMBERS membres
+UID_OR_PUB_LIST Dont le pseudo ou la clé contient
+UID_OR_PUB_LIST_END (3 car. min.)
diff --git a/routes/members2.ts b/routes/members2.ts
index 6bb7786..84923a9 100755
--- a/routes/members2.ts
+++ b/routes/members2.ts
@@ -69,6 +69,8 @@ module.exports = async (req: any, res: any, next: any) => {
 	var pendingSigs = req.query.pendingSigs || "no"; // Valeur par défaut
 	var centrality = req.query.centrality || "no"; // Valeur par défaut
 	var format = req.query.format || 'HTML'; // Valeur par défaut
+    let uidOrPubList = req.query.uidOrPubList === 'yes';
+    let uidOrPubValue = req.query.uidOrPubValue;
 	let nextYn = (req.query.nextYn=="yes") ? "yes":"no";
 	let randomList = req.query.randomList === 'no' ? 'no' : 'yes';
 	let numberOfRandomMembers = parseInt(req.query.randomCounts) || MonitConstants.MEMBERS_VIEW.DEFAULT_MEMBERS_RANDOM_NUMBER
@@ -86,7 +88,17 @@ module.exports = async (req: any, res: any, next: any) => {
 	let lastUpgradeTimeDatas = membersQuality(MonitConstants.QUALITY_CACHE_ACTION.INIT);
 	let dSenCache = membersQuality(MonitConstants.QUALITY_CACHE_ACTION.GET_D_SEN);
 	if (lastUpgradeTimeDatas > 0 && dSenCache > dSen) { previousNextYn == "yes"; }
-    
+
+    // Recherche par pseudo/pubkey
+    if (uidOrPubList) {
+      // UID/PUB > random
+      randomList = 'no'
+      if (!uidOrPubValue || uidOrPubValue.length < 3) {
+        // Recherche trop large
+        uidOrPubList = false
+        randomList = 'yes' // A la place
+      }
+    }
     // Alimenter wotb avec la toile actuelle
 	const wotbInstance = duniterServer.dal.wotb;
 		
@@ -94,7 +106,8 @@ module.exports = async (req: any, res: any, next: any) => {
 	let reinitCache = (Math.floor(Date.now() / 1000) > (membersLastUptime + MonitConstants.MIN_MEMBERS_UPDATE_FREQ));
 		
 		// Si changement de conditions, alors forcer le rechargement du cache s'il n'est pas vérouillé, sinon forcer les conditions à celles en mémoire
-		if (previousMode != mode || previousCentrality != centrality || previousNextYn != nextYn || previousRandomList != randomList || numberOfRandomMembers != previousRandomCounts)
+		// Si recherche par UID ou pubkey => recharger systématiquement
+		if (uidOrPubList || previousMode != mode || previousCentrality != centrality || previousNextYn != nextYn || previousRandomList != randomList || numberOfRandomMembers != previousRandomCounts)
 		{
 			if (!lockMembers)
 			{
@@ -184,6 +197,12 @@ module.exports = async (req: any, res: any, next: any) => {
 				}
 				membersList = randomMembers
 			}
+			else if (uidOrPubList) {
+				// Rerchercher les membres qui matchent par l'UID ou la pubkey
+				membersList = membersList.filter(m => {
+					return m.uid.toLocaleLowerCase().includes(uidOrPubValue) || m.pub.toLocaleLowerCase().includes(uidOrPubValue)
+				})
+			}
     
 			// Récupérer pour chaque identité, le numéro du block d'écriture du dernier membership
 			// Ainsi que la première ou dernière certification
@@ -590,7 +609,9 @@ module.exports = async (req: any, res: any, next: any) => {
 				// get parameters
         		days, mode, sort_by, order,
 				pendingSigs, centrality, nextYn,
-				numberOfRandomMembers, randomList,
+				numberOfRandomMembers: numberOfRandomMembers, randomList,
+				// Formulaire de recherche par UID ou PUB
+				uidOrPubList, uidOrPubValue,
 				
 				// page data
         		currentBlockchainTimestamp,
diff --git a/views/members.html b/views/members.html
index a3dbb90..ace782a 100755
--- a/views/members.html
+++ b/views/members.html
@@ -49,6 +49,8 @@ ${printMenu(MENU_LANG, help, "MEMBERS")}
 <input type="checkbox" name="nextYn" value="yes" ${nextYn == 'yes' ? 'checked' : ''}> ${LANG["NEXT_YN"]}<br>
 <input type="checkbox" name="randomList" value="yes" ${randomList == 'yes' ? 'checked' : ''}> ${LANG["RANDOM_LIST"]}
 <input type="number" name="randomCounts" value="${numberOfRandomMembers}"/> ${LANG["RANDOM_LIST_END"]}.<br>
+<input type="checkbox" name="uidOrPubList" value="yes" ${uidOrPubList ? 'checked' : ''}> ${LANG["UID_OR_PUB_LIST"]}
+<input type="search" name="uidOrPubValue" value="${uidOrPubValue || ''}"/> ${LANG["UID_OR_PUB_LIST_END"]}.<br>
 <hr>
 
 <!-- Afficher la légende et l'aide -->
-- 
GitLab