diff --git a/src/Backend/AutopilotMonitor.Functions/Functions/SignalRAddToGroupFunction.cs b/src/Backend/AutopilotMonitor.Functions/Functions/SignalRAddToGroupFunction.cs index 90b8bbed..29b6895b 100644 --- a/src/Backend/AutopilotMonitor.Functions/Functions/SignalRAddToGroupFunction.cs +++ b/src/Backend/AutopilotMonitor.Functions/Functions/SignalRAddToGroupFunction.cs @@ -71,7 +71,7 @@ namespace AutopilotMonitor.Functions.Functions } else { - var requestedTenantId = ExtractTenantIdFromGroupName(request.GroupName); + var requestedTenantId = SignalRGroupHelper.ExtractTenantIdFromGroupName(request.GroupName); if (string.IsNullOrEmpty(requestedTenantId)) { _logger.LogWarning($"User {userEmail} attempted to join unrecognized group format: {request.GroupName}"); @@ -101,7 +101,7 @@ namespace AutopilotMonitor.Functions.Functions } // Extract session ID from group name if it's a session-specific group - var logPrefix = ExtractLogPrefix(request.GroupName); + var logPrefix = SignalRGroupHelper.ExtractLogPrefix(request.GroupName); _logger.LogInformation($"{logPrefix} AddToGroup: {request.GroupName} (User: {userEmail})"); var response = req.CreateResponse(HttpStatusCode.OK); @@ -130,46 +130,6 @@ namespace AutopilotMonitor.Functions.Functions } } - /// - /// Extracts tenant ID from SignalR group name - /// Group formats: "tenant-{tenantId}" or "session-{tenantId}-{sessionId}" - /// - private string? ExtractTenantIdFromGroupName(string groupName) - { - if (groupName.StartsWith("tenant-")) - { - // Format: "tenant-{tenantId}" - return groupName.Substring("tenant-".Length); - } - else if (groupName.StartsWith("session-")) - { - // Format: "session-{tenantId}-{sessionId}" - // Extract everything between "session-" and the last 5 GUID segments - var parts = groupName.Split('-'); - if (parts.Length >= 7) // "session" + 5 GUID parts (tenant) + 5 GUID parts (session) - { - // Reconstruct tenant GUID from parts 1-5 - return string.Join("-", parts.Skip(1).Take(5)); - } - } - return null; - } - - private string ExtractLogPrefix(string groupName) - { - // Extract session ID from group name: "session-{tenantId}-{sessionId}" - if (groupName.StartsWith("session-")) - { - var parts = groupName.Split('-'); - if (parts.Length > 2) - { - var sessionId = string.Join("-", parts.Skip(parts.Length - 5).Take(5)); // Last 5 parts form the GUID - return $"[Session: {sessionId.Substring(0, Math.Min(8, sessionId.Length))}]"; - } - } - // For tenant groups: "tenant-{tenantId}" - return $"[Group: {groupName.Substring(0, Math.Min(20, groupName.Length))}]"; - } } public class AddToGroupRequest diff --git a/src/Backend/AutopilotMonitor.Functions/Functions/SignalRRemoveFromGroupFunction.cs b/src/Backend/AutopilotMonitor.Functions/Functions/SignalRRemoveFromGroupFunction.cs index d9b41398..a2eaf50f 100644 --- a/src/Backend/AutopilotMonitor.Functions/Functions/SignalRRemoveFromGroupFunction.cs +++ b/src/Backend/AutopilotMonitor.Functions/Functions/SignalRRemoveFromGroupFunction.cs @@ -71,7 +71,7 @@ namespace AutopilotMonitor.Functions.Functions } else { - var requestedTenantId = ExtractTenantIdFromGroupName(request.GroupName); + var requestedTenantId = SignalRGroupHelper.ExtractTenantIdFromGroupName(request.GroupName); if (string.IsNullOrEmpty(requestedTenantId)) { _logger.LogWarning($"User {userEmail} attempted to leave unrecognized group format: {request.GroupName}"); @@ -101,7 +101,7 @@ namespace AutopilotMonitor.Functions.Functions } // Extract session ID from group name if it's a session-specific group - var logPrefix = ExtractLogPrefix(request.GroupName); + var logPrefix = SignalRGroupHelper.ExtractLogPrefix(request.GroupName); _logger.LogInformation($"{logPrefix} RemoveFromGroup: {request.GroupName} (User: {userEmail})"); var response = req.CreateResponse(HttpStatusCode.OK); @@ -130,46 +130,6 @@ namespace AutopilotMonitor.Functions.Functions } } - /// - /// Extracts tenant ID from SignalR group name - /// Group formats: "tenant-{tenantId}" or "session-{tenantId}-{sessionId}" - /// - private string? ExtractTenantIdFromGroupName(string groupName) - { - if (groupName.StartsWith("tenant-")) - { - // Format: "tenant-{tenantId}" - return groupName.Substring("tenant-".Length); - } - else if (groupName.StartsWith("session-")) - { - // Format: "session-{tenantId}-{sessionId}" - // Extract everything between "session-" and the last 5 GUID segments - var parts = groupName.Split('-'); - if (parts.Length >= 7) // "session" + 5 GUID parts (tenant) + 5 GUID parts (session) - { - // Reconstruct tenant GUID from parts 1-5 - return string.Join("-", parts.Skip(1).Take(5)); - } - } - return null; - } - - private string ExtractLogPrefix(string groupName) - { - // Extract session ID from group name: "session-{tenantId}-{sessionId}" - if (groupName.StartsWith("session-")) - { - var parts = groupName.Split('-'); - if (parts.Length > 2) - { - var sessionId = string.Join("-", parts.Skip(parts.Length - 5).Take(5)); // Last 5 parts form the GUID - return $"[Session: {sessionId.Substring(0, Math.Min(8, sessionId.Length))}]"; - } - } - // For tenant groups: "tenant-{tenantId}" - return $"[Group: {groupName.Substring(0, Math.Min(20, groupName.Length))}]"; - } } public class RemoveFromGroupRequest diff --git a/src/Backend/AutopilotMonitor.Functions/Helpers/SignalRGroupHelper.cs b/src/Backend/AutopilotMonitor.Functions/Helpers/SignalRGroupHelper.cs new file mode 100644 index 00000000..1504c6d9 --- /dev/null +++ b/src/Backend/AutopilotMonitor.Functions/Helpers/SignalRGroupHelper.cs @@ -0,0 +1,48 @@ +namespace AutopilotMonitor.Functions.Helpers; + +/// +/// Helper class for parsing SignalR group names. +/// Group formats: "tenant-{tenantId}", "session-{tenantId}-{sessionId}", or "galactic-admins" +/// +public static class SignalRGroupHelper +{ + /// + /// Extracts tenant ID from SignalR group name. + /// + public static string? ExtractTenantIdFromGroupName(string groupName) + { + if (groupName.StartsWith("tenant-")) + { + // Format: "tenant-{tenantId}" + return groupName.Substring("tenant-".Length); + } + else if (groupName.StartsWith("session-")) + { + // Format: "session-{tenantId}-{sessionId}" + // Extract everything between "session-" and the last 5 GUID segments + var parts = groupName.Split('-'); + if (parts.Length >= 7) // "session" + 5 GUID parts (tenant) + 5 GUID parts (session) + { + // Reconstruct tenant GUID from parts 1-5 + return string.Join("-", parts.Skip(1).Take(5)); + } + } + return null; + } + + public static string ExtractLogPrefix(string groupName) + { + // Extract session ID from group name: "session-{tenantId}-{sessionId}" + if (groupName.StartsWith("session-")) + { + var parts = groupName.Split('-'); + if (parts.Length > 2) + { + var sessionId = string.Join("-", parts.Skip(parts.Length - 5).Take(5)); // Last 5 parts form the GUID + return $"[Session: {sessionId.Substring(0, Math.Min(8, sessionId.Length))}]"; + } + } + // For tenant groups: "tenant-{tenantId}" + return $"[Group: {groupName.Substring(0, Math.Min(20, groupName.Length))}]"; + } +}