0.6.22 • Published 10 years ago

nis-model v0.6.22

Weekly downloads
4
License
MIT
Repository
github
Last release
10 years ago

Advanced, database agnostic ODM

Sometimes your application is not a simple to-do list and you need to write complex business logic. Rather than strictly predefined CRUD methods and hooks, nis-model is a set of tools which you can use to write your own logic, data sources and reusable behaviours.

  • Scheme (inheritable, with nested models)
  • Validations (extendable validations and sanitizers)
  • Defaults (inheritable default settings)
  • Methods (inheritable instance and constructor methods)
  • Queries (inheritable, extendable and cacheable query builder methods)
  • Hooks (inheritable and extendable)
  • Relations with integrity maintaining hooks
  • Data sources with optimistic locks (Memory, Json file, Mongo, Rest, Elastic search)
  • Caching (synchronize workers' cache across nodejs cluster)
  • Behaviours (Orderable, Tree)

Installation

npm install nis-model

Usage

var Model = require('nis-model');

/*
 * create employee model, which:
 * 1. is stored in mongo database
 * 2. is in tree structure
 * 3. is orderable
 * 4. can handle process of changing job - it is not just a simple update,
 * it has to be confirmed by HR department
 */
var Employee = Model.define('Employee', [ 'MongoDataSource', 'Orderable', 'Tree' ], {
    name:{ isString:true },
    surname:{ isString:true },
    salary:{ isNumber:true, round:2 },
    job:{ isIn:[ 'project_manager', 'sales', 'support'] },
    jobConfirmed:{ isBool:true },
    // address as submodel
    address: { model: Model('Address') },
    // or array of submodels
    addresses: { arrayOf: Model('Address') }
});

// define connection details by extending inherited defaults
Employee.extendDefaults({
    connection:{
        host: 'localhost',
        port: 27017,
        database:'myapp',
        collection:'employees'
    }
});

// now, add hookable method
Employee.prototype.changeJob = Employee.wrapHooks('changeJob', function(newJob, cb){
    var employee = this;
    employee.job = newJob;
    employee.jobConfirmed = false;
    employee.update(cb);
});

// register "beforeChangeJob" listener
Employee.on('beforeChangeJob', function(next){
    // notify HR department
    next();
});

// init model, this will ensure indexes or do some work to init datastore
Employee.init();

// now we can get employee and change his job
Employee.collection().find({ name:'Chuck', surname:'Norris' }).one(function(err, employee){
    employee.changeJob('super_agent', function(err){
        // job changed, and HR department was notified
        // (but I am sure they can't change Chuck's job - nobody can :)
    });
});

// if you need to define a new type of employee, just inherit it from Employee.
// It will inherit all methods including registered events like "beforeJobChange".
var SuperEmployee = Model.define('SuperEmployee', ['Employee']);
0.6.22

10 years ago

0.6.21

10 years ago

0.6.20

10 years ago

0.6.19

10 years ago

0.6.18

10 years ago

0.6.17

10 years ago

0.6.16

10 years ago

0.6.15

10 years ago

0.6.14

10 years ago

0.6.13

10 years ago

0.6.12

10 years ago

0.6.11

10 years ago

0.6.10

10 years ago

0.6.9

10 years ago

0.6.8

10 years ago

0.6.7

10 years ago

0.6.6

10 years ago

0.6.5

10 years ago

0.6.4

10 years ago

0.6.3

11 years ago

0.6.2

11 years ago

0.6.1

11 years ago

0.6.0

11 years ago