115 lines
4.2 KiB
C#
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
|
|
}
|
|
}
|