refactor querying tables for rows binded to monitors with start and end times

- prepare function for other API functions that use this methodology
build-default-monitor-config-from-definitions
Moe 2020-05-23 23:08:54 -07:00
parent 0379fa70a7
commit 8526eea89a
2 changed files with 170 additions and 129 deletions

View File

@ -160,4 +160,158 @@ module.exports = function(s,config){
},true)
delete(s.preQueries)
}
s.sqlQueryBetweenTimesWithPermissions = (options,callback) => {
// options = {
// table: 'Events Counts',
// user: user,
// monitorId: req.params.id,
// startTime: req.query.start,
// endTime: req.query.end,
// startTimeOperator: req.query.startOperator,
// endTimeOperator: req.query.endOperator,
// limit: req.query.limit,
// archived: req.query.archived,
// endIsStartTo: !!req.query.endIsStartTo,
// parseRowDetails: true,
// rowName: 'counts'
// }
const user = options.user
const groupKey = options.groupKey
const monitorId = options.monitorId
const limit = options.limit
const archived = options.archived
const endTime = options.endTime
const startTimeOperator = options.startTimeOperator
const endTimeOperator = options.endTimeOperator
const startTime = options.startTime
const theTableSelected = options.table
const endIsStartTo = options.endIsStartTo
const userDetails = user.details
const rowName = options.rowName || 'rows'
var hasRestrictions = userDetails.sub && userDetails.allmonitors !== '1'
if(
user.permissions.watch_videos === "0" ||
hasRestrictions && (!userDetails.video_view || userDetails.video_view.indexOf(monitorId)===-1)
){
callback([]);
return
}
var queryString = 'SELECT * FROM `' + theTableSelected + '` WHERE ke=?'
var queryValues = [groupKey]
var queryStringCount = 'SELECT COUNT(*) FROM `' + theTableSelected + '` WHERE ke=?'
var queryCountValues = [groupKey]
if(archived === '1'){
queryString += ` AND details LIKE '%"archived":"1"'`
queryStringCount += ` AND details LIKE '%"archived":"1"'`
}
if(!monitorId){
if(
userDetails.sub &&
userDetails.monitors &&
userDetails.allmonitors !== '1'
){
try{
userDetails.monitors = JSON.parse(userDetails.monitors)
}catch(er){}
var queryWheres = []
userDetails.monitors.forEach(function(v,n){
queryWheres.push('mid=?')
queryValues.push(v)
})
queryString += ' AND ('+queryWheres.join(' OR ')+')'
queryStringCount += ' AND ('+queryWheres.join(' OR ')+')'
}
}else{
if(
!userDetails.sub ||
userDetails.allmonitors !== '0' ||
userDetails.monitors.indexOf(monitorId) >- 1
){
queryString += ' and mid=?'
queryValues.push(monitorId)
queryStringCount += ' and mid=?'
queryCountValues.push(monitorId)
}else{
res.end('[]');
return;
}
}
if(startTime || endTime){
if(startTime && startTime !== ''){
startTime = s.stringToSqlTime(startTime)
}
if(endTime && endTime !== ''){
endTime = s.stringToSqlTime(endTime)
}
if(!startTimeOperator || startTimeOperator==''){
startTimeOperator = startTimeOperator || '>='
}
if(!endTimeOperator || endTimeOperator==''){
endTimeOperator = endTimeOperator || '>='
}
var theEndParameter = '`end`'
if(endIsStartTo){
theEndParameter = '`time`'
}
switch(true){
case(startTime && startTime !== '' && endTime && endTime !== ''):
queryString += ' AND `time` '+startTimeOperator+' ? AND '+theEndParameter+' '+endTimeOperator+' ?';
queryStringCount += ' AND `time` '+startTimeOperator+' ? AND '+theEndParameter+' '+endTimeOperator+' ?';
queryValues.push(startTime)
queryValues.push(endTime)
queryCountValues.push(startTime)
queryCountValues.push(endTime)
break;
case(startTime && startTime !== ''):
queryString += ' AND `time` '+startTimeOperator+' ?';
queryStringCount += ' AND `time` '+startTimeOperator+' ?';
queryValues.push(startTime)
queryCountValues.push(startTime)
break;
case(endTime && endTime !== ''):
queryString += ' AND '+theEndParameter+' '+endTimeOperator+' ?';
queryStringCount += ' AND '+theEndParameter+' '+endTimeOperator+' ?';
queryValues.push(endTime)
queryCountValues.push(endTime)
break;
}
}
queryString += ' ORDER BY `time` DESC';
var rowLimit = limit || '100'
if(rowLimit !== '0'){
queryString += ' LIMIT ' + rowLimit
}
s.sqlQuery(queryString,queryValues,function(err,r){
if(!r){
callback({
total: 0,
limit: rowLimit,
skip: 0,
[rowName]: []
});
return
}
if(options.parseRowDetails){
r.forEach((row) => {
row.details = JSON.parse(row.details)
})
}
s.sqlQuery(queryStringCount,queryCountValues,function(err,count){
var skipOver = 0
if(rowLimit.indexOf(',') > -1){
skipOver = parseInt(rowLimit.split(',')[0])
rowLimit = parseInt(rowLimit.split(',')[1])
}else{
rowLimit = parseInt(rowLimit)
}
callback({
total: count[0]['COUNT(*)'],
limit: rowLimit,
skip: skipOver,
[rowName]: r,
endIsStartTo: endIsStartTo
})
})
})
}
}

View File

@ -1819,135 +1819,22 @@ module.exports = function(s,config,lang,app,io){
], function (req,res){
res.setHeader('Content-Type', 'application/json')
s.auth(req.params,function(user){
const groupKey = req.params.ke
const monitorId = req.params.id
var hasRestrictions = user.details.sub && user.details.allmonitors !== '1'
if(
user.permissions.watch_videos==="0" ||
hasRestrictions && (!user.details.video_view || user.details.video_view.indexOf(monitorId)===-1)
){
res.end(s.prettyPrint([]))
return
}
var origURL = req.originalUrl.split('/')
var videoParam = origURL[origURL.indexOf(req.params.auth) + 1]
var queryString = 'SELECT * FROM `Events Counts` WHERE ke=?'
var queryValues = [groupKey]
var queryStringCount = 'SELECT COUNT(*) FROM `Events Counts` WHERE ke=?'
var queryCountValues = [groupKey]
if(req.query.archived === '1'){
queryString += ` AND details LIKE '%"archived":"1"'`
queryStringCount += ` AND details LIKE '%"archived":"1"'`
}
if(!monitorId){
if(
user.details.sub &&
user.details.monitors &&
user.details.allmonitors !== '1'
){
try{
user.details.monitors = JSON.parse(user.details.monitors)
}catch(er){}
var queryWheres = []
user.details.monitors.forEach(function(v,n){
queryWheres.push('mid=?')
queryValues.push(v)
})
queryString += ' AND ('+queryWheres.join(' OR ')+')'
queryStringCount += ' AND ('+queryWheres.join(' OR ')+')'
}
}else{
if(
!user.details.sub ||
user.details.allmonitors !== '0' ||
user.details.monitors.indexOf(monitorId) >- 1
){
queryString += ' and mid=?'
queryValues.push(monitorId)
queryStringCount += ' and mid=?'
queryCountValues.push(monitorId)
}else{
res.end('[]');
return;
}
}
if(req.query.start || req.query.end){
if(req.query.start && req.query.start !== ''){
req.query.start = s.stringToSqlTime(req.query.start)
}
if(req.query.end && req.query.end !== ''){
req.query.end = s.stringToSqlTime(req.query.end)
}
if(!req.query.startOperator || req.query.startOperator==''){
const startOperator = req.query.startOperator || '>='
}
if(!req.query.endOperator || req.query.endOperator==''){
const endOperator = req.query.endOperator || '>='
}
var endIsStartTo
var theEndParameter = '`end`'
if(req.query.endIsStartTo){
endIsStartTo = true
theEndParameter = '`time`'
}
switch(true){
case(req.query.start && req.query.start !== '' && req.query.end && req.query.end !== ''):
queryString += ' AND `time` '+startOperator+' ? AND '+theEndParameter+' '+endOperator+' ?';
queryStringCount += ' AND `time` '+startOperator+' ? AND '+theEndParameter+' '+endOperator+' ?';
queryValues.push(req.query.start)
queryValues.push(req.query.end)
queryCountValues.push(req.query.start)
queryCountValues.push(req.query.end)
break;
case(req.query.start && req.query.start !== ''):
queryString += ' AND `time` '+startOperator+' ?';
queryStringCount += ' AND `time` '+startOperator+' ?';
queryValues.push(req.query.start)
queryCountValues.push(req.query.start)
break;
case(req.query.end && req.query.end !== ''):
queryString += ' AND '+theEndParameter+' '+endOperator+' ?';
queryStringCount += ' AND '+theEndParameter+' '+endOperator+' ?';
queryValues.push(req.query.end)
queryCountValues.push(req.query.end)
break;
}
}
queryString += ' ORDER BY `time` DESC';
var rowLimit = req.query.limit || '100'
if(rowLimit !== '0'){
queryString += ' LIMIT ' + rowLimit
}
s.sqlQuery(queryString,queryValues,function(err,r){
if(!r){
res.end(s.prettyPrint({
total: 0,
limit: rowLimit,
skip: 0,
counts: []
}));
return
}
r.forEach((row) => {
row.details = JSON.parse(row.details)
})
s.sqlQuery(queryStringCount,queryCountValues,function(err,count){
var skipOver = 0
if(rowLimit.indexOf(',') > -1){
skipOver = parseInt(rowLimit.split(',')[0])
rowLimit = parseInt(rowLimit.split(',')[1])
}else{
rowLimit = parseInt(rowLimit)
}
res.end(s.prettyPrint({
isUTC: config.useUTC,
total: count[0]['COUNT(*)'],
limit: rowLimit,
skip: skipOver,
counts: r,
endIsStartTo: endIsStartTo
}))
})
s.sqlQueryBetweenTimesWithPermissions({
table: 'Events Counts',
user: user,
groupKey: req.params.ke,
monitorId: req.params.id,
startTime: req.query.start,
endTime: req.query.end,
startTimeOperator: req.query.startOperator,
endTimeOperator: req.query.endOperator,
limit: req.query.limit,
archived: req.query.archived,
endIsStartTo: !!req.query.endIsStartTo,
parseRowDetails: true,
rowName: 'counts'
},(response) => {
res.end(s.prettyPrint(response))
})
},res,req);
})