diff --git a/src/ScadaLink.CentralUI/Components/Pages/Notifications/NotificationReport.razor b/src/ScadaLink.CentralUI/Components/Pages/Notifications/NotificationReport.razor index 207f402..a1e2c1e 100644 --- a/src/ScadaLink.CentralUI/Components/Pages/Notifications/NotificationReport.razor +++ b/src/ScadaLink.CentralUI/Components/Pages/Notifications/NotificationReport.razor @@ -266,7 +266,7 @@
@SiteName(d.SourceSiteId)
Source node
-
@(string.IsNullOrEmpty(d.SourceNode) ? "—" : d.SourceNode)
+
@(string.IsNullOrEmpty(_detail?.SourceNode) ? "—" : _detail.SourceNode)
Source instance
@(string.IsNullOrEmpty(d.SourceInstanceId) ? "—" : d.SourceInstanceId)
diff --git a/src/ScadaLink.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor b/src/ScadaLink.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor index 511c24c..d24af8c 100644 --- a/src/ScadaLink.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor +++ b/src/ScadaLink.CentralUI/Components/Pages/SiteCalls/SiteCallsReport.razor @@ -267,7 +267,7 @@
@SiteName(det.SourceSite)
Source node
-
@(string.IsNullOrEmpty(d.SourceNode) ? "—" : d.SourceNode)
+
@(string.IsNullOrEmpty(det.SourceNode) ? "—" : det.SourceNode)
Channel
@det.Channel
diff --git a/src/ScadaLink.Commons/Messages/Audit/SiteCallQueries.cs b/src/ScadaLink.Commons/Messages/Audit/SiteCallQueries.cs index 93658c5..4245e3c 100644 --- a/src/ScadaLink.Commons/Messages/Audit/SiteCallQueries.cs +++ b/src/ScadaLink.Commons/Messages/Audit/SiteCallQueries.cs @@ -119,7 +119,8 @@ public sealed record SiteCallDetail( DateTime CreatedAtUtc, DateTime UpdatedAtUtc, DateTime? TerminalAtUtc, - DateTime IngestedAtUtc); + DateTime IngestedAtUtc, + string? SourceNode = null); /// /// Site Calls UI -> Central: request for the global SiteCalls KPI summary. diff --git a/src/ScadaLink.Commons/Messages/Notification/NotificationOutboxQueries.cs b/src/ScadaLink.Commons/Messages/Notification/NotificationOutboxQueries.cs index 27bd888..e6b6365 100644 --- a/src/ScadaLink.Commons/Messages/Notification/NotificationOutboxQueries.cs +++ b/src/ScadaLink.Commons/Messages/Notification/NotificationOutboxQueries.cs @@ -119,7 +119,8 @@ public record NotificationDetail( DateTimeOffset CreatedAt, DateTimeOffset? LastAttemptAt, DateTimeOffset? NextAttemptAt, - DateTimeOffset? DeliveredAt); + DateTimeOffset? DeliveredAt, + string? SourceNode = null); /// /// Outbox UI -> Central: request for the notification outbox KPI summary. diff --git a/src/ScadaLink.NotificationOutbox/NotificationOutboxActor.cs b/src/ScadaLink.NotificationOutbox/NotificationOutboxActor.cs index c7a91ef..8fc6956 100644 --- a/src/ScadaLink.NotificationOutbox/NotificationOutboxActor.cs +++ b/src/ScadaLink.NotificationOutbox/NotificationOutboxActor.cs @@ -749,7 +749,8 @@ public class NotificationOutboxActor : ReceiveActor, IWithTimers notification.CreatedAt, notification.LastAttemptAt, notification.NextAttemptAt, - notification.DeliveredAt); + notification.DeliveredAt, + notification.SourceNode); return new NotificationDetailResponse( request.CorrelationId, Success: true, ErrorMessage: null, detail); diff --git a/src/ScadaLink.SiteCallAudit/SiteCallAuditActor.cs b/src/ScadaLink.SiteCallAudit/SiteCallAuditActor.cs index 7539f3a..cfc29ce 100644 --- a/src/ScadaLink.SiteCallAudit/SiteCallAuditActor.cs +++ b/src/ScadaLink.SiteCallAudit/SiteCallAuditActor.cs @@ -652,7 +652,8 @@ public class SiteCallAuditActor : ReceiveActor CreatedAtUtc: row.CreatedAtUtc, UpdatedAtUtc: row.UpdatedAtUtc, TerminalAtUtc: row.TerminalAtUtc, - IngestedAtUtc: row.IngestedAtUtc); + IngestedAtUtc: row.IngestedAtUtc, + SourceNode: row.SourceNode); } /// diff --git a/tests/ScadaLink.NotificationOutbox.Tests/NotificationOutboxActorQueryTests.cs b/tests/ScadaLink.NotificationOutbox.Tests/NotificationOutboxActorQueryTests.cs index a7fa0e4..4f71714 100644 --- a/tests/ScadaLink.NotificationOutbox.Tests/NotificationOutboxActorQueryTests.cs +++ b/tests/ScadaLink.NotificationOutbox.Tests/NotificationOutboxActorQueryTests.cs @@ -354,6 +354,7 @@ public class NotificationOutboxActorQueryTests : TestKit row.ResolvedTargets = "[\"ops@example.com\",\"oncall@example.com\"]"; row.TypeData = "{\"priority\":\"high\"}"; row.SourceScript = "HighLevelAlarm.csx"; + row.SourceNode = "node-a"; row.SiteEnqueuedAt = DateTimeOffset.UtcNow.AddMinutes(-5); row.DeliveredAt = DateTimeOffset.UtcNow; _repository.GetByIdAsync(row.NotificationId, Arg.Any()).Returns(row); @@ -377,6 +378,10 @@ public class NotificationOutboxActorQueryTests : TestKit Assert.Equal("instance-42", detail.SourceInstanceId); Assert.Equal(2, detail.RetryCount); Assert.Equal("transient blip", detail.LastError); + // SourceNode flows through the detail projection so the report detail + // modal binds uniformly to the detail record (was previously read off + // the summary). + Assert.Equal("node-a", detail.SourceNode); } [Fact] diff --git a/tests/ScadaLink.SiteCallAudit.Tests/SiteCallAuditActorTests.cs b/tests/ScadaLink.SiteCallAudit.Tests/SiteCallAuditActorTests.cs index 0d6fd26..d181413 100644 --- a/tests/ScadaLink.SiteCallAudit.Tests/SiteCallAuditActorTests.cs +++ b/tests/ScadaLink.SiteCallAudit.Tests/SiteCallAuditActorTests.cs @@ -402,7 +402,8 @@ public class SiteCallAuditActorTests : TestKit, IClassFixture