import restify from 'restify'; import redis from 'redis'; import yup from 'yup'; import { checkReqBody, checkParams } from './modules/check-schema.js'; import dbWrapper from './modules/db.js'; import logger from './modules/logging.js'; function registerRoute(db, server, log) { return function setupRoute(routeSetup) { const route = routeSetup({ db, yup, log }); if (route.schema) { switch (route.type) { case 'get': server.get(route.route, checkParams(route.schema, log, route.route), route.handler); break; case 'post': server.post(route.route, checkReqBody(route.schema, log, route.route), route.handler); break; default: throw new Error(); } } else { switch (route.type) { case 'get': server.get(route.route, route.handler); break; case 'post': server.post(route.route, route.handler); break; default: throw new Error(); } } }; } function start(routes, host = '127.0.0.1', port = 8080, dbOpts, serverOpts) { const client = redis.createClient(dbOpts); client.on('connect', () => { logger.info('connected to db, starting server...'); const server = restify.createServer(serverOpts); const db = dbWrapper(client); const setupRoute = registerRoute(db, server, logger); routes.forEach(route => { setupRoute(route); }); server.listen(port, host, () => { logger.info(`${server.name} listening at ${server.url}`); }); }); } export default start;