forked from AmericanRedCross/osm-stats-workers
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
73 lines (66 loc) · 2.44 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
var Promise = require('bluebird');
var getHashtags = require('./src/common/get_hashtags.js');
var calculateMetrics = require('./src/calculate_metrics');
var User = require('./src/models/User');
var Changeset = require('./src/models/Changeset');
var Hashtag = require('./src/models/Hashtag');
var Country = require('./src/models/Country');
var Worker = function (loggingFn) {
loggingFn = loggingFn || function (data) { console.log('>', data); };
this.bookshelf = require('./src/common/bookshelf_init');
this.logger = loggingFn;
};
Worker.prototype.destroy = function () {
return this.bookshelf.knex.destroy();
};
Worker.prototype.addToDB = function (changeset) {
this.changeset = changeset;
var component = this;
var metrics = {};
try {
metrics = calculateMetrics(changeset);
} catch (e) {
component.logger(e, changeset);
return Promise.reject(e);
}
if (metrics.id) {
var hashtags = getHashtags(changeset.metadata.comment);
return this.bookshelf.transaction(function (t) {
return User.createUserIfNotExists(metrics.user, t)
.then(function (user) {
return Promise.join(
Changeset.createChangesetIfNotExists(metrics, t),
Hashtag.createHashtags(hashtags, t),
Country.query('where', 'name', 'in', metrics.countries).fetch({transacting: t}),
function (changeset, hashtags, countries) {
return changeset.hashtags().attach(hashtags, {transacting: t})
.then(function () {
return changeset.countries().attach(countries, {transacting: t});
})
.then(function () {
return user.updateUserMetrics(metrics.metrics, metrics.user.geo_extent, t);
});
})
.then(function (user) {
return Promise.join(
user.getNumCountries(t),
user.getHashtags(t),
user.getTimestamps(t),
function (numCountries, hashtags, timestamps) {
metrics.metrics.numCountries = numCountries;
metrics.metrics.hashtags = hashtags;
metrics.metrics.timestamps = timestamps;
return user.updateBadges(metrics.metrics, t);
});
});
});
})
.catch(function (err) {
component.logger(err, changeset);
return Promise.reject(err);
});
} else {
return ('No tracked changes in changeset ' + changeset.metadata.id);
}
};
module.exports = Worker;