using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using gehGassi.Domain.Common; using Microsoft.AspNetCore.SignalR; namespace gehGassi.Web.Hubs { /// /// Service der den Versand von SignalR-Nachrichten /// vom Server ermöglicht. Dieses Muster wird verwendet um nicht alle SignalR-Methoden an den Client zu veröffentlichen. /// public class SystemHubSender : ISystemHubSender { private readonly IHubContext _systemHub; private readonly ISystemHubUsers _systemHubUsers; /// /// Erstellt eine Instanz /// /// Instanz eines ISystemHub /// Instanz eines ISystemHubUsers public SystemHubSender(IHubContext systemHub, ISystemHubUsers systemHubUsers) { _systemHub = systemHub; _systemHubUsers = systemHubUsers; } /// /// Senden eine Nachricht an einen Benutzer /// /// Benutzer - email /// Nachricht /// Task public async Task MessageForUser(string user, string message) { var connectionIds = _systemHubUsers.ConnectedUsers[user]; if (connectionIds != null && connectionIds.Any()) { await _systemHub.Clients.Clients(connectionIds).SendAsync("MessageForUser", message); } } /// /// Anzeigen der Warte-Animation im Browser /// /// Benutzername /// Timeout in Millisekunden /// Task public async Task ShowWaitingAsync(string user, int timeout = 25000) { var connectionIds = _systemHubUsers.ConnectedUsers[user]; if (connectionIds != null && connectionIds.Any()) { await _systemHub.Clients.Clients(connectionIds).SendAsync("ShowWaiting", timeout); } } /// /// Ausblenden der Warte-Animation im Browser /// /// Benutzername /// Task public async Task HideWaitingAsync(string user) { var connectionIds = _systemHubUsers.ConnectedUsers[user]; if (connectionIds != null && connectionIds.Any()) { await _systemHub.Clients.Clients(connectionIds).SendAsync("HideWaiting"); } } #region Cart - Warenkorb /// /// Event wenn sich der Warenkorb geändert hat /// /// ID des Kunden als GUID /// Anzahl der Artikel im Warenkorb /// Liste Benutzer die ignoriert werden soll /// public async Task CartChangedAsync(Guid customerId, int itemCount, List ignoreUsers = null) { var group = $"customer_{customerId}"; var ignoreList = GetIgnoreList(ignoreUsers); await _systemHub.Clients.GroupExcept(group, ignoreList).SendAsync("CartChanged", itemCount); } #endregion #region Helper /// /// Holen der Connection-IDS für Benutzer die Ignoriert werden sollen /// /// Liste Benutzernamen die ignoriert werden sollen /// Liste connectionIds die ignoriert werden sollen private List GetIgnoreList(List ignoreUsers) { var ignoreList = new List(); if (ignoreUsers == null || !ignoreUsers.Any()) return ignoreList; foreach (var ignoreUser in ignoreUsers.Where(ignoreUser => _systemHubUsers.ConnectedUsers.ContainsKey(ignoreUser))) { ignoreList.AddRange(_systemHubUsers.ConnectedUsers[ignoreUser]); } return ignoreList; } #endregion } }