Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var express = require('express');
- var cookieParser = require('cookie-parser');
- var passwordHash = require('password-hash');
- var path = require('path');
- var json2csv = require('json2csv');
- var MongoClient = require('mongodb').MongoClient;
- var assert = require('assert');
- var app = express();
- var collection;
- var user;
- var query;
- var database;
- var count = 0;
- var results = [];
- var fs = require('fs');
- //var url = 'mongodb://iattend:pass@ds011872.mlab.com:11872/iattend';
- var url='mongodb://localhost:27017/iAttend';
- var bodyParser = require("body-parser");
- var FormData = require('form-data');
- //###### faceplusples has to be using US server, if broken check module and replase CN with US
- var FacePlusPlus = require('faceplusplus');
- var config = {
- api_key: '811c42cba5495e4c5d25cc2cbc37dcf7',
- api_secret: '1p34xzkMH_h1ZFVj15CCgCOle5_wfTYe'
- };
- var client = new FacePlusPlus(config);
- //###### Might possibly cause issues
- app.use(express.static(__dirname + '/public'));
- app.use(bodyParser.urlencoded({extended: false}));
- app.use(bodyParser.json());
- //use url in connection to mongo server
- MongoClient.connect(url, function (err, db) {
- if (err) throw err;
- console.log("Mongo connected");
- console.log(url);
- database = db;
- });
- app.use(express.static(path.join(__dirname, '/')));
- //serving the html file
- app.get('/', function (req, res, next) {
- res.sendFile('index.html', {root: './'});
- next();
- });
- app.use(cookieParser());
- app.get('/checkCookie', function (req, res) {
- var logged;
- if (req.cookies.user != null) {
- logged = true;
- res.send({logged: logged, user: req.cookies});
- }
- else {
- logged = false;
- res.send({logged: logged});
- }
- });
- app.get('/checkUser', function (req, res) {
- var userExists = false;
- var searchEmail = req.query.email.toString();
- collection = database.collection('users');
- collection.findOne({"email": searchEmail}, function (err, result) {
- if (result) {
- userExists = true;
- console.log("found ya");
- console.log(result);
- res.send({exists: userExists, result: result});
- }
- else {
- console.log("didn't find you");
- res.send({exists: userExists});
- }
- });
- console.log(userExists);
- });
- app.get('/newUser', function (req, res) {
- var userInserted = false;
- var message;
- collection = database.collection('users');
- /*collection.findAndModify({{"email":searchEmail},
- $setOnInsert:
- {"name":req.query.user,
- "email":req.query.email,
- "password":req.query.password,
- "userType":req.query.userType}
- },
- {new: false, upsert: true},
- })*/
- var hashedPassword = passwordHash.generate(req.query.password);
- collection.insertOne(
- {
- "name": req.query.user,
- "email": req.query.email,
- "password": hashedPassword,
- "userType": req.query.userType
- }, function (err, doc) {
- console.log("in insert");
- if (err) {
- userInserted = false;
- message = "An error occured " + err;
- throw err;
- res.send({data: userInserted, message: message});
- }
- else {
- message = "user added";
- console.log(message);
- console.log(doc);
- userInserted = true;
- res.send({data: userInserted, message: message});
- }
- }
- );
- });
- app.get('/login', function (req, res) {
- var password = req.query.password.toString();
- var email = req.query.email.toString();
- var passMatch = false;
- var user;
- collection = database.collection('users');
- collection.find({"email": email}).toArray(function (err, docs) {
- console.log("looking for password match with " + req.query.password);
- var hashedPassword = docs[0].password;
- if ((passwordHash.verify(password, hashedPassword))) {
- console.log("we have a match");
- passMatch = true;
- user = docs[0].email;
- res.cookie('user', user);
- name = docs[0].name;
- res.cookie('name', name);
- type = docs[0].userType;
- res.cookie('type', type);
- console.log(req.cookies.user);
- res.send({data: docs, match: passMatch});
- }
- else {
- console.log("not finding that match");
- }
- });
- });
- app.get('/logout', function (req, res) {
- res.clearCookie('user');
- res.clearCookie('name');
- res.clearCookie('type');
- //console.log(req.cookies);
- var logged = false;
- res.send({logged: logged});
- });
- app.get('/createClass', function (req, res) {
- var classCreated;
- var exists = false;
- collection = database.collection('courses');
- collection.findOne({
- "dept": req.query.department,
- "courseNum": req.query.courseNumber,
- "section": req.query.courseSection
- }, function (err, result) {
- if (result) {
- console.log("class exists");
- exists = true;
- res.send({data: result, existed: exists});
- }
- else {
- collection.insertOne(
- {
- "name": req.query.name,
- "dept": req.query.department,
- "courseNum": req.query.courseNumber,
- "section": req.query.courseSection,
- "regNum": req.query.registration,
- "owner": req.cookies.user
- }, function (err, doc) {
- console.log("in insert");
- if (err) {
- classCreated = false;
- message = "An error occured " + err;
- throw err;
- res.send({data: classInserted, message: message});
- }
- else {
- message = "class created";
- console.log(message);
- console.log(doc);
- classCreated = true;
- res.send({data: doc, insert: classCreated});
- }
- }
- );
- database.collection("attendance").insertOne(
- {"dept":req.query.department,
- "courseNum":req.query.courseNumber,
- "section":req.query.courseSection}, function(err, doc){
- if(err){
- console.log(err);
- }
- });
- }
- });
- });
- app.get('/getClasses', function (req, res) {
- var registered;
- console.log("over here");
- console.log(req.query.authority);
- console.log(req.cookies.user);
- var user = req.cookies.user.toString();
- console.log(user);
- collection = database.collection('courses');
- if(req.query.authority=="true") {
- collection.find({"owner" : user}).toArray(function (err, docs) {
- if (docs.length==0) {
- registered = false;
- console.log("not found");
- res.send({registered: registered});
- }
- else {
- registered = true;
- console.log("found");
- res.send({data: docs, registered: registered});
- }
- });
- }
- if(req.query.authority=="false") {
- console.log("user is a student");
- collection.find({"students" : user}).toArray(function (err, docs) {
- if (docs.length==0) {
- registered = false;
- console.log("not found");
- res.send({registered: registered});
- }
- else {
- registered = true;
- console.log("found");
- res.send({data: docs, registered: registered});
- }
- });
- }
- });
- app.get('/isLive', function(req, res){
- var classArray = [];
- var ids = [];
- classArray.push(req.query.classes);
- for(var i=0; i<classArray.length; i++){
- ids.push(classArray._id);
- }
- console.log("enrolled in" + classArray);
- var liveClasses = [];
- collection = database.collection('attendance');
- collection.find({"code": {$exists:true}}).toArray(function (err, docs){
- //liveClasses.push(docs);
- //console.log("live classes are" + docs);
- console.log(docs);
- });
- //for(var i=0; i<liveClasses.length; i++){
- //}
- //console.log(liveClasses);
- //res.send({data: liveClasses});
- });
- app.get('/setVerCode', function(req, res){
- var datetime = new Date();
- console.log(datetime);
- var dateString = datetime.toString();
- code = req.query.code;
- console.log(code, req.query.dept, req.query.courseNum, req.query.section);
- collection = database.collection('attendance');
- collection.update(
- {
- "dept": req.query.dept,
- "courseNum": req.query.courseNum,
- "section": req.query.section
- },
- { $set:
- {
- "code": code,
- "date": datetime
- }
- }
- )
- console.log("code updated");
- res.send({code:code});
- });
- app.get('/clearAndCount', function(req, res){
- code = req.query.code;
- console.log(code);
- collection = database.collection('attendance');
- collection.update(
- {
- "dept":req.query.dept,
- "courseNum":req.query.courseNum,
- "section":req.query.section
- },
- { $unset:
- {
- "code": ""
- }
- }
- );
- collection.findOne(
- {
- "dept":req.query.dept,
- "courseNum":req.query.courseNum,
- "section":req.query.section
- },{"students": true}).toArray(function (err, docs){
- res.send({data : docs});
- });
- console.log("code cleared and attendance calculated");
- //res.send({code:code});
- });
- app.get('/searchAddClass', function (req, res) {
- var classAdded;
- var exists = false;
- var codeMatch = true;
- var nameFound = false;
- var names = [];
- collection = database.collection('courses');
- collection.findOne({
- "dept": req.query.department,
- "courseNum": req.query.courseNumber,
- "section": req.query.courseSection
- }, function (err, result) {
- if (err) {
- exists = false;
- res.send({data: err, exists: exists});
- }
- else if (result.regNum != req.query.registration) {
- codeMatch = false;
- console.log("code mismatch");
- console.log(result);
- res.send({data: result, verifiedCode: codeMatch});
- }
- else if (result.students != null) {
- names = result.students;
- for (var i = 0; i < names.length; i++) {
- if (names[i] == req.cookies.user) {
- nameFound = true;
- break;
- }
- }
- if (nameFound == true) {
- console.log("already registered");
- exists = true;
- res.send({data: result, alreadyReg: nameFound});
- }
- }
- else {
- collection.update(
- {
- "course": req.query.course,
- "dept": req.query.department,
- "courseNum": req.query.courseNumber,
- "section": req.query.courseSection
- },
- {$addToSet: {"students": req.cookies.user}}
- );
- res.send({success: true});
- }
- });
- });
- //##############################################################
- ///////////////////////// face recognition and geolocation stuff
- //##############################################################
- //adds a face to a person so that it will remain in the database and sends back landmark data
- app.post('/addFace', function (req, res) {
- //parse datauri
- var base64Data = req.body.data.replace(/^data:image\/jpeg;base64,/, "");
- var tempFileName = Math.floor(Math.random() * (100000000000000000 - 0 + 1) + 0).toString() + ".jpg";
- //temporarily store image so it can be sent to the api
- require("fs").writeFile(tempFileName, base64Data, 'base64', function (err) {
- var fdata = {
- img: {
- value: fs.readFileSync(__dirname + '/' + tempFileName),
- meta: {filename: 'tempimg.jpg'}
- }
- };
- client.postMulti('detection/detect', fdata, function (err, response, body) {
- console.log("performed a detection");
- var det = body;
- fs.unlinkSync(__dirname + '/' + tempFileName);
- if (body.face.length > 0) {
- var randomName = Math.floor(Math.random() * (49 - 0 + 1) + 0).toString();
- var faceid = body.face[0].face_id;
- client.postMulti('person/add_face', {
- person_name: {value: randomName},
- face_id: {value: body.face[0].face_id}
- }, function (err, response, body) {
- console.log("Added face_id " + faceid.toString());
- console.log(JSON.stringify(body))
- });
- collection = database.collection('users');
- console.log(req.cookies.user);
- collection.update(
- {"email": req.cookies.user},
- {$set: {"face_id": faceid}}
- )
- console.log("face_id added to ueser collection");
- //here is where we store the face_id into the database
- client.post('detection/landmark', {face_id: body.face[0].face_id}, function (err, response, body) {
- console.log("performed landmark");
- res.send({detect: det, landmark: body});
- });
- }
- else {
- res.sendStatus("1");
- }
- });
- });
- });
- //this handles face auth and geolocation comparisons
- app.post('/compare', function (req, res) {
- var base64Data = req.body.data.replace(/^data:image\/jpeg;base64,/, "");
- var tempFileName = Math.floor(Math.random() * (100000000000000000 - 0 + 1) + 0).toString() + ".jpg";
- require("fs").writeFile(tempFileName, base64Data, 'base64', function (err) {
- var fdata = {
- img: {
- value: fs.readFileSync(__dirname + '/' + tempFileName),
- meta: {filename: 'tempimg.jpg'}
- }
- };
- client.postMulti('detection/detect', fdata, function (err, response, body) {
- console.log("performed a detection");
- var det = body;
- fs.unlinkSync(__dirname + '/' + tempFileName);
- if (body.face.length > 0) {
- collection = database.collection('users');
- console.log(req.cookies.user);
- collection.findOne({"email": req.cookies.user}, function(err, result){
- if(err){
- console.log(err);
- }
- else{
- //do geographical compare
- //these should be pulled from the database corresponding to the class
- var lat2 = 42.728394;
- var lon2 = -73.680941;
- distance = getDistanceFromLatLonInKm(req.body.latitude,req.body.longitude,lat2, lon2);
- console.log(distance*1000);
- //face_id2 value should come from user
- client.postMulti('recognition/compare', {face_id1: { value: faceid}, face_id2: {value: result.face_id}}, function(err, response, body){
- console.log("performed a comparison");
- res.send(JSON.stringify(body.similarity));//body.similarity));
- console.log(JSON.stringify(body.similarity))
- });
- }
- });
- }
- else{
- res.sendStatus("1");
- }
- });
- });
- });
- //this serves the purpose of uickly returning the landmarks while the compare is done
- app.post('/detect', function (req, res) {
- var base64Data = req.body.data.replace(/^data:image\/jpeg;base64,/, "");
- var tempFileName = Math.floor(Math.random() * (100000000000000000 - 0 + 1) + 0).toString() + ".jpg";
- require("fs").writeFile(tempFileName, base64Data, 'base64', function (err) {
- var fdata = {
- img: {
- value: fs.readFileSync(__dirname + '/' + tempFileName),
- meta: {filename: 'tempimg.jpg'}
- }
- };
- client.postMulti('detection/detect', fdata, function (err, response, body) {
- console.log("performed a detection");
- var det = body;
- fs.unlinkSync(__dirname + '/' + tempFileName);
- if (body.face.length > 0) {
- client.post('detection/landmark', {face_id: body.face[0].face_id}, function (err, response, body) {
- console.log("performed landmark");
- res.send({detect: det, landmark: body});
- });
- }
- else {
- res.sendStatus("1");
- }
- });
- });
- });
- app.post("/addLoc", function (req, res){
- collection = database.collection('courses');
- console.log(req.cookies.user);
- collection.update(
- {"dept": req.body.regNum,
- "courseNum": req.body.courseNum,
- "section": req.body.sectionNum},
- {$set: {"latitude": req.body.lati,"longitude": req.body.longitude}}
- )
- console.log("location added to class");
- });
- //calculate distance based on longitude and latitude
- function getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2) {
- var R = 6371; // Radius of the earth in km
- var dLat = deg2rad(lat2 - lat1); // deg2rad below
- var dLon = deg2rad(lon2 - lon1);
- var a =
- Math.sin(dLat / 2) * Math.sin(dLat / 2) +
- Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
- Math.sin(dLon / 2) * Math.sin(dLon / 2);
- var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
- var d = R * c; // Distance in km
- return d;
- }
- function deg2rad(deg) {
- return deg * (Math.PI / 180)
- }
- //##############################################################
- ///////////////////////// face recognition and geolocation stuff
- //##############################################################
- app.listen(3000, "127.0.0.1");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement