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 |
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
7×
1×
1×
1×
1×
7×
6×
6×
6×
6×
6×
6×
6×
6×
6×
6×
6×
6×
6×
6×
6×
6×
6×
7×
7×
7× | "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; |