-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsti.js
More file actions
97 lines (95 loc) · 3.02 KB
/
sti.js
File metadata and controls
97 lines (95 loc) · 3.02 KB
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
require('dotenv').load();
var ACCOUNT_SID = process.env.TW_ACCOUNT_SID;
var AUTH_TOKEN = process.env.TW_AUTH_TOKEN;
var twilio = require('twilio')(ACCOUNT_SID, AUTH_TOKEN);
var async = require('async');
var request = require('request');
var fs = require('fs');
var geolib = require('geolib');
module.exports = {
validate_zip: function(req, res, next){
var zip, toPhone;
if(req.body && Object.keys(req.body).length > 0){
zip = req.body.Body;
toPhone = req.body.From;
} else{
zip = req.query.zip;
toPhone = process.env.TEST_PHONE;
}
if(/^\d{5}(-\d{4})?$/.test(zip)){
req.zip = zip;
req.toPhone = toPhone;
next();
} else {
send('invalidZip', toPhone, {zip: zip});
res.end();
}
},
get_locations: function(req, res, next){
var locations = JSON.parse(fs.readFileSync('./src/locations.json', 'utf8'));
var coordinates = [];
locations.locations.forEach(function(loc){
coordinates.push(loc.coordinates);
});
var params = {
url: "http://maps.googleapis.com/maps/api/geocode/json",
qs: {
address: req.zip
}
};
request(params, function(err, response, body){
if (!err && response.statusCode == 200) {
var zip_query = JSON.parse(body);
if(zip_query.status == "OK"){
var result = zip_query.results[0];
var zip_lat = result.geometry.location.lat;
var zip_lng = result.geometry.location.lng;
var closest = geolib.orderByDistance({latitude: zip_lat, longitude: zip_lng}, coordinates);
var final_locations = [];
for (var i = 0; i < 3; i++) {
var location = locations.locations[closest[i].key];
location.distance = closest[i].distance;
final_locations.push(location);
}
res.locations = final_locations;
next();
}
} else{
send('noResults', req.toPhone, {zip: req.zip});
}
});
},
send_locations: function(req, res, next){
if(res.locations){
res.locations.forEach(function(location){
send('location', req.toPhone, {location: location});
});
}
res.end();
}
};
function send(type, toPhone, data){
var body;
switch (type) {
case "invalidZip":
body = "Sorry, " + data.zip + " is not a valid zip code. Please try again!";
break;
case "noResults":
body = "Sorry, " + data.zip + " did not return any testing locations. Please try a different zip code";
break;
case "location":
var location = data.location;
body = location.name + ': \n' + location.address.street + ', ' + location.address.city + ', ' + location.address.state + ' ' + location.address.zip + '\n';
body += 'hours: ' + location.hours + '\n';
body += 'phone: ' + location.phone;
break;
}
twilio.sendMessage({
to: toPhone,
from: '+18043085060',
body: body
}, function(err, responseData){
if (!err) { // "err" is an error received during the request, if any
}
});
}