nuclear-entity-cache
Version:
A simple nuclear.js cache module that can be used as a centralized cache for entities.
86 lines (71 loc) • 1.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _nuclearJs = require('nuclear-js');
var _actionTypes = require('../actionTypes');
exports.default = {
getInitialState: function getInitialState() {
return (0, _nuclearJs.toImmutable)({});
},
handlers: [{
type: _actionTypes.ENTITY_CACHE_LOAD,
handler: loadHandler
}, {
type: _actionTypes.ENTITY_CACHE_REMOVE,
handler: removeHandler
}]
};
/**
* Handler for loading entities.
*
* @public
* @param {Immutable.Map} cache
* @param {array} payload.data
* @param {string} payload.entityName
* @returns {Immutable.Map}
*/
function loadHandler(cache, _ref) {
var name = _ref.name;
var data = _ref.data;
cache = ensureEntityContainer(cache, name);
return cache.withMutations(function (cache) {
data.forEach(function (entity) {
cache.setIn([name, entity.id], (0, _nuclearJs.toImmutable)(entity));
});
});
}
/**
* Handler for removing entities.
*
* @public
* @param {Immutable.Map} cache
* @param {array} payload.selectors
* @param {string} payload.entityName
* @returns {Immutable.Map}
*/
function removeHandler(cache, _ref2) {
var entityName = _ref2.entityName;
var selectors = _ref2.selectors;
cache = ensureEntityContainer(cache, entityName);
return cache.withMutations(function (cache) {
selectors.forEach(function (_ref3) {
var id = _ref3.id;
cache.removeIn([entityName, id]);
});
});
}
/**
* Ensures cache has a container map for given entity.
*
* @public
* @param {Immutable.Map} cache - store state
* @param {name} name
* @return {Immutable.Map}
*/
function ensureEntityContainer(cache, name) {
if (!cache.has(name)) {
cache = cache.set(name, (0, _nuclearJs.toImmutable)({}));
}
return cache;
}