· 5 years ago · Sep 21, 2020, 03:56 PM
1module.exports = function(s,config,lang,app,io){
2 s.schedules = {}
3 //Get all Schedules
4 s.getAllSchedules = function(callback){
5 s.schedules = {}
6 s.knexQuery({
7 action: "select",
8 columns: "*",
9 table: "Schedules"
10 },(err,rows) => {
11 rows.forEach(function(schedule){
12 s.updateSchedule(schedule)
13 })
14 if(callback)callback()
15 })
16 }
17 //update schedule
18 s.updateSchedule = function(row){
19 var schedule = Object.assign(row,{})
20 if(!s.schedules[schedule.ke])s.schedules[schedule.ke] = {}
21 s.checkDetails(schedule)
22 schedule.timezoneOffset = parseInt(schedule.details.timezone) || 0
23 schedule.details.days.forEach(function(dayNumber,key){
24 schedule.details.days[key] = parseInt(dayNumber)
25 })
26 if(!s.schedules[schedule.ke][schedule.name]){
27 s.schedules[schedule.ke][schedule.name] = schedule
28 }else{
29 s.schedules[schedule.ke][schedule.name] = Object.assign(s.schedules[schedule.ke][schedule.name],schedule)
30 }
31 }
32 //check time in schedule
33 var checkTimeAgainstSchedule = function(schedule,callback){
34 var start = schedule.start
35 var end = schedule.end
36 if(!callback)callback = function(){}
37 try{
38 if(
39 start
40 ){
41 var checkStartTime = new Date()
42 var startSplit = start.split(':')
43 var startHour = parseInt(startSplit[0])
44 var startMin = parseInt(startSplit[1])
45 checkStartTime.setHours(startHour)
46 checkStartTime.setMinutes(startMin - schedule.timezoneOffset)
47 if(end){
48 var checkEndTime = new Date()
49 var endSplit = end.split(':')
50 var endHour = parseInt(endSplit[0])
51 var endMin = parseInt(endSplit[1])
52 checkEndTime.setHours(endHour)
53 checkEndTime.setMinutes(endMin - schedule.timezoneOffset)
54 }
55 var currentDate = new Date()
56 currentDate.setMinutes(currentDate.getMinutes() - schedule.timezoneOffset)
57 if(
58 (
59 currentDate >= checkStartTime &&
60 currentDate <= checkEndTime
61 ) ||
62 currentDate >= checkStartTime && !end
63 ){
64 callback()
65 return true
66 }else{
67 callback({
68 currentDate : currentDate,
69 startTime : checkStartTime,
70 endTime : checkEndTime
71 })
72 }
73 }else{
74 callback({}) //no start time selected, failed
75 }
76 }catch(err){
77 console.log(err)
78 callback(err)
79 }
80 return false
81 }
82 //check days in schedule
83 var checkDaysAgainstSchedule = function(schedule,callback){
84 var days = schedule.details.days
85 if(!callback)callback = function(){}
86 try{
87 if(
88 days
89 ){
90 var currentDate = new Date()
91 currentDate.setMinutes(currentDate.getMinutes() - schedule.timezoneOffset)
92 var currentDay = currentDate.getDay()
93 if(
94 days.indexOf(currentDay) > -1 // if currentDay of week is found in schedule selection
95 ){
96 callback()
97 return true
98 }else{
99 callback({
100 currentDate: currentDate,
101 currentDay: currentDay
102 })
103 }
104 }else{
105 callback() //no days selected, succeed
106 return true
107 }
108 }catch(err){
109 console.log(err)
110 callback(err)
111 }
112 return false
113 }
114 //check all Schedules
115 s.checkSchedules = function(v,callback){
116 console.log('**************************')
117 console.log('checkSchedules started at ' + (new Date()))
118 var groupKeys = Object.keys(s.schedules)
119 groupKeys.forEach(function(key){
120 var scheduleNames = Object.keys(s.schedules[key])
121 scheduleNames.forEach(function(name){
122
123 var schedule = s.schedules[key][name]
124 console.log(' ' + schedule.name + ' (' + schedule.start + ' - ' + schedule.end + ')')
125 console.log(' enabled:' + schedule.enabled)
126 console.log(' monitorStates:' + schedule.details.monitorStates)
127
128 if(schedule.enabled === 1 && schedule.start && schedule.details.monitorStates){
129 var timePasses = checkTimeAgainstSchedule(schedule)
130 var daysPasses = checkDaysAgainstSchedule(schedule)
131 var passed = timePasses && daysPasses
132 console.log(' timePasses:' + timePasses)
133 console.log(' daysPasses:' + timePasses)
134
135 if(passed && !schedule.active){
136
137 console.log(' schedule.active = false and passed = true; setting schedule.active = true')
138
139 schedule.active = true
140 var monitorStates = schedule.details.monitorStates
141 monitorStates.forEach(function(stateName){
142
143 console.log(' calling activateMonitorStates for ' + stateName)
144 s.activateMonitorStates(key,stateName,{
145 ke: key,
146 uid: 'System',
147 details: {},
148 permissions: {},
149 lang: lang
150 },function(endData){
151 // console.log(endData)
152 })
153 })
154 }else if(!passed && schedule.active){
155
156 console.log(' setting schedule.active = false')
157 schedule.active = false
158 }
159 }
160 })
161 })
162 }
163 //
164 s.findSchedule = function(groupKey,name,callback){
165 //presetQueryVals = [ke, type, name]
166 s.knexQuery({
167 action: "select",
168 columns: "*",
169 table: "Schedules",
170 where: [
171 ['ke','=',groupKey],
172 ['name','=',name],
173 ],
174 limit: 1
175 },function(err,schedules) {
176 var schedule
177 var notFound = false
178 if(schedules && schedules[0]){
179 schedule = schedules[0]
180 s.checkDetails(schedule)
181 }else{
182 notFound = true
183 }
184 callback(notFound,schedule)
185 })
186 }
187 //
188 var onProcessReady = function(){
189 s.getAllSchedules(function(){
190 s.checkSchedules()
191 })
192 setInterval(function(){
193 s.checkSchedules()
194 },1000 * 60 * 5)
195 }
196 /**
197 * WebServerPath : API : Get Schedule
198 */
199 app.all([
200 config.webPaths.apiPrefix+':auth/schedule/:ke',
201 config.webPaths.adminApiPrefix+':auth/schedule/:ke',
202 config.webPaths.apiPrefix+':auth/schedule/:ke/:name',
203 config.webPaths.adminApiPrefix+':auth/schedule/:ke/:name',
204 config.webPaths.apiPrefix+':auth/schedules/:ke',
205 config.webPaths.adminApiPrefix+':auth/schedules/:ke',
206 config.webPaths.apiPrefix+':auth/schedules/:ke/:name',
207 config.webPaths.adminApiPrefix+':auth/schedules/:ke/:name',
208 ],function (req,res){
209 s.auth(req.params,function(user){
210 var endData = {
211 ok : false
212 }
213 if(user.details.sub){
214 endData.msg = user.lang['Not Permitted']
215 s.closeJsonResponse(res,endData)
216 return
217 }
218 var whereQuery = [
219 ['ke','=',req.params.ke]
220 ]
221 if(req.params.name){
222 whereQuery.push(['name','=',req.params.name])
223 }
224 s.knexQuery({
225 action: "select",
226 columns: "*",
227 table: "Schedules",
228 where: whereQuery,
229 },function(err,schedules) {
230 endData.ok = true
231 schedules = schedules || []
232 schedules.forEach(function(schedule){
233 s.checkDetails(schedule)
234 })
235 endData.schedules = schedules
236 s.closeJsonResponse(res,endData)
237 })
238 })
239 })
240 /**
241 * WebServerPath : API : Update Schedule
242 */
243 app.all([
244 config.webPaths.apiPrefix+':auth/schedule/:ke/:name/:action',
245 config.webPaths.adminApiPrefix+':auth/schedule/:ke/:name/:action',
246 config.webPaths.apiPrefix+':auth/schedules/:ke/:name/:action',
247 config.webPaths.adminApiPrefix+':auth/schedules/:ke/:name/:action'
248 ],function (req,res){
249 s.auth(req.params,function(user){
250 var endData = {
251 ok : false
252 }
253 if(user.details.sub){
254 endData.msg = user.lang['Not Permitted']
255 s.closeJsonResponse(res,endData)
256 return
257 }
258 switch(req.params.action){
259 case'insert':case'edit':
260 var form = s.getPostData(req)
261 s.checkDetails(form)
262 if(!form || !form.details){
263 endData.msg = user.lang['Form Data Not Found']
264 s.closeJsonResponse(res,endData)
265 return
266 }
267 form.enabled = parseInt(form.enabled) || 1;
268 s.findSchedule(req.params.ke,req.params.name,function(notFound,preset){
269 if(notFound === true){
270 endData.msg = lang["Inserted Schedule Configuration"]
271 var insertData = {
272 ke: req.params.ke,
273 name: req.params.name,
274 details: s.stringJSON(form.details),
275 start: form.start,
276 end: form.end,
277 enabled: form.enabled
278 }
279 s.knexQuery({
280 action: "insert",
281 table: "Schedules",
282 insert: insertData
283 })
284 s.tx({
285 f: 'add_schedule',
286 insertData: insertData,
287 ke: req.params.ke,
288 name: req.params.name
289 },'GRP_'+req.params.ke)
290 }else{
291 endData.msg = lang["Edited Schedule Configuration"]
292 var insertData = {
293 details: s.stringJSON(form.details),
294 start: form.start,
295 end: form.end,
296 enabled: form.enabled
297 }
298 s.knexQuery({
299 action: "update",
300 table: "Schedules",
301 update: insertData,
302 where: [
303 ['ke','=',req.params.ke],
304 ['name','=',req.params.name],
305 ]
306 })
307 s.tx({
308 f: 'edit_schedule',
309 insertData: Object.assign(insertData,{
310 ke: req.params.ke,
311 name: req.params.name,
312 }),
313 ke: req.params.ke,
314 name: req.params.name
315 },'GRP_'+req.params.ke)
316 }
317 s.updateSchedule({
318 ke: req.params.ke,
319 name: req.params.name,
320 details: s.stringJSON(form.details),
321 start: form.start,
322 end: form.end,
323 enabled: form.enabled
324 })
325 endData.ok = true
326 s.closeJsonResponse(res,endData)
327 })
328 break;
329 case'delete':
330 s.findSchedule(req.params.ke,req.params.name,function(notFound,schedule){
331 if(notFound === true){
332 endData.msg = user.lang['Schedule Configuration Not Found']
333 s.closeJsonResponse(res,endData)
334 }else{
335 s.knexQuery({
336 action: "delete",
337 table: "Schedules",
338 where : {
339 ke: req.params.ke,
340 name: req.params.name,
341 }
342 },function(err){
343 if(!err){
344 endData.msg = lang["Deleted Schedule Configuration"]
345 endData.ok = true
346 if(s.schedules[schedule.ke])delete(s.schedules[schedule.ke][schedule.name])
347 }
348 s.closeJsonResponse(res,endData)
349 })
350 }
351 })
352 break;
353 }
354 })
355 })
356 //bind events
357 s.onProcessReady(onProcessReady)
358}
359