2016-07-16 02:06:10 +00:00
|
|
|
import {combineReducers} from 'redux';
|
2016-04-26 07:29:24 +00:00
|
|
|
|
2016-09-21 21:17:11 +00:00
|
|
|
import * as db from 'backend/database';
|
2016-09-02 05:45:12 +00:00
|
|
|
|
|
|
|
const ENTITY_BLACKLIST = {
|
2016-09-21 21:17:11 +00:00
|
|
|
[db.response.type]: 1,
|
|
|
|
[db.stats.type]: 1
|
2016-09-02 05:45:12 +00:00
|
|
|
};
|
2016-04-26 07:29:24 +00:00
|
|
|
|
2016-04-27 03:17:05 +00:00
|
|
|
const ENTITY_INSERT = 'entities/insert';
|
2016-04-26 07:29:24 +00:00
|
|
|
const ENTITY_UPDATE = 'entities/update';
|
|
|
|
const ENTITY_REMOVE = 'entities/remove';
|
|
|
|
|
|
|
|
// ~~~~~~~~ //
|
|
|
|
// REDUCERS //
|
|
|
|
// ~~~~~~~~ //
|
|
|
|
|
|
|
|
function genericEntityReducer (referenceName) {
|
|
|
|
return function (state = {}, action) {
|
|
|
|
const doc = action[referenceName];
|
|
|
|
|
|
|
|
if (!doc) {
|
|
|
|
return state;
|
|
|
|
}
|
|
|
|
|
2016-09-02 05:45:12 +00:00
|
|
|
if (ENTITY_BLACKLIST[doc.type]) {
|
|
|
|
return state;
|
|
|
|
}
|
|
|
|
|
2016-04-26 07:29:24 +00:00
|
|
|
switch (action.type) {
|
|
|
|
|
|
|
|
case ENTITY_UPDATE:
|
2016-04-27 03:17:05 +00:00
|
|
|
case ENTITY_INSERT:
|
2016-04-26 07:29:24 +00:00
|
|
|
return {...state, [doc._id]: doc};
|
|
|
|
|
|
|
|
case ENTITY_REMOVE:
|
|
|
|
const newState = Object.assign({}, state);
|
|
|
|
delete newState[action[referenceName]._id];
|
|
|
|
return newState;
|
|
|
|
|
|
|
|
default:
|
|
|
|
return state;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-15 17:04:36 +00:00
|
|
|
const reducers = {};
|
2016-09-21 21:17:11 +00:00
|
|
|
for (const type of db.ALL_TYPES) {
|
2016-08-15 17:04:36 +00:00
|
|
|
// Name example: RequestGroup => requestGroups
|
|
|
|
// Add an "s" to the end if there isn't already
|
|
|
|
const trailer = type.match(/s$/) ? '' : 's';
|
|
|
|
const name = `${type.slice(0, 1).toLowerCase()}${type.slice(1)}${trailer}`;
|
|
|
|
reducers[name] = genericEntityReducer(type);
|
|
|
|
}
|
|
|
|
|
2016-04-26 07:29:24 +00:00
|
|
|
export default combineReducers({
|
2016-08-15 17:04:36 +00:00
|
|
|
...reducers,
|
2016-07-19 16:59:26 +00:00
|
|
|
doNotPersist: () => true
|
2016-08-15 17:04:36 +00:00
|
|
|
});
|
2016-04-26 07:29:24 +00:00
|
|
|
|
|
|
|
|
|
|
|
// ~~~~~~~ //
|
|
|
|
// ACTIONS //
|
|
|
|
// ~~~~~~~ //
|
|
|
|
|
2016-08-15 17:04:36 +00:00
|
|
|
const insertFns = {};
|
2016-09-21 21:17:11 +00:00
|
|
|
for (let type of db.ALL_TYPES) {
|
2016-08-15 17:04:36 +00:00
|
|
|
insertFns[type] = doc => ({type: ENTITY_INSERT, [type]: doc})
|
|
|
|
}
|
|
|
|
|
|
|
|
const updateFns = {};
|
2016-09-21 21:17:11 +00:00
|
|
|
for (let type of db.ALL_TYPES) {
|
2016-08-15 17:04:36 +00:00
|
|
|
updateFns[type] = doc => ({type: ENTITY_UPDATE, [type]: doc})
|
|
|
|
}
|
|
|
|
|
|
|
|
const removeFns = {};
|
2016-09-21 21:17:11 +00:00
|
|
|
for (let type of db.ALL_TYPES) {
|
2016-08-15 17:04:36 +00:00
|
|
|
removeFns[type] = doc => ({type: ENTITY_REMOVE, [type]: doc})
|
|
|
|
}
|
2016-04-26 07:29:24 +00:00
|
|
|
|
2016-04-27 03:17:05 +00:00
|
|
|
export function insert (doc) {
|
|
|
|
return insertFns[doc.type](doc);
|
|
|
|
}
|
|
|
|
|
2016-04-26 07:29:24 +00:00
|
|
|
export function update (doc) {
|
|
|
|
return updateFns[doc.type](doc);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function remove (doc) {
|
|
|
|
return removeFns[doc.type](doc);
|
|
|
|
}
|