gehgassi_backend/gehGassi.Web/Hubs/SystemHubSender.cs

115 lines
4.2 KiB
C#

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
{
/// <summary>
/// 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.
/// </summary>
public class SystemHubSender : ISystemHubSender
{
private readonly IHubContext<SystemHub> _systemHub;
private readonly ISystemHubUsers _systemHubUsers;
/// <summary>
/// Erstellt eine Instanz
/// </summary>
/// <param name="systemHub">Instanz eines ISystemHub</param>
/// <param name="systemHubUsers">Instanz eines ISystemHubUsers </param>
public SystemHubSender(IHubContext<SystemHub> systemHub, ISystemHubUsers systemHubUsers)
{
_systemHub = systemHub;
_systemHubUsers = systemHubUsers;
}
/// <summary>
/// Senden eine Nachricht an einen Benutzer
/// </summary>
/// <param name="user">Benutzer - email</param>
/// <param name="message">Nachricht</param>
/// <returns>Task</returns>
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);
}
}
/// <summary>
/// Anzeigen der Warte-Animation im Browser
/// </summary>
/// <param name="user">Benutzername</param>
/// <param name="timeout">Timeout in Millisekunden</param>
/// <returns>Task</returns>
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);
}
}
/// <summary>
/// Ausblenden der Warte-Animation im Browser
/// </summary>
/// <param name="user">Benutzername</param>
/// <returns>Task</returns>
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
/// <summary>
/// Event wenn sich der Warenkorb geändert hat
/// </summary>
/// <param name="customerId">ID des Kunden als GUID</param>
/// <param name="itemCount">Anzahl der Artikel im Warenkorb</param>
/// <param name="ignoreUsers">Liste Benutzer die ignoriert werden soll</param>
/// <returns></returns>
public async Task CartChangedAsync(Guid customerId, int itemCount, List<string> ignoreUsers = null)
{
var group = $"customer_{customerId}";
var ignoreList = GetIgnoreList(ignoreUsers);
await _systemHub.Clients.GroupExcept(group, ignoreList).SendAsync("CartChanged", itemCount);
}
#endregion
#region Helper
/// <summary>
/// Holen der Connection-IDS für Benutzer die Ignoriert werden sollen
/// </summary>
/// <param name="ignoreUsers">Liste Benutzernamen die ignoriert werden sollen</param>
/// <returns>Liste connectionIds die ignoriert werden sollen</returns>
private List<string> GetIgnoreList(List<string> ignoreUsers)
{
var ignoreList = new List<string>();
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
}
}