Advertisement
Guest User

Untitled

a guest
May 4th, 2016
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var express = require('express');
  2. var cookieParser = require('cookie-parser');
  3. var passwordHash = require('password-hash');
  4. var path = require('path');
  5. var json2csv = require('json2csv');
  6. var MongoClient = require('mongodb').MongoClient;
  7. var assert = require('assert');
  8. var app = express();
  9. var collection;
  10. var user;
  11. var query;
  12. var database;
  13. var count = 0;
  14. var results = [];
  15. var fs = require('fs');
  16. //var url = 'mongodb://iattend:pass@ds011872.mlab.com:11872/iattend';
  17. var url='mongodb://localhost:27017/iAttend';
  18. var bodyParser = require("body-parser");
  19. var FormData = require('form-data');
  20.  
  21. //###### faceplusples has to be using US server, if broken check module and replase CN with US
  22. var FacePlusPlus = require('faceplusplus');
  23. var config = {
  24.     api_key: '811c42cba5495e4c5d25cc2cbc37dcf7',
  25.     api_secret: '1p34xzkMH_h1ZFVj15CCgCOle5_wfTYe'
  26. };
  27.  
  28. var client = new FacePlusPlus(config);
  29.  
  30.  
  31. //###### Might possibly cause issues
  32. app.use(express.static(__dirname + '/public'));
  33. app.use(bodyParser.urlencoded({extended: false}));
  34. app.use(bodyParser.json());
  35.  
  36. //use url in connection to mongo server
  37. MongoClient.connect(url, function (err, db) {
  38.     if (err) throw err;
  39.     console.log("Mongo connected");
  40.     console.log(url);
  41.     database = db;
  42. });
  43.  
  44. app.use(express.static(path.join(__dirname, '/')));
  45.  
  46. //serving the html file
  47. app.get('/', function (req, res, next) {
  48.     res.sendFile('index.html', {root: './'});
  49.     next();
  50. });
  51.  
  52. app.use(cookieParser());
  53.  
  54. app.get('/checkCookie', function (req, res) {
  55.     var logged;
  56.  
  57.     if (req.cookies.user != null) {
  58.         logged = true;
  59.         res.send({logged: logged, user: req.cookies});
  60.     }
  61.     else {
  62.         logged = false;
  63.         res.send({logged: logged});
  64.     }
  65. });
  66.  
  67. app.get('/checkUser', function (req, res) {
  68.     var userExists = false;
  69.     var searchEmail = req.query.email.toString();
  70.     collection = database.collection('users');
  71.     collection.findOne({"email": searchEmail}, function (err, result) {
  72.         if (result) {
  73.             userExists = true;
  74.             console.log("found ya");
  75.             console.log(result);
  76.             res.send({exists: userExists, result: result});
  77.         }
  78.         else {
  79.             console.log("didn't find you");
  80.             res.send({exists: userExists});
  81.         }
  82.     });
  83.     console.log(userExists);
  84. });
  85.  
  86.  
  87.  
  88. app.get('/newUser', function (req, res) {
  89.     var userInserted = false;
  90.     var message;
  91.     collection = database.collection('users');
  92.     /*collection.findAndModify({{"email":searchEmail},
  93.      $setOnInsert:
  94.      {"name":req.query.user,
  95.      "email":req.query.email,
  96.      "password":req.query.password,
  97.      "userType":req.query.userType}
  98.      },
  99.      {new: false, upsert: true},
  100.      })*/
  101.     var hashedPassword = passwordHash.generate(req.query.password);
  102.  
  103.     collection.insertOne(
  104.         {
  105.             "name": req.query.user,
  106.             "email": req.query.email,
  107.             "password": hashedPassword,
  108.             "userType": req.query.userType
  109.         }, function (err, doc) {
  110.             console.log("in insert");
  111.             if (err) {
  112.                 userInserted = false;
  113.                 message = "An error occured " + err;
  114.                 throw err;
  115.                 res.send({data: userInserted, message: message});
  116.             }
  117.             else {
  118.                 message = "user added";
  119.                 console.log(message);
  120.                 console.log(doc);
  121.                 userInserted = true;
  122.                 res.send({data: userInserted, message: message});
  123.             }
  124.         }
  125.     );
  126. });
  127.  
  128. app.get('/login', function (req, res) {
  129.  
  130.     var password = req.query.password.toString();
  131.     var email = req.query.email.toString();
  132.     var passMatch = false;
  133.     var user;
  134.  
  135.     collection = database.collection('users');
  136.     collection.find({"email": email}).toArray(function (err, docs) {
  137.         console.log("looking for password match with " + req.query.password);
  138.         var hashedPassword = docs[0].password;
  139.         if ((passwordHash.verify(password, hashedPassword))) {
  140.             console.log("we have a match");
  141.             passMatch = true;
  142.             user = docs[0].email;
  143.             res.cookie('user', user);
  144.             name = docs[0].name;
  145.             res.cookie('name', name);
  146.             type = docs[0].userType;
  147.             res.cookie('type', type);
  148.             console.log(req.cookies.user);
  149.             res.send({data: docs, match: passMatch});
  150.         }
  151.         else {
  152.             console.log("not finding that match");
  153.         }
  154.     });
  155.  
  156. });
  157.  
  158. app.get('/logout', function (req, res) {
  159.     res.clearCookie('user');
  160.     res.clearCookie('name');
  161.     res.clearCookie('type');
  162.     //console.log(req.cookies);
  163.     var logged = false;
  164.     res.send({logged: logged});
  165. });
  166.  
  167. app.get('/createClass', function (req, res) {
  168.     var classCreated;
  169.     var exists = false;
  170.  
  171.     collection = database.collection('courses');
  172.     collection.findOne({
  173.         "dept": req.query.department,
  174.         "courseNum": req.query.courseNumber,
  175.         "section": req.query.courseSection
  176.     }, function (err, result) {
  177.         if (result) {
  178.             console.log("class exists");
  179.             exists = true;
  180.             res.send({data: result, existed: exists});
  181.         }
  182.         else {
  183.             collection.insertOne(
  184.                 {
  185.                     "name": req.query.name,
  186.                     "dept": req.query.department,
  187.                     "courseNum": req.query.courseNumber,
  188.                     "section": req.query.courseSection,
  189.                     "regNum": req.query.registration,
  190.                     "owner": req.cookies.user
  191.                 }, function (err, doc) {
  192.                     console.log("in insert");
  193.                     if (err) {
  194.                         classCreated = false;
  195.                         message = "An error occured " + err;
  196.                         throw err;
  197.                         res.send({data: classInserted, message: message});
  198.                     }
  199.                     else {
  200.                         message = "class created";
  201.                         console.log(message);
  202.                         console.log(doc);
  203.                         classCreated = true;
  204.                         res.send({data: doc, insert: classCreated});
  205.                     }
  206.                 }
  207.             );
  208.  
  209.             database.collection("attendance").insertOne(
  210.                 {"dept":req.query.department,
  211.                 "courseNum":req.query.courseNumber,
  212.                 "section":req.query.courseSection}, function(err, doc){
  213.                     if(err){
  214.                         console.log(err);
  215.                     }
  216.             });
  217.         }
  218.     });
  219. });
  220.  
  221. app.get('/getClasses', function (req, res) {
  222.     var registered;
  223.     console.log("over here");
  224.     console.log(req.query.authority);
  225.    
  226.     console.log(req.cookies.user);
  227.     var user = req.cookies.user.toString();
  228.     console.log(user);
  229.    
  230.     collection = database.collection('courses');
  231.  
  232.     if(req.query.authority=="true") {
  233.         collection.find({"owner" : user}).toArray(function (err, docs) {
  234.            
  235.             if (docs.length==0) {
  236.                 registered = false;
  237.                 console.log("not found");
  238.                 res.send({registered: registered});
  239.             }
  240.             else {
  241.                 registered = true;
  242.                 console.log("found");
  243.                 res.send({data: docs, registered: registered});
  244.             }
  245.         });
  246.     }
  247.     if(req.query.authority=="false") {
  248.         console.log("user is a student");
  249.            collection.find({"students" : user}).toArray(function (err, docs) {
  250.            
  251.             if (docs.length==0) {
  252.                 registered = false;
  253.                 console.log("not found");
  254.                 res.send({registered: registered});
  255.             }
  256.             else {
  257.                 registered = true;
  258.                 console.log("found");
  259.                 res.send({data: docs, registered: registered});
  260.             }
  261.         });  
  262.     }
  263. });
  264.  
  265. app.get('/isLive', function(req, res){
  266.  
  267.     var classArray = [];
  268.     var ids = [];
  269.     classArray.push(req.query.classes);
  270.     for(var i=0; i<classArray.length; i++){
  271.         ids.push(classArray._id);
  272.     }
  273.     console.log("enrolled in" + classArray);
  274.  
  275.     var liveClasses = [];
  276.  
  277.     collection = database.collection('attendance');
  278.     collection.find({"code": {$exists:true}}).toArray(function (err, docs){
  279.         //liveClasses.push(docs);
  280.         //console.log("live classes are" + docs);
  281.         console.log(docs);
  282.     });
  283.  
  284.    
  285.  
  286.     //for(var i=0; i<liveClasses.length; i++){
  287.  
  288.     //}
  289.      
  290.     //console.log(liveClasses);
  291.     //res.send({data: liveClasses});
  292.    
  293. });
  294.  
  295. app.get('/setVerCode', function(req, res){
  296.  
  297.     var datetime = new Date();
  298.     console.log(datetime);
  299.     var dateString = datetime.toString();
  300.  
  301.     code = req.query.code;
  302.     console.log(code, req.query.dept, req.query.courseNum, req.query.section);
  303.  
  304.     collection = database.collection('attendance');
  305.  
  306.     collection.update(
  307.         {
  308.             "dept": req.query.dept,
  309.             "courseNum": req.query.courseNum,
  310.             "section": req.query.section
  311.         },
  312.         {   $set:
  313.             {
  314.                 "code": code,
  315.                 "date": datetime
  316.             }
  317.         }
  318.     )
  319.     console.log("code updated");
  320.     res.send({code:code});
  321.    
  322. });
  323.  
  324. app.get('/clearAndCount', function(req, res){
  325.     code = req.query.code;
  326.     console.log(code);
  327.  
  328.     collection = database.collection('attendance');
  329.  
  330.     collection.update(
  331.     {
  332.         "dept":req.query.dept,
  333.         "courseNum":req.query.courseNum,
  334.         "section":req.query.section
  335.     },
  336.     {   $unset:
  337.         {
  338.             "code": ""
  339.         }
  340.     }
  341.     );
  342.  
  343.     collection.findOne(
  344.     {
  345.         "dept":req.query.dept,
  346.         "courseNum":req.query.courseNum,
  347.         "section":req.query.section
  348.     },{"students": true}).toArray(function (err, docs){
  349.         res.send({data : docs});
  350.     });
  351.  
  352.     console.log("code cleared and attendance calculated");
  353.     //res.send({code:code});
  354.    
  355. });
  356.  
  357. app.get('/searchAddClass', function (req, res) {
  358.     var classAdded;
  359.     var exists = false;
  360.     var codeMatch = true;
  361.     var nameFound = false;
  362.     var names = [];
  363.  
  364.     collection = database.collection('courses');
  365.  
  366.     collection.findOne({
  367.         "dept": req.query.department,
  368.         "courseNum": req.query.courseNumber,
  369.         "section": req.query.courseSection
  370.     }, function (err, result) {
  371.  
  372.         if (err) {
  373.             exists = false;
  374.             res.send({data: err, exists: exists});
  375.         }
  376.  
  377.         else if (result.regNum != req.query.registration) {
  378.             codeMatch = false;
  379.             console.log("code mismatch");
  380.             console.log(result);
  381.             res.send({data: result, verifiedCode: codeMatch});
  382.         }
  383.  
  384.         else if (result.students != null) {
  385.  
  386.             names = result.students;
  387.             for (var i = 0; i < names.length; i++) {
  388.                 if (names[i] == req.cookies.user) {
  389.                     nameFound = true;
  390.                     break;
  391.                 }
  392.             }
  393.  
  394.             if (nameFound == true) {
  395.                 console.log("already registered");
  396.                 exists = true;
  397.                 res.send({data: result, alreadyReg: nameFound});
  398.             }
  399.         }
  400.  
  401.         else {
  402.             collection.update(
  403.                 {
  404.                     "course": req.query.course,
  405.                     "dept": req.query.department,
  406.                     "courseNum": req.query.courseNumber,
  407.                     "section": req.query.courseSection
  408.                 },
  409.                 {$addToSet: {"students": req.cookies.user}}
  410.             );
  411.             res.send({success: true});
  412.  
  413.         }
  414.     });
  415.  
  416. });
  417.  
  418. //##############################################################
  419. ///////////////////////// face recognition and geolocation stuff
  420. //##############################################################
  421.  
  422.  
  423. //adds a face to a person so that it will remain in the database and sends back landmark data
  424. app.post('/addFace', function (req, res) {
  425.  
  426.     //parse datauri
  427.     var base64Data = req.body.data.replace(/^data:image\/jpeg;base64,/, "");
  428.     var tempFileName = Math.floor(Math.random() * (100000000000000000 - 0 + 1) + 0).toString() + ".jpg";
  429.  
  430.     //temporarily store image so it can be sent to the api
  431.     require("fs").writeFile(tempFileName, base64Data, 'base64', function (err) {
  432.  
  433.         var fdata = {
  434.             img: {
  435.                 value: fs.readFileSync(__dirname + '/' + tempFileName),
  436.                 meta: {filename: 'tempimg.jpg'}
  437.             }
  438.         };
  439.  
  440.         client.postMulti('detection/detect', fdata, function (err, response, body) {
  441.             console.log("performed a detection");
  442.             var det = body;
  443.             fs.unlinkSync(__dirname + '/' + tempFileName);
  444.  
  445.  
  446.             if (body.face.length > 0) {
  447.  
  448.  
  449.                 var randomName = Math.floor(Math.random() * (49 - 0 + 1) + 0).toString();
  450.                 var faceid = body.face[0].face_id;
  451.                 client.postMulti('person/add_face', {
  452.                     person_name: {value: randomName},
  453.                     face_id: {value: body.face[0].face_id}
  454.                 }, function (err, response, body) {
  455.                     console.log("Added face_id " + faceid.toString());
  456.                     console.log(JSON.stringify(body))
  457.  
  458.                 });
  459.                 collection = database.collection('users');
  460.                 console.log(req.cookies.user);
  461.                 collection.update(
  462.                     {"email": req.cookies.user},
  463.                     {$set: {"face_id": faceid}}
  464.                 )
  465.                 console.log("face_id added to ueser collection");
  466.  
  467.                 //here is where we store the face_id into the database
  468.  
  469.                 client.post('detection/landmark', {face_id: body.face[0].face_id}, function (err, response, body) {
  470.                     console.log("performed landmark");
  471.                     res.send({detect: det, landmark: body});
  472.                 });
  473.             }
  474.             else {
  475.                 res.sendStatus("1");
  476.             }
  477.         });
  478.     });
  479.  
  480. });
  481.  
  482.  
  483. //this handles face auth and geolocation comparisons
  484. app.post('/compare', function (req, res) {
  485.  
  486.     var base64Data = req.body.data.replace(/^data:image\/jpeg;base64,/, "");
  487.     var tempFileName = Math.floor(Math.random() * (100000000000000000 - 0 + 1) + 0).toString() + ".jpg";
  488.  
  489.     require("fs").writeFile(tempFileName, base64Data, 'base64', function (err) {
  490.  
  491.         var fdata = {
  492.             img: {
  493.                 value: fs.readFileSync(__dirname + '/' + tempFileName),
  494.                 meta: {filename: 'tempimg.jpg'}
  495.             }
  496.         };
  497.  
  498.         client.postMulti('detection/detect', fdata, function (err, response, body) {
  499.             console.log("performed a detection");
  500.             var det = body;
  501.             fs.unlinkSync(__dirname + '/' + tempFileName);
  502.  
  503.  
  504.             if (body.face.length > 0) {
  505.  
  506.                 collection = database.collection('users');
  507.                 console.log(req.cookies.user);
  508.                 collection.findOne({"email": req.cookies.user}, function(err, result){
  509.  
  510.                     if(err){
  511.                         console.log(err);
  512.                     }
  513.                     else{
  514.                         //do geographical compare
  515.                         //these should be pulled from the database corresponding to the class
  516.                         var lat2 = 42.728394;
  517.                         var lon2 = -73.680941;
  518.                        
  519.                         distance = getDistanceFromLatLonInKm(req.body.latitude,req.body.longitude,lat2, lon2);
  520.                         console.log(distance*1000);
  521.                         //face_id2 value should come from user
  522.                         client.postMulti('recognition/compare', {face_id1: { value: faceid}, face_id2: {value: result.face_id}}, function(err, response, body){
  523.                                     console.log("performed a comparison");
  524.                                     res.send(JSON.stringify(body.similarity));//body.similarity));
  525.                                     console.log(JSON.stringify(body.similarity))
  526.                                 });
  527.                         }
  528.  
  529.                 });
  530.  
  531.             }
  532.             else{
  533.                 res.sendStatus("1");
  534.             }
  535.            
  536.        
  537.         });
  538.     });
  539.        
  540. });
  541.  
  542.  
  543.  
  544. //this serves the purpose of uickly returning the landmarks while the compare is done
  545. app.post('/detect', function (req, res) {
  546.  
  547.     var base64Data = req.body.data.replace(/^data:image\/jpeg;base64,/, "");
  548.     var tempFileName = Math.floor(Math.random() * (100000000000000000 - 0 + 1) + 0).toString() + ".jpg";
  549.  
  550.     require("fs").writeFile(tempFileName, base64Data, 'base64', function (err) {
  551.  
  552.         var fdata = {
  553.             img: {
  554.                 value: fs.readFileSync(__dirname + '/' + tempFileName),
  555.                 meta: {filename: 'tempimg.jpg'}
  556.             }
  557.         };
  558.  
  559.         client.postMulti('detection/detect', fdata, function (err, response, body) {
  560.             console.log("performed a detection");
  561.             var det = body;
  562.             fs.unlinkSync(__dirname + '/' + tempFileName);
  563.  
  564.             if (body.face.length > 0) {
  565.                 client.post('detection/landmark', {face_id: body.face[0].face_id}, function (err, response, body) {
  566.                     console.log("performed landmark");
  567.                     res.send({detect: det, landmark: body});
  568.                 });
  569.             }
  570.             else {
  571.                 res.sendStatus("1");
  572.             }
  573.         });
  574.     });
  575.  
  576. });
  577.  
  578. app.post("/addLoc", function (req, res){
  579.    
  580.     collection = database.collection('courses');
  581.                 console.log(req.cookies.user);
  582.                 collection.update(
  583.                     {"dept": req.body.regNum,
  584.                     "courseNum": req.body.courseNum,
  585.                     "section": req.body.sectionNum},
  586.                     {$set: {"latitude": req.body.lati,"longitude": req.body.longitude}}
  587.                 )
  588.                 console.log("location added to class");
  589. });
  590.  
  591.  
  592. //calculate distance based on longitude and latitude
  593. function getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2) {
  594.     var R = 6371; // Radius of the earth in km
  595.     var dLat = deg2rad(lat2 - lat1);  // deg2rad below
  596.     var dLon = deg2rad(lon2 - lon1);
  597.     var a =
  598.             Math.sin(dLat / 2) * Math.sin(dLat / 2) +
  599.             Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
  600.             Math.sin(dLon / 2) * Math.sin(dLon / 2);
  601.     var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  602.     var d = R * c; // Distance in km
  603.     return d;
  604. }
  605.  
  606. function deg2rad(deg) {
  607.     return deg * (Math.PI / 180)
  608. }
  609.  
  610. //##############################################################
  611. ///////////////////////// face recognition and geolocation stuff
  612. //##############################################################
  613.  
  614. app.listen(3000, "127.0.0.1");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement