CryptoHub.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Application.Abstractions.Crypto;
  2. using Microsoft.AspNetCore.SignalR;
  3. namespace Web.Api.Hubs;
  4. public sealed class CryptoHub : Hub<ICryptoHubClient>
  5. {
  6. // ─── Market-specific subscriptions ────────────────────────
  7. public async Task SubscribeMarket(string market)
  8. {
  9. if (string.IsNullOrWhiteSpace(market))
  10. {
  11. return;
  12. }
  13. var lower = market.ToLower().Trim();
  14. await Groups.AddToGroupAsync(Context.ConnectionId, $"ticker:{lower}");
  15. await Groups.AddToGroupAsync(Context.ConnectionId, $"trade:{lower}");
  16. await Groups.AddToGroupAsync(Context.ConnectionId, $"orderbook:{lower}");
  17. await Groups.AddToGroupAsync(Context.ConnectionId, $"candle:{lower}");
  18. }
  19. public async Task UnsubscribeMarket(string market)
  20. {
  21. if (string.IsNullOrWhiteSpace(market))
  22. {
  23. return;
  24. }
  25. var lower = market.ToLower().Trim();
  26. await Groups.RemoveFromGroupAsync(Context.ConnectionId, $"ticker:{lower}");
  27. await Groups.RemoveFromGroupAsync(Context.ConnectionId, $"trade:{lower}");
  28. await Groups.RemoveFromGroupAsync(Context.ConnectionId, $"orderbook:{lower}");
  29. await Groups.RemoveFromGroupAsync(Context.ConnectionId, $"candle:{lower}");
  30. }
  31. // ─── Global tickers subscription ──────────────────────────
  32. public async Task SubscribeTickers(string? quote = null)
  33. {
  34. var group = string.IsNullOrWhiteSpace(quote) ? "tickers" : $"tickers:{quote.ToLower().Trim()}";
  35. await Groups.AddToGroupAsync(Context.ConnectionId, group);
  36. }
  37. public async Task UnsubscribeTickers(string? quote = null)
  38. {
  39. var group = string.IsNullOrWhiteSpace(quote) ? "tickers" : $"tickers:{quote.ToLower().Trim()}";
  40. await Groups.RemoveFromGroupAsync(Context.ConnectionId, group);
  41. }
  42. }