Browse Source

Fix README, move route setup into start

Craig Fletcher 4 years ago
parent
commit
7f3b222350
3 changed files with 37 additions and 31 deletions
  1. 3 3
      README.md
  2. 21 27
      src/easy-api.js
  3. 13 1
      src/modules/db.js

+ 3 - 3
README.md

@@ -50,13 +50,13 @@ hash to use as an ID.
 * port: couchdb port, e.g. 5984
 * dbs: array of DB names to connect to (created if they don't exist), e.g. ['visits']
 * username: couchdb username, e.g. admin
-* password: copuchbase password, e.g. password123
+* password: couchbase password, e.g. password123
 
 
 ## Routes
 
-Routes are defined as simple factories, passed a db wrapper, yup and log instance as
-an object (`{db, yup, log}`) and expected to return:
+Routes are defined as simple factories, passed an array of wrapped dbs, yup and log instance as
+an object (`{dbs, yup, log}`) and expected to return:
   * verb: HTTP verb, e.g. `get`
   * path: restify path string, e.g. `/api/hello/:name`
   * handlers: array of restify handler functions for route

+ 21 - 27
src/easy-api.js

@@ -1,48 +1,42 @@
 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 connectAndWrapDbs 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('connecting to db...');
+    const dbs = await connectAndWrapDbs(couchDbOpts);
 
-    logger.info('connected to db, starting server...');
+    logger.info('connected to db, setting up server...');
     const server = restify.createServer(restifyOpts);
 
+    logger.info('setting up middlewares...');
     middlewares.forEach(middlewareFactory => {
       server.use(middlewareFactory({ server, restify }));
     });
 
+    logger.info('setting up routes...');
     routes.forEach(routeFactory => {
-      setupRoute(routeFactory, dbs, server, logger);
+      const route = routeFactory({ dbs, yup, logger });
+      const handlers = route.schema ? [validationFactory(route, logger), ...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();
+      }
     });
 
+    logger.info('server setup complete');
+
     server.listen(port, host, () => {
       logger.info(`${server.name} listening at ${server.url}`);
     });

+ 13 - 1
src/modules/db.js

@@ -1,4 +1,5 @@
 import hasha from 'hasha';
+import nano from 'nano';
 
 function getLeafId(nodePath) {
   return hasha(nodePath.join('#'), { algorithm: 'sha256', encoding: 'hex' });
@@ -47,4 +48,15 @@ async function dbWrapper(client, dbName) {
   };
 }
 
-export default dbWrapper;
+async function wrapDbs(client, dbs) {
+  return dbs.reduce(async (wrappedDbs, dbName) => ({ ...wrappedDbs, [dbName]: await dbWrapper(client, dbName) }), {});
+}
+
+async function connectAndWrapDbs(opts) {
+  const connStr = `${opts.protocol}://${opts.username}:${opts.password}@${opts.host}:${opts.port}`;
+  const client = await nano(connStr);
+  const dbs = await wrapDbs(client, opts.dbs);
+  return dbs;
+}
+
+export default connectAndWrapDbs;