sotlas-api/summits.js

69 wiersze
2.1 KiB
JavaScript

const moment = require('moment');
const db = require('./db');
module.exports = {
lookupSummits: function(objects) {
// Get all summit refs so we can look them all up in one go
let summitCodes = new Set();
let associationCodes = new Set();
objects.forEach(obj => {
summitCodes.add(obj.summit.code);
associationCodes.add(obj.summit.code.substring(0, obj.summit.code.indexOf('/')));
});
return new Promise((resolve, reject) => {
db.getDb().collection('summits').find({code: {$in: [...summitCodes]}}, {projection: {'_id': false, code: true, name: true, altitude: true, points: true, coordinates: true, activationCount: true, validFrom: true, validTo: true, 'photos.author': true}})
.toArray((err, summits) => {
if (err) {
reject(err);
return;
}
let summitMap = {};
let now = moment();
summits.forEach(summit => {
if (now.isBefore(summit.validFrom) || now.isAfter(summit.validTo)) {
summit.invalid = true;
}
delete summit.validFrom;
delete summit.validTo;
if (summit.photos) {
let photoAuthors = new Set();
summit.photos.forEach(photo => {
photoAuthors.add(photo.author);
});
summit.photoAuthors = [...photoAuthors];
delete summit.photos;
}
summitMap[summit.code] = summit;
});
db.getDb().collection('associations').find({code: {$in: [...associationCodes]}}).toArray((err, associations) => {
if (err) {
reject(err);
return;
}
let associationMap = {};
associations.forEach(association => {
associationMap[association.code] = association;
});
objects.forEach(object => {
let association = object.summit.code.substring(0, object.summit.code.indexOf('/'));
if (summitMap[object.summit.code]) {
object.summit = summitMap[object.summit.code];
if (object.summit) {
object.summit.isoCode = associationMap[association].isoCode;
object.summit.continent = associationMap[association].continent;
}
}
});
resolve(objects);
});
});
});
}
}