Skip to content

Commit

Permalink
add link to app instance to body of correspondance message
Browse files Browse the repository at this point in the history
  • Loading branch information
HauklandJ committed Feb 21, 2025
1 parent 70a4625 commit 95ecbcf
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 5 deletions.
14 changes: 14 additions & 0 deletions src/Altinn.App.Core/Configuration/GeneralSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,17 @@ public string GetAltinnPartyCookieName
}
}
}

internal static class GeneralSettingsExtensions
{
/// <summary>
/// Convenience method to get <see cref="GeneralSettings.ExternalAppBaseUrl" /> with segments replaced and trailing # and / as this is how the url is used in the app.
/// </summary>
/// <param name="settings">The general settings</param>
/// <param name="app">The app identifier</param>
/// <returns>The formatted url</returns>
public static string FormattedExternalAppBaseUrlWithTrailingPound(this GeneralSettings settings, AppIdentifier app)
{
return settings.FormattedExternalAppBaseUrl(app).TrimEnd('/') + "#/";
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -30,7 +33,8 @@ internal sealed class SigningCorrespondenceService(
IHostEnvironment hostEnvironment,
IAppResources appResources,
IAppMetadata appMetadata,
ILogger<SigningCorrespondenceService> logger
ILogger<SigningCorrespondenceService> logger,
IOptions<GeneralSettings> settings
) : ISigningCorrespondenceService
{
private readonly ICorrespondenceClient _correspondenceClient = correspondenceClient;
Expand All @@ -39,6 +43,7 @@ ILogger<SigningCorrespondenceService> logger
private readonly IAppResources _appResources = appResources;
private readonly IAppMetadata _appMetadata = appMetadata;
private readonly ILogger<SigningCorrespondenceService> _logger = logger;
private readonly UrlHelper _urlHelper = new(settings);

public async Task<SendCorrespondenceResponse?> SendSignConfirmationCorrespondence(
InstanceIdentifier instanceIdentifier,
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -301,7 +306,8 @@ await _appResources.GetTexts(
async Task<CorrespondenceContent> GetContent(
AppIdentifier appIdentifier,
ApplicationMetadata appMetadata,
Party senderParty
Party senderParty,
string instanceUrl
)
{
TextResource? textResource = null;
Expand Down Expand Up @@ -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. <br /><br /> Hvis du lurer på noe, kan du kontakte {appOwner}.",
Body = $"Du har en oppgave som venter på din signatur. <a href=\"{instanceUrl}\">Klikk her for å åpne applikasjonen</a>.<br /><br />Hvis du lurer på noe, kan du kontakte {appOwner}.",
};

CorrespondenceContent content = new()
Expand Down
30 changes: 30 additions & 0 deletions src/Altinn.App.Core/Helpers/UrlHelper.cs
Original file line number Diff line number Diff line change
@@ -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<GeneralSettings> settings)
{
_settings = settings.Value;
}

/// <summary>
/// Get the url for an instance of an app
/// </summary>
/// <param name="app">The app identifier</param>
/// <param name="instance">The instance identifier</param>
/// <returns>The url for the app</returns>
public string GetInstanceUrl(AppIdentifier app, InstanceIdentifier instance)
{
string baseUrl = _settings.FormattedExternalAppBaseUrlWithTrailingPound(app);

string url = $"{baseUrl}{instance.InstanceOwnerPartyId}/{instance.InstanceGuid}";

return url;
}
}
42 changes: 42 additions & 0 deletions test/Altinn.App.Core.Tests/Configuration/GeneralSettingsTests.cs
Original file line number Diff line number Diff line change
@@ -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);
}
}
34 changes: 34 additions & 0 deletions test/Altinn.App.Core.Tests/Helpers/UrlHelperTests.cs
Original file line number Diff line number Diff line change
@@ -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
);
}
}

0 comments on commit 95ecbcf

Please sign in to comment.