From acf056326477d95cbf68800003140f03305d6e75 Mon Sep 17 00:00:00 2001 From: HauklandJ Date: Fri, 21 Feb 2025 14:33:43 +0100 Subject: [PATCH] add link to app instance to body of correspondance message --- .../Configuration/GeneralSettings.cs | 14 +++++++ .../Signing/SigningCorrespondenceService.cs | 16 ++++--- src/Altinn.App.Core/Helpers/UrlHelper.cs | 30 +++++++++++++ .../Configuration/GeneralSettingsTests.cs | 42 +++++++++++++++++++ .../Helpers/UrlHelperTests.cs | 34 +++++++++++++++ 5 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 src/Altinn.App.Core/Helpers/UrlHelper.cs create mode 100644 test/Altinn.App.Core.Tests/Configuration/GeneralSettingsTests.cs create mode 100644 test/Altinn.App.Core.Tests/Helpers/UrlHelperTests.cs diff --git a/src/Altinn.App.Core/Configuration/GeneralSettings.cs b/src/Altinn.App.Core/Configuration/GeneralSettings.cs index 288c755fa..c17127534 100644 --- a/src/Altinn.App.Core/Configuration/GeneralSettings.cs +++ b/src/Altinn.App.Core/Configuration/GeneralSettings.cs @@ -82,3 +82,17 @@ public string GetAltinnPartyCookieName } } } + +internal static class GeneralSettingsExtensions +{ + /// + /// Convenience method to get with segments replaced and trailing # and / as this is how the url is used in the app. + /// + /// The general settings + /// The app identifier + /// The formatted url + public static string FormattedExternalAppBaseUrlWithTrailingPound(this GeneralSettings settings, AppIdentifier app) + { + return settings.FormattedExternalAppBaseUrl(app).TrimEnd('/') + "#/"; + } +} diff --git a/src/Altinn.App.Core/Features/Signing/SigningCorrespondenceService.cs b/src/Altinn.App.Core/Features/Signing/SigningCorrespondenceService.cs index 3d068c988..2103cebe7 100644 --- a/src/Altinn.App.Core/Features/Signing/SigningCorrespondenceService.cs +++ b/src/Altinn.App.Core/Features/Signing/SigningCorrespondenceService.cs @@ -1,4 +1,5 @@ using System.Globalization; +using Altinn.App.Core.Configuration; using Altinn.App.Core.Constants; using Altinn.App.Core.Exceptions; using Altinn.App.Core.Features.Correspondence; @@ -8,6 +9,7 @@ using Altinn.App.Core.Features.Signing.Helpers; using Altinn.App.Core.Features.Signing.Interfaces; using Altinn.App.Core.Features.Signing.Models; +using Altinn.App.Core.Helpers; using Altinn.App.Core.Internal.AltinnCdn; using Altinn.App.Core.Internal.App; using Altinn.App.Core.Internal.Data; @@ -20,6 +22,7 @@ using Altinn.Platform.Storage.Interface.Models; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Signee = Altinn.App.Core.Internal.Sign.Signee; namespace Altinn.App.Core.Features.Signing; @@ -30,7 +33,8 @@ internal sealed class SigningCorrespondenceService( IHostEnvironment hostEnvironment, IAppResources appResources, IAppMetadata appMetadata, - ILogger logger + ILogger logger, + IOptions settings ) : ISigningCorrespondenceService { private readonly ICorrespondenceClient _correspondenceClient = correspondenceClient; @@ -39,6 +43,7 @@ ILogger logger private readonly IAppResources _appResources = appResources; private readonly IAppMetadata _appMetadata = appMetadata; private readonly ILogger _logger = logger; + private readonly UrlHelper _urlHelper = new(settings); public async Task SendSignConfirmationCorrespondence( InstanceIdentifier instanceIdentifier, @@ -235,14 +240,14 @@ await _appResources.GetTexts( ); } - CorrespondenceContent content = await GetContent(appIdentifier, appMetadata, serviceOwnerParty); + string instanceUrl = _urlHelper.GetInstanceUrl(appIdentifier, instanceIdentifier); + CorrespondenceContent content = await GetContent(appIdentifier, appMetadata, serviceOwnerParty, instanceUrl); string? emailBody = notification?.Email?.Body; string? emailSubject = notification?.Email?.Subject; string? smsBody = notification?.Sms?.Body; // TODO: Language support - // TODO: Add link to app instance in the correspondence body // TODO: Tests return await _correspondenceClient.Send( new SendCorrespondencePayload( @@ -301,7 +306,8 @@ await _appResources.GetTexts( async Task GetContent( AppIdentifier appIdentifier, ApplicationMetadata appMetadata, - Party senderParty + Party senderParty, + string instanceUrl ) { TextResource? textResource = null; @@ -348,7 +354,7 @@ await _appResources.GetTexts(appIdentifier.Org, appIdentifier.App, defaultLangua { Title = $"{appName}: Oppgave til signering", Summary = $"Din signatur ventes for {appName}.", - Body = $"Du har mottatt en oppgave som krever din signatur.

Hvis du lurer på noe, kan du kontakte {appOwner}.", + Body = $"Du har en oppgave som venter på din signatur. Klikk her for å åpne applikasjonen.

Hvis du lurer på noe, kan du kontakte {appOwner}.", }; CorrespondenceContent content = new() diff --git a/src/Altinn.App.Core/Helpers/UrlHelper.cs b/src/Altinn.App.Core/Helpers/UrlHelper.cs new file mode 100644 index 000000000..b9be0a6a6 --- /dev/null +++ b/src/Altinn.App.Core/Helpers/UrlHelper.cs @@ -0,0 +1,30 @@ +using Altinn.App.Core.Configuration; +using Altinn.App.Core.Models; +using Microsoft.Extensions.Options; + +namespace Altinn.App.Core.Helpers; + +internal class UrlHelper +{ + private readonly GeneralSettings _settings; + + public UrlHelper(IOptions settings) + { + _settings = settings.Value; + } + + /// + /// Get the url for an instance of an app + /// + /// The app identifier + /// The instance identifier + /// The url for the app + public string GetInstanceUrl(AppIdentifier app, InstanceIdentifier instance) + { + string baseUrl = _settings.FormattedExternalAppBaseUrlWithTrailingPound(app); + + string url = $"{baseUrl}{instance.InstanceOwnerPartyId}/{instance.InstanceGuid}"; + + return url; + } +} diff --git a/test/Altinn.App.Core.Tests/Configuration/GeneralSettingsTests.cs b/test/Altinn.App.Core.Tests/Configuration/GeneralSettingsTests.cs new file mode 100644 index 000000000..6f43e2153 --- /dev/null +++ b/test/Altinn.App.Core.Tests/Configuration/GeneralSettingsTests.cs @@ -0,0 +1,42 @@ +using Altinn.App.Core.Configuration; +using Altinn.App.Core.Models; +using Microsoft.Extensions.Options; + +namespace Altinn.App.Core.Tests.Configuration; + +public class GeneralSettingsTests +{ + private readonly GeneralSettings _settings; + + public GeneralSettingsTests() + { + var options = Options.Create(new GeneralSettings { HostName = "localhost.altinn.cloud" }); + _settings = options.Value; + } + + [Fact] + public void FormattedExternalAppBaseUrl_GivenAppIdentifier_ReturnsFormattedUrl() + { + // Arrange + AppIdentifier app = new("testOrg", "testApp"); + + // Act + var result = _settings.FormattedExternalAppBaseUrl(app); + + // Assert + Assert.Equal($"http://localhost.altinn.cloud/testOrg/testApp/", result); + } + + [Fact] + public void FormattedExternalAppBaseUrlWithTrailingPound_GivenAppIdentifier_ReturnsFormattedUrlWithTrailingPound() + { + // Arrange + AppIdentifier app = new("testOrg", "testApp"); + + // Act + var result = _settings.FormattedExternalAppBaseUrlWithTrailingPound(app); + + // Assert + Assert.Equal($"http://localhost.altinn.cloud/testOrg/testApp#/", result); + } +} diff --git a/test/Altinn.App.Core.Tests/Helpers/UrlHelperTests.cs b/test/Altinn.App.Core.Tests/Helpers/UrlHelperTests.cs new file mode 100644 index 000000000..7350040ba --- /dev/null +++ b/test/Altinn.App.Core.Tests/Helpers/UrlHelperTests.cs @@ -0,0 +1,34 @@ +using Altinn.App.Core.Configuration; +using Altinn.App.Core.Helpers; +using Altinn.App.Core.Models; +using Microsoft.Extensions.Options; + +namespace Altinn.App.Core.Tests.Helpers; + +public class UrlHelperTests +{ + private readonly UrlHelper _urlHelper; + + public UrlHelperTests() + { + var options = Options.Create(new GeneralSettings { HostName = "localhost.altinn.cloud" }); + _urlHelper = new(options); + } + + [Fact] + public void GetInstanceUrl_ReturnsFormattedUrl() + { + // Arrange + AppIdentifier app = new("testOrg", "testApp"); + InstanceIdentifier instance = new("50841220/7c811874-deca-428d-b238-019f1a149833"); + + // Act + var result = _urlHelper.GetInstanceUrl(app, instance); + + // Assert + Assert.Equal( + "http://localhost.altinn.cloud/testOrg/testApp#/50841220/7c811874-deca-428d-b238-019f1a149833", + result + ); + } +}