#nullable enable using System; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.SignalR; using Volo.Abp.MultiTenancy; using Volo.Abp.Users; namespace Sozsoft.Platform.Messenger; [Authorize] public class MessengerHub : Hub { private readonly ICurrentTenant _currentTenant; private readonly ICurrentUser _currentUser; private readonly MessengerAppService _messengerAppService; public MessengerHub( ICurrentTenant currentTenant, ICurrentUser currentUser, MessengerAppService messengerAppService) { _currentTenant = currentTenant; _currentUser = currentUser; _messengerAppService = messengerAppService; } public override async Task OnConnectedAsync() { if (_currentUser.Id.HasValue) { await Groups.AddToGroupAsync(Context.ConnectionId, UserGroupName(_currentUser.Id.Value)); await Groups.AddToGroupAsync(Context.ConnectionId, TenantGroupName()); } await base.OnConnectedAsync(); } public override async Task OnDisconnectedAsync(Exception? exception) { if (_currentUser.Id.HasValue) { await Groups.RemoveFromGroupAsync(Context.ConnectionId, UserGroupName(_currentUser.Id.Value)); await Groups.RemoveFromGroupAsync(Context.ConnectionId, TenantGroupName()); } await base.OnDisconnectedAsync(exception); } public async Task SendMessage(MessengerSendMessageDto input) { var message = await _messengerAppService.SendMessageAsync(input); var targetGroups = message.RecipientIds .Append(message.SenderId) .Distinct() .Select(UserGroupName) .ToList(); await Clients.Groups(targetGroups).SendAsync("MessengerMessageReceived", message); } public async Task DeleteMessage(Guid messageId) { var deletedMessage = await _messengerAppService.DeleteMessageAsync(messageId); var targetGroups = deletedMessage.RecipientIds .Append(deletedMessage.SenderId) .Distinct() .Select(UserGroupName) .ToList(); await Clients.Groups(targetGroups).SendAsync("MessengerMessageDeleted", deletedMessage); } private string TenantKey => _currentTenant.Id?.ToString("N") ?? "host"; private string TenantGroupName() => $"messenger:tenant:{TenantKey}"; private string UserGroupName(Guid userId) => $"messenger:user:{TenantKey}:{userId:N}"; }