Перепиливание под чистый DDD
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
using Knot.Modules.Messaging.Application.Abstractions;
|
||||
using Knot.Modules.Messaging.Domain;
|
||||
using MediatR;
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Knot.Modules.Conversations.Application.Abstractions;
|
||||
using Knot.Modules.Conversations.Domain;
|
||||
using Knot.Modules.Conversations.Infrastructure.SignalR;
|
||||
using Knot.Shared.Kernel;
|
||||
|
||||
namespace Knot.Modules.Conversations.Application.Messages.React;
|
||||
|
||||
public sealed record AddReactionCommand(
|
||||
Guid MessageId,
|
||||
Guid UserId,
|
||||
string Emoji,
|
||||
Guid ChatId) : ICommand;
|
||||
|
||||
public sealed class AddReactionCommandHandler : ICommandHandler<AddReactionCommand>
|
||||
{
|
||||
private readonly IMessageReactionRepository _reactionRepository;
|
||||
private readonly IChatsUnitOfWork _unitOfWork;
|
||||
private readonly IHubContext<ChatHub> _hubContext;
|
||||
private readonly IUserDisplayNameProvider _displayNameProvider;
|
||||
private readonly ILogger<AddReactionCommandHandler> _logger;
|
||||
|
||||
public AddReactionCommandHandler(
|
||||
IMessageReactionRepository reactionRepository,
|
||||
IChatsUnitOfWork unitOfWork,
|
||||
IHubContext<ChatHub> hubContext,
|
||||
IUserDisplayNameProvider displayNameProvider,
|
||||
ILogger<AddReactionCommandHandler> logger)
|
||||
{
|
||||
_reactionRepository = reactionRepository;
|
||||
_unitOfWork = unitOfWork;
|
||||
_hubContext = hubContext;
|
||||
_displayNameProvider = displayNameProvider;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<Result> Handle(AddReactionCommand request, CancellationToken cancellationToken)
|
||||
{
|
||||
_logger.LogInformation("AddReaction: MessageId={MessageId}, UserId={UserId}, Emoji={Emoji}, ChatId={ChatId}",
|
||||
|
||||
request.MessageId, request.UserId, request.Emoji, request.ChatId);
|
||||
|
||||
|
||||
var reaction = new MessageReaction(request.MessageId, request.UserId, request.Emoji);
|
||||
await _reactionRepository.AddAsync(reaction, cancellationToken);
|
||||
|
||||
await _unitOfWork.SaveChangesAsync(cancellationToken);
|
||||
|
||||
|
||||
_logger.LogInformation("AddReaction: Reaction saved to database");
|
||||
|
||||
var username = await _displayNameProvider.GetDisplayNameAsync(request.UserId, cancellationToken);
|
||||
|
||||
|
||||
_logger.LogInformation("AddReaction: Sending reaction_added to group {ChatId}", request.ChatId);
|
||||
|
||||
await _hubContext.Clients.Group(request.ChatId.ToString()).SendAsync("reaction_added", new
|
||||
{
|
||||
messageId = request.MessageId,
|
||||
chatId = request.ChatId,
|
||||
userId = request.UserId,
|
||||
username = username,
|
||||
emoji = request.Emoji
|
||||
});
|
||||
|
||||
_logger.LogInformation("AddReaction: reaction_added sent successfully");
|
||||
|
||||
return Result.Success();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user