コード例 #1
0
        /// <summary>
        /// Get the results from Azure Search service and populate the result (card + preview).
        /// </summary>
        /// <param name="query">Query which the user had typed in Messaging Extension search field.</param>
        /// <param name="commandId">Command id to determine which tab in Messaging Extension has been invoked.</param>
        /// <param name="userObjectId">Azure Active Directory id of the user.</param>
        /// <param name="count">Number of search results to return.</param>
        /// <param name="localDateTime">Indicates local date and time of end user.</param>
        /// <returns><see cref="Task"/>Returns Messaging Extension result object, which will be used for providing the card.</returns>
        public async Task <MessagingExtensionResult> GetPostsAsync(
            string query,
            string commandId,
            string userObjectId,
            int count,
            DateTimeOffset?localDateTime)
        {
            MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult
            {
                Type             = "result",
                AttachmentLayout = AttachmentLayoutTypes.List,
                Attachments      = new List <MessagingExtensionAttachment>(),
            };
            IEnumerable <EventEntity> trainingResults;

            SearchParametersDto searchParamsDto;

            // commandId should be equal to Id mentioned in Manifest file under composeExtensions section.
            switch (commandId?.ToUpperInvariant())
            {
            case BotCommands.RecentTrainingsCommandId:
                searchParamsDto = new SearchParametersDto
                {
                    SearchString       = query,
                    SearchResultsCount = count,
                    SearchScope        = EventSearchType.AllPublicPrivateEventsForUser,
                    UserObjectId       = userObjectId,
                };
                trainingResults = await this.userEventSearchService.GetEventsAsync(searchParamsDto);

                await this.BindCategoryDetails(trainingResults);

                composeExtensionResult = MessagingExtensionCard.GetCard(trainingResults, this.applicationBasePath, this.localizer, localDateTime);
                break;

            case BotCommands.PopularTrainingsCommandId:
                searchParamsDto = new SearchParametersDto
                {
                    SearchString       = query,
                    SearchResultsCount = count,
                    SearchScope        = EventSearchType.AllPublicPrivateEventsForUser,
                    UserObjectId       = userObjectId,
                    SortByFilter       = (int)SortBy.PopularityByRegisteredUsers,
                };
                trainingResults = await this.userEventSearchService.GetEventsAsync(searchParamsDto);

                await this.BindCategoryDetails(trainingResults);

                composeExtensionResult = MessagingExtensionCard.GetCard(trainingResults, this.applicationBasePath, this.localizer, localDateTime);
                break;

            default:
                break;
            }

            return(composeExtensionResult);
        }
        /// <summary>
        /// Get messaging extension search result based on user search query and command.
        /// </summary>
        /// <param name="teamId">Team Id where bot is installed.</param>
        /// <param name="searchQuery">User search query text.</param>
        /// <param name="commandId">Messaging extension command id e.g. recentActivities or allActivities.</param>
        /// <param name="count">Count for pagination in Messaging extension.</param>
        /// <param name="skip">Skip for pagination in Messaging extension.</param>
        /// <returns>A task that represents compose extension result with activities.</returns>
        private async Task <MessagingExtensionResult> GetSearchResultAsync(string teamId, string searchQuery, string commandId, int count, int skip)
        {
            try
            {
                MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult();

                IList <GroupActivityEntity> groupActivities = await this.groupActivityStorageHelper.GetGroupActivityEntityDetailAsync(teamId);

                // On initial run searchQuery value is "true".
                if (searchQuery != "true")
                {
                    this.logger.LogInformation($"search query entered by user is {searchQuery} for {teamId}");
                    groupActivities = groupActivities.Where(x => x.GroupActivityTitle.Contains(searchQuery, StringComparison.OrdinalIgnoreCase)).ToList();
                }

                // If no activities found for a team.
                if (groupActivities.Count() <= 0)
                {
                    composeExtensionResult.Type = MessagingExtensionMessageType;
                    composeExtensionResult.Text = Strings.NoActivitiesFoundText;
                    this.logger.LogInformation($"No activities found for {teamId}");
                    return(composeExtensionResult);
                }

                composeExtensionResult.Type             = MessagingExtenstionResultType;
                composeExtensionResult.AttachmentLayout = AttachmentLayoutTypes.List;
                switch (commandId)
                {
                case RecentCommandId:
                    composeExtensionResult.Attachments = MessagingExtensionCard.GetGroupActivityCard(groupActivities.OrderByDescending(groupActivity => groupActivity.Timestamp).Skip(skip).Take(count).ToList());
                    break;

                case AllCommandId:
                    composeExtensionResult.Attachments = MessagingExtensionCard.GetGroupActivityCard(groupActivities.Skip(skip).Take(count).ToList());
                    break;
                }

                return(composeExtensionResult);
            }
            catch (Exception ex)
            {
                this.logger.LogError(ex, $"Error while generating result for messaging extension for {commandId} for {teamId}");
                return(null);
            }
        }