'use strict';
const R = require('ramda');
let request = require('superagent');
module.exports = (config, articleAuthors) => {
if (!R.isNil(articleAuthors) && articleAuthors.length > 0) {
const authors = R.pluck("dataValues", articleAuthors)
.map(x => R.assoc("id", x.author_id, x));
return new Promise(resolve => {
requestAuthors(config, authors, resolve);
});
}
return Promise.resolve([]);
};
function groupAuthors(authors) {
return R.reduce((mem, author) => {
const hasId = R.compose(R.not, R.isNil, R.prop('id'))(author);
if (hasId) {
return R.assoc('withIds', R.concat(mem.withIds, R.of(author)), mem);
}
return R.assoc('withoutIds', R.concat(mem.withoutIds, R.of(author)), mem);
}, {withIds: [], withoutIds: []}, authors);
}
function requestAuthors(config, authors, cb) {
const meta = R.objOf("type", "author");
const groupedAuthors = groupAuthors(authors);
request
.get(config.authorsEndpoint)
.query({
"ids": R.pluck('id', groupedAuthors.withIds)
})
.timeout(250)
.end((err, res) => {
if (err || res.error) {
return cb(R.map(R.pair(R.assoc("error", res ? res.body : err, meta)), authors));
}
const authorsTuplesWithoutIds = R.map(R.pair(meta), groupedAuthors.withoutIds);
const authorsTuplesFromApi = groupedAuthors.withIds.map(author => {
const serviceAuthor = R.find(R.propEq("id", author.id), res.body);
if (serviceAuthor) return [meta, R.merge(author, serviceAuthor)];
return [meta, author];
});
cb(R.concat(authorsTuplesFromApi, authorsTuplesWithoutIds));
});
} |