UNPKG

congo-model

Version:

A model class for the congo mongodb ecosystem

69 lines (59 loc) 1.88 kB
var insert = require('congo-insert'); var update = require('congo-update'); var isObjectID = require('is-object-id'); var ObjectID = require('mongodb').ObjectID; module.exports = function(db, collection_name, json_schema){ var modelClass = function(){ this.collection = db.collection(collection_name); this.schema = json_schema; this.data = {}; this.commited = false; } modelClass.prototype.save = function(callback){ var self = this; if(this.commited){ update(this.collection, this.schema, this.data, function(err, result){ if(err == null) self.commited = true; callback(err, result); }); }else insert(this.collection, this.schema, this.data, callback); }; modelClass.prototype.destroy = function(callback){ if(!this.commited) this.collection.remove({_id: new ObjectID(this.data._id)}, callback); else callback("This model has not been saved, so it cannot be destroyed.", null); }; modelClass.findRaw = function(query, callback){ var cursor = db.collection(collection_name).find(query); callback(cursor); }; modelClass.find = function(query, callback){ var documents = db.collection(collection_name).find(query).map(function(d){ var doc = new modelClass(); doc.data = d; doc.commited = true; return doc; }); }; modelClass.findOne = function(query){ var cursor = db.collection(collection_name).find(query); cursor.limit(1); var results = cursor.toArray(); if(results.length > 0){ var doc = new modelClass(); doc.data = results[0]; doc.commited = true; return doc; }else return null; }; modelClass.findOneByID = function(id){ if(!isObjectID(id)) return null; else return this.findOne({_id: new ObjectID(id)}); }; return modelClass; };