| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- import restify from 'restify';
- import nano from 'nano';
- import yup from 'yup';
- import validationFactory from './modules/validations.js';
- import dbWrapper from './modules/db.js';
- import logger from './modules/logging.js';
- function setupRoute(routeFactory, dbs, server, log) {
- const route = routeFactory({ dbs, yup, log });
- const handlers = route.schema ? [validationFactory(route, log), ...route.handlers] : route.handlers;
- switch (route.verb) {
- case 'get':
- server.get(route.path, ...handlers);
- break;
- case 'post':
- server.post(route.path, ...handlers);
- break;
- default:
- throw new Error();
- }
- }
- async function connectDbs(client, dbs) {
- return dbs.reduce(async (wrappedDbs, dbName) => ({ ...wrappedDbs, [dbName]: await dbWrapper(client, dbName) }), {});
- }
- async function start({ routes, host, port, middlewares, couchDbOpts, restifyOpts }) {
- try {
- const connStr = `${couchDbOpts.protocol}://${couchDbOpts.username}:${couchDbOpts.password}@${couchDbOpts.host}:${couchDbOpts.port}`;
- const client = await nano(connStr);
- const dbs = await connectDbs(client, couchDbOpts.dbs);
- logger.info('connected to db, starting server...');
- const server = restify.createServer(restifyOpts);
- middlewares.forEach(middlewareFactory => {
- server.use(middlewareFactory({ server, restify }));
- });
- routes.forEach(routeFactory => {
- setupRoute(routeFactory, dbs, server, logger);
- });
- server.listen(port, host, () => {
- logger.info(`${server.name} listening at ${server.url}`);
- });
- } catch (e) {
- throw new Error(e);
- }
- }
- export default start;
|