54 lines
2.0 KiB
C#
54 lines
2.0 KiB
C#
using IM.Commons.IntegrationEvents;
|
|
using MassTransit;
|
|
using MediatR;
|
|
using MessageService.Domain.Events;
|
|
using MessageService.Domain.IReposities;
|
|
using MessageService.Infrastructure;
|
|
|
|
namespace MessageService.WebApi.Application.EventHandlers
|
|
{
|
|
public class MessageHandler : INotificationHandler<MessageCreatedDomainEvent>, INotificationHandler<MessageWithdrawDomainEvent>
|
|
{
|
|
private readonly IPublishEndpoint endpoint;
|
|
private readonly IConversationReposity reposity;
|
|
private readonly MessageDbContext messageDb;
|
|
|
|
public MessageHandler(IPublishEndpoint endpoint, IConversationReposity reposity, MessageDbContext messageDb)
|
|
{
|
|
this.endpoint = endpoint;
|
|
this.reposity = reposity;
|
|
this.messageDb = messageDb;
|
|
}
|
|
|
|
public async Task Handle(MessageCreatedDomainEvent notification, CancellationToken cancellationToken)
|
|
{
|
|
var message = notification.Message;
|
|
|
|
var conversations = await reposity.FindByStreamKeyAsync(message.StreamKey, cancellationToken);
|
|
foreach (var conversation in conversations)
|
|
{
|
|
conversation.UpdateLastMessage(message.Content.Fallback, message.CreationTime);
|
|
if (conversation.UserId == message.SenderId)
|
|
{
|
|
conversation.SetLastReadSequence(message.SequenceId);
|
|
}
|
|
else
|
|
{
|
|
conversation.IncrementUnread();
|
|
}
|
|
}
|
|
|
|
messageDb.Conversations.UpdateRange(conversations);
|
|
await messageDb.SaveChangesAsync(cancellationToken);
|
|
|
|
await endpoint.Publish(message.ToIntegrationEvent(), cancellationToken);
|
|
}
|
|
|
|
public async Task Handle(MessageWithdrawDomainEvent notification, CancellationToken cancellationToken)
|
|
{
|
|
var message = notification.Message;
|
|
await endpoint.Publish(new MsgWithdrawEvent(message.Id, message.State.ToString(), message.StreamKey), cancellationToken);
|
|
}
|
|
}
|
|
}
|