0.4.0 • Published 9 years ago

hapi-crud-promise v0.4.0

Weekly downloads
1
License
MIT
Repository
github
Last release
9 years ago

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.

0.4.0

9 years ago

0.3.0

10 years ago

0.2.0

10 years ago

0.1.1

10 years ago

0.1.0

10 years ago

0.0.7

10 years ago

0.0.6

10 years ago

0.0.5

10 years ago

0.0.4

10 years ago

0.0.3

10 years ago

0.0.2

10 years ago

0.0.1

10 years ago