342 lines
13 KiB
JavaScript
342 lines
13 KiB
JavaScript
module.exports = function(s,config,lang,app,io){
|
|
s.schedules = {}
|
|
//Get all Schedules
|
|
s.getAllSchedules = function(callback){
|
|
s.schedules = {}
|
|
s.knexQuery({
|
|
action: "select",
|
|
columns: "*",
|
|
table: "Schedules"
|
|
},(err,rows) => {
|
|
rows.forEach(function(schedule){
|
|
s.updateSchedule(schedule)
|
|
})
|
|
if(callback)callback()
|
|
})
|
|
}
|
|
//update schedule
|
|
s.updateSchedule = function(row){
|
|
var schedule = Object.assign(row,{})
|
|
if(!s.schedules[schedule.ke])s.schedules[schedule.ke] = {}
|
|
s.checkDetails(schedule)
|
|
schedule.timezoneOffset = parseInt(schedule.details.timezone) || 0
|
|
schedule.details.days.forEach(function(dayNumber,key){
|
|
schedule.details.days[key] = parseInt(dayNumber)
|
|
})
|
|
if(!s.schedules[schedule.ke][schedule.name]){
|
|
s.schedules[schedule.ke][schedule.name] = schedule
|
|
}else{
|
|
s.schedules[schedule.ke][schedule.name] = Object.assign(s.schedules[schedule.ke][schedule.name],schedule)
|
|
}
|
|
}
|
|
//check time in schedule
|
|
var checkTimeAgainstSchedule = function(schedule,callback){
|
|
var start = schedule.start
|
|
var end = schedule.end
|
|
if(!callback)callback = function(){}
|
|
try{
|
|
if(
|
|
start
|
|
){
|
|
var checkStartTime = new Date()
|
|
var startSplit = start.split(':')
|
|
var startHour = parseInt(startSplit[0])
|
|
var startMin = parseInt(startSplit[1])
|
|
checkStartTime.setHours(startHour)
|
|
checkStartTime.setMinutes(startMin - schedule.timezoneOffset)
|
|
if(end){
|
|
var checkEndTime = new Date()
|
|
var endSplit = end.split(':')
|
|
var endHour = parseInt(endSplit[0])
|
|
var endMin = parseInt(endSplit[1])
|
|
checkEndTime.setHours(endHour)
|
|
checkEndTime.setMinutes(endMin - schedule.timezoneOffset)
|
|
}
|
|
var currentDate = new Date()
|
|
currentDate.setMinutes(currentDate.getMinutes() - schedule.timezoneOffset)
|
|
if(
|
|
(
|
|
currentDate >= checkStartTime &&
|
|
currentDate <= checkEndTime
|
|
) ||
|
|
currentDate >= checkStartTime && !end
|
|
){
|
|
callback()
|
|
return true
|
|
}else{
|
|
callback({
|
|
currentDate : currentDate,
|
|
startTime : checkStartTime,
|
|
endTime : checkEndTime
|
|
})
|
|
}
|
|
}else{
|
|
callback({}) //no start time selected, failed
|
|
}
|
|
}catch(err){
|
|
console.log(err)
|
|
callback(err)
|
|
}
|
|
return false
|
|
}
|
|
//check days in schedule
|
|
var checkDaysAgainstSchedule = function(schedule,callback){
|
|
var days = schedule.details.days
|
|
if(!callback)callback = function(){}
|
|
try{
|
|
if(
|
|
days
|
|
){
|
|
var currentDate = new Date()
|
|
currentDate.setMinutes(currentDate.getMinutes() - schedule.timezoneOffset)
|
|
var currentDay = currentDate.getDay()
|
|
if(
|
|
days.indexOf(currentDay) > -1 // if currentDay of week is found in schedule selection
|
|
){
|
|
callback()
|
|
return true
|
|
}else{
|
|
callback({
|
|
currentDate: currentDate,
|
|
currentDay: currentDay
|
|
})
|
|
}
|
|
}else{
|
|
callback() //no days selected, succeed
|
|
return true
|
|
}
|
|
}catch(err){
|
|
console.log(err)
|
|
callback(err)
|
|
}
|
|
return false
|
|
}
|
|
//check all Schedules
|
|
s.checkSchedules = function(v,callback){
|
|
var groupKeys = Object.keys(s.schedules)
|
|
groupKeys.forEach(function(key){
|
|
var scheduleNames = Object.keys(s.schedules[key])
|
|
scheduleNames.forEach(function(name){
|
|
var schedule = s.schedules[key][name]
|
|
if(schedule.enabled === 1 && schedule.start && schedule.details.monitorStates){
|
|
var timePasses = checkTimeAgainstSchedule(schedule)
|
|
var daysPasses = checkDaysAgainstSchedule(schedule)
|
|
var passed = timePasses && daysPasses
|
|
if(passed && !schedule.active){
|
|
schedule.active = true
|
|
var monitorStates = schedule.details.monitorStates
|
|
monitorStates.forEach(function(stateName){
|
|
s.activateMonitorStates(key,stateName,{
|
|
ke: key,
|
|
uid: 'System',
|
|
details: {},
|
|
permissions: {},
|
|
lang: lang
|
|
},function(endData){
|
|
// console.log(endData)
|
|
})
|
|
})
|
|
}else if(!passed && schedule.active){
|
|
schedule.active = false
|
|
}
|
|
}
|
|
})
|
|
})
|
|
}
|
|
//
|
|
s.findSchedule = function(groupKey,name,callback){
|
|
//presetQueryVals = [ke, type, name]
|
|
s.knexQuery({
|
|
action: "select",
|
|
columns: "*",
|
|
table: "Schedules",
|
|
where: [
|
|
['ke','=',groupKey],
|
|
['name','=',name],
|
|
],
|
|
limit: 1
|
|
},function(err,schedules) {
|
|
var schedule
|
|
var notFound = false
|
|
if(schedules && schedules[0]){
|
|
schedule = schedules[0]
|
|
s.checkDetails(schedule)
|
|
}else{
|
|
notFound = true
|
|
}
|
|
callback(notFound,schedule)
|
|
})
|
|
}
|
|
//
|
|
var onProcessReady = function(){
|
|
s.getAllSchedules(function(){
|
|
s.checkSchedules()
|
|
})
|
|
setInterval(function(){
|
|
s.checkSchedules()
|
|
},1000 * 60 * 5)
|
|
}
|
|
/**
|
|
* WebServerPath : API : Get Schedule
|
|
*/
|
|
app.all([
|
|
config.webPaths.apiPrefix+':auth/schedule/:ke',
|
|
config.webPaths.adminApiPrefix+':auth/schedule/:ke',
|
|
config.webPaths.apiPrefix+':auth/schedule/:ke/:name',
|
|
config.webPaths.adminApiPrefix+':auth/schedule/:ke/:name',
|
|
config.webPaths.apiPrefix+':auth/schedules/:ke',
|
|
config.webPaths.adminApiPrefix+':auth/schedules/:ke',
|
|
config.webPaths.apiPrefix+':auth/schedules/:ke/:name',
|
|
config.webPaths.adminApiPrefix+':auth/schedules/:ke/:name',
|
|
],function (req,res){
|
|
s.auth(req.params,function(user){
|
|
var endData = {
|
|
ok : false
|
|
}
|
|
if(user.details.sub){
|
|
endData.msg = user.lang['Not Permitted']
|
|
s.closeJsonResponse(res,endData)
|
|
return
|
|
}
|
|
var whereQuery = [
|
|
['ke','=',req.params.ke]
|
|
]
|
|
if(req.params.name){
|
|
whereQuery.push(['name','=',req.params.name])
|
|
}
|
|
s.knexQuery({
|
|
action: "select",
|
|
columns: "*",
|
|
table: "Schedules",
|
|
where: whereQuery,
|
|
},function(err,schedules) {
|
|
endData.ok = true
|
|
schedules = schedules || []
|
|
schedules.forEach(function(schedule){
|
|
s.checkDetails(schedule)
|
|
})
|
|
endData.schedules = schedules
|
|
s.closeJsonResponse(res,endData)
|
|
})
|
|
})
|
|
})
|
|
/**
|
|
* WebServerPath : API : Update Schedule
|
|
*/
|
|
app.all([
|
|
config.webPaths.apiPrefix+':auth/schedule/:ke/:name/:action',
|
|
config.webPaths.adminApiPrefix+':auth/schedule/:ke/:name/:action',
|
|
config.webPaths.apiPrefix+':auth/schedules/:ke/:name/:action',
|
|
config.webPaths.adminApiPrefix+':auth/schedules/:ke/:name/:action'
|
|
],function (req,res){
|
|
s.auth(req.params,function(user){
|
|
var endData = {
|
|
ok : false
|
|
}
|
|
if(user.details.sub){
|
|
endData.msg = user.lang['Not Permitted']
|
|
s.closeJsonResponse(res,endData)
|
|
return
|
|
}
|
|
switch(req.params.action){
|
|
case'insert':case'edit':
|
|
var form = s.getPostData(req)
|
|
s.checkDetails(form)
|
|
if(!form || !form.details){
|
|
endData.msg = user.lang['Form Data Not Found']
|
|
s.closeJsonResponse(res,endData)
|
|
return
|
|
}
|
|
form.enabled = parseInt(form.enabled) || 1;
|
|
s.findSchedule(req.params.ke,req.params.name,function(notFound,preset){
|
|
if(notFound === true){
|
|
endData.msg = lang["Inserted Schedule Configuration"]
|
|
var insertData = {
|
|
ke: req.params.ke,
|
|
name: req.params.name,
|
|
details: s.stringJSON(form.details),
|
|
start: form.start,
|
|
end: form.end,
|
|
enabled: form.enabled
|
|
}
|
|
s.knexQuery({
|
|
action: "insert",
|
|
table: "Schedules",
|
|
insert: insertData
|
|
})
|
|
s.tx({
|
|
f: 'add_schedule',
|
|
insertData: insertData,
|
|
ke: req.params.ke,
|
|
name: req.params.name
|
|
},'GRP_'+req.params.ke)
|
|
}else{
|
|
endData.msg = lang["Edited Schedule Configuration"]
|
|
var insertData = {
|
|
details: s.stringJSON(form.details),
|
|
start: form.start,
|
|
end: form.end,
|
|
enabled: form.enabled
|
|
}
|
|
s.knexQuery({
|
|
action: "update",
|
|
table: "Schedules",
|
|
update: insertData,
|
|
where: [
|
|
['ke','=',req.params.ke],
|
|
['name','=',req.params.name],
|
|
]
|
|
})
|
|
s.tx({
|
|
f: 'edit_schedule',
|
|
insertData: Object.assign(insertData,{
|
|
ke: req.params.ke,
|
|
name: req.params.name,
|
|
}),
|
|
ke: req.params.ke,
|
|
name: req.params.name
|
|
},'GRP_'+req.params.ke)
|
|
}
|
|
s.updateSchedule({
|
|
ke: req.params.ke,
|
|
name: req.params.name,
|
|
details: s.stringJSON(form.details),
|
|
start: form.start,
|
|
end: form.end,
|
|
enabled: form.enabled
|
|
})
|
|
endData.ok = true
|
|
s.closeJsonResponse(res,endData)
|
|
})
|
|
break;
|
|
case'delete':
|
|
s.findSchedule(req.params.ke,req.params.name,function(notFound,schedule){
|
|
if(notFound === true){
|
|
endData.msg = user.lang['Schedule Configuration Not Found']
|
|
s.closeJsonResponse(res,endData)
|
|
}else{
|
|
s.knexQuery({
|
|
action: "delete",
|
|
table: "Schedules",
|
|
where : {
|
|
ke: req.params.ke,
|
|
name: req.params.name,
|
|
}
|
|
},function(err){
|
|
if(!err){
|
|
endData.msg = lang["Deleted Schedule Configuration"]
|
|
endData.ok = true
|
|
if(s.schedules[schedule.ke])delete(s.schedules[schedule.ke][schedule.name])
|
|
}
|
|
s.closeJsonResponse(res,endData)
|
|
})
|
|
}
|
|
})
|
|
break;
|
|
}
|
|
})
|
|
})
|
|
//bind events
|
|
s.onProcessReady(onProcessReady)
|
|
}
|