diff --git a/libs/sql.js b/libs/sql.js index 6c013664..b1abde48 100644 --- a/libs/sql.js +++ b/libs/sql.js @@ -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 + }) + }) + }) + } } diff --git a/libs/webServerPaths.js b/libs/webServerPaths.js index ded2169d..78204551 100644 --- a/libs/webServerPaths.js +++ b/libs/webServerPaths.js @@ -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); })