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 | 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 42× 42× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× 1× | 'use strict'; const restify = require('restify'); const BeneLogger = require('bene-logger'); const morgan = require('morgan'); const article = require('./lib/article'); const author = require('./lib/author'); const getId = require('./lib/getId'); const schema = require('./lib/schema'); let Db = require('tm-apps-db'); const redis = require('redis'); const apicache = require('apicache'); const logDirectory = '/var/log/nginx/healthd'; const rollers = require('streamroller'); function enhancedHealthReporting(morgan, dateFileStreamCtor) { const healthdStream = new dateFileStreamCtor(`${logDirectory}/application.log.`, 'yyyy-MM-dd-hh', {alwaysIncludePattern: true}); morgan.token('unixtime', () => new Date().getTime() / 1000); return morgan(':unixtime":url":status":response-time":response-time":remote-addr', {stream: healthdStream}); } function redisCache(config, redis, apicache) { return apicache.options({ redisClient: redis.createClient(config.cache.redis), statusCodes: { exclude: [], include: [200] } }).middleware(config.cache.duration); } module.exports = function (config) { config.authorsEndpoint = config.authorsEndpoint.replace("org-", ""); const logger = new BeneLogger({logging: config.logging.enabled}); const db = Db(config.db, logger); logger.setDefaults({ service_name: 'appsApi' }); logger.info('starting api', {config: JSON.stringify(config)}); const server = restify.createServer({ name: 'appsApi' }); Iif(config.logging.enhanced === true) server.use(enhancedHealthReporting(morgan, rollers.DateRollingFileStream)); Iif(config.cache.enabled === true) server.use(redisCache(config, redis, apicache)); server.use(restify.queryParser()); server.on('uncaughtException', function (req, res, route, err) { logger.error('api error', { stack: err.stack }); res.send(new restify.InternalServerError()); res.end(); }); server.listen(config.server.port, function () { logger.info('server listening', { server_name: server.name, server_url: server.url }); }); server.use((req, res, next) => { logger.debug(`request ${req.method} ${encodeURIComponent(req.url)}`, { ip: req.headers['x-forwarded-for'] || req.connection.remoteAddress, userAgent: req.headers['user-agent'], statusCode: res.statusCode }); next(); }); server.get('healthcheck', (req, res) => { res.charSet('utf-8'); res.json({ version: process.env.npm_package_version, server: { name: server.name, url: server.url } }); }); server.get('/:source/:publicationId/articles/:articleId', article(db, config)); server.get("/:source/:publicationId/section-ids", getId.section(db, config)); server.get("/tag-ids", getId.tag(db, config, logger)); server.get('/schemas', schema.getSchemaList); server.get('/schemas/:contentType', schema.getSchema); server.get('/:source/:pubblicationId/authors/:authorId', author(db, config)); return server; }; Iif (require.main === module) { const config = require('config'); module.exports(config); } |