1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-12-22 19:07:54 +01:00
unleash.unleash/lib/event-differ.js

146 lines
3.2 KiB
JavaScript
Raw Normal View History

/* eslint-disable no-param-reassign */
2016-06-18 21:53:18 +02:00
'use strict';
2016-10-26 10:43:11 +02:00
const { diff } = require('deep-diff');
2016-12-09 14:50:30 +01:00
const {
STRATEGY_CREATED,
STRATEGY_DELETED,
STRATEGY_UPDATED,
STRATEGY_IMPORT,
STRATEGY_DEPRECATED,
STRATEGY_REACTIVATED,
DROP_STRATEGIES,
2016-12-09 14:50:30 +01:00
FEATURE_CREATED,
FEATURE_UPDATED,
FEATURE_ARCHIVED,
FEATURE_REVIVED,
FEATURE_IMPORT,
FEATURE_TAGGED,
FEATURE_UNTAGGED,
DROP_FEATURES,
CONTEXT_FIELD_CREATED,
CONTEXT_FIELD_UPDATED,
CONTEXT_FIELD_DELETED,
PROJECT_CREATED,
PROJECT_UPDATED,
PROJECT_DELETED,
TAG_CREATED,
TAG_DELETED,
TAG_TYPE_CREATED,
TAG_TYPE_DELETED,
APPLICATION_CREATED,
2016-12-09 14:50:30 +01:00
} = require('./event-type');
const strategyTypes = [
STRATEGY_CREATED,
STRATEGY_DELETED,
STRATEGY_UPDATED,
STRATEGY_IMPORT,
STRATEGY_DEPRECATED,
STRATEGY_REACTIVATED,
DROP_STRATEGIES,
];
2016-12-27 21:03:50 +01:00
const featureTypes = [
2016-12-09 14:50:30 +01:00
FEATURE_CREATED,
FEATURE_UPDATED,
FEATURE_ARCHIVED,
FEATURE_REVIVED,
FEATURE_IMPORT,
FEATURE_TAGGED,
FEATURE_UNTAGGED,
DROP_FEATURES,
];
const contextTypes = [
CONTEXT_FIELD_CREATED,
CONTEXT_FIELD_DELETED,
CONTEXT_FIELD_UPDATED,
];
const tagTypes = [TAG_CREATED, TAG_DELETED];
const tagTypeTypes = [TAG_TYPE_CREATED, TAG_TYPE_DELETED];
const projectTypes = [PROJECT_CREATED, PROJECT_UPDATED, PROJECT_DELETED];
2017-06-28 10:17:14 +02:00
function baseTypeFor(event) {
if (featureTypes.indexOf(event.type) !== -1) {
return 'features';
}
if (strategyTypes.indexOf(event.type) !== -1) {
return 'strategies';
}
if (contextTypes.indexOf(event.type) !== -1) {
return 'context';
}
if (projectTypes.indexOf(event.type) !== -1) {
return 'project';
}
if (tagTypes.indexOf(event.type) !== -1) {
return 'tag';
}
if (tagTypeTypes.indexOf(event.type) !== -1) {
return 'tag-type';
}
if (event.type === APPLICATION_CREATED) {
return 'application';
}
return event.type;
}
2017-06-28 10:17:14 +02:00
function groupByBaseTypeAndName(events) {
2016-06-18 21:53:18 +02:00
const groups = {};
2016-06-18 21:53:18 +02:00
events.forEach(event => {
const baseType = baseTypeFor(event);
groups[baseType] = groups[baseType] || {};
2017-06-28 10:17:14 +02:00
groups[baseType][event.data.name] =
groups[baseType][event.data.name] || [];
groups[baseType][event.data.name].push(event);
});
return groups;
}
2017-06-28 10:17:14 +02:00
function eachConsecutiveEvent(events, callback) {
2016-06-18 21:53:18 +02:00
const groups = groupByBaseTypeAndName(events);
2016-06-18 21:53:18 +02:00
Object.keys(groups).forEach(baseType => {
const group = groups[baseType];
2016-06-18 21:53:18 +02:00
Object.keys(group).forEach(name => {
2016-06-18 22:23:19 +02:00
const currentEvents = group[name];
2016-06-18 21:53:18 +02:00
let left;
let right;
let i;
let l;
2016-06-18 22:23:19 +02:00
for (i = 0, l = currentEvents.length; i < l; i++) {
2016-12-27 21:03:50 +01:00
left = currentEvents[i];
2016-06-18 22:23:19 +02:00
right = currentEvents[i + 1];
callback(left, right);
}
});
});
}
2017-06-28 10:17:14 +02:00
function addDiffs(events) {
// TODO: no-param-reassign
2016-06-18 21:53:18 +02:00
eachConsecutiveEvent(events, (left, right) => {
if (right) {
left.diffs = diff(right.data, left.data);
left.diffs = left.diffs || [];
} else {
left.diffs = null;
}
});
}
module.exports = {
2016-06-18 21:55:46 +02:00
addDiffs,
};