"use strict"; /** * Created by viktor.shevchenko on 7/9/15. */ (function () { 'use strict'; angular.module('myitsmApp') .factory('relationModel', ['relationService', 'systemAlertService', '$filter', '$q', function (relationService, systemAlertService, $filter, $q) { var relationModel = { cache: {}, unlinked: [] }; relationModel.getRelations = function (id, type, displayId, additionalCriteria) { var criteria = {}; if (displayId) { criteria = { "criteria": '{"parentDisplayId": ' + displayId + '}' }; } if (additionalCriteria) { criteria = _.assign(criteria, additionalCriteria); return relationService.getRelations(id, type, criteria); } if (!relationModel.cache[id]) { var relationsPromise = relationService.getRelations(id, type, criteria).then(function (relations) { //Case: when you are in draft mode there chances that relations are found in template and some you have attached via smart-recorder so concat them if (relations && relations.length > 0) { if (relationModel.cache[id] && relationModel.cache[id].length) { relationModel.cache[id].concat(relations); } else { relationModel.cache[id] = relations; } } else { //Make sure to reset to empty array only if there isn't anything in it as the smart-recorder object pushes relations to same cache even before this promise is fulfilled if (!(relationModel.cache[id] && relationModel.cache[id].length)) { relationModel.cache[id] = []; } } return relationModel.cache[id]; }); relationModel.cache[id] = relationsPromise; return relationsPromise; } var isAngularPromise = _.has(relationModel.cache[id], '$$state.status'); return $q.when(isAngularPromise ? relationModel.cache[id] : angular.copy(relationModel.cache[id])); }; relationModel.refreshRelations = function (id, type) { return relationService.getRelations(id, type).then(function (relations) { relationModel.cache[id] = relations; return relationModel.cache[id]; }); }; /** * Add Relation to entity * @param {Object} context - {uuid:'', type:''} * @param {Array} relations * @returns {*|Promise} */ relationModel.addRelation = function (context, relations) { if (relations.length) { _.forEach(relations, function (relation) { if (angular.isDefined(relation.visited)) { delete relation.visited; } }); } var params = { ids: [context], relationship: relations }; return relationService.bulkAddRelation(params).then(function (allRelations) { updateRelationsAfterAdd(allRelations); }); }; relationModel.markRelationForAdd = function (id, relations) { if (relations instanceof Array) { relationModel.cache[id] = relationModel.cache[id].concat(relations); } else { if (relationModel.cache[id] instanceof Array === false) { relationModel.cache[id] = []; } relationModel.cache[id].push(relations); } }; relationModel.markRelationForDelete = function (id, relation) { var removeIdx = _.findIndex(relationModel.cache[id], { id: relation.id }); relationModel.cache[id].splice(removeIdx, 1); }; //todo: this method is not used yet, move ticketMode.addRelations -> to this method; relationModel.bulkAddRelation = function (contexts, relations) { return relationService.bulkAddRelation({ ids: contexts, relationship: relations }).then(function (allRelations) { updateRelationsAfterAdd(allRelations); }); }; relationModel.relateBulkCI = function (ticket, relation, searchCriteria) { return relationService.relateBulkCI(ticket, relation, searchCriteria); }; relationModel.removeRelation = function (context, relations) { return relationService.removeRelation(context, relations).then(function (response) { _.forEach(relations, function (relation) { var condition = relation.type === EntityVO.TYPE_OUTAGE ? { displayId: relation.id } : (relation.type === EntityVO.TYPE_ASSET ? { "realObject": { "instanceId": relation.id } } : { id: relation.id }); var removeIdx = _.findIndex(relationModel.cache[context.parentId], condition); relationModel.unlinked = (relationModel.cache[context.parentId] && removeIdx > -1) ? relationModel.cache[context.parentId].splice(removeIdx, 1) : []; }); if (response && response.data && response.data.additionalInformation && response.data.additionalInformation.needsReconciliation) { systemAlertService.error({ text: $filter('i18n')('asset.actionBlade.assetAction.warning.reconciliation'), clear: false }); } }); }; relationModel.deleteActivity = function (ticket) { return relationService.deleteActivity(ticket); }; relationModel.updateTaskSequence = function (tasks) { return relationService.updateTaskSequence(tasks); }; relationModel.updateReleasePlanItemsSequence = function (releasePlanItems) { return relationService.updateReleasePlanItemsSequence(releasePlanItems); }; relationModel.getRelationsByTag = function (id, type, tag) { var relationsPromise = relationService.getRelations(id, type, { tags: tag }).then(function (relations) { return relations; }); return relationsPromise; }; function updateRelationsAfterAdd(allRelations) { _.forEach(allRelations, function (contextRelations, contextID) { if (relationModel.cache[contextID]) { relationModel.cache[contextID].length = 0; Array.prototype.push.apply(relationModel.cache[contextID], contextRelations.relations); } else { relationModel.cache[contextID] = contextRelations.relations; } if (contextRelations.relations.length === 1 && relationModel.cache[contextRelations.relations[0].id]) { relationModel.refreshRelations(contextRelations.relations[0].id, contextRelations.relations[0].type); } }); } return relationModel; } ]); })();