@neode/express
v0.1.0
Published
Neode REST endpoints for Express
Downloads
3
Readme
@neode/express
The idea behind this repository is remove the CRUD boilerplate around Express applications interacting with Neo4j by providing a simple API to build Resource Controller around your neode models.
Usage
With one extra dependency and one line of code, you can quickly add a set of REST endpoints.
Say for example, you have a graph of (:User)
s and their (:Skill)
s - you would have a models directory with two files:
Then index.js would look a little like this:
const express = require('express')
const bodyParser = require('body-parser')
const neode = require('neode')
.fromEnv()
.withDirectory(__dirname +'/models')
const app = express()
app.use(bodyParser.json())
// ...
By adding two lines, you can create a set of REST endpoints that use the information defined in the Neo4j models to validate and process the requests.
const resource = require('@neode/express')
app.use('/api/users', resource(neode, 'User'))
The resource
function
This takes two arguments, first your neode
instance, and secondly the name of the model. That's it. You'll be able to GET /api/users
to retrieve a list of User nodes, POST /api/users
to create a new user, GET /api/users/{primary key}
to view an individual resource PUT /api/users/{primary key}
to update the node, and DELETE /api/users/{primary key}
to delete the node.
Endpoints
GET /
- List
The list endpoint will return a paginated list of nodes. The list can be filtered based on any property that is listed in the model definition as an index, unique or a primary key. All you need to do is pass it as part of the query string.
Key | Action | Notes
-- | -- | --
order | Property name to order by
sort | Order to return the records | asc
or desc
limit | Number of records to return | Default is 10
page | Page number to return | Offset is calculated as page-1 * limit
POST /
- Create
Posting to the root will attempt to create a node based on the neode model definition. If any validation fails, the server wll return a 422 status code and an object including details
- a list of the Joi validation errors.
This takes a combination of the post body and request params - so for example, you could define the primary key of the parent object into the URL.
// Post.js
module.exports = {
body: 'string',
user: {
type: 'node',
target: 'User',
relationship: 'POSTED',
direction: 'in',
},
}
// Resource
api.use('/api/users/:user/posts', resource(neode, 'Post'))
// Application call
axios.post('http://localhost:3000/api/users/user', { data: { content: 'Lorem ipsum' } })
This would take the :user
value from the URL, combine it with data
in the request and pass the info through to neode.create()
.
GET /:id
Show
A GET request to /{id}
will attempt to load the model with the primary key {id}
. The primary key is defined as the primary: true
in the model definition. The properties and relationships defined with eager: true
will be returned as a JSON object.
PUT /:id
- Update
A PUT request to /{id}
will attempt to load the model with the primary key {id}
, then use a combination of the request params and post body to update the node.
DELETE /:id
- Destroy
A PUT request to /{id}
will attempt to load the model with the primary key {id}
, then delete it via neode - including any cascade deletion defined in the model.