fix(central-ui): notification deep link and relay use the stored N-form NotificationId

Notify.Send mints NotificationId as Guid "N" (no dashes) and the outbox parses it back into
the audit row's CorrelationId, so the Flow Debugger's Notify node linked and relayed a "D"
string the Notifications table never matches (found live: the report opened empty). The
link and RetryNotificationRequest now use "N", and the Notification report normalises any
Guid-shaped ?correlationId= to "N" so Audit Log and Flow Debugger callers both land.

Claude-Session: https://claude.ai/code/session_01NcMG6xXdsJbmD2wYAgkK29
This commit is contained in:
Joseph Doherty
2026-09-06 11:16:24 -04:00
parent 1f8c5810ca
commit 91d14ebdee
6 changed files with 29 additions and 6 deletions
@@ -106,7 +106,7 @@ public class FlowStepDetailTests : BunitContext
var notify = Step(FlowStepKind.Notify, FlowStepOutcome.Ok, "Planners", CachedLifecycle("Delivered"), c);
cut = Render<FlowStepDetail>(p => p.Add(x => x.Step, notify));
link = cut.Find("a[data-test=open-report]");
Assert.Equal($"/notifications/report?correlationId={c:D}", link.GetAttribute("href"));
Assert.Equal($"/notifications/report?correlationId={c:N}", link.GetAttribute("href"));
Assert.Equal("Open in Notification report", link.TextContent.Trim());
var sync = Step(FlowStepKind.ApiCall, FlowStepOutcome.Ok, "Delmia.AckRecipe");
@@ -167,7 +167,7 @@ public class FlowStepDetailTests : BunitContext
Assert.Contains("Parked", hint.TextContent);
var hintLink = hint.QuerySelector("a");
Assert.NotNull(hintLink);
Assert.Equal($"/notifications/report?correlationId={c:D}", hintLink!.GetAttribute("href"));
Assert.Equal($"/notifications/report?correlationId={c:N}", hintLink!.GetAttribute("href"));
}
[Fact]