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, INotificationHandler { 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); } } }