0.9.0 • Published 7 years ago

mongoose-class-wrapper v0.9.0

Weekly downloads
237
License
MIT
Repository
github
Last release
7 years ago

mongoose-class-wrapper Build Status

Tiny ES2015 class-based wrapper for mongoose model methods.

Note: Since v4.7.0, Mongoose already supports ES2015 classes (PR reference).

Installation

$ npm i mongoose mongoose-class-wrapper --save

Usage

You can use this plugin with latest Node.js versions (at least v4 LTS) as they support ES2015 class syntax (in strict mode). For previous versions use babel.

Basic Example

// Importing modules
const mongoose = require('mongoose');
const loadClass = require('mongoose-class-wrapper');
//   for babel:
// import mongoose from 'mongoose';
// import loadClass from 'mongoose-class-wrapper';
//   for typescript:
// import * as mongoose from 'mongoose';
// import loadClass = require('mongoose-class-wrapper');


// Create mongoose schema
var userSchema = new mongoose.Schema({
  username: {type: String, unique: true, required: true},
  email: {type: String, unique: true, required: true},
  hashedPassword: {type: String, required: true},
  salt: {type: String, required: true},
  created: {type: Date, default: Date.now}
});

// Create new class with model methods
class UserModel {

  get password() {
    return this._plainPassword;
  }
  set password(password) {
    this._plainPassword = password;
    this.salt = Math.random() + '';
    this.hashedPassword = this.encryptPassword(password);
  }

  encryptPassword(password) {
    return crypto.createHmac('sha1', this.salt).update(password).digest('hex');
  }

  static byEmail(email) {
    return this.findOne({email}).exec();
  }

}

//posible options, for instance if you want to ignore getter and setters put
const options={
	ignoreGettersAndSetters:true
}

// Add methods from class to schema
userSchema.plugin(loadClass, {target:UserModel,options:options});

// Export mongoose model
export default mongoose.model('User', userSchema);

Inheritance Example

import mongoose from 'mongoose';
import loadClass from 'mongoose-class-wrapper';

class Resource {}

// Add schema to base class
Resource.schema = {
  version: {
    type: Number,
    default: 0
  }
}

// Add hooks to base class
Resource.hooks = {
  pre: {
    save: function(next) {
      this.version += 1;
      next();
    }
  }
}

var schema = new mongoose.Schema({
  title: String,
  author: String
});

class Book extends Resource {}

// Add schema, hooks and methods from class to schema
schema.plugin(loadClass, Book);

// Export mongoose model
export default mongoose.model('Book', schema);

Experimental decorators

Experimental decorators for mongoose models are available in mongoose-decorators package.

License

This library is under the MIT License