blob: 3e86a1df71b57407405bbc24ff78b5bb86f55db1 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with this
* work for additional information regarding copyright ownership. The ASF
* licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
var App = require('app');
/**
* Mapper for <code>App.AlertGroup</code>
* Save general information
* Doesn't save not changed data (check it using <code>App.cache['previousAlertGroupsFullMap']</code>)
* Use <code>App.cache['previousAlertGroupsMap']</code> to store map alertDefinitions-alertGroups. This map is used
* in the <code>App.AlertDefinitionsMapper</code> to correctly link alertDefinitions and alertGroups
*/
App.alertGroupsMapper = App.QuickDataMapper.create({
model: App.AlertGroup,
config: {
id: 'AlertGroup.id',
name: 'AlertGroup.name',
default: 'AlertGroup.default',
targets_key: 'AlertGroup.targets',
targets_type: 'array',
targets: {
item: 'id'
}
},
map: function (json, ignoreDelete) {
if(Em.isNone(App.cache['previousAlertGroupsFullMap'])) {
App.cache['previousAlertGroupsFullMap'] = {};
}
if (!Em.isNone(json, 'items')) {
console.time('App.alertGroupsMapper execution time');
var alertGroups = [],
self = this,
groupsMap = {},
groupsToDelete = App.AlertGroup.find().mapProperty('id'),
/**
* AlertGroups-map for <code>App.AlertDefinitionsMappers</code>
* Format:
* <code>
* {
* alert_definition1_id: [alert_group1_id, alert_group2_id],
* alert_definition2_id: [alert_group3_id, alert_group1_id],
* ...
* }
* </code>
* @type {object}
*/
alertDefinitionsGroupsMap = {},
alertNotificationsGroupsMap = {};
json.items.forEach(function(item) {
var group = self.parseIt(item, self.get('config'));
groupsToDelete = groupsToDelete.without(group.id);
group.targets = [];
group.definitions = [];
if (item.AlertGroup.definitions) {
item.AlertGroup.definitions.forEach(function (definition) {
if (!group.definitions.contains(definition.id)) {
group.definitions.push(definition.id);
}
if (Em.isNone(alertDefinitionsGroupsMap[definition.id])) {
alertDefinitionsGroupsMap[definition.id] = [];
}
alertDefinitionsGroupsMap[definition.id].push(group.id);
});
}
if (item.AlertGroup.targets) {
item.AlertGroup.targets.forEach(function (target) {
if (!group.targets.contains(target.id)) {
group.targets.push(target.id);
}
if (Em.isNone(alertNotificationsGroupsMap[target.id])) {
alertNotificationsGroupsMap[target.id] = [];
}
alertNotificationsGroupsMap[target.id].push(group.id);
});
}
groupsMap[group.id] = group;
var previousGroup = App.cache['previousAlertGroupsFullMap'][group.id] ? App.cache['previousAlertGroupsFullMap'][group.id] : {};
var changedFields = self.getDiscrepancies(group, previousGroup, ['name', 'description', 'default', 'targets', 'definitions']);
if (Object.keys(changedFields).length) {
alertGroups.push(group);
}
}, this);
if (!ignoreDelete) {
groupsToDelete.forEach(function(groupId) {
self.deleteRecord(App.AlertGroup.find(groupId));
});
}
App.cache['previousAlertGroupsMap'] = alertDefinitionsGroupsMap;
App.cache['previousAlertGroupsFullMap'] = groupsMap;
App.cache['alertNotificationsGroupsMap'] = alertNotificationsGroupsMap;
// initial load takes much more time than others, but it's OK (all data should be saved first time)
App.store.safeLoadMany(this.get('model'), alertGroups);
console.timeEnd('App.alertGroupsMapper execution time');
}
}
});