Заготовка опросов
This commit is contained in:
@@ -13,6 +13,12 @@ using Knot.Shared.Kernel;
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
using Knot.Contracts.Auth.Domain;
|
||||
using Knot.Contracts.Auth.Application.Abstractions;
|
||||
using Knot.Modules.Conversations.Application.Messages.Pin;
|
||||
using Knot.Modules.Conversations.Application.Messages.Unpin;
|
||||
using Knot.Modules.Conversations.Application.DTOs;
|
||||
using Knot.Contracts.Messaging.Application.Abstractions;
|
||||
using Knot.Contracts.Messaging.Domain;
|
||||
using Knot.Contracts.Conversations.Application.Abstractions;
|
||||
|
||||
namespace Knot.Modules.Conversations.Infrastructure.SignalR;
|
||||
|
||||
@@ -39,17 +45,29 @@ public sealed class ChatHub : Hub
|
||||
private readonly IUserContext _userContext;
|
||||
private readonly IChatRepository _chatRepository;
|
||||
private readonly IUserRepository _userRepository;
|
||||
private readonly IMessageRepository _messageRepository;
|
||||
private readonly ILogger<ChatHub> _logger;
|
||||
private readonly IMemoryCache _cache;
|
||||
private readonly IUserDisplayNameProvider _userProvider;
|
||||
|
||||
public ChatHub(ISender sender, IUserContext userContext, IChatRepository chatRepository, IUserRepository userRepository, ILogger<ChatHub> logger, IMemoryCache cache)
|
||||
public ChatHub(
|
||||
ISender sender,
|
||||
IUserContext userContext,
|
||||
IChatRepository chatRepository,
|
||||
IUserRepository userRepository,
|
||||
IMessageRepository messageRepository,
|
||||
ILogger<ChatHub> logger,
|
||||
IMemoryCache cache,
|
||||
IUserDisplayNameProvider userProvider)
|
||||
{
|
||||
_sender = sender;
|
||||
_userContext = userContext;
|
||||
_chatRepository = chatRepository;
|
||||
_userRepository = userRepository;
|
||||
_messageRepository = messageRepository;
|
||||
_logger = logger;
|
||||
_cache = cache;
|
||||
_userProvider = userProvider;
|
||||
}
|
||||
|
||||
public override async Task OnConnectedAsync()
|
||||
@@ -112,14 +130,18 @@ public sealed class ChatHub : Hub
|
||||
new AttachmentRequest(a.Type, a.Url, a.FileName, a.FileSize)).ToList();
|
||||
|
||||
var command = new SendMessageCommand(
|
||||
request.ChatId,
|
||||
_userContext.UserId,
|
||||
request.Content,
|
||||
request.Type,
|
||||
attachments,
|
||||
request.ReplyToId,
|
||||
request.Quote,
|
||||
request.ForwardedFromId);
|
||||
ChatId: request.ChatId,
|
||||
SenderId: _userContext.UserId,
|
||||
Content: request.Content,
|
||||
Type: request.Type,
|
||||
Attachments: attachments,
|
||||
ReplyToId: request.ReplyToId,
|
||||
Quote: request.Quote,
|
||||
ForwardedFromId: request.ForwardedFromId,
|
||||
PollOptions: request.PollOptions,
|
||||
PollIsAnonymous: request.PollIsAnonymous,
|
||||
PollAllowMultipleAnswers: request.PollAllowMultipleAnswers
|
||||
);
|
||||
|
||||
await _sender.Send(command);
|
||||
}
|
||||
@@ -227,6 +249,40 @@ public sealed class ChatHub : Hub
|
||||
_logger.LogInformation("RemoveReaction completed successfully");
|
||||
}
|
||||
|
||||
[HubMethodName("pin_message")]
|
||||
public async Task PinMessage(PinMessageRequest request)
|
||||
{
|
||||
var command = new PinMessageCommand(request.MessageId, request.ChatId, _userContext.UserId);
|
||||
var result = await _sender.Send(command);
|
||||
var message = await _messageRepository.GetByIdAsync(request.MessageId, Context.ConnectionAborted);
|
||||
if (message != null)
|
||||
{
|
||||
var senderInfo = await _userProvider.GetUsersInfoAsync(new[] { message.SenderId });
|
||||
var dto = MessageMapper.MapToDto(message, senderInfo, Enumerable.Empty<MessageReaction>(), Enumerable.Empty<Guid>());
|
||||
|
||||
await Clients.Group(request.ChatId.ToString()).SendAsync("message_pinned", new
|
||||
{
|
||||
chatId = request.ChatId,
|
||||
message = dto,
|
||||
userId = _userContext.UserId
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
[HubMethodName("unpin_message")]
|
||||
public async Task UnpinMessage(PinMessageRequest request)
|
||||
{
|
||||
var command = new UnpinMessageCommand(request.MessageId, request.ChatId, _userContext.UserId);
|
||||
var result = await _sender.Send(command);
|
||||
|
||||
await Clients.Group(request.ChatId.ToString()).SendAsync("message_unpinned", new
|
||||
{
|
||||
chatId = request.ChatId,
|
||||
messageId = request.MessageId,
|
||||
userId = _userContext.UserId
|
||||
});
|
||||
}
|
||||
|
||||
// ────────────────────────────────────────────────────────────────
|
||||
// Friend signals (Proxy methods for real-time notification)
|
||||
// ────────────────────────────────────────────────────────────────
|
||||
@@ -648,7 +704,7 @@ public sealed class ChatHub : Hub
|
||||
await Clients.Group(request.ChatId).SendAsync("group_call_status_updated", new
|
||||
{
|
||||
chatId = request.ChatId,
|
||||
userId = Context.UserIdentifier,
|
||||
userId = _userContext.UserId.ToString(),
|
||||
isMuted = request.IsMuted,
|
||||
isVideoOff = request.IsVideoOff
|
||||
});
|
||||
@@ -675,7 +731,7 @@ public sealed class ChatHub : Hub
|
||||
await Clients.Group(chatId).SendAsync("group_call_status_updated", new
|
||||
{
|
||||
chatId = chatId,
|
||||
userId = Context.UserIdentifier,
|
||||
userId = _userContext.UserId.ToString(),
|
||||
isMuted = isMuted,
|
||||
isVideoOff = isVideoOff
|
||||
});
|
||||
@@ -759,7 +815,10 @@ public sealed class ChatHub : Hub
|
||||
List<AttachmentHubRequest>? Attachments = null,
|
||||
Guid? ReplyToId = null,
|
||||
string? Quote = null,
|
||||
Guid? ForwardedFromId = null);
|
||||
Guid? ForwardedFromId = null,
|
||||
List<string>? PollOptions = null,
|
||||
bool? PollIsAnonymous = null,
|
||||
bool? PollAllowMultipleAnswers = null);
|
||||
public record ReadMessagesRequest(Guid ChatId, Guid LastReadMessageId, long LastReadSequenceId);
|
||||
public record CallOfferRequest(string TargetUserId, object Offer, string CallType, string? ChatId);
|
||||
public record CallAnswerRequest(string TargetUserId, object Answer);
|
||||
@@ -771,6 +830,7 @@ public sealed class ChatHub : Hub
|
||||
public record CallStatusRequest(string TargetUserId, bool IsMuted, bool IsVideoOff);
|
||||
public record AddReactionRequest(Guid MessageId, Guid ChatId, string Emoji);
|
||||
public record RemoveReactionRequest(Guid MessageId, Guid ChatId, string Emoji);
|
||||
public record PinMessageRequest(Guid MessageId, Guid ChatId);
|
||||
public record DeleteMessagesHubRequest(Guid ChatId, List<string> MessageIds, bool DeleteForAll);
|
||||
public record GroupCallJoinRequest(string ChatId, string CallType);
|
||||
public record ParticipantInfo(string Id, string Username, string DisplayName, string? Avatar, bool IsSharingScreen = false, bool IsMuted = false, bool IsVideoOff = false);
|
||||
|
||||
Reference in New Issue
Block a user