/// <summary> /// Provide search result for table to be used by SME based on Azure search service. /// </summary> /// <param name="searchScope">Scope of the search.</param> /// <param name="searchQuery">searchQuery to be provided by message extension.</param> /// <param name="count">Number of search results to return.</param> /// <param name="skip">Number of search results to skip.</param> /// <param name="requestorId">Requester id of the user to get specific tickets.</param> /// <returns>List of search results.</returns> public async Task <IList <TicketDetail> > SearchTicketsAsync(TicketSearchScope searchScope, string searchQuery, int?count = null, int?skip = null, string requestorId = "") { await this.EnsureInitializedAsync(); IList <TicketDetail> tickets = new List <TicketDetail>(); SearchParameters searchParameters = new SearchParameters(); switch (searchScope) { case TicketSearchScope.UrgentTickets: searchParameters.Filter = $"Severity eq {(int)TicketSeverity.Urgent}"; searchParameters.OrderBy = new[] { "Timestamp desc" }; break; case TicketSearchScope.AssignedTickets: searchParameters.Filter = $"TicketStatus eq {(int)TicketState.Assigned}"; searchParameters.OrderBy = new[] { "Timestamp desc" }; break; case TicketSearchScope.UnassignedTickets: searchParameters.Filter = $"TicketStatus eq {(int)TicketState.Unassigned}"; searchParameters.OrderBy = new[] { "Timestamp desc" }; break; case TicketSearchScope.ActiveTickets: searchParameters.Filter = $"(TicketStatus eq {(int)TicketState.Assigned} or TicketStatus eq {(int)TicketState.Unassigned}) and CreatedByObjectId eq '{requestorId}'"; searchParameters.OrderBy = new[] { "Timestamp desc" }; break; case TicketSearchScope.ClosedTickets: searchParameters.Filter = $"TicketStatus eq {(int)TicketState.Closed} and CreatedByObjectId eq '{requestorId}'"; searchParameters.OrderBy = new[] { "Timestamp desc" }; break; } searchParameters.Top = count ?? DefaultSearchResultCount; searchParameters.Skip = skip ?? 0; searchParameters.IncludeTotalResultCount = false; searchParameters.Select = new[] { "Title", "TicketStatus", "AssignedToName", "AssignedToObjectId", "CreatedOn", "RequesterName", "CreatedByUserPrincipalName", "Description", "RequesterName", "SmeConversationId", "SmeTicketActivityId", "ClosedOn", "ClosedByName", "LastModifiedByName", "Severity", "RequesterConversationId", "RequesterTicketActivityId", "TicketId", "RequestType", "CreatedByObjectId" }; var docs = await this.searchIndexClient.Documents.SearchAsync <TicketDetail>(searchQuery, searchParameters); if (docs != null) { tickets = docs.Results.Select(result => result.Document).ToList(); } this.logger.LogInformation("Retrieved documents from ticket search service successfully."); return(tickets); }
/// <inheritdoc/> public async Task <IList <TicketEntity> > SearchTicketsAsync(TicketSearchScope searchScope, string searchQuery, int?count = null, int?skip = null) { await this.EnsureInitializedAsync(); IList <TicketEntity> tickets = new List <TicketEntity>(); SearchParameters searchParam = new SearchParameters(); switch (searchScope) { case TicketSearchScope.RecentTickets: searchParam.OrderBy = new[] { "Timestamp desc" }; break; case TicketSearchScope.OpenTickets: searchParam.Filter = "Status eq " + (int)TicketState.Open + " and AssignedToName eq null"; searchParam.OrderBy = new[] { "Timestamp desc" }; break; case TicketSearchScope.AssignedTickets: searchParam.Filter = "Status eq " + (int)TicketState.Open + " and AssignedToName ne null"; searchParam.OrderBy = new[] { "Timestamp desc" }; break; default: break; } searchParam.Top = count ?? DefaultSearchResultCount; searchParam.Skip = skip ?? 0; searchParam.IncludeTotalResultCount = false; searchParam.Select = new[] { "Timestamp", "Title", "Status", "AssignedToName", "AssignedToObjectId", "DateCreated", "RequesterName", "RequesterUserPrincipalName", "Description", "RequesterGivenName", "SmeThreadConversationId", "DateAssigned", "DateClosed", "LastModifiedByName", "UserQuestion", "KnowledgeBaseAnswer" }; var docs = await this.searchIndexClient.Documents.SearchAsync <TicketEntity>(searchQuery, searchParam); if (docs != null) { foreach (SearchResult <TicketEntity> doc in docs.Results) { tickets.Add(doc.Document); } } return(tickets); }
/// <summary> /// Provide search result for table to be used by SME based on Azure search service. /// </summary> /// <param name="searchScope">Scope of the search.</param> /// <param name="languageCode">Language code applicable to the expert team where the search is being performed.</param> /// <param name="searchQuery">searchQuery to be provided by message extension.</param> /// <param name="count">Number of search results to return.</param> /// <param name="skip">Number of search results to skip.</param> /// <returns>List of search results.</returns> public async Task <IList <TicketEntity> > SearchTicketsAsync(TicketSearchScope searchScope, string languageCode, string searchQuery, int?count = null, int?skip = null) { await this.EnsureInitializedAsync().ConfigureAwait(false); IList <TicketEntity> tickets = new List <TicketEntity>(); SearchParameters searchParameters = new SearchParameters(); switch (searchScope) { case TicketSearchScope.RecentTickets: searchParameters.OrderBy = new[] { "Timestamp desc" }; break; case TicketSearchScope.AnsweredTickets: searchParameters.Filter = "Status eq " + (int)TicketState.Answered; searchParameters.OrderBy = new[] { "Timestamp desc" }; break; case TicketSearchScope.UnAnsweredTickets: searchParameters.Filter = "Status eq " + (int)TicketState.UnAnswered; searchParameters.OrderBy = new[] { "Timestamp desc" }; break; } searchParameters.Filter += (!string.IsNullOrWhiteSpace(searchParameters.Filter) ? " and " : string.Empty) + "LanguageCode eq '" + languageCode + "'"; searchParameters.Top = count ?? DefaultSearchResultCount; searchParameters.Skip = skip ?? 0; searchParameters.IncludeTotalResultCount = false; searchParameters.Select = new[] { "TicketId", "Timestamp", "Title", "Status", "AssignedToName", "AssignedToObjectId", "DateCreated", "RequesterName", "RequesterUserPrincipalName", "Description", "RequesterGivenName", "SmeThreadConversationId", "DateAssigned", "LastModifiedByName", "UserQuestion", "KnowledgeBaseAnswer", "KnowledgeBaseQuestion", "AnswerBySME" }; var docs = await this.searchIndexClient.Documents.SearchAsync <TicketEntity>(searchQuery, searchParameters).ConfigureAwait(false); if (docs != null) { foreach (SearchResult <TicketEntity> doc in docs.Results) { tickets.Add(doc.Document); } } return(tickets); }