An easy to use framework to build rest api service with koa-neo4j,data models are fully declarative by json-schema
An easy to use framework to build rest api service with koa-neo4j,data models are fully declarative by json-schema
{
"id": "User",
"type": "object",
"properties": {
"alias": {
"type": "string"
},
"name": {
"type": "string"
},
"lang": {
"type": "string"
},
"userid":{
"type":"integer"
},
"passwd":{
"type":"string"
}
},
"route":"/users"
}
first each data model is a valid json schema,so model 'User' will be validated with ajv as json object with fields and related data types as above
data model with attribute "route":"/users"
will generate restful api interface with route /users
POST /users
PUT /users/:uuid
DELETE /users/:uuid
GET /users/:uuid
GET /users
"id":"User"
is not only the id of the json schema but also the label of the node stored in neo4j{
"id": "ConfigurationItem",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"responsibility":{
"type": "integer",
"schema":"User",
"relationship":{"name":"RESPONSIBLE_FOR","reverse":true}
},
...
},
"required": ["name"],
"route": "/cfgItems",
"search":{"index":"cmdb"}
}
schema
means field responsibility
in model ConfigurationItem
reference model User
and will generate relationship in neo4j as following
(:ConfigurationItem)<-[:RESPONSIBLE_FOR]-(:User)
search
means instance of ConfigurationItem
will also stored in elasticsearch with cmdb
as index name
api/searchByCypher
{
"category":"ITService",
"search":["email","pop3"],
"cypher":"OPTIONAL MATCH (s1:ITService) WHERE s1.uuid IN {search} or s1.group IN {search} WITH COLLECT(distinct(s1.uuid)) as services_byIds UNWIND {search} as keyword OPTIONAL MATCH (s1:ITService)-[:BelongsTo]->(sg:ITServiceGroup) WHERE s1.name = keyword or sg.name = keyword WITH services_byIds+collect(distinct(s1.uuid)) as services UNWIND services AS service RETURN COLLECT(distinct service)"
}
category
is id of the model,cypher
is the raw cypher query, other fields are required parameters in cypher query
api/searchByEql
{
"category":"ConfigurationItem",
"body":
{
"query": {
"bool":{
"must":[
{"match": {"category": "Router"}},
{"match":{"status.status":"In_Use"}},
{"match":{"it_service":"{{service_email_id}}"}}
]
}
},
"sort" : [
{ "product_date" : {"order" : "desc"}}]
}
}
category
is id of the model,body
is the raw eql
install npm dependencies
npm install
configuration
modify value in config/default.json to match db configuration
"neo4j": {
"host": "localhost",
"port": 7687,
"http_port":7474,
"user": "neo4j",
"password": "neo4j"
},
"elasticsearch":{
"host": "localhost",
"port": 9200,
"requestTimeout":3000,
"mode": "strict"
},
"redis": {
"host": "localhost",
"port": 6379
},
init Schema
npm run init
start
npm start
run integration test cases with postman
npm test