namespace Application.Abstractions.Chat; /// /// 채팅 룸 키 규약 (개미투자 D2) — roomKey = main | stock:{code}. /// channel:{sid} 는 기존 채널 채팅(비활성) 호환용 레거시 키 — JoinRoom 공개 계약에는 포함하지 않는다. /// public static class ChatRoomKeys { public const string Main = "main"; public const string StockPrefix = "stock:"; public const string ChannelPrefix = "channel:"; public const int MaxLength = 20; public static bool IsStockRoom(string roomKey) => roomKey.StartsWith(StockPrefix, StringComparison.Ordinal); public static bool IsChannelRoom(string roomKey) => roomKey.StartsWith(ChannelPrefix, StringComparison.Ordinal); /// 공개 계약 유효성 — main 또는 stock:{6자리 숫자} 만 허용 public static bool IsValid(string? roomKey) { if (string.IsNullOrWhiteSpace(roomKey) || roomKey.Length > MaxLength) { return false; } if (roomKey == Main) { return true; } if (IsStockRoom(roomKey)) { var code = roomKey[StockPrefix.Length..]; return code is { Length: 6 } && code.All(char.IsAsciiDigit); } return false; } public static string ForStock(string code) => $"{StockPrefix}{code}"; public static string ForChannel(string channelSID) => $"{ChannelPrefix}{channelSID}"; }