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",
npm i restormify
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"
}
}
}
]
}
The default options are:
restormify(opts, callback)
{
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.
When the system has finished initlizing it'll call this with the db instance to the relations table or an error if any.
npm test
npm test-coverage
restormify is ©2014 Todd Kennedy. Available for use under the MIT License.