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
}
}