/
flea.js
127 lines (107 loc) · 3.3 KB
/
flea.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
var express = require('express');
var app = express();
app.set('port', process.env.PORT || 3000);
app.use(express.static('public'));
var handlebars = require('express-handlebars')
.create({defaultLayout:'main'});
app.engine('handlebars',handlebars.engine);
app.set('view engine', 'handlebars');
var fs = require('fs');
var csv2 = require('csv2');
var objectify = require('objectify-arrays');
var multer = require('multer');
var upload = multer({dest: 'uploads/'});
var directions = require('./directions');
var credentials = require('./credentials');
// auth
var auth = require('basic-auth');
app.use(function(req, res, next) {
var user = auth(req);
if (user === undefined
|| user['name'] !== credentials.authUser
|| user['pass'] !== credentials.authPw) {
res.statusCode = 401;
res.setHeader('WWW-Authenticate', 'Basic realm="MyRealmName"');
res.end('Unauthorized');
} else {
next();
}
});
// show form
app.get('/', function (req,res){
res.render('form');
});
// form handler
app.post('/process', upload.single('csvfile'), function (req, res, next) {
// req.file is the uploaded file
// req.body holds the text fields
var origin = req.body.origin;
var destination = req.body.destination;
var waypoints = [];
var personInfo = [];
// convert to array of objects
fs.createReadStream(req.file.path)
.pipe(csv2())
.pipe(objectify())
.on('data', function (data) { // read each object one at a time, as they stream in
// build string for gmaps ---> waypoints array
waypoints.push(data.address + ", " + data.city + ',' + data.state);
// store the person name to use at end ---> names array
personInfo.push({name: data.name, apt: data.apt, phone: data.phone});
})
.on('error', function(err){
console.log("GOT ERROR!");
console.log(err);
})
.on('end', function (d){
// Send it to API processor/parser
directions(origin,destination,waypoints,personInfo)
.then(function(output){
// Get result back from parser and render it to the view
res.render('directions',output);
//clean up
fs.unlink(req.file.path);
});
});
});
// use body parser to process ajax request
app.use(require('body-parser').urlencoded({extended:true}));
// ajax post to save data from results
app.post('/save',function(req,res){
//console.log(req.body.stops);
var content = JSON.stringify(req.body.stops);
var fname = Date.now();
fs.writeFile('datastore/' + fname + ".json", content, function(err) {
if(err) {
return console.log(err);
}
});
res.json({'status':'ok','id':fname});
});
app.get('/route/:id',function(req,res){
var filename = 'datastore/' + req.params.id + '.json';
var content = fs.readFileSync(filename, 'utf8', function(err,data){
if (err){
console.log(err);
}
});
//console.log(JSON.parse(content));
var context = {};
context.addresses = JSON.parse(content);
res.render('route',context);
});
// 404
app.use(function (req,res,next) {
res.status(404);
res.render('404');
});
app.use(function (err, req, res, next) {
console.error(err.stack);
res.status(500);
res.render('500');
});
app.listen(app.get('port'),function(){
console.log('Express started on port ' +
app.get('port') +
". Press Ctrl-C to terminate");
});