iridium
Version:
A custom lightweight ORM for MongoDB designed for power-users
74 lines (61 loc) • 2.94 kB
text/typescript
import {Core} from './Core';
import {Schema} from './Schema';
import {Model} from './Model';
import {ModelCache} from './ModelCache';
import * as ModelOptions from './ModelOptions';
import Skmatc = require('skmatc');
import _ = require('lodash');
import MongoDB = require('mongodb');
import Bluebird = require('bluebird');
/**
* Provides a number of methods which are used to handle events that occur within
* the Iridium workflow - such as what happens when a document is received from
* the database, or how to handle the creation of new documents and saving of instances.
*
* Mostly this is for cache support, wrapping and hook triggering.
* @internal
*/
export class ModelHandlers<TDocument extends { _id?: any }, TInstance> {
constructor(public model: Model<TDocument, TInstance>) {
}
documentReceived<TResult>(conditions: any,
result: TDocument,
wrapper: (document: TDocument, isNew?: boolean, isPartial?: boolean) => TResult,
options: ModelOptions.QueryOptions = {}): Bluebird<TResult> {
_.defaults(options, {
cache: true,
partial: false
});
return Bluebird.resolve(result).then((target: any) => {
return <Bluebird<TResult>>Bluebird.resolve().then(() => {
// Cache the document if caching is enabled
if (this.model.core.cache && options.cache && !options.fields) {
this.model.cache.set(target); // Does not block execution pipeline - fire and forget
}
// Trigger the received hook
if (this.model.hooks.onRetrieved) this.model.hooks.onRetrieved(target);
// Wrap the document and trigger the ready hook
let wrapped: TResult = wrapper(target, false, !!options.fields);
if (this.model.hooks.onReady && wrapped instanceof this.model.Instance) this.model.hooks.onReady(<TInstance><any>wrapped);
return wrapped;
});
});
}
creatingDocuments(documents: TDocument[]): Bluebird<any[]> {
return Bluebird.all(documents.map((document: any) => {
return Bluebird.resolve().then(() => {
if (this.model.hooks.onCreating) this.model.hooks.onCreating(document);
document = this.model.helpers.convertToDB(document);
let validation: Skmatc.Result = this.model.helpers.validate(document);
if (validation.failed) return Bluebird.reject(validation.error);
return document;
});
}));
}
savingDocument(instance: TInstance, changes: any): Bluebird<TInstance> {
return Bluebird.resolve().then(() => {
if (this.model.hooks.onSaving) this.model.hooks.onSaving(instance, changes);
return instance;
});
}
}