SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/common/metadata-model.js

98 lines
5.2 KiB
JavaScript

"use strict";
/**
* Created by viktor.shevchenko on 7/10/2014.
*/
(function () {
'use strict';
angular.module('myitsmApp')
.factory('metadataModel', ['metadataService', '$q', function (metadataService, $q) {
var metadataModel = {
cache: {},
allStatuses: [],
allStatusReasons: []
};
metadataModel.getMetadataByType = function (type) {
if (metadataModel.cache[type]) {
var isAngularPromise = _.has(metadataModel.cache[type], '$$state.status');
return $q.when(isAngularPromise ? metadataModel.cache[type] : angular.copy(metadataModel.cache[type]));
}
metadataModel.cache[type] = metadataService.getMetadataByType(type).then(function (response) {
metadataModel.cache[type] = response[0];
if (response[0] && response[0].statuses) {
addStatusReason(response[0].statuses, type);
metadataModel.allStatuses = _.uniqBy((metadataModel.allStatuses.concat(response[0].statuses)), 'name');
}
return angular.copy(metadataModel.cache[type]);
});
return metadataModel.cache[type];
};
function addStatusReason(allStatuses, type) {
_.forEach(allStatuses, function (status) {
if (status.statusReasons && status.statusReasons.length) {
metadataModel.allStatusReasons.push(status.statusReasons);
}
});
if (metadataModel.cache[type] && metadataModel.cache[type].consoleColumns
&& metadataModel.cache[type].consoleColumns.statusReason && metadataModel.cache[type].consoleColumns.statusReason.length) {
metadataModel.allStatusReasons.push(metadataModel.cache[type].consoleColumns.statusReason);
}
metadataModel.allStatusReasons = _.uniqBy(_.flattenDeep(metadataModel.allStatusReasons), 'name');
}
metadataModel.getMetadataByTypes = function (types) {
var requestMetadataForTicketTypes = [], metadataPromises = [], collectedMetaData = [];
_.forEach(types, function (type) {
if (!metadataModel.cache[type]) {
requestMetadataForTicketTypes.push(type);
}
else if (_.has(metadataModel.cache[type], '$$state.status')) {
metadataPromises.push(metadataModel.cache[type]);
}
else {
collectedMetaData.push(angular.copy(metadataModel.cache[type]));
}
});
if (!requestMetadataForTicketTypes.length && !metadataPromises.length) {
return $q.when(collectedMetaData);
}
if (requestMetadataForTicketTypes.length) {
var requestMetadataPromise = metadataService.getMetadataByType(requestMetadataForTicketTypes);
metadataPromises.push(requestMetadataPromise);
_.forEach(requestMetadataForTicketTypes, function (requestTicketType) {
metadataModel.cache[requestTicketType] = requestMetadataPromise;
});
}
return $q.all(metadataPromises).then(function (metadataResponses) {
_.forEach(metadataResponses, function (metadataArray) {
if (Array.isArray(metadataArray)) {
_.forEach(metadataArray, loadMetadata);
}
else {
loadMetadata(metadataArray);
}
function loadMetadata(metadata) {
metadataModel.cache[metadata.metadatatype] = metadata;
addStatusReason(metadata.statuses, metadata.metadatatype);
metadataModel.allStatuses = _.uniqBy((metadataModel.allStatuses.concat(metadata.statuses)), 'name');
}
});
//Return metadata in the same sequence in which it was demanded
collectedMetaData = [];
_.forEach(types, function (metadataType) {
collectedMetaData.push(metadataModel.cache[metadataType]);
});
return collectedMetaData;
});
};
//person metadata call for creating a new customer, we don't use type here when we make the backend call
// because this is not a ticket, it is a resource
metadataModel.getPersonMetadata = function (type) {
metadataModel.cache[type] = metadataService.getPersonMetadata().then(function (response) {
metadataModel.cache[type] = response[0];
return angular.copy(metadataModel.cache[type]);
});
return metadataModel.cache[type];
};
return metadataModel;
}]);
})();