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))}]";
+ }
+}