[Persistence] Add capability decorator

Add capability decorator such that persistence queuing functionality
can be added on to the regular persistence capability of a domain
object. WTD-1033.
This commit is contained in:
Victor Woeltjen 2015-03-20 13:13:02 -07:00
parent f0549db4fa
commit 62e88abbd2

View File

@ -0,0 +1,75 @@
/*global define,Promise*/
/**
* Module defining CoreCapabilityProvider. Created by vwoeltje on 11/7/14.
*/
define(
['./QueuingPersistenceCapability'],
function (QueuingPersistenceCapability) {
"use strict";
/**
* Capability decorator. Adds queueing support to persistence
* capabilities for domain objects, such that persistence attempts
* will be handled in batches (allowing failure notification to
* also be presented in batches.)
*
* @constructor
*/
function QueuingPersistenceCapabilityDecorator(
persistenceQueue,
capabilityService
) {
function decoratePersistence(capabilities) {
var originalPersistence = capabilities.persistence;
if (originalPersistence) {
capabilities.persistence = function (domainObject) {
// Get/instantiate the original
var original =
(typeof originalPersistence === 'function') ?
originalPersistence(domainObject) :
originalPersistence;
// Provide a decorated version
return new QueuingPersistenceCapability(
persistenceQueue,
original,
domainObject
);
};
}
return capabilities;
}
function getCapabilities(model) {
return capabilityService.getCapabilities(model)
.then(decoratePersistence);
}
return {
/**
* Get all capabilities associated with a given domain
* object.
*
* This returns a promise for an object containing key-value
* pairs, where keys are capability names and values are
* either:
*
* * Capability instances
* * Capability constructors (which take a domain object
* as their argument.)
*
*
* @param {*} model the object model
* @returns {Object.<string,function|Capability>} all
* capabilities known to be valid for this model, as
* key-value pairs
*/
getCapabilities: getCapabilities
};
}
return QueuingPersistenceCapabilityDecorator;
}
);