mayor-model-cache
Version:
A nuclear-js module provides a cache for your models
84 lines (68 loc) • 2.03 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.STORE_NAME = undefined;
var _actionTypes = require('../action-types');
var _actionTypes2 = _interopRequireDefault(_actionTypes);
var _nuclearJs = require('nuclear-js');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var STORE_NAME = exports.STORE_NAME = '@@mayor/model-cache';
/**
* ModelCacheStore is used for storing arbitrary model objects.
*/
exports.default = (0, _nuclearJs.Store)({
getInitialState: function getInitialState() {
return (0, _nuclearJs.toImmutable)({});
},
initialize: function initialize() {
this.on(_actionTypes2.default.MODEL_CACHE_LOAD_ENTITY, load);
this.on(_actionTypes2.default.MODEL_CACHE_REMOVE_ENTITY, remove);
}
});
/**
* Loads data into cache using given model.
*
* @public
* @param {Immutable.Map} cache - store state
* @param {object} payload
* @return {Immutable.Map}
*/
function load(cache, payload) {
var model = payload.model;
var data = payload.data;
cache = ensureEntityContainer(cache, model.entity);
return cache.withMutations(function (cache) {
data.forEach(function (entry) {
cache.setIn([model.entity, entry.id], (0, _nuclearJs.toImmutable)(entry));
});
});
}
/**
* Removes data from cache with given id
*
* @public
* @param {Immutable.Map} cache - store state
* @param {object} payload
* @return {Immutable.Map}
*/
function remove(cache, payload) {
var model = payload.model;
var data = payload.data;
cache = ensureEntityContainer(cache, model.entity);
return cache.removeIn([model.entity, payload.data.id]);
}
/**
* Ensures cache has a container map for given entity.
*
* @public
* @param {Immutable.Map} cache - store state
* @param {string} entity - model entity
* @return {Immutable.Map}
*/
function ensureEntityContainer(cache, entity) {
if (!cache.has(entity)) {
cache = cache.set(entity, (0, _nuclearJs.toImmutable)({}));
}
return cache;
}