hapi-crud-promise

0.4.0 • Public • Published

hapi-crud-promise Build Status Coverage Status

NPM NPM

Basics

Reduce repetitive route setup for basic CRUD apps.

Provide one route and a 5 handlers:

/api/things/{thingId}

And get 5 routes added to your server:

GET    /api/things
POST   /api/things
GET    /api/things/{thingId}
PUT    /api/things/{thingId}
DELETE /api/things/{thingId}

Simple Usage

const Hapi = require('hapi');
const Joi = require('joi');
const hapiCrudPromise = require('../index');
 
const server = new Hapi.Server();
server.connection({ host: '127.0.0.1' });
 
hapiCrudPromise(server, {
  path: '/api/things/{thingId}',
  config: {
    validate: {
      query: { // validation only applied to GET (all)
        limit: Joi.number().optional()
      }
      params: { // validation only applied to GET (one), DELETE, and UPDATE routes
        thingId: Joi.string().required()
      },
      payload: Joi.object({ // validation only applied to POST and PUT route
        thing: Joi.object({
          name: Joi.string().required()
        }).required()
      })
    }
  },
  crudRead(req) {
    return knex('things')
      .first()
      .where({ id: req.params.thingId });
  },
  crudReadAll(req) {
    return knex('things').limit(req.query.limit);
  },
  crudUpdate(req) {
    return knex('things')
      .update(req.payload.thing)
      .where({ id: req.params.thingId })
      .limit(1)
      .returning('*')
      .spread((thing) => ({ thing: thing }));
  },
  crudCreate(req) {
    return knex('things')
      .insert(req.payload.thing)
      .returning('*')
      .spread((thing) => ({ thing: thing }));
  },
  crudDelete(req) {
    return knex('things')
      .delete()
      .where({ id: req.params.thingId })
      .limit(1);
  }
});

Slightly-more-advanced Usage

If you have a long path in your route with multiple parameters the last one is special, it identifies the resource you are CRUD-ing and will only be included on validations for GET (one), DELETE, and UPDATE routes

const Hapi = require('hapi');
const Joi = require('joi');
const hapiCrudPromise = require('../index');
 
const server = new Hapi.Server();
server.connection({ host: '127.0.0.1' });
 
hapiCrudPromise(server, {
  path: '/api/users/{userId}/things/{thingId}',
  config: {
    validate: {
      query: { // validation only applied to GET (all)
        limit: Joi.number().optional()
      }
      params: {
        userId: Joi.string().required(), // This and other param validations applied to all routes
        thingId: Joi.string().required() // Except this one! only applied to GET (one), DELETE, and UPDATE routes
      },
      payload: Joi.object({ // validation only applied to POST and PUT route
        thing: Joi.object({
          name: Joi.string().required()
        }).required()
      })
    }
  },
  crudRead(req) {
    ...
  },
  crudReadAll(req) {
    ...
  },
  crudUpdate(req) {
    ...
  },
  crudCreate(req) {
    ...
  },
  crudDelete(req) {
    ...
  }
});

Contributing

Contributors wanted. If you are looking for a way to help out browse the Help Wanted issues and find one that looks good to you. If you have an idea to make hapi-crud-promise better submit a pull request.

Pull Request Checklist

Checklist for submitting a pull request:

  • npm run test - Unit tests must pass
  • New unit tests
  • npm run test-cov - Code coverage cannot go down
  • npm run lint - New code must have no linter errors
  • Your pull request must pass CI

FAQ

Isn't this like hapi-crud?

Yeah, but with Promises! And active. And the Github repo is still live.

Can't I just create a bunch of routes manually?

CRUD routes are repetitive. Write less code and go outside.

Readme

Keywords

Package Sidebar

Install

npm i hapi-crud-promise

Weekly Downloads

1

Version

0.4.0

License

MIT

Last publish

Collaborators

  • gangstead