From 9ec1838c1cb49278c6ebd0fd9956feb9e50ba66c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20B=C3=B6hm?= Date: Sun, 23 Feb 2020 18:39:24 +0100 Subject: [PATCH 1/3] Implement filtering by attributes --- .gitignore | 3 +++ core/db.js | 5 +++-- core/entryController.js | 24 ++++++++++++++++++++++-- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 7e07ab2..df95446 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,6 @@ typings/ # next.js build output .next + +# JetBrains IDEs +.idea/* diff --git a/core/db.js b/core/db.js index e9d4e90..bf44599 100644 --- a/core/db.js +++ b/core/db.js @@ -69,9 +69,10 @@ exports.getEntries = function(filter, callback){ sql += (filter['active'] === 1 ? ' AND' : ' WHERE') + ' image != \'\''; } - let orderByDate = filter['orderByDate'] === 'asc' ? 'ASC' : 'DESC'; + let orderBy = filter['orderBy'] ? filter['orderBy'] : 'id'; + let order = filter['order'] ? filter['order'] : 'desc'; - sql += ' ORDER BY ID ' + orderByDate + ' LIMIT ? OFFSET ?;'; + sql += ' ORDER BY ' + orderBy + ' '+ order + ' LIMIT ? OFFSET ?;'; // make the query connection.query(sql, [filter['limit'], filter['offset']], function(err, results) { diff --git a/core/entryController.js b/core/entryController.js index 0f7471c..7e952f2 100644 --- a/core/entryController.js +++ b/core/entryController.js @@ -11,13 +11,33 @@ exports.getAll = function(req, res) { const ORDER_BY_DATE_ASC = 'asc', ORDER_BY_DATE_DESC = 'desc'; + const orderByAcceptedAttributes = [ + 'id', + 'email', + 'firstname', + 'lastname', + 'country', + 'email_confirmed', + 'status', + 'anon', + 'created_at', + 'confirmed_at', + ]; + let filter = {}; filter['limit'] = parseInt(req.query.limit) || 10; filter['offset'] = parseInt(req.query.offset) || 0; - filter['active'] = parseInt(req.query.isActive) || 1; - filter['orderByDate'] = (req.query.orderByDate === ORDER_BY_DATE_ASC) ? ORDER_BY_DATE_ASC : ORDER_BY_DATE_DESC; + filter['active'] = parseInt(req.query.isActive) === 0 ? 0 : 1; filter['profileImage'] = parseInt(req.query.profileImage) || 0; + // 'orderBy' && 'order' are parameters from the WP admin backend for ordering the entries list + if (req.query.orderBy && orderByAcceptedAttributes.includes(req.query.orderBy)) { + if (req.query.order && (req.query.order === 'asc' || req.query.order === 'desc')) { + filter['orderBy'] = req.query.orderBy; + filter['order'] = req.query.order; + } + } + db.getEntries(filter, function(results, err){ if(!err){ // format output where required From 9ae99a4ecfeff523a5bfcefee8895c78dac1af11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20B=C3=B6hm?= Date: Mon, 2 Mar 2020 21:36:46 +0100 Subject: [PATCH 2/3] Implement filtering for status and email_confirmed --- core/db.js | 14 +++++++++++++- core/entryController.js | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/db.js b/core/db.js index bf44599..afa38f8 100644 --- a/core/db.js +++ b/core/db.js @@ -66,7 +66,19 @@ exports.getEntries = function(filter, callback){ } if (filter['profileImage'] === 1) { - sql += (filter['active'] === 1 ? ' AND' : ' WHERE') + ' image != \'\''; + sql += (sql.includes('WHERE') ? ' AND' : ' WHERE') + ' image != \'\''; + } + + if (filter['confirmed'] === 'yes') { + sql += (sql.includes('WHERE') ? ' AND' : ' WHERE') + ' email_confirmed = 1'; + } else if (filter['confirmed'] === 'no') { + sql += (sql.includes('WHERE') ? ' AND' : ' WHERE') + ' email_confirmed = 0'; + } + + if (filter['status'] === 'active' && filter['active'] !== 1) { + sql += (sql.includes('WHERE') ? ' AND' : ' WHERE') + ' status = 1'; + } else if (filter['status'] === 'inactive' && filter['active'] !== 1) { + sql += (sql.includes('WHERE') ? ' AND' : ' WHERE') + ' status = 0'; } let orderBy = filter['orderBy'] ? filter['orderBy'] : 'id'; diff --git a/core/entryController.js b/core/entryController.js index 7e952f2..9ecc29d 100644 --- a/core/entryController.js +++ b/core/entryController.js @@ -29,6 +29,8 @@ exports.getAll = function(req, res) { filter['offset'] = parseInt(req.query.offset) || 0; filter['active'] = parseInt(req.query.isActive) === 0 ? 0 : 1; filter['profileImage'] = parseInt(req.query.profileImage) || 0; + filter['confirmed'] = req.query.confirmed === 'yes' || req.query.confirmed === 'no' ? req.query.confirmed : 'all'; + filter['status'] = req.query.status === 'active' || req.query.status === 'inactive' ? req.query.status : 'all'; // 'orderBy' && 'order' are parameters from the WP admin backend for ordering the entries list if (req.query.orderBy && orderByAcceptedAttributes.includes(req.query.orderBy)) { From 0da3c30e480f8c77811bb85310254bc991e37cf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20B=C3=B6hm?= Date: Sun, 8 Mar 2020 21:41:57 +0100 Subject: [PATCH 3/3] Add filtering to count method to get exact count for WP admin backend --- core/db.js | 26 ++++++++++++++++++++++++-- core/entryController.js | 8 +++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/core/db.js b/core/db.js index afa38f8..095714f 100644 --- a/core/db.js +++ b/core/db.js @@ -172,11 +172,33 @@ exports.deleteEntry = function(id, callback){ }); }; -exports.getCount = function(callback){ +exports.getCount = function(filter, callback){ + console.log(filter); pool.getConnection(function(err, connection) { if(err) { console.log(err); callback(true); return; } - let sql = "SELECT count(*) as cnt FROM entries WHERE email_confirmed > 0 AND status < 2 AND country != '';"; + // let sql = "SELECT count(*) as cnt FROM entries WHERE email_confirmed > 0 AND status < 2 AND country != '';"; + let sql = 'SELECT count(*) as cnt FROM entries'; + + if (filter['active'] === 1) { + sql += ' WHERE email_confirmed > 0 AND status < 2 AND country != \'\''; + } + + if (filter['profileImage'] === 1) { + sql += (sql.includes('WHERE') ? ' AND' : ' WHERE') + ' image != \'\''; + } + + if (filter['confirmed'] === 'yes') { + sql += (sql.includes('WHERE') ? ' AND' : ' WHERE') + ' email_confirmed = 1'; + } else if (filter['confirmed'] === 'no') { + sql += (sql.includes('WHERE') ? ' AND' : ' WHERE') + ' email_confirmed = 0'; + } + + if (filter['status'] === 'active' && filter['active'] !== 1) { + sql += (sql.includes('WHERE') ? ' AND' : ' WHERE') + ' status = 1'; + } else if (filter['status'] === 'inactive' && filter['active'] !== 1) { + sql += (sql.includes('WHERE') ? ' AND' : ' WHERE') + ' status = 0'; + } // make the query connection.query(sql, function(err, results) { diff --git a/core/entryController.js b/core/entryController.js index 9ecc29d..82f87cb 100644 --- a/core/entryController.js +++ b/core/entryController.js @@ -120,7 +120,13 @@ exports.deleteEntry = function(request, response){ }; exports.getCount = function(req, res) { - db.getCount(function(results, err){ + let filter = {}; + filter['active'] = parseInt(req.query.isActive) === 0 ? 0 : 1; + filter['profileImage'] = parseInt(req.query.profileImage) || 0; + filter['confirmed'] = req.query.confirmed === 'yes' || req.query.confirmed === 'no' ? req.query.confirmed : 'all'; + filter['status'] = req.query.status === 'active' || req.query.status === 'inactive' ? req.query.status : 'all'; + + db.getCount(filter, function(results, err){ if(!err){ // TODO switch to json when clocks have been adjusted to new API // res.status(200).json({success : true, count : results[0]['cnt']});