Skip to content

Easily create CRUD routes on a hapi server by providing a path and promises for each of the actions

Notifications You must be signed in to change notification settings

wemofit/hapi-crud-promise

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

39 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

About

Easily create CRUD routes on a hapi server by providing a path and promises for each of the actions

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript 100.0%