-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
107 lines (99 loc) · 3.55 KB
/
index.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
const fs = require('fs')
const http = require('https')
const uuid = require('node-uuid')
const icalendar = require('icalendar')
const ical = new icalendar.iCalendar()
const tranformSubject = (subject) => {
switch (subject) {
case 'grey':
return "Graue Tonne"
case 'green':
return "Grüne Tonne"
case 'blue':
return "Blaue Tonne"
case 'yellow':
return "Gelbe Tonne"
case 'brown':
return "Braune Tonne"
case 'wertstoff':
return "Wertstoff Tonne"
default:
return subject
}
}
const checkForError = (statusCode, contentType) => {
if (statusCode !== 200) {
return new Error(`Request Failed.\n` + `Status Code: ${statusCode}`)
} else if (!/^application\/json/.test(contentType)) {
return new Error(`Invalid content-type.\n` + `Expected application/json but received ${contentType}`)
}
return false
}
const parseStreetCodeResponseData = (rawData, plz, cb) => {
try {
let parsedData = JSON.parse(rawData);
parsedData.data.forEach(function (item) {
if (item.zipcode == plz) cb(null, item)
})
} catch (e) {
cb(e.message, null);
}
}
const parseCollectionEventsResponseData = (rawData, cb) => {
try {
let parsedData = JSON.parse(rawData);
parsedData.data.forEach((item) => {
var event = new icalendar.VEvent(uuid.v4())
event.setSummary(tranformSubject(item.type))
event.setDate(new Date(item.year,item.month-1,item.day,6,0,0), 60*60)
ical.addComponent(event)
})
cb(null, ical.toString())
} catch (e) {
cb(e.message, null);
}
}
const getStreetCode = (street_name, building_number, building_number_addition, plz, cb) => {
if (!building_number_addition) building_number_addition = ''
let streetCodeApiEndpoint = `https://www.awbkoeln.de/api/streets?street_name=${street_name}&building_number=${building_number}&building_number_addition=${building_number_addition}&form=json`
http.get(streetCodeApiEndpoint, (res) => {
let error = checkForError(res.statusCode, res.headers['content-type'])
if (error) {
res.resume()
cb(error, null)
return;
}
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => rawData += chunk)
res.on('end', () => parseStreetCodeResponseData(rawData, plz, cb))
})
}
const getCollectionEvents = (street_code, building_number, building_number_addition, year, cb) => {
if (!building_number_addition) building_number_addition = ''
let collectionEventsApiEndpoint = `https://www.awbkoeln.de/api/calendar?building_number=${building_number}&street_code=${street_code}&start_year=${year}&end_year=${year}&start_month=1&end_month=12&building_number_addition=${building_number_addition}&form=json`
http.get(collectionEventsApiEndpoint, (res) => {
let error = checkForError(res.statusCode, res.headers['content-type'])
if (error) {
res.resume()
cb(error, null)
return;
}
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => rawData += chunk)
res.on('end', () => parseCollectionEventsResponseData(rawData, cb))
})
}
module.exports = (street, building_number, year, plz, building_number_addition, cb) => {
if (!cb && typeof building_number_addition === 'function') {
cb = building_number_addition
building_number_addition = ''
}
getStreetCode(street, building_number, building_number_addition, plz, (err, data) => {
if (err) return cb(err, null)
getCollectionEvents(data.street_code, data.building_number, building_number_addition, year, (err, data) => {
cb(err, data)
})
})
}