using IM.Commons.IntegrationEvents; using MassTransit; using MessageService.Domain.IReposities; using MessageService.Infrastructure; namespace MessageService.WebApi.Application.EventHandlers { public class ConversationAddHandler : IConsumer, IConsumer, IConsumer { private readonly IConversationReposity reposity; private readonly MessageDbContext messageDb; public ConversationAddHandler(IConversationReposity reposity, MessageDbContext messageDb) { this.reposity = reposity; this.messageDb = messageDb; } public async Task Consume(ConsumeContext context) { var @event = context.Message; var existing = await reposity.FindByTargetIdAsync(@event.GroupId); if (existing.Any(x => x.UserId == @event.UserId && x.ChatType == Domain.Enums.ChatType.GROUP)) { return; } reposity.Create(new Domain.Entities.Conversation( userId: @event.UserId, targetId: @event.GroupId, targetAvatar: @event.GroupAvatar ?? @event.Avatar, targetName: @event.GroupName, lastReadSequenceId: null, unreadCount:0, chatType: Domain.Enums.ChatType.GROUP, lastMessage: string.Empty )); await messageDb.SaveChangesAsync(context.CancellationToken); } public async Task Consume(ConsumeContext context) { var @event = context.Message; var existing = await reposity.FindByUserIdAsync(@event.OwnerId); if (existing.Any(x => x.TargetId == @event.TargetId && x.ChatType == Domain.Enums.ChatType.PRIVATE)) { return; } reposity.Create(new Domain.Entities.Conversation( userId: @event.OwnerId, targetId: @event.TargetId, targetAvatar: @event.TargetAvatar, targetName: @event.TargetNickName, lastReadSequenceId: null, unreadCount: 0, chatType: Domain.Enums.ChatType.PRIVATE, lastMessage: string.Empty )); await messageDb.SaveChangesAsync(context.CancellationToken); } public async Task Consume(ConsumeContext context) { var conversations = await reposity.FindByTargetIdAsync(context.Message.GroupId); foreach (var conversation in conversations.Where(x => x.UserId == context.Message.UserId && x.ChatType == Domain.Enums.ChatType.GROUP)) { conversation.SoftDelete(); } await messageDb.SaveChangesAsync(context.CancellationToken); } } }