quick and dirty api boilerplate

Craig Fletcher 0d154cf1c7 Add auth 4 éve
couchdb 7727186cf6 Redis -> couchdb 4 éve
src 0d154cf1c7 Add auth 4 éve
.env.example 0d154cf1c7 Add auth 4 éve
.eslintrc.cjs 7727186cf6 Redis -> couchdb 4 éve
.gitignore 7727186cf6 Redis -> couchdb 4 éve
.nvmrc 4337b08561 Initial commit 4 éve
.prettierrc 4337b08561 Initial commit 4 éve
README.md 7f3b222350 Fix README, move route setup into start 4 éve
docker-compose.yml 0d154cf1c7 Add auth 4 éve
package-lock.json 0d154cf1c7 Add auth 4 éve
package.json 0d154cf1c7 Add auth 4 éve

README.md

Easy API boilerplate

Quick and dirty API boilerplate, using:

  • CouchDB for the DB
  • Yup for validation
  • Restify for the web server/routing
  • Winston for logging
  • ESLint for linting

There are many limitations to this configuration, it is intended as a debugging/prototyping tool.

There are fairly few npm modules, not a lot of code, and most things are simply factories with dependencies passed in.

Usage

Import start from easy-api.js, call like so:

start({
  routes[], 
  host, 
  port,
  middlewares[],
  couchDbOpts{}, 
  restifyOpts{}
})

The included example uses docker and docker-compose, so the db host is set to "couchdb" and the restify server listens on 0.0.0.0:8080. You'll need to rename .env.example to .env and change the password.

Storage

Objects are stored in couchdb by calculating the sha256 hash, hex digest from a "path" array for convenience (e.g. ["users", req.params.userName, "stats", "visits"]).

There is no hardening or security intention behind this - it's simply a fast hash to use as an ID.

CouchDB options

  • protocol: protocol to access couchdb, e.g. http
  • host: couchdb host, e.g. couchdb.mydomain.com
  • 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: couchbase password, e.g. password123

Routes

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
  • schema (optional): yup schema to validate against

Validation

If a route passes a schema, the request will be validated against it before any other handlers are called.

  • get requests validate against req.params
  • post requests validate against req.body

When validation fails, a HTTP 400 is returned and the remaining handlers are not processed.

Middlewares

Middlewares are defined as factories, returning a restify-compatible middleware. They are passed the server instance and restify, like so:

const middlewareToBeApplied = middlewareFactory({server, restify});
server.use(middlewareToBeApplied);