'use strict';
const BeneLogger = require('bene-logger');
const restify = require('restify');
const R = require('ramda');
const getAuthor = require('./get/authorsEndpoint');
const hl = require('highland');
const parseAuthor = require('../toJSON/authorEndpoint');
module.exports = (db, config) => (req, res, next) => {
const logger = new BeneLogger({logging: config.logging.enabled});
const authorId = req.params.authorId;
const source = req.params.source;
// Tricking getAuthor into accepting a query as it
// came back as a Sequelize object ;)
// It's a hack but it allows me to use the whole
// getAuthor pipeline
const queries = [{
'dataValues':{
'author_id': `${source}.${authorId}`
}
}];
logger.setDefaults({
author_id: `${source}.${authorId}`,
source: source,
service_name: 'appsApi'
});
logger.info('processing request');
logger.time('processed request');
hl(getAuthor(config, queries))
.toCallback((err, result) => {
if (err) {
if (!R.isNil(err.type)) {
// TODO: this needs to trigger alert
logger.error(err, {author_id: authorId, source: source, severe: err.type});
} else {
logger.error(err, {author_id: authorId, source: source});
}
if (R.has("status", err) && R.has("message", err) && R.has(err.status, restify)) {
logger.timeEnd('processed request');
next(new restify[err.status](err.message));
} else {
logger.timeEnd('processed request');
next(new restify.InternalServerError(err.stack));
}
} else {
if(!R.isNil(result[0][0].error)){
// because the 404 might have happen
// on authors api
const err = result[0][0].error;
next(new restify[err.code](err.message));
}else{
logger.timeEnd('processed request');
res.charSet('utf-8');
// result is an array of tuple
// we're only interested in the contents
// of the second element of the first tuple
res.send(parseAuthor(result[0][1]));
}
}
});
}; |