Skip to content

Commit c30396a

Browse files
feat: Enhanced the notification message when the credential is expired (#354)
Refs: #353 Reviewed-by: Phil Schneider <info@philschneider.de>
1 parent 345a557 commit c30396a

File tree

4 files changed

+16
-8
lines changed

4 files changed

+16
-8
lines changed

src/credentials/SsiCredentialIssuer.Expiry.App/ExpiryCheckService.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,18 +170,19 @@ private static async ValueTask HandleNotification(
170170

171171
var content = JsonSerializer.Serialize(new
172172
{
173-
Type = data.VerifiedCredentialExternalTypeId,
173+
AssignedExternalCredentialType = data.VerifiedCredentialExternalTypeId?.GetEnumValue(),
174174
ExpiryDate = data.ExpiryDate?.ToString("O") ?? throw new ConflictException("Expiry Date must be set here"),
175175
Version = data.DetailVersion,
176176
CredentialId = data.Id,
177-
ExpiryCheckTypeId = newExpiryCheckTypeId
177+
CredentialType = data.verifiedCredentialTypeId.ToString(),
178+
ExpiryCheckTypeId = newExpiryCheckTypeId.ToString()
178179
}, Options);
179180

180181
if (Guid.TryParse(data.RequesterId, out var requesterId))
181182
{
182183
await portalService.AddNotification(content, requesterId, NotificationTypeId.CREDENTIAL_EXPIRY,
183184
cancellationToken).ConfigureAwait(ConfigureAwaitOptions.None);
184-
var typeValue = data.VerifiedCredentialExternalTypeId.GetEnumValue() ??
185+
var typeValue = data.VerifiedCredentialExternalTypeId?.GetEnumValue() ??
185186
throw new UnexpectedConditionException(
186187
$"VerifiedCredentialType {data.VerifiedCredentialExternalTypeId} does not exists");
187188
var mailParameters = new MailParameter[]

src/database/SsiCredentialIssuer.DbAccess/Models/CredentialExpiryData.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ public record CredentialExpiryData(
2929
string? DetailVersion,
3030
string Bpnl,
3131
CompanySsiDetailStatusId CompanySsiDetailStatusId,
32-
VerifiedCredentialExternalTypeId VerifiedCredentialExternalTypeId,
32+
VerifiedCredentialTypeId verifiedCredentialTypeId,
33+
VerifiedCredentialExternalTypeId? VerifiedCredentialExternalTypeId,
3334
CredentialScheduleData ScheduleData);
3435

3536
public record CredentialScheduleData(

src/database/SsiCredentialIssuer.DbAccess/Repositories/CompanySsiDetailsRepository.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ public IAsyncEnumerable<CredentialExpiryData> GetExpiryData(DateTimeOffset now,
305305
x.Details.VerifiedCredentialExternalTypeDetailVersion!.Version,
306306
x.Details.Bpnl,
307307
x.Details.CompanySsiDetailStatusId,
308+
x.Details.VerifiedCredentialTypeId,
308309
x.Details.VerifiedCredentialType!.VerifiedCredentialTypeAssignedExternalType!.VerifiedCredentialExternalTypeId,
309310
new CredentialScheduleData(
310311
x.IsVcToDelete,

tests/credentials/SsiCredentialIssuer.Expiry.App.Tests/ExpiryCheckServiceTests.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
using Microsoft.Extensions.DependencyInjection;
2222
using Microsoft.Extensions.Logging;
2323
using Microsoft.Extensions.Options;
24+
using Microsoft.OpenApi.Extensions;
2425
using Org.Eclipse.TractusX.Portal.Backend.Framework.DateTimeProvider;
26+
using Org.Eclipse.TractusX.Portal.Backend.Framework.Models;
2527
using Org.Eclipse.TractusX.Portal.Backend.Framework.Processes.Library.DBAccess;
2628
using Org.Eclipse.TractusX.Portal.Backend.Framework.Processes.Library.Enums;
2729
using Org.Eclipse.TractusX.SsiCredentialIssuer.DBAccess;
@@ -32,6 +34,7 @@
3234
using Org.Eclipse.TractusX.SsiCredentialIssuer.Expiry.App.DependencyInjection;
3335
using Org.Eclipse.TractusX.SsiCredentialIssuer.Portal.Service.Models;
3436
using Org.Eclipse.TractusX.SsiCredentialIssuer.Portal.Service.Services;
37+
using System.Runtime.CompilerServices;
3538

3639
namespace Org.Eclipse.TractusX.SsiCredentialIssuer.Expiry.App.Tests;
3740

@@ -98,7 +101,7 @@ public async Task ExecuteAsync_WithInactiveAndEligibleForDeletion_RemovesEntry()
98101
.Create();
99102
var data = new CredentialExpiryData[]
100103
{
101-
new(credentialId, Guid.NewGuid().ToString(), inactiveVcsToDelete.AddDays(-1), null, null, Bpnl, CompanySsiDetailStatusId.INACTIVE, VerifiedCredentialExternalTypeId.MEMBERSHIP_CREDENTIAL, credentialScheduleData)
104+
new(credentialId, Guid.NewGuid().ToString(), inactiveVcsToDelete.AddDays(-1), null, null, Bpnl, CompanySsiDetailStatusId.INACTIVE, VerifiedCredentialTypeId.MEMBERSHIP, VerifiedCredentialExternalTypeId.MEMBERSHIP_CREDENTIAL, credentialScheduleData)
102105
};
103106
A.CallTo(() => _dateTimeProvider.OffsetNow).Returns(now);
104107
A.CallTo(() => _companySsiDetailsRepository.GetExpiryData(A<DateTimeOffset>._, A<DateTimeOffset>._, A<DateTimeOffset>._))
@@ -130,7 +133,7 @@ public async Task ExecuteAsync_WithPendingAndExpiryBeforeNow_DeclinesRequest()
130133
.Create();
131134
var data = new CredentialExpiryData[]
132135
{
133-
new(ssiDetail.Id, ssiDetail.CreatorUserId, ssiDetail.ExpiryDate!.Value, ssiDetail.ExpiryCheckTypeId, null, Bpnl, ssiDetail.CompanySsiDetailStatusId, VerifiedCredentialExternalTypeId.MEMBERSHIP_CREDENTIAL, credentialScheduleData)
136+
new(ssiDetail.Id, ssiDetail.CreatorUserId, ssiDetail.ExpiryDate!.Value, ssiDetail.ExpiryCheckTypeId, null, Bpnl, ssiDetail.CompanySsiDetailStatusId, VerifiedCredentialTypeId.MEMBERSHIP, VerifiedCredentialExternalTypeId.MEMBERSHIP_CREDENTIAL, credentialScheduleData)
134137
};
135138
A.CallTo(() => _dateTimeProvider.OffsetNow).Returns(now);
136139
A.CallTo(() => _companySsiDetailsRepository.GetExpiryData(A<DateTimeOffset>._, A<DateTimeOffset>._, A<DateTimeOffset>._))
@@ -178,7 +181,7 @@ public async Task ExecuteAsync_WithActiveCloseToExpiry_NotifiesCreator(int days,
178181
.Create();
179182
var data = new CredentialExpiryData[]
180183
{
181-
new(ssiDetail.Id, ssiDetail.CreatorUserId, ssiDetail.ExpiryDate!.Value, ssiDetail.ExpiryCheckTypeId, null, Bpnl, ssiDetail.CompanySsiDetailStatusId, VerifiedCredentialExternalTypeId.MEMBERSHIP_CREDENTIAL, credentialScheduleData)
184+
new(ssiDetail.Id, ssiDetail.CreatorUserId, ssiDetail.ExpiryDate!.Value, ssiDetail.ExpiryCheckTypeId, null, Bpnl, ssiDetail.CompanySsiDetailStatusId, VerifiedCredentialTypeId.MEMBERSHIP, VerifiedCredentialExternalTypeId.MEMBERSHIP_CREDENTIAL, credentialScheduleData)
182185
};
183186
A.CallTo(() => _dateTimeProvider.OffsetNow).Returns(now);
184187
A.CallTo(() => _companySsiDetailsRepository.GetExpiryData(A<DateTimeOffset>._, A<DateTimeOffset>._, A<DateTimeOffset>._))
@@ -190,16 +193,18 @@ public async Task ExecuteAsync_WithActiveCloseToExpiry_NotifiesCreator(int days,
190193
initialize?.Invoke(ssiDetail);
191194
updateFields.Invoke(ssiDetail);
192195
});
196+
var credentialNotification = A.Captured<string>();
197+
A.CallTo(() => _portalService.AddNotification(credentialNotification._, creatorUserId, NotificationTypeId.CREDENTIAL_EXPIRY, A<CancellationToken>._)).DoesNothing();
193198

194199
// Act
195200
await _sut.ExecuteAsync(CancellationToken.None);
196201

197202
// Assert
198203
A.CallTo(() => _companySsiDetailsRepository.RemoveSsiDetail(ssiDetail.Id, A<string>._, A<string>._)).MustNotHaveHappened();
199204
A.CallTo(() => _issuerRepositories.SaveAsync()).MustHaveHappenedOnceExactly();
200-
A.CallTo(() => _portalService.AddNotification(A<string>._, creatorUserId, NotificationTypeId.CREDENTIAL_EXPIRY, A<CancellationToken>._)).MustHaveHappenedOnceExactly();
201205
A.CallTo(() => _portalService.TriggerMail("CredentialExpiry", creatorUserId, A<IEnumerable<MailParameter>>._, A<CancellationToken>._)).MustHaveHappenedOnceExactly();
202206

207+
credentialNotification.GetLastValue().Should().ContainAll(VerifiedCredentialExternalTypeId.MEMBERSHIP_CREDENTIAL.GetEnumValue(), VerifiedCredentialTypeId.MEMBERSHIP.GetEnumValue());
203208
ssiDetail.ExpiryCheckTypeId.Should().Be(expiryCheckTypeId);
204209
}
205210
}

0 commit comments

Comments
 (0)