basyt

0.3.0 • Public • Published

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.

npm version Build Status Dependencies Coverage Status

Installation

$ npm install basyt
$ npm install basyt-mongodb-collection

Features

  • 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.

Dependencies (7)

Dev Dependencies (3)

Package Sidebar

Install

npm i basyt

Weekly Downloads

3

Version

0.3.0

License

MIT

Last publish

Collaborators

  • yonca