-
Notifications
You must be signed in to change notification settings - Fork 15
/
update.js
101 lines (88 loc) · 2.27 KB
/
update.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
var Promise = require('bluebird')
var request = Promise.promisifyAll(require('request'))
var xml2js = require('xml2js')
var _ = require('lodash')
var config = require('./config');
var locations = require('./locations');
var fs = Promise.promisifyAll(require('fs'))
var parseXmlString = Promise.promisify(xml2js.parseString, xml2js);
var xmlBuilder = new xml2js.Builder({
renderOpts: {
pretty: false
},
headless: true
})
locations = _.indexBy(locations, "zipcode")
var requestZipcode = function(zipcode) {
var req = {
CityStateLookupRequest: {
$: {
USERID: config.USPS_USERNAME
},
ZipCode: {
$: {
ID: 0
},
Zip5: zipcode
}
}
}
var xmlReq = xmlBuilder.buildObject(req);
var opts = {
url: 'http://production.shippingapis.com/ShippingAPI.dll',
qs: {
API: 'CityStateLookup',
xml: xmlReq
}
}
return Promise.resolve()
.bind({})
.then(function() {
return request.getAsync(opts)
})
.spread(function(response, body) {
return parseXmlString(body);
})
.then(function(data) {
var data = _.first(data.CityStateLookupResponse.ZipCode)
if (data.City && data.State) {
return {
zipcode: data.Zip5[0],
city: data.City[0],
state: data.State[0]
}
}
})
}
var capitalize = function(city) {
city = city.toLowerCase().split(" ")
city = _.map(city, _.capitalize).join(" ")
return city
}
var save = function() {
var newLocations = _.values(locations)
return fs.writeFileAsync('locations.json', JSON.stringify(newLocations))
}
var hasChanged = function(zipcode) {
return requestZipcode(zipcode)
.then(function(data) {
if (!data) {
return
}
var prev = locations[data.zipcode]
var prevCity = prev.city.toLowerCase()
var newCity = data.city.toLowerCase()
if (prevCity !== newCity) {
var newCityFormatted = capitalize(data.city)
console.log(zipcode + ": " + prev.city + " → " + newCityFormatted)
locations[data.zipcode].city = newCityFormatted
return save()
}
})
}
Promise
.resolve(_.pluck(locations, "zipcode"))
.each(function(zipcode) {
zipcode = _.padLeft(zipcode, 5, 0)
return hasChanged(zipcode)
})