Advertisement
Guest User

Untitled

a guest
Apr 4th, 2019
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 19.06 KB | None | 0 0
  1. "use strict";
  2. // Express App (Routes)
  3. const express = require("express");
  4. const app = express();
  5. const path = require("path");
  6. const fileUpload = require("express-fileupload");
  7. const bodyParser = require("body-parser");
  8.  
  9. const ffi = require("ffi");
  10. const mysql = require('mysql');
  11. let connection = null;
  12.  
  13.  
  14. let 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.  
  50. app.use(fileUpload());
  51. app.use(bodyParser.urlencoded({ extended: false }));
  52. app.use(bodyParser.json());
  53.  
  54. // Minimization
  55. const fs = require("fs");
  56. const JavaScriptObfuscator = require("javascript-obfuscator");
  57.  
  58. // Important, pass in port as in `npm run dev 1234`, do not change
  59. const portNum = process.argv[2];
  60.  
  61. // Send HTML at root, do not change
  62. app.get("/", function(req, res) {
  63. res.sendFile(path.join(__dirname + "/public/index.html"));
  64. });
  65.  
  66. // Send Style, do not change
  67. app.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
  73. app.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
  88. app.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
  114. app.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.  
  125. const errorMessages = {
  126. INV_FILE: 'Invalid File',
  127. INV_CAL: 'Invalid Calendar',
  128. INV_EVENT: 'Invald Event',
  129. INV_ALARM: 'Invalid Alarm'
  130. }
  131.  
  132. app.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.  
  146. app.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.  
  167. app.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.  
  183. app.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.  
  195. app.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.  
  213. app.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.  
  225. app.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.  
  240. app.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.  
  323. app.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.  
  394. app.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.  
  488. app.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.  
  523. app.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.  
  714. app.use(function (err, req, res, next) {
  715. console.error(err.stack)
  716. res.status(500).send()
  717. })
  718.  
  719. app.listen(portNum);
  720. console.log("Running app at localhost: " + portNum);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement