Reorganize root folder structure: Remove apps layer layer
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
using MediatR;
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
using Knot.Modules.Chats.Domain;
|
||||
using Knot.Modules.Chats.Infrastructure.SignalR;
|
||||
using Knot.Shared.Kernel;
|
||||
|
||||
namespace Knot.Modules.Chats.Infrastructure.Handlers;
|
||||
|
||||
/// <summary>
|
||||
/// Обработчик доменного события отправки сообщения.
|
||||
/// Отправляет уведомление через SignalR всем участникам чата.
|
||||
/// </summary>
|
||||
public sealed class MessageSentDomainEventHandler : INotificationHandler<MessageSentDomainEvent>
|
||||
{
|
||||
private readonly IHubContext<ChatHub> _hubContext;
|
||||
private readonly IMessageRepository _messageRepository;
|
||||
private readonly IUserDisplayNameProvider _displayNameProvider;
|
||||
|
||||
public MessageSentDomainEventHandler(
|
||||
IHubContext<ChatHub> hubContext,
|
||||
IMessageRepository messageRepository,
|
||||
IUserDisplayNameProvider displayNameProvider)
|
||||
{
|
||||
_hubContext = hubContext;
|
||||
_messageRepository = messageRepository;
|
||||
_displayNameProvider = displayNameProvider;
|
||||
}
|
||||
|
||||
public async Task Handle(MessageSentDomainEvent notification, CancellationToken cancellationToken)
|
||||
{
|
||||
var message = await _messageRepository.GetByIdAsync(notification.MessageId, cancellationToken);
|
||||
if (message is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var userInfo = await _displayNameProvider.GetUserInfoAsync(message.SenderId, cancellationToken);
|
||||
var senderObj = userInfo != null
|
||||
? new { Id = userInfo.Id, Username = userInfo.Username, DisplayName = userInfo.DisplayName, Avatar = userInfo.Avatar }
|
||||
: new { Id = message.SenderId, Username = "unknown", DisplayName = "Unknown", Avatar = (string?)null };
|
||||
|
||||
// Fetch forwarded from info if exists
|
||||
object? forwardedFromObj = null;
|
||||
if (message.ForwardedFromId.HasValue)
|
||||
{
|
||||
var fwdUserInfo = await _displayNameProvider.GetUserInfoAsync(message.ForwardedFromId.Value, cancellationToken);
|
||||
forwardedFromObj = fwdUserInfo != null
|
||||
? new { Id = fwdUserInfo.Id, Username = fwdUserInfo.Username, DisplayName = fwdUserInfo.DisplayName, Avatar = fwdUserInfo.Avatar }
|
||||
: new { Id = message.ForwardedFromId.Value, Username = "unknown", DisplayName = "Unknown", Avatar = (string?)null };
|
||||
}
|
||||
|
||||
// Fetch reply info if exists
|
||||
object? replyToObj = null;
|
||||
if (message.ReplyToId.HasValue)
|
||||
{
|
||||
var replyMsg = await _messageRepository.GetByIdAsync(message.ReplyToId.Value, cancellationToken);
|
||||
if (replyMsg != null)
|
||||
{
|
||||
var replySenderInfo = await _displayNameProvider.GetUserInfoAsync(replyMsg.SenderId, cancellationToken);
|
||||
replyToObj = new
|
||||
{
|
||||
Id = replyMsg.Id,
|
||||
Content = replyMsg.Content,
|
||||
Quote = message.Quote,
|
||||
media = replyMsg.Media.Select(rm => new { rm.Id, rm.Type, rm.Url }).ToList(),
|
||||
Sender = replySenderInfo != null
|
||||
? new { Id = replySenderInfo.Id, Username = replySenderInfo.Username, DisplayName = replySenderInfo.DisplayName }
|
||||
: new { Id = replyMsg.SenderId, Username = "unknown", DisplayName = "Unknown" }
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Отправляем сообщение в "комнату" чата.
|
||||
await _hubContext.Clients.Group(notification.ChatId.ToString())
|
||||
.SendAsync("new_message", new
|
||||
{
|
||||
message.Id,
|
||||
message.ChatId,
|
||||
message.SenderId,
|
||||
Content = message.Content,
|
||||
Type = message.Type,
|
||||
message.CreatedAt,
|
||||
message.ForwardedFromId,
|
||||
ForwardedFrom = forwardedFromObj,
|
||||
message.ReplyToId,
|
||||
ReplyTo = replyToObj,
|
||||
Quote = message.Quote,
|
||||
Media = message.Media.Select(m => new
|
||||
{
|
||||
m.Id,
|
||||
m.Type,
|
||||
m.Url,
|
||||
Filename = m.Filename,
|
||||
Size = m.Size
|
||||
}).ToList(),
|
||||
Sender = senderObj,
|
||||
ReadBy = new List<object>(),
|
||||
StoryId = message.StoryId,
|
||||
StoryMediaUrl = message.StoryMediaUrl,
|
||||
StoryMediaType = message.StoryMediaType
|
||||
}, cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user