· 6 years ago · Apr 04, 2019, 09:38 PM
1"use strict";
2// Express App (Routes)
3const express = require("express");
4const app = express();
5const path = require("path");
6const fileUpload = require("express-fileupload");
7const bodyParser = require("body-parser");
8
9const ffi = require("ffi");
10const mysql = require('mysql');
11let connection = null;
12
13
14let sharedLib = ffi.Library('./libcal',{
15 objectToJSON: ["string", ["string"]],
16 fillCalPanel: ["string", ["string"]],
17 webToCalendar: [
18 "string",
19 [
20 "string",
21 "string",
22 "string",
23 "string",
24 "string",
25 "string",
26 "string",
27 "string",
28 "string",
29 "string"
30 ]
31 ],
32 webToAddEvent: [
33 "string",
34 [
35 "string",
36 "string",
37 "string",
38 "string",
39 "string",
40 "string",
41 "string",
42 "string",
43 "string"
44 ]
45 ],
46 webToProps: ["string", ["string", "int"]],
47 webToAlarms: ["string", ["string", "int"]]
48});
49
50app.use(fileUpload());
51app.use(bodyParser.urlencoded({ extended: false }));
52app.use(bodyParser.json());
53
54// Minimization
55const fs = require("fs");
56const JavaScriptObfuscator = require("javascript-obfuscator");
57
58// Important, pass in port as in `npm run dev 1234`, do not change
59const portNum = process.argv[2];
60
61// Send HTML at root, do not change
62app.get("/", function(req, res) {
63 res.sendFile(path.join(__dirname + "/public/index.html"));
64});
65
66// Send Style, do not change
67app.get("/style.css", function(req, res) {
68 //Feel free to change the contents of style.css to prettify your Web app
69 res.sendFile(path.join(__dirname + "/public/style.css"));
70});
71
72// Send obfuscated JS, do not change
73app.get("/index.js", function(req, res) {
74 fs.readFile(path.join(__dirname + "/public/index.js"), "utf8", function(
75 err,
76 contents
77 ) {
78 const minimizedContents = JavaScriptObfuscator.obfuscate(contents, {
79 compact: true,
80 controlFlowFlattening: true
81 });
82 res.contentType("application/javascript");
83 res.send(minimizedContents._obfuscatedCode);
84 });
85});
86
87//Respond to POST requests that upload files to uploads/ directory
88app.post("/upload", function(req, res) {
89
90 if (!req.files) {
91 return res.status(400).send("No files were uploaded.");
92 }
93
94 let uploadFile = req.files.file;
95 console.log("uploadFile", uploadFile);
96
97
98 try {
99 // Use the mv() method to place the file somewhere on your server
100 uploadFile.mv("uploads/" + uploadFile.name, function(err) {
101 if (err) {
102
103 return res.status(500).send(err);
104 }
105
106 res.redirect("/");
107 });
108 } catch (err) {
109 res.send("No file selected");
110 }
111});
112
113//Respond to GET requests for files in the uploads/ directory
114app.get("/uploads/:name", function(req, res) {
115 fs.stat("uploads/" + req.params.name, function(err, stat) {
116 console.log(err);
117 if (err == null) {
118 res.sendFile(path.join(__dirname + "/uploads/" + req.params.name));
119 } else {
120 res.send("");
121 }
122 });
123});
124
125const errorMessages = {
126 INV_FILE: 'Invalid File',
127 INV_CAL: 'Invalid Calendar',
128 INV_EVENT: 'Invald Event',
129 INV_ALARM: 'Invalid Alarm'
130}
131
132app.get("/props", function(req, res) {
133 let files = [];
134 files = fs.readdirSync("./uploads/");
135
136 let array = [];
137
138 for (let x = 0; x < files.length; x++) {
139 array[x] = sharedLib.objectToJSON(files[x]);
140 console.log(array[x]);
141 }
142
143 res.send(array);
144});
145
146app.get("/invFileCheck", function(req, res) {
147 var file = req.query.fileName;
148
149 let files = [];
150 files = fs.readdirSync("./uploads/");
151
152 let response;
153
154 for (let x = 0; x < files.length; x++) {
155
156 if (files[x] == file){
157
158 response = JSON.parse(sharedLib.objectToJSON(file));
159
160 }
161 alert(response);
162 }
163
164 res.send(response);
165});
166
167app.get("/fileObject", function(req, res) {
168 let files = [];
169 files = fs.readdirSync("./uploads/");
170
171 let array = [];
172
173 for (let x = 0; x < files.length; x++) {
174
175 array[x] = JSON.parse(sharedLib.objectToJSON(files[x]));
176
177 console.log(array[x]);
178 }
179
180 res.send(array);
181});
182
183app.get("/dropDownBtn", function(req, res) {
184 let files = [];
185 files = fs.readdirSync("./uploads/");
186
187 res.send(files);
188});
189
190// app.get("/alarms", function(req, res) {
191// const alarms = ["asdf", "aalrm2"];
192// res.send(alarms);
193// });
194
195app.get("/eventProps", function(req, res) {
196 const errors = ["INV_FILE"]
197 let filename = req.query.filename;
198 let eventNum = req.query.eventNumber;
199 console.log("adding event props file ", filename + eventNum, " to status db");
200 let output = sharedLib.webToProps(filename, eventNum);
201 console.log("added event props file ", filename + eventNum, " to status db with output", output);
202 const hasError = errors.find(function(error) {
203 return error === output
204 })
205 if(hasError) {
206 res.statusMessage = errorMessages[output]
207 return res.status(503).send()
208 }
209 res.send(JSON.parse(output));
210
211});
212
213app.get("/eventAlarms", function(req, res) {
214
215
216 let filename = req.query.filename;
217 let alarmNum = req.query.alarmNumber;
218 console.log("adding alarm file ", filename + alarmNum, " to status db");
219 let output = sharedLib.webToAlarms(filename, alarmNum);
220 console.log("added alarm file ", filename + alarmNum, " to status db with output", output);
221 res.send(JSON.parse(output));
222
223});
224
225app.get("/fillCPanel", function(req, res) {
226 let filename = req.query.filename;
227 let array = sharedLib.fillCalPanel(filename);
228
229 console.log(array);
230 res.send(array);
231
232 //
233 // let files = [];
234 // files = fs.readdirSync('./uploads/');
235 //
236 // res.send(files);
237 //
238});
239
240app.post("/calendar", function(req, res, next) {
241 const prodid = req.body.prodID;
242 const versionEntry = req.body.versionEntry;
243 const startDate = req.body.sdtDate;
244 const startTime = req.body.sdtTime;
245 const creationDate = req.body.cdtDate;
246 const creationTime = req.body.cdtTime;
247 const uid = req.body.uid;
248 const fileName = req.body.filename;
249 const sUtcValue = req.body.sUtcValue;
250 const cUtcValue = req.body.cUtcValue;
251
252 console.log("Got data from frontend: ", req.body, "\n");
253 const requiredFields = [
254 "prodID",
255 "versionEntry",
256 "sdtDate",
257 "sdtTime",
258 "cdtDate",
259 "cdtTime",
260 "uid",
261 "filename",
262 "sUtcValue",
263 "cUtcValue"
264 ]
265
266 let unavailableField = ""
267 const isAllFieldsAvailable =requiredFields.every(function(requiredField) {
268 const isCurrentFieldAvailable = !!req.body[requiredField]
269 if(!isCurrentFieldAvailable) {
270 unavailableField = requiredField
271 }
272 return isCurrentFieldAvailable
273 })
274 console.log(isAllFieldsAvailable)
275
276 if(!isAllFieldsAvailable) {
277
278 res.statusMessage = `Please provide ${unavailableField}`
279 res.status(400).send()
280 return next();
281 }
282
283 try {
284 const calendarResponse= sharedLib.webToCalendar(
285 prodid,
286 versionEntry,
287 startDate,
288 startTime,
289 creationDate,
290 creationTime,
291 uid,
292 fileName,
293 sUtcValue,
294 cUtcValue
295 );
296
297 // console.log(calendarResponse);
298 if(calendarResponse === "OK") {
299 res.status(200).send({message: calendarResponse})
300 next();
301 }
302
303 else {
304 throw Error(calendarResponse)
305 }
306
307 } catch (error) {
308
309 res.statusMessage = error
310 res.status(500).send(res.statusMg)
311
312 }
313
314 // res.status(200).send({
315 // message: "Successfully uploaded"
316 // });
317 // } catch (error) {
318 // res.status(503).send(error);
319 // }
320});
321
322
323app.post("/event", function(req, res, next) {
324
325 const uid = req.body.eUid;
326 const startDate = req.body.sdtDate;
327 const startTime = req.body.sdtTime;
328 const startUTC = req.body.esUtcValue;
329 const creationDate = req.body.cdtDate;
330 const creationTime = req.body.cdtTime;
331 const creationUTC = req.body.ecUtcValue;
332 const summary = req.body.summary;
333 const filename = req.body.filename;
334
335 console.log("Got data from frontend: ", req.body, "\n");
336 const requiredFields = [
337 "eUid",
338 "sdtDate",
339 "sdtTime",
340 "esUtcValue",
341 "cdtDate",
342 "cdtTime",
343 "ecUtcValue",
344 "summary",
345 "filename"
346 ]
347 let unavailbleField = ""
348 const isAllFieldsAvailable =requiredFields.every(function(requiredField) {
349 const isCurrentFieldAvailable = !!req.body[requiredField]
350 if(!isCurrentFieldAvailable) {
351 unavailbleField = requiredField
352 }
353 return isCurrentFieldAvailable
354 })
355 console.log(isAllFieldsAvailable)
356
357 if(!isAllFieldsAvailable) {
358 res.statusMessage = `Please provide ${unavailbleField}`
359 res.status(400).send()
360 return next()
361 }
362
363 try {
364
365 const eventResponse= sharedLib.webToAddEvent(
366 uid,
367 startDate,
368 startTime,
369 startUTC,
370 creationDate,
371 creationTime,
372 creationUTC,
373 summary,
374 filename
375 );
376
377 console.log(eventResponse);
378 if(eventResponse === 'OK') {
379
380 res.status(200).send(eventResponse);
381 next();
382 }
383 else {
384 console.log("Got error from add event function",eventResponse)
385 throw Error(eventResponse)
386 }
387
388 } catch (error) {
389 res.statusMessage = error
390 res.status(500).send(res.statusMg)
391 }
392});
393
394app.get("/login", function(req, res) {
395
396 let username = req.query.username
397 let password = req.query.password
398 let database = req.query.database
399
400 console.log(username);
401 console.log(password);
402 console.log(database);
403
404 connection = mysql.createConnection({
405 host : 'dursley.socs.uoguelph.ca',
406 user : username,
407 password : password,
408 database : database
409});
410
411
412 connection.connect(function(err){
413
414 if (err){
415 const errorMessage = "FAILED TO CONNECT"
416 res.status(500).send(errorMessage)
417 }
418
419 else {
420
421 let file = `create table if not exists FILE(
422 cal_id int auto_increment primary key,
423 file_Name varchar(60) not null,
424 version int not null,
425 prod_id varchar(256) not null
426 );`;
427
428 let event = `create table if not exists EVENT(
429 event_id int auto_increment primary key,
430 summary varchar(1024),
431 start_time datetime not null,
432 location varchar(60),
433 organizer varchar(256),
434 cal_file int not null,
435 foreign key(cal_file) references FILE(cal_id) on delete cascade
436 );`;
437
438
439 let alarm = "create table if not exists ALARM( alarm_id int auto_increment primary key,action varchar(256) not null,`trigger` varchar(256) not null,event int not null,foreign key(event) references EVENT(event_id) on delete cascade);";
440
441
442 connection.query(file, function(err, results, fields) {
443
444 if (err) {
445 const errorMessage = "FAILED TO CONNECT"
446 res.status(500).send(errorMessage)
447 console.log("UNABLE TO CREATE TABLE");
448 }
449 else {
450 console.log("SUCCESSFULLY CREATED TABLE");
451 }
452 });
453
454 connection.query(event, function(err, results, fields) {
455
456 if (err) {
457 const errorMessage = "FAILED TO CONNECT"
458
459 console.log("UNABLE TO CREATE TABLE");
460 res.status(500).send(errorMessage)
461 }
462 else {
463 console.log("SUCCESSFULLY CREATED TABLE");
464 }
465 });
466
467 connection.query(alarm, function(err, results, fields) {
468
469 if (err) {
470 const errorMessage = "FAILED TO CONNECT"
471
472 console.log("UNABLE TO CREATE TABLE");
473 res.status(500).send(errorMessage)
474 }
475 else {
476 console.log("SUCCESSFULLY CREATED TABLE");
477 }
478 });
479
480 const message = "OK"
481 res.status(200).send(message);
482 }
483
484 });
485
486});
487
488app.get("/deleteTables", function(req, res) {
489
490 connection.query("delete from ALARM", function (err, rows, fields) {
491 if (err) {
492 console.log("Something went wrong. "+err);
493 const failMessage = "FAILED TO DELETE FROM ALARM TABLE"
494 res.status(500).send(failMessage);
495 }
496 else
497 console.log("Cleared data from ALARM table");
498 });
499
500 connection.query("delete from EVENT", function (err, rows, fields) {
501 if (err) {
502 console.log("Something went wrong. "+err);
503 const failMessage = "FAILED TO DELETE FROM EVENT TABLE"
504 res.status(500).send(failMessage);
505 }
506 else
507 console.log("Cleared data from EVENT table");
508 });
509
510
511 connection.query("delete from FILE", function (err, rows, fields) {
512 if (err) {
513 console.log("Something went wrong. "+err);
514 const failMessage = "FAILED TO DELETE FROM FILE TABLE"
515 res.status(500).send(failMessage);
516 }
517 else
518 console.log("Cleared data from FILE table");
519 });
520
521});
522
523app.get("/storeFile", function(req, res) {
524 let files = [];
525 files = fs.readdirSync("./uploads/");
526
527 let array = [];
528
529 connection.query("delete from FILE", function (err, rows, fields) {
530 if (err)
531 console.log("Something went wrong. "+err);
532 else
533 console.log("Cleared data from table");
534 });
535
536 connection.query("delete from EVENT", function (err, rows, fields) {
537 if (err)
538 console.log("Something went wrong. "+err);
539 else
540 console.log("Cleared data from table");
541 });
542
543 connection.query("delete from ALARM", function (err, rows, fields) {
544 if (err)
545 console.log("Something went wrong. "+err);
546 else
547 console.log("Cleared data from table");
548 });
549
550
551 for (let x = 0; x < files.length; x++) {
552
553 array[x] = JSON.parse(sharedLib.objectToJSON(files[x]));
554
555 let records = "INSERT INTO FILE (file_Name, version, prod_id) VALUES ('"+array[x].Filename+"','"+array[x].version+"', '"+array[x].prodID+"')";
556
557 connection.query(records, function (err, rows, fields) {
558 if (err){
559 console.log("FAILED TO INSERT into FILE Table. "+err);
560 const failMessage = "FAILED TO INSERT"
561 res.status(500).send(failMessage);
562 }
563 });
564 }
565
566 connection.query("SELECT * FROM FILE ORDER BY cal_id", function (err, rows, fields) {
567 console.log("FILE TABLE LENGTH", rows.length);
568 //Throw an error if we cannot run the query
569 if (err) {
570 console.log("Something went wrong. "+err);
571 }
572 else {
573 let a = 0;
574 //Rows is an array of objects. Each object has fields corresponding to table columns
575 for (let row of rows){
576
577 let eventList = JSON.parse(sharedLib.fillCalPanel(row.file_Name));
578
579 for (let y = 0; y < eventList.length; y++) {
580 a = y;
581 let date = eventList[y].startDT.date;
582 let time = eventList[y].startDT.time;
583
584 let formattedDate = date.slice(0, 4) + "-" + date.slice(4, 6) + "-" + date.slice(6, 8);
585 let formattedTime = time.slice(0, 2) + ":" + time.slice(2, 4) + ":" + time.slice(4, 6);
586 let startTime = formattedDate + " " + formattedTime;
587
588 let output = JSON.parse(sharedLib.webToProps(row.file_Name, y+1));
589 let summary = "";
590 let location = "";
591 let organizer = "";
592
593 if (output.SUMMARY != undefined){
594 summary = output.SUMMARY;
595 }
596 else {
597 summary = null;
598 }
599
600 if (output.LOCATION != undefined){
601 location = output.SUMMARY;
602 }
603 else {
604 location = null;
605 }
606
607 if (output.ORGANIZER != undefined){
608 organizer = output.SUMMARY;
609 }
610 else {
611 organizer = null;
612 }
613
614 console.log("ROW ID:", row.cal_id);
615
616 //INSERT INTO EVENT (summary, start_time, location, organizer, cal_file) VALUES ("hey", '1900-01-01 00:00:00' ,"ua", "dfa", 92);
617 let eventRecords = "INSERT INTO EVENT (summary, start_time, location, organizer, cal_file) VALUES ('"+summary+"','"+startTime+"','"+location+"','"+organizer+"','"+row.cal_id+"')";
618
619 connection.query(eventRecords, function (err, rows, fields) {
620
621 if (err){
622 console.log("FAILED TO INSERT into EVENT Table. "+err);
623 const failMessage = "FAILED TO INSERT"
624 res.status(500).send(failMessage);
625 }
626 });
627
628 // let alarmList = JSON.parse(sharedLib.webToAlarms(row.file_Name, y+1));
629 // console.log("ALARM LIST", alarmList);
630 // console.log("VALUE OF ALARMLIST LENGTH", alarmList.length);
631
632 // console.log("ALARM TITLE:", alarmList.title);
633
634 // if (alarmList.title != "No Event Alarms"){
635
636 // for (var p = 0; p<alarmList.length; p++){
637
638 // let alarmRecords = "INSERT INTO ALARM (action, trigger, event) VALUES ('"+alarmList[p].action+"','"+alarmList[p].trigger+"','"+eventList[a].event_id+"')";
639 // console.log("ALARM ACTION", alarmList[p].action);
640 // console.log("ALARM LIST", alarmList[p].trigger);
641 // console.log("EVENT ID:", eventList[a].event_id);
642
643 // connection.query(alarmRecords, function (err, rows, fields) {
644 // if (err){
645 // console.log("FAILED TO INSERT into ALARM Table. "+err);
646 // const failMessage = "FAILED TO INSERT"
647 // res.status(500).send(failMessage);
648 // }
649
650 // });
651 // }
652 // }
653
654
655 }
656 }
657
658 }
659 });
660
661// connection.query("SELECT * FROM ALARM ORDER BY alarm_id", function (err, rows, fields) {
662// if (err){
663// console.log("Something went wrong. "+err);
664// }
665// else {
666// console.log("Database contents sorted by alarm_id:");
667// console.log(rows.length);
668// for (let i = 0; i < rows.length; i++){
669// console.log("in the for loop");
670// console.log("ID: "+rows[i].id+" ACTION: "+rows[i].action+" TRIGGER: "+rows[i].trigger);
671// }
672// }
673
674// });
675
676 connection.query("SELECT * FROM EVENT ORDER BY event_id", function (err, rows, fields) {
677 if (err){
678 console.log("Something went wrong. "+err);
679 }
680 else {
681 console.log("Database contents sorted by event_id:");
682
683 console.log(rows.length);
684 for (let row of rows){
685 console.log("in the for loop");
686 console.log("ID: "+rows[i].id+" Summary: "+rows[i].summary+" Start Time: "+rows[i].start_time+" Location: "+rows[i].location+" Organizer: "+ rows[i].organizer + "CAL_FILE: " + rows[i].cal_id);
687 }
688 }
689
690});
691
692
693
694
695
696 //*** Uncomment the code below if you want ot see the data in rows and fields ***
697
698 /*
699 console.log("Rows:");
700 for (let row of rows){
701 console.log(row);
702 }
703 console.log("Fields:");
704 for (let field of fields){
705 console.log(field);
706 }
707 */
708
709
710 // res.status(500).send("OK");
711 res.send(array);
712});
713
714app.use(function (err, req, res, next) {
715 console.error(err.stack)
716 res.status(500).send()
717})
718
719app.listen(portNum);
720console.log("Running app at localhost: " + portNum);