all files / api/lib/ author.js

25.81% Statements 8/31
0% Branches 0/11
100% Functions 0/0
23.33% Lines 7/30
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                                                                                                                               
'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]));
            }
 
        }
    });
 
    
};