From 2d51df4ededf64421842d6d487420d302f5ad7fc Mon Sep 17 00:00:00 2001 From: JamesPasta Date: Wed, 19 Aug 2026 16:33:31 -0700 Subject: [PATCH 1/2] bugfix/AB#34117-CommentsEmailTo-Copilot --- .../Controllers/UnityMessagingController.cs | 10 ++++++++ .../Realtime/NotificationHub.cs | 6 +++++ .../js/notifications-realtime-client.js | 16 +++++++++++++ .../wwwroot/themes/ux2/zone-extensions.js | 24 +++---------------- 4 files changed, 35 insertions(+), 21 deletions(-) diff --git a/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/Controllers/UnityMessagingController.cs b/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/Controllers/UnityMessagingController.cs index cb1a6d240..db61d5ba1 100644 --- a/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/Controllers/UnityMessagingController.cs +++ b/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/Controllers/UnityMessagingController.cs @@ -54,6 +54,11 @@ public async Task MessageUserAsync([FromBody] DirectMessageReques return BadRequest("TargetUserId and Message are required."); } + if (request.Message.Length > NotificationHub.MaxDirectMessageLength) + { + return BadRequest($"Messages cannot exceed {NotificationHub.MaxDirectMessageLength} characters."); + } + var senderUserId = CurrentUser.Id?.ToString() ?? "unknown"; var senderName = DisplayNameHelper.Resolve(CurrentUser); @@ -98,6 +103,11 @@ public async Task MessageTenantAsync([FromBody] TenantMessageRequ return BadRequest("TargetTenantId and Message are required."); } + if (request.Message.Length > NotificationHub.MaxDirectMessageLength) + { + return BadRequest($"Messages cannot exceed {NotificationHub.MaxDirectMessageLength} characters."); + } + if (currentTenant.Id.HasValue && currentTenant.Id.Value != request.TargetTenantId) { return Forbid(); diff --git a/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/Realtime/NotificationHub.cs b/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/Realtime/NotificationHub.cs index 3940e149d..5e87ed9a8 100644 --- a/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/Realtime/NotificationHub.cs +++ b/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/Realtime/NotificationHub.cs @@ -31,6 +31,7 @@ public class NotificationHub( { public const string HubRoute = "/signalr/notifications"; public const string NotificationLogsOpsGroup = "ops:notification-logs"; + public const int MaxDirectMessageLength = 4000; public override async Task OnConnectedAsync() { @@ -147,6 +148,11 @@ public async Task SendDirectMessageAsync(string targetUserId, string message) throw new HubException("Target user and message are required."); } + if (message.Length > MaxDirectMessageLength) + { + throw new HubException($"Messages cannot exceed {MaxDirectMessageLength} characters."); + } + var senderId = GetCurrentUserId() ?? string.Empty; var senderName = DisplayNameHelper.Resolve(Context.User); var timestamp = DateTime.UtcNow; diff --git a/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/wwwroot/js/notifications-realtime-client.js b/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/wwwroot/js/notifications-realtime-client.js index 734676911..a8681ae6a 100644 --- a/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/wwwroot/js/notifications-realtime-client.js +++ b/applications/Unity.GrantManager/modules/Unity.Notifications/src/Unity.Notifications.Web/wwwroot/js/notifications-realtime-client.js @@ -1,4 +1,10 @@ (function () { + if (globalThis.__unityRealtimeWidgetInitialized) { + return; + } + + globalThis.__unityRealtimeWidgetInitialized = true; + whenReady(init); function whenReady(callback) { @@ -296,6 +302,10 @@ return; } + if (message.length > 4000) { + return; + } + if (connection.state !== signalR.HubConnectionState.Connected) { return; } @@ -562,6 +572,12 @@ })(); (function () { + if (globalThis.__unityRealtimeWidgetInitialized) { + return; + } + + globalThis.__unityRealtimeWidgetInitialized = true; + whenReady(init); function whenReady(callback) { diff --git a/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/themes/ux2/zone-extensions.js b/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/themes/ux2/zone-extensions.js index 038076fa8..06ab57936 100644 --- a/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/themes/ux2/zone-extensions.js +++ b/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/themes/ux2/zone-extensions.js @@ -113,27 +113,9 @@ * @returns */ let toCamelCaseInternal = function (str) { - let regexs = [ - /(^[A-Z])/, // first char of string - /((\.)[A-Z])/ // first char after a dot (.) - ]; - - regexs.forEach( - function (regex) { - let infLoopAvoider = 0; - - while (regex.test(str)) { - str = str - .replace(regex, function ($1) { return $1.toLowerCase(); }); - - if (infLoopAvoider++ > 1000) { - break; - } - } - } - ); - - return str; + return str + .replace(/^[A-Z]/, match => match.toLowerCase()) + .replace(/\.[A-Z]/g, match => match.toLowerCase()); } /** From aaa6cd21d956fd7a6a76618b1faf1934b2610620 Mon Sep 17 00:00:00 2001 From: JamesPasta Date: Wed, 19 Aug 2026 16:42:35 -0700 Subject: [PATCH 2/2] feature/AB#34135-InsantMessaging-JSBundling --- .../wwwroot/themes/ux2/zone-extensions.js | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/themes/ux2/zone-extensions.js b/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/themes/ux2/zone-extensions.js index 038076fa8..06ab57936 100644 --- a/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/themes/ux2/zone-extensions.js +++ b/applications/Unity.GrantManager/modules/Unity.Theme.UX2/src/Unity.Theme.UX2/wwwroot/themes/ux2/zone-extensions.js @@ -113,27 +113,9 @@ * @returns */ let toCamelCaseInternal = function (str) { - let regexs = [ - /(^[A-Z])/, // first char of string - /((\.)[A-Z])/ // first char after a dot (.) - ]; - - regexs.forEach( - function (regex) { - let infLoopAvoider = 0; - - while (regex.test(str)) { - str = str - .replace(regex, function ($1) { return $1.toLowerCase(); }); - - if (infLoopAvoider++ > 1000) { - break; - } - } - } - ); - - return str; + return str + .replace(/^[A-Z]/, match => match.toLowerCase()) + .replace(/\.[A-Z]/g, match => match.toLowerCase()); } /**