using System.Security.Claims; using Govor.Contracts.Requests.SignalR; using Govor.Core.Models; using Govor.Core.Repositories.Users; using Govor.Data.Repositories.Exceptions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; namespace Govor.API.Hubs; [Authorize] public class ChatsHub : Hub { private readonly IUsersRepository _usersRepository; private readonly ILogger _logger; public ChatsHub(IUsersRepository usersRepository, ILogger logger) { _usersRepository = usersRepository; _logger = logger; } public override async Task OnConnectedAsync() { var userId = GetUserId(); if (userId != Guid.Empty) { // Привязываем ConnectionId к UserId await Groups.AddToGroupAsync(Context.ConnectionId, userId.ToString()); _logger.LogInformation("User {UserId} connected with ConnectionId {ConnectionId}", userId, Context.ConnectionId); } await base.OnConnectedAsync(); } public override async Task OnDisconnectedAsync(Exception? exception) { var userId = GetUserId(); if (userId != Guid.Empty) { await Groups.RemoveFromGroupAsync(Context.ConnectionId, userId.ToString()); _logger.LogInformation("User {UserId} disconnected", userId); } await base.OnDisconnectedAsync(exception); } public async Task Edit(string newMessage, Guid messageId) { } public async Task Send(MessageRequest request) { // Валидация входных данных if (string.IsNullOrWhiteSpace(request.EncryptedContent)) { _logger.LogWarning("Empty message received from user {UserId}", GetUserId()); throw new ArgumentException("Message cannot be empty", nameof(request.EncryptedContent)); } var senderId = GetUserId(); // Проверка существования получателя /*try { await _usersRepository.FindByIdAsync(toUserId); } catch (NotFoundByKeyException ex) { _logger.LogWarning("Recipient user {ToUserId} not found", toUserId); throw; } catch (ArgumentException ex) { _logger.LogWarning("Invalid recipient userId received from user {UserId}", GetUserId()); throw; }*/ try { _logger.LogInformation("Message sent from {SenderId} to {RecipientId} at {UtcNow}", senderId, request.RecipientId, DateTime.UtcNow); // Отправка сообщения отправителю и получателю //await Clients.Group(request.RecipientId.ToString()).SendAsync("Receive", message, senderId); // Clients.Group(senderId.ToString()).SendAsync("Receive", message, senderId); } catch (Exception ex) { //_logger.LogError(ex, "Error sending message from {SenderId} to {RecipientId}", senderId, toUserId); throw; } } private Guid GetUserId() { var userIdClaim = Context.User?.FindFirst("userID")?.Value; if (string.IsNullOrEmpty(userIdClaim) || !Guid.TryParse(userIdClaim, out var userId)) { _logger.LogError("Could not retrieve sender userId"); throw new UnauthorizedAccessException("userID claim is missing or invalid"); } return userId; } }