easy-api.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import restify from 'restify';
  2. import nano from 'nano';
  3. import yup from 'yup';
  4. import validationFactory from './modules/validations.js';
  5. import dbWrapper from './modules/db.js';
  6. import logger from './modules/logging.js';
  7. function setupRoute(routeFactory, dbs, server, log) {
  8. const route = routeFactory({ dbs, yup, log });
  9. const handlers = route.schema ? [validationFactory(route, log), ...route.handlers] : route.handlers;
  10. switch (route.verb) {
  11. case 'get':
  12. server.get(route.path, ...handlers);
  13. break;
  14. case 'post':
  15. server.post(route.path, ...handlers);
  16. break;
  17. default:
  18. throw new Error();
  19. }
  20. }
  21. async function connectDbs(client, dbs) {
  22. return dbs.reduce(async (wrappedDbs, dbName) => ({ ...wrappedDbs, [dbName]: await dbWrapper(client, dbName) }), {});
  23. }
  24. async function start({ routes, host, port, middlewares, couchDbOpts, restifyOpts }) {
  25. try {
  26. const connStr = `${couchDbOpts.protocol}://${couchDbOpts.username}:${couchDbOpts.password}@${couchDbOpts.host}:${couchDbOpts.port}`;
  27. const client = await nano(connStr);
  28. const dbs = await connectDbs(client, couchDbOpts.dbs);
  29. logger.info('connected to db, starting server...');
  30. const server = restify.createServer(restifyOpts);
  31. middlewares.forEach(middlewareFactory => {
  32. server.use(middlewareFactory({ server, restify }));
  33. });
  34. routes.forEach(routeFactory => {
  35. setupRoute(routeFactory, dbs, server, logger);
  36. });
  37. server.listen(port, host, () => {
  38. logger.info(`${server.name} listening at ${server.url}`);
  39. });
  40. } catch (e) {
  41. throw new Error(e);
  42. }
  43. }
  44. export default start;