Sign Up for Free

RunKit +

Try any Node.js package right in your browser

This is a playground to test code. It runs a full Node.js environment and already has all of npm’s 1,000,000+ packages pre-installed, including restormify with all npm packages installed. Try it out:

require("orm/package.json"); // orm is a peer dependency. require("restify/package.json"); // restify is a peer dependency. var restormify = require("restormify")

This service is provided by RunKit and is not affiliated with npm, Inc or the package authors.

restormify v1.0.1

An automatic API generator for node-orm2 and restify

build status

REST-ORM-ify

A package designed to easily expose node-orm2 models as REST interface using node-restify. Requires the use of the restify.bodyParser middleware.

The API will generate a HAL-compliant REST interface allowing for abitrary content association and better automation for interacting with objects.

This has been tested against:

"orm": "~2.1.17",
"restify": "~2.8.1",

Installation

npm i restormify

Usage

var restify = require('restify');
var orm = require('orm');
var restormify = require('restormify');

var server = restify.createServer();
server.use(restify.bodyParser());
orm.connect('some/db/string', function(err, db){
  db.define('todo', {
    task: String,
    completed: Boolean,
    deleted: {type: 'boolean', serverOnly: true},
    hiddenValue: {type: text, serverOnly: true}
  });
  db.sync('models', function(){

    restormify({
      db: db,
      server: server,
      apiBase: 'api',
      deletedColumn: 'deleted',
      allowAccess: function(req, method, resourceName, resourceId){
        return true;
      }
    }, function(err, relationsModel){
      server.listen(3000);
    });
  });
});

This will expose todo as /api/todo responding to:

  • GET /api/todo
  • GET /api/todo/[id]
  • POST /api/todo
  • PUT /api/todo/[id]
  • PATCH /api/todo/[id]
  • DELETE /api/todo/[id]
> curl -X POST -H 'Content-type: application/json' -d '{"task": "Write tests", "completed": false}' myapi.com/api/todo

{
  "id": 1,
  "task": "Write tests",
  "completed": false,
  "_links": {
    "self": {
      "href": "/api/todo/1",
      "type": "todo"
    },
    "associations": {
      "href": "/api/todo/1/associations"
    },
    "associate": {
      "href": "/api/todo/1/{associatioName}",
      "templated": "true"
    }
  }
}

It will also allow you to associate content, and retrieve those associations, as well as information about the resource being retrieved.

curl -X POST -H 'Content-type: application/json' myapi.com/api/todo/1/assocate/todo -d '{"id": 1,"task": "Write tests","completed": false,"_links": {"self": {"href": "/api/todo/1","type": "todo"},"associations": {"href": "/api/todo/1/associations"},"associate": {"href": "/api/todo/1/{associatioName}","templated": "true"}}}'

{
  todo: [
    {
      "id": 1,
      "task": "Write tests",
      "completed": false,
      "_links": {
        "self": {
          "href": "/api/todo/1",
          "type": "todo"
        },
        "associations": {
          "href": "/api/todo/1/associations"
        },
        "associate": {
          "href": "/api/todo/1/{associatioName}",
          "templated": "true"
        }
      }
    }
  ]
}

API

The default options are:

restormify(opts, callback)

opts

{
    apiBase: 'api',
    deletedColumn: 'deleted',
    allowAccess: function(){
      return true;
    },
    logger: server.logger
}

options.apiBase: what all requests to your API will be prefixed with. options.deletedColumn: the name of the column to flag a piece of content as deleted. If set to false it will destroy data in your database options.allowAccess: This method is called on each request. Returning false will return 401: Not authorized to the client. It is passed in the restify req object, the name of the resource (and any ID), along with the HTTP method. options.logger: Specify a bunyan logger function to use. Defaults to default (which uses the logger available from restify object), false will disable logging.

callback(err, relationsModel)

When the system has finished initlizing it'll call this with the db instance to the relations table or an error if any.

Tests and Coverage

npm test npm test-coverage

License

restormify is ©2014 Todd Kennedy. Available for use under the MIT License.

RunKit is a free, in-browser JavaScript dev environment for prototyping Node.js code, with every npm package installed. Sign up to share your code.
Sign Up for Free