/// <summary> /// Initializes a new instance of the <see cref="RewardAndRecognitionActivityHandler"/> class. /// </summary> /// <param name="logger">The logger.</param> /// <param name="localizer">The current cultures' string localizer.</param> /// <param name="telemetryClient">The application insights telemetry client. </param> /// <param name="options">The options.</param> /// <param name="telemetryOptions">Telemetry instrumentation key</param> /// <param name="configureAdminStorageProvider">Provider for fetching information about admin details from storage table.</param> /// <param name="teamStorageProvider">Provider for fetching information about team details from storage table.</param> /// <param name="awardsStorageProvider">Provider for fetching information about awards from storage table.</param> /// <param name="endorseDetailStorageProvider">Provider for fetching information about endorsement details from storage table.</param> /// <param name="rewardCycleStorageProvider">Provider for fetching information about active award cycle details from storage table.</param> /// <param name="nominateDetailSearchService">Provider to search nomination details in Azure search service.</param> /// <param name="botAdapter">Bot adapter.</param> /// <param name="microsoftAppCredentials">MicrosoftAppCredentials of bot.</param> public RewardAndRecognitionActivityHandler( ILogger <RewardAndRecognitionActivityHandler> logger, IStringLocalizer <Strings> localizer, TelemetryClient telemetryClient, IOptions <RewardAndRecognitionActivityHandlerOptions> options, IOptions <TelemetryOptions> telemetryOptions, IConfigureAdminStorageProvider configureAdminStorageProvider, ITeamStorageProvider teamStorageProvider, IAwardsStorageProvider awardsStorageProvider, IEndorsementsStorageProvider endorseDetailStorageProvider, IRewardCycleStorageProvider rewardCycleStorageProvider, IAwardNominationSearchService nominateDetailSearchService, BotFrameworkAdapter botAdapter, MicrosoftAppCredentials microsoftAppCredentials) { options = options ?? throw new ArgumentNullException(nameof(options)); telemetryOptions = telemetryOptions ?? throw new ArgumentNullException(nameof(telemetryOptions)); this.logger = logger; this.localizer = localizer; this.telemetryClient = telemetryClient; this.options = options; this.instrumentationKey = telemetryOptions.Value.InstrumentationKey; this.configureAdminStorageProvider = configureAdminStorageProvider; this.teamStorageProvider = teamStorageProvider; this.awardsStorageProvider = awardsStorageProvider; this.endorseDetailStorageProvider = endorseDetailStorageProvider; this.rewardCycleStorageProvider = rewardCycleStorageProvider; this.nominateDetailSearchService = nominateDetailSearchService; this.botAdapter = botAdapter; this.microsoftAppCredentials = microsoftAppCredentials; }
/// <summary> /// Get the results from Azure search service and populate the result (card + preview). /// </summary> /// <param name="applicationBasePath">Application base URL.</param> /// <param name="query">Query which the user had typed in message extension search.</param> /// <param name="cycleId">Current reward cycle id.</param> /// <param name="teamId">Get the results based on the TeamId.</param> /// <param name="count">Count for pagination.</param> /// <param name="skip">Skip for pagination.</param> /// <param name="searchService">Search service.</param> /// <param name="localizer">The current cultures' string localizer.</param> /// <returns><see cref="Task"/> Returns MessagingExtensionResult which will be used for providing the card.</returns> public static async Task <MessagingExtensionResult> GetSearchResultAsync( string applicationBasePath, string query, string cycleId, string teamId, int?count, int?skip, IAwardNominationSearchService searchService, IStringLocalizer <Strings> localizer) { MessagingExtensionResult composeExtensionResult = new MessagingExtensionResult { Type = "result", AttachmentLayout = AttachmentLayoutTypes.List, Attachments = new List <MessagingExtensionAttachment>(), }; IList <NominationEntity> searchServiceResults; searchServiceResults = await searchService?.SearchNominationsAsync(query, cycleId, teamId, count, skip); if (searchServiceResults != null) { foreach (var nominatedDetail in searchServiceResults) { AdaptiveCard endorseAdaptiveCard = new AdaptiveCard(new AdaptiveSchemaVersion(Constants.AdaptiveCardVersion)) { Body = new List <AdaptiveElement> { new AdaptiveColumnSet { Columns = new List <AdaptiveColumn> { new AdaptiveColumn { Width = AdaptiveColumnWidth.Stretch, Items = new List <AdaptiveElement> { new AdaptiveTextBlock { Text = nominatedDetail.AwardName, HorizontalAlignment = AdaptiveHorizontalAlignment.Left, Weight = AdaptiveTextWeight.Bolder, Size = AdaptiveTextSize.Large, Wrap = true, }, }, }, new AdaptiveColumn { Width = AdaptiveColumnWidth.Auto, Items = new List <AdaptiveElement> { new AdaptiveImage { Url = string.IsNullOrEmpty(nominatedDetail.AwardImageLink) ? new Uri(string.Format(CultureInfo.InvariantCulture, "{0}/Content/DefaultAwardImage.png", applicationBasePath)) : new Uri(nominatedDetail.AwardImageLink), HorizontalAlignment = AdaptiveHorizontalAlignment.Right, PixelHeight = PixelHeightAwardImage, PixelWidth = PixelWidthAwardImage, }, }, }, }, }, new AdaptiveTextBlock { Text = nominatedDetail.NomineeNames, Wrap = true, HorizontalAlignment = AdaptiveHorizontalAlignment.Left, Weight = AdaptiveTextWeight.Bolder, Spacing = AdaptiveSpacing.Large, }, new AdaptiveTextBlock { Text = localizer.GetString("NominatedByText", nominatedDetail.NominatedByName), Wrap = true, HorizontalAlignment = AdaptiveHorizontalAlignment.Left, Spacing = AdaptiveSpacing.Default, }, new AdaptiveTextBlock { Text = nominatedDetail.ReasonForNomination, Wrap = true, HorizontalAlignment = AdaptiveHorizontalAlignment.Left, Spacing = AdaptiveSpacing.Default, }, }, Actions = new List <AdaptiveAction> { new AdaptiveSubmitAction { Title = localizer.GetString("EndorseButtonText"), Data = new AdaptiveCardAction { MsteamsCardAction = new CardAction { Type = Constants.FetchActionType, }, Command = Constants.EndorseAction, NomineeUserPrincipalNames = nominatedDetail.NomineeUserPrincipalNames, AwardName = nominatedDetail.AwardName, AwardId = nominatedDetail.AwardId, NomineeNames = nominatedDetail.NomineeNames, NomineeObjectIds = nominatedDetail.NomineeObjectIds, RewardCycleId = nominatedDetail.RewardCycleId, }, }, }, }; ThumbnailCard previewCard = new ThumbnailCard { Title = HttpUtility.HtmlEncode(nominatedDetail.NomineeNames), Subtitle = $"<p style='font-weight: 600;'>{HttpUtility.HtmlEncode(nominatedDetail.AwardName)}</p>", }; composeExtensionResult.Attachments.Add(new Attachment { ContentType = AdaptiveCard.ContentType, Content = endorseAdaptiveCard, }.ToMessagingExtensionAttachment(previewCard.ToAttachment())); } } return(composeExtensionResult); }