basyt
v0.3.0
Published
minimalist nodejs package to create JSON API server.
Downloads
50
Maintainers
Readme
basyt
minimalist package to create JSON API server. Typical scenario to use basyt is when you need a rest-like JSON API that provides create/read/update/delete/query actions for your data entities.
Installation
$ npm install basyt
$ npm install basyt-mongodb-collectionFeatures
- is an extension over awesome nodejs framework expressjs
- generates CRUDL API and routing based on entities and controllers located in corresponding folders at the startup
- provides json web token based authentication
- provides redis based notification for entity updates
- provides user management and role based access control
Please review test folder, there you will find a sample web application exposing test_entity and test_relation entities.
Quick Start
To utilize basyt as foundation of your API, you need several declarations. Firstly basyt needs global APP_CONFIG object.
GLOBAL.APP_CONFIG = {
base_folder: __dirname + '/',
//base_folder definition is required, you probably will keep this line as it is
package_file: GLOBAL.APP_CONFIG.base_folder + 'package.json',
//path for package.json file. basyt uses package.json to get application name and version.
//when not defined package_file is set to base_folder + 'package.json'
basyt: { //scope for basyt related configuration
port: 5850,
//port number that basyt HTTP server will listen
entity_path: '/',
//url base path for entity API endpoints. default is '/'
//if it is set to 'foo' then base address for entity is http://hostname/foo/entity
entities_folder: GLOBAL.APP_CONFIG.base_folder + 'entities',
//path for folder that contains entity definitions.
//when not defined, entities_folder is set to base_folder + 'entities'
controllers_folder: GLOBAL.APP_CONFIG.base_folder + 'controllers',
//path for folder that contains entity-free controller definitions.
//when not defined, controllers_folder is set to base_folder + 'controllers'
enable_ws: true,
//enables socket.io based websocket. default true
enable_cors: true,
//enables CORS setup. default false
enable_auth: true,
//enables user management and authentication. default true
cors: {
//CORS headers to be setup. Required only when enable_cors is true
//following values can be set for CORS setup.
//Content_Type header field is allowed by default
//Authorization header is allowed when auth is enabled
origin: 'http://localhost:8580',
methods: 'GET,PUT,POST,DELETE',
headers: ['accept']
},
auth: {
//required when enable_auth is true.
secret_key: 'your.secret.key',
//key to be used for generating json web token
method: 'jwt'
//currently only supported method is jwt
}
disable_discovery: false,
//when discovery is enabled, GET request to server's base address will provide all possible API
},
mongodb: { //scope for mongodb collection configuration
connection: 'mongodb://localhost/basyt_db'
}
};after declaring global APP_CONFIG, you simply instantiate basyt
var basyt = require('basyt');
var basytApp = basyt();basyt explores entities and controllers in corresponding folders and generates API endpoints. In entities folder, entity declarations are like in the following example
module.exports = {
collection: { //collection is database aspect of entity
storage: "mongodb",
//currently the only storage option is mongodb. it is used to select collection
name: "test_entity",
//name of entity, used for url path and as collection name
strict: true,
//when collection is NOT strict, it accepts attributes that are not defined in attributes list
attributes: { //list of the attributes of entity
//following attributes are given as example
name: {type: "string", required: true},
email: "email",
url: "url",
telephone: {
type: "numeric",
minLength: 7,
maxLength: 11
}
},
event_channels: ['{{obj.email}}:test_entity'],
//basyt emits redis event for entity updates.
//By default, it emits entity:{{entity name}}:{{object id}} event
//for additional events event_channels list is used.
methods: {
//list of collection methods
//here hook functions for entity can be defined. for instance beforeCreate, afterCreate etc.
//see basyt-base-collection/index.js hook functions for complete hook functions and their
//signature
}
},
auth_levels: {
//authentication levels for API actions for entity. Default authentication level is 'USER'
'read': 'USER',
'list': 'USER',
'update': 'USER',
'update_bulk': 'USER',
'query': 'USER',
'create': 'USER',
'create_bulk': 'USER',
'delete': 'USER',
'delete_bulk': 'USER'
},
//you can disable/enable any API action for entity.
disable_read: false,
disable_list: false,
disable_update: false,
disable_delete_bulk: true,
disable_create_bulk: true,
disable_update_bulk: true,
customActions: {
//here you can define any other actions for the entity
test: {
path: '/:entity_id/test',
//url path that action will bind to
method: 'put',
//HTTP method for the action
auth_level: 'ADMIN',
//Authentication level for the action
action: function custom_action(req, res) {
//action function
return res.json({success: true});
}
}
}
};In controllers folder, entity-free controllers are declared. Those controller files include definitions similar to customActions field of entity declarations.
module.exports = {
example_action: {
path: '/example_action',
//url path that action will bind to
method: 'GET',
//HTTP method for the action
auth_level: 'USER',
//Authentication level for the action
action: function example_action(req, res) {
//action function
return res.json({success: true});
}
}
};For a controller file named test\_controller.js with content given above, there will be an api for address http://hostname/test_controller/example_action.
That's all for a quick start. Wiki pages are coming soon!
Why do we call it basyt
In Turkish basit means simple. That is the motivation: an extension over expressjs to make things simpler. Since our company's initials are YT, we decided to call the project basyt, simple web package from Yonca Teknoloji.
