SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/search/search-service.js

554 lines
27 KiB
JavaScript

"use strict";
(function () {
'use strict';
angular.module('searchModule').service('searchService', ['$resource', 'utilityFunctions', function ($resource, utilityFunctions) {
var resource = $resource('/smartit/rest/v2/search', {}, {
getSmartSearchResults: {
url: '/smartit/rest/smartsearch?search_text=:searchText',
method: 'GET',
isArray: true
},
getSuggestedSearchResults: {
url: '/smartit/rest/globalsearch/suggest/search',
method: 'GET',
isArray: false,
transformResponse: function (data) {
return { results: angular.fromJson(data) };
}
},
getGlobalSearchResults: {
url: '/smartit/rest/globalsearch',
method: 'POST',
headers: { 'Content-Type': 'application/json' },
isArray: true
},
getSites: {
url: '/smartit/rest/foundation/search/site',
method: 'GET',
isArray: true
},
getList: {
url: '/smartit/rest/foundation/items',
method: 'GET',
isArray: true
},
getAssigneeByText: {
url: '/smartit/rest/foundation/items',
method: 'GET',
isArray: true
},
getCompaniesByText: {
url: '/smartit/rest/foundation/items',
method: 'GET',
isArray: true
},
getSupportGroupsList: {
url: '/smartit/rest/person/search/supportgroup',
method: 'GET',
isArray: true
},
getListOfServiceByText: {
url: '/smartit/rest/asset/search',
method: 'GET',
isArray: true
},
getOutages: {
url: '/smartit/rest/outage/search',
method: 'GET',
isArray: true
},
getFilteredOutagesList: {
url: '/smartit/rest/outage/search/filter',
method: 'POST',
headers: { 'Content-Type': 'application/json' },
isArray: true
},
getFilteredOutagesListMock: {
url: 'mocks/suggested-outages-list.json',
isArray: true,
method: 'GET'
},
searchCIsRelatedToChangeRequestByCriteria: {
url: '/smartit/rest/asset/list/get',
isArray: true,
method: 'POST'
},
getListForAssignee: {
url: '/smartit/rest/foundation/assignment/items',
isArray: true,
headers: { 'Content-Type': 'application/json' },
method: 'POST'
},
getAssigneeSupportGroupsList: {
url: '/smartit/rest/foundation/assignment/supportgroup',
method: 'POST',
isArray: true
},
getRecommendedSupportGroupsList: {
url: '/smartit/rest/foundation/recommendation/:ticketType/supportgroup',
method: 'POST',
isArray: true
},
getRequestForRelatedTicket: {
url: '/smartit/rest/request/search/:id',
method: 'GET',
isArray: true
},
getLiveAgentDefaultSupportGroup: {
url: '/smartit/rest/foundation/supportgroup/:customerCompany',
method: 'GET',
isArray: true
},
getHKMRecommendedKA: {
url: '/smartit/rest/knowledge/search',
method: 'POST',
isArray: true
},
getHKMUrls: {
url: '/smartit/rest/knowledge/hkmurls',
method: 'GET',
isArray: true
}
});
var searchResultsCategoryOrderMap = {
tickets: 1,
knowledge: 2,
asset: 3,
person: 4
};
this.targetArea = { selectedTargetArea: null };
/**
* Public functions
*/
this.setSelectedTargetArea = function (targetArea) {
this.targetArea.selectedTargetArea = targetArea;
};
this.getSelectedTargetArea = function () {
return this.targetArea.selectedTargetArea;
};
this.getSmartSearchResults = function (searchText) {
return resource.getSmartSearchResults({ searchText: searchText }).$promise.then(function (data) {
return processSmartSearchResultsData(data);
});
};
this.getSuggestedSearchResults = function (searchText) {
return resource.getSuggestedSearchResults({ text: searchText }).$promise.then(function (data) {
return processSuggestedSearchResults(data.results || []);
});
};
this.getGlobalSearchResults = function (params, filters) {
return resource.getGlobalSearchResults(params, filters).$promise.then(function (data) {
return processGlobalSearchResultsData(data);
});
};
this.getHKMRecommendedKA = function (params, filters) {
return resource.getHKMRecommendedKA(params, filters).$promise.then(function (data) {
return processGlobalSearchResultsData(data);
});
};
this.getOrganizationsByText = function (searchText) {
var params = {
type: 'organization',
searchText: searchText
};
return resource.getList(params).$promise.then(function (result) {
return _.map(result[0].items[0].objects, function (org) {
return new OrganizationVO().build(org);
});
});
};
this.getOrganizationsByCompany = function (companyName, searchText) {
var params = {
type: 'organization',
searchOptions: { companyName: companyName },
searchText: searchText
};
return resource.getList(params).$promise.then(function (result) {
var data = _.map(result[0].items[0].objects, function (org) {
return new OrganizationVO().build(org);
});
return { organizations: data, exceedsChunkSize: result[0].items[0].exceedsChunkSize };
});
};
this.getOrganizationsByTextAndCompany = function (searchText, companyName) {
var params = {
type: 'organization',
searchText: searchText,
searchOptions: { companyName: companyName }
};
return resource.getList(params).$promise.then(function (result) {
var data = _.map(result[0].items[0].objects, function (org) {
return new OrganizationVO().build(org);
});
return { items: data, exceedsChunkSize: result[0].items[0].exceedsChunkSize };
});
};
this.getSupportOrganizationsByText = function (searchText) {
var params = {
type: 'supportOrganization',
searchText: searchText
};
return resource.getList(params).$promise.then(function (result) {
var objects = _.map(result[0].items[0].objects, function (org) {
return new OrganizationVO().build(org);
});
return { organizations: objects, exceedsChunkSize: result[0].items[0].exceedsChunkSize };
});
};
this.getAssigneeSupportOrgByCompany = function (searchOptions, chunkInfo) {
var params = {
type: 'supportOrganization'
};
if (chunkInfo) {
params.chunkInfo = chunkInfo;
}
return resource.getListForAssignee(params, searchOptions).$promise.then(function (result) {
var objects = _.map(result[0].items[0].objects, function (org) {
return new OrganizationVO().build(org);
});
return { organizations: objects, exceedsChunkSize: result[0].items[0].exceedsChunkSize };
});
};
this.getSupportOrganizationsByCompany = function (searchOptions, chunkInfo) {
var params = {
type: 'supportOrganization',
searchOptions: searchOptions
};
if (chunkInfo) {
params.chunkInfo = chunkInfo;
}
return resource.getList(params).$promise.then(function (result) {
var objects = _.map(result[0].items[0].objects, function (org) {
return new OrganizationVO().build(org);
});
return { organizations: objects, exceedsChunkSize: result[0].items[0].exceedsChunkSize };
});
};
this.getSupportOrganizationsByTextAndCompany = function (searchText, searchOptions) {
var params = {
type: 'supportOrganization',
// chunking not yet working at backend, will uncomment once backend is fixed
// chunkInfo: { startIndex: 0, chunkSize: chunkSize },
searchText: searchText,
searchOptions: searchOptions
};
return resource.getList(params).$promise.then(function (result) {
var objects = _.map(result[0].items[0].objects, function (org) {
return new OrganizationVO().build(org);
});
return { organizations: objects, exceedsChunkSize: result[0].items[0].exceedsChunkSize };
});
};
this.getDepartmentsByCompany = function (companyName, searchText) {
var params = {
type: 'department',
searchOptions: { companyName: companyName },
searchText: searchText
};
return resource.getList(params).$promise.then(function (result) {
var objects = _.map(result[0].items[0].objects, function (org) {
return new OrganizationVO().build(org);
});
return { organizations: objects, exceedsChunkSize: result[0].items[0].exceedsChunkSize };
});
};
this.getAssigneeByText = function (searchText) {
var params = {
type: 'assignee',
searchText: searchText
};
return resource.getAssigneeByText(params).$promise.then(function (result) {
return result[0].items[0].objects;
});
};
this.getCompaniesByText = function (searchText, attrs) {
var params = {
type: 'company',
searchText: searchText
};
_.assign(params, attrs);
return resource.getCompaniesByText(params).$promise.then(function (result) {
var items = result[0].items[0];
return { companies: items.objects, exceedsChunkSize: items.exceedsChunkSize, totalMatches: items.totalMatches };
});
};
this.getSupportCompaniesByText = function (searchText, attrs) {
var params = {
type: 'supportCompany',
searchText: searchText
};
_.assign(params, attrs);
return resource.getCompaniesByText(params).$promise.then(function (result) {
return result[0].items[0].objects;
});
};
this.getAssigneeSupportCompaniesByText = function (searchText, attrs, options) {
var params = {
type: 'assigneeSupportCompany',
searchText: searchText
};
_.assign(params, attrs);
return resource.getListForAssignee(params, options).$promise.then(function (result) {
return { objects: result[0].items[0].objects, exceedsChunkSize: result[0].items[0].exceedsChunkSize };
});
};
this.getSupportGroupsList = function (params) {
return resource.getSupportGroupsList(params).$promise.then(function (result) {
var objects = _.map(result[0].items[0].objects, function (group) {
return new SupportGroupVO().build(group);
});
return { supportGroups: objects, exceedsChunkSize: result[0].items[0].exceedsChunkSize };
});
};
this.getAssigneeSupportGroupsList = function (urlParams, payloadParams) {
return resource.getAssigneeSupportGroupsList(urlParams, payloadParams).$promise.then(function (result) {
var objects = _.map(result[0].items[0].objects, function (group) {
return new SupportGroupVO().build(group);
});
return { supportGroups: objects, exceedsChunkSize: result[0].items[0].exceedsChunkSize };
});
};
this.getRecommendedSupportGroupsList = function (urlParams, payloadParams) {
return resource.getRecommendedSupportGroupsList(urlParams, payloadParams).$promise.then(function (result) {
var objects = _.map(result[0].items[0].objects, function (group) {
return new SupportGroupVO().build(group);
});
return { supportGroups: objects };
});
};
this.getApproverSupportCompanies = function (searchText, attrs, ticketType) {
var params = {
searchText: searchText,
type: 'approverSupportCompany',
searchOptions: {
role: (ticketType && ticketType === EntityVO.TYPE_RELEASE) ? 'releaseapprover' : 'changeapprover',
}
};
_.assign(params, attrs);
return resource.getCompaniesByText(params).$promise.then(function (result) {
return result[0].items[0].objects;
});
};
this.getApproverSupportOrganizations = function (searchText, searchOptions, chunkInfo) {
var params = {
type: 'approverSupportOrganization',
searchOptions: searchOptions
};
if (searchText && searchText.length > 0) {
params.searchText = searchText;
}
if (chunkInfo) {
params.chunkInfo = chunkInfo;
}
return resource.getList(params).$promise.then(function (result) {
return _.map(result[0].items[0].objects, function (org) {
return new OrganizationVO().build(org);
});
});
};
this.getFoundationItems = function (params) {
return resource.getList(params).$promise.then(function (result) {
var items = result[0].items[0];
return { foundationItems: items.objects, exceedsChunkSize: items.exceedsChunkSize };
});
};
this.getSitesByText = function (searchText) {
return resource.getSites({ searchText: searchText }).$promise.then(function (result) {
return { list: result[0].items[0].objects, exceedsChunkSize: result[0].items[0].exceedsChunkSize };
});
};
this.getSitesObjectByText = function (searchText) {
return resource.getSites({ searchText: searchText }).$promise.then(function (result) {
return _.map(result[0].items[0].objects, function (site) {
return new SiteVO().build(site);
});
});
};
this.getOutages = function (searchParams) {
return resource.getOutages(searchParams).$promise.then(function (result) {
return _.map(result[0].items[0].objects, function (outage) {
return new OutageVO().build(outage);
});
});
};
this.getSitesByCompany = function (companyName) {
var params = {
companyName: companyName,
searchText: '%' //Viktor: temp workaround, backend does not support call without searchtext, todo: remove after change
};
return resource.getSites(params).$promise.then(function (result) {
return result[0].items[0];
});
};
this.getSitesByTextAndCompany = function (searchText, companyName) {
var params = {
searchText: searchText,
companyName: companyName
};
return resource.getSites(params).$promise.then(function (result) {
return { list: result[0].items[0].objects, exceedsChunkSize: result[0].items[0].exceedsChunkSize };
});
};
this.getListOfServiceByText = function (searchText, companyName) {
var params = {
searchParam: searchText,
company: { name: companyName },
assetType: 'Business Service'
};
return resource.getListOfServiceByText(params).$promise.then(function (result) {
return result[0].items[0].objects;
});
};
this.getListObjOfServiceByText = function (searchText, companyName) {
var params = {
searchParam: searchText,
company: { name: companyName },
assetType: 'Business Service'
};
return resource.getListOfServiceByText(params).$promise.then(function (result) {
return { list: result[0].items[0].objects, exceedsChunkSize: result[0].items[0].exceedsChunkSize };
});
};
/**
* @ngdoc method
* @name myitsmApp.searchService#getFilteredSuggestedOutagesList
*
* @description
* Get list of Outages based on the criteria
* @param {Object} filters - Filters object, used for generating Outage filtering request
* @param {Boolean} filters.relatedCI - would filter Outages that are related to CIs, which have a relation to the ticket.
* @param {String} filters.searchText - would filter only Outages that have a matching by this value
* @param {String} filters.ciNames - would filter only Outages that have relation to CIs, which names are matching this value
* @param {Array} filters.unavailabilityType - would filter only Outages with Unavailability type matching any value in this array
* @param {Array} filters.unavailabilityStatus - would filter only Outages with Unavailability Status matching any value in this array
* @param {Array} filters.scheduledDate - Outage unavailability scheduled date filter object
* @param {Timestamp} filters.scheduledDate[].start - Outage unavailability scheduled date start value
* @param {Timestamp} filters.scheduledDate[].end - Outage unavailability scheduled date end value
* @param {Object} ticket - Ticket information (Optional)
* @param {String} ticket.id - Unique id of the ticket. Outages will be filtered based on the relation to this ticket
* @param {String} ticket.type - Ticket type value
*/
this.getFilteredOutagesList = function (filters, ticket) {
var defaultFilters = {
relatedCI: false,
searchText: '',
ciNames: '',
unavailabilityType: [],
unavailabilityStatus: [],
scheduledDate: []
}, requestFilters = {};
if (ticket && ticket.id && ticket.type) {
requestFilters.attributeMap = { id: ticket.id, ticketType: ticket.type };
}
_.each(defaultFilters, function (filter, key) {
if (filters[key]) {
requestFilters[key] = filters[key];
}
});
if (requestFilters.ciNames) {
if (requestFilters.relatedCI) {
requestFilters.relatedCI = false;
}
}
var params = { filterCriteria: { outageCriteria: requestFilters } };
//promise = requestFilters.relatedCI ? resource.getFilteredOutagesListMock().$promise : resource.getFilteredOutagesList(params).$promise;
return resource.getFilteredOutagesList(params).$promise
.then(function (data) {
var responseObjects = data[0] && data[0].items || [], filteredOutages = responseObjects[0] && responseObjects[0].objects || [];
return _.map(filteredOutages, function (outage) {
return new OutageVO().build(outage);
});
});
};
this.searchCIsRelatedToChangeRequestByCriteria = function (params, ticket, chunkInfo) {
var defaultParams = {
chunkInfo: {
chunkSize: 100,
startIndex: 0
},
filterCriteria: {
relatedCI: true,
attributeMap: {
id: ticket && ticket.id,
ticketType: EntityVO.TYPE_CHANGE
}
}
};
angular.extend(defaultParams.filterCriteria, params);
if (chunkInfo) {
angular.extend(defaultParams.chunkInfo, chunkInfo);
}
return resource.searchCIsRelatedToChangeRequestByCriteria({ source: 'cioutages' }, defaultParams).$promise
.then(function (data) {
var assetList = [];
try {
assetList = _.uniqBy(data[0].items[0].objects, function (ci) {
return ci.reconciliationId;
});
}
catch (e) {
console.log(e);
}
assetList.forEach(function (asset) {
return new AssetVO().build(asset);
});
return assetList;
});
};
/**
* Private functions
*/
function processSmartSearchResultsData(data) {
var searchResults = data[0] && data[0].items || [];
searchResults.forEach(function (value) {
value.results = value.results.map(function (item) {
return new GlobalSearchItemVO().build(item);
});
});
return searchResults;
}
function processSuggestedSearchResults(list) {
var result = [];
_.forEach(list, function (item) {
result.push(utilityFunctions.escapeHTML(item));
});
return result;
}
function processGlobalSearchResultsData(data) {
var searchResults = {
items: data[0] && data[0].items || [],
totalCount: 0
};
_.forEach(searchResults.items, function (item) {
searchResults.totalCount += item.totalCount;
item.active = true;
item.sortOrder = searchResultsCategoryOrderMap[item.searchCategory] || 100;
item.results = _.map(item.results, function (result) {
result = new GlobalSearchItemVO().build(result);
if (result.additionalInformation.accessMappings) {
result.additionalInformation.accessMappings = new AccessMappingVO().parseAccessMap(result.additionalInformation.accessMappings);
}
return result;
});
});
searchResults.items = _.sortBy(searchResults.items, 'sortOrder');
return searchResults;
}
this.getRequestForRelatedTicket = function (id) {
return resource.getRequestForRelatedTicket({ id: id }).$promise.then(function (response) {
return response[0].items[0] || undefined;
});
};
this.getLiveAgentDefaultSupportGroup = function (customerCompany) {
return resource.getLiveAgentDefaultSupportGroup({ customerCompany: customerCompany }).$promise.then(function (response) {
return response[0].items[0] || undefined;
});
};
this.getHKMUrls = function () {
return resource.getHKMUrls().$promise.then(function (response) {
return response[0].items[0] || undefined;
});
};
}]);
}());