all files / src/ server.js

81.36% Statements 48/59
50% Branches 6/12
25% Functions 1/4
82.76% Lines 48/58
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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117                                                                                                                                         
"use strict";
 
const restify = require('restify');
const getTopStories = require("./topStories");
const getCuratedLists = require('./curatedLists');
const getPool = require("./pools");
const getSections = require("./sections");
const getTags = require("./tags");
const config = require("config");
const hl = require("highland");
const utils = require("./utils");
const breaker = require('./breaker');
const ebHealth = require('eb-healthd-middleware');
const restifyEtagCache = require('restify-etag-cache');
const BeneLogger = require('bene-logger');
const logger = new BeneLogger({logging: config.logging.enabled});
const redis = require('redis');
const apicache = require('apicache');
const getArticlesByAuthorId = require('./articlesByAuthor');
 
let AWS = require("aws-sdk");
AWS.config.update({
    region: config.dynamodb.region
});
Eif (config.dynamodb.endpoint) {
    AWS.config.update({
        "endpoint": config.dynamodb.endpoint
    });
}
let dc = hl.streamifyAll(new AWS.DynamoDB.DocumentClient());
const pg = require('tm-apps-db')(config.db);
 
function redisRetryStrategy({ attempt }) {
    return Math.min(attempt * 100, 3000);
}
 
function redisCache(config, redis, apicache) {
    const client = redis.createClient(Object.assign(config.cache.redis, {
        no_ready_check: true,
        retry_strategy: redisRetryStrategy
    }));
 
    return apicache.options({
        redisClient: client,
        statusCodes: {
            exclude: [],
            include: [200]
        }
    }).middleware(config.cache.duration);
}
 
let app = (config, dc, pg) => {
 
    let server = restify.createServer({
        name: 'appsListAPI'
    });
    
    server.use(restify.queryParser());
    server.pre(restify.pre.sanitizePath());
    server.use(restify.bodyParser());
 
    Iif(config.logging.enhanced === true) server.use(ebHealth({}));
 
    Iif(config.cache.enabled === true) {
        if (config.cache.circuitbreaker.enabled === true) {
            server.use(redisCache(config, breaker(redis, config.cache.circuitbreaker), apicache));
        } else {
            server.use(redisCache(config, redis, apicache));
        }
    }
 
    server.use(restifyEtagCache());
 
    config.cacheEndpoint = utils.setCacheEndpoint(config.articleEndpoint);
 
    server.get("/:source/:publicationId/top-stories", getTopStories(config, dc));
 
    server.get("/:source/:publicationId/curated-lists/:listId", getCuratedLists(config));
 
    server.get("/:source/:publicationId/pool/:escenicId/:area", getPool(config, dc));
 
    server.get("/:source/:publicationId/sections/:escenicId", getSections(config, pg));
 
    server.get("/:source/:publicationId/tags/:escenicId", getTags(config, pg));
 
    server.get("/:source/:publicationId/authors/:escenicId", getArticlesByAuthorId(config, pg));
 
    server.get('/healthcheck', (req, res) => {
        res.json({
            version: process.env.npm_package_version,
            server: {
                name: server.name,
                url: server.url
            }
        });
    });
 
    server.on('uncaughtException', function (req, res) {
        res.send(new restify.InternalServerError());
        res.end();
    });
 
    return server;
};
 
let server;
Iif (require.main === module) {
    server = app(config, dc, pg);
    server.listen(config.server.port, function () {
        logger.info('server listening', {
            server_name: server.name,
            server_url: server.url
        });
    });
}
 
module.exports = server || app;