/// <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);
        }
Exemplo n.º 3
0
        /// <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);
        }