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()); } /**