"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; }]); })();