前端:
1、优化消息排序逻辑 2、新增加载历史消息 3、修复已知问题 后端: 1、优化消息排序逻辑 2、增加用户信息缓存机制 3、修改日期类型为DateTimeOffset改善时区信息丢失问题 3、修复了已知问题 数据库: 1、新增SequenceId字段用于消息排序 2、新增ClientMsgId字段用于客户端消息回执
This commit is contained in:
+2
-2
@@ -26,10 +26,10 @@ namespace IM_API.Application.EventHandlers.FriendAddHandler
|
||||
{
|
||||
ChatType = ChatType.PRIVATE,
|
||||
Content = "您有新的好友关系已添加",
|
||||
MsgId = @event.EventId.ToString(),
|
||||
//MsgId = @event.EventId.ToString(),
|
||||
ReceiverId = @event.ResponseUserId,
|
||||
SenderId = @event.RequestUserId,
|
||||
TimeStamp = DateTime.UtcNow
|
||||
TimeStamp = DateTime.Now
|
||||
});
|
||||
await _chathub.Clients.Users(usersList).SendAsync("ReceiveMessage", res);
|
||||
}
|
||||
|
||||
+8
-21
@@ -35,28 +35,15 @@ namespace IM_API.Application.EventHandlers.MessageCreatedHandler
|
||||
public async Task Consume(ConsumeContext<MessageCreatedEvent> context)
|
||||
{
|
||||
var @event = context.Message;
|
||||
|
||||
if (@event.ChatType == ChatType.PRIVATE)
|
||||
await _conversationService.UpdateConversationAfterSentAsync(new Dtos.Conversation.UpdateConversationDto
|
||||
{
|
||||
Conversation? userAConversation = await _context.Conversations.FirstOrDefaultAsync(
|
||||
x => x.UserId == @event.MsgSenderId && x.TargetId == @event.MsgRecipientId
|
||||
);
|
||||
Conversation? userBConversation = await _context.Conversations.FirstOrDefaultAsync(
|
||||
x => x.UserId == @event.MsgRecipientId && x.TargetId == @event.MsgSenderId
|
||||
);
|
||||
if (userAConversation is null || userBConversation is null)
|
||||
{
|
||||
_logger.LogError("消息事件更新会话信息失败:{@event}", @event);
|
||||
}
|
||||
userAConversation.LastMessage = @event.MessageContent;
|
||||
userAConversation.LastReadMessageId = @event.MessageId;
|
||||
userAConversation.LastMessageTime = @event.MessageCreated;
|
||||
userBConversation.LastMessage = @event.MessageContent;
|
||||
userBConversation.UnreadCount += 1;
|
||||
userBConversation.LastMessageTime = @event.MessageCreated;
|
||||
_context.UpdateRange(userAConversation, userBConversation);
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
LastMessage = @event.MessageContent,
|
||||
LastSequenceId = @event.SequenceId,
|
||||
ReceiptId = @event.MsgRecipientId,
|
||||
SenderId = @event.MsgSenderId,
|
||||
StreamKey = @event.StreamKey,
|
||||
DateTime = @event.MessageCreated
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
using IM_API.Domain.Events;
|
||||
using MassTransit;
|
||||
using IM_API.Interface.Services;
|
||||
using AutoMapper;
|
||||
using IM_API.Models;
|
||||
|
||||
namespace IM_API.Application.EventHandlers.MessageCreatedHandler
|
||||
{
|
||||
public class MessageCreatedDbHandler : IConsumer<MessageCreatedEvent>
|
||||
{
|
||||
private readonly IMessageSevice _messageService;
|
||||
public readonly IMapper _mapper;
|
||||
public MessageCreatedDbHandler(IMessageSevice messageSevice, IMapper mapper)
|
||||
{
|
||||
_messageService = messageSevice;
|
||||
_mapper = mapper;
|
||||
}
|
||||
|
||||
public async Task Consume(ConsumeContext<MessageCreatedEvent> context)
|
||||
{
|
||||
var @event = context.Message;
|
||||
var msg = _mapper.Map<Message>(@event);
|
||||
await _messageService.MakeMessageAsync(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
+24
-13
@@ -5,6 +5,7 @@ using IM_API.Dtos;
|
||||
using IM_API.Hubs;
|
||||
using IM_API.Models;
|
||||
using IM_API.Tools;
|
||||
using IM_API.VOs.Message;
|
||||
using MassTransit;
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
|
||||
@@ -22,21 +23,31 @@ namespace IM_API.Application.EventHandlers.MessageCreatedHandler
|
||||
|
||||
public async Task Consume(ConsumeContext<MessageCreatedEvent> context)
|
||||
{
|
||||
Console.ForegroundColor = ConsoleColor.Red;
|
||||
var @event = context.Message;
|
||||
if (@event.ChatType == Models.ChatType.PRIVATE)
|
||||
Console.WriteLine($"[SignalR]handlerCreated!");
|
||||
try
|
||||
{
|
||||
MessageBaseDto messageBaseDto = new MessageBaseDto
|
||||
{
|
||||
MsgId = @event.MessageId.ToString(),
|
||||
ChatType = @event.ChatType,
|
||||
Content = @event.MessageContent,
|
||||
GroupMemberId = null,
|
||||
ReceiverId = @event.MsgRecipientId,
|
||||
SenderId = @event.MsgSenderId,
|
||||
TimeStamp = @event.MessageCreated,
|
||||
Type = @event.MessageMsgType
|
||||
};
|
||||
await _hub.Clients.Users(@event.MsgRecipientId.ToString()).SendAsync("ReceiveMessage", messageBaseDto);
|
||||
// 先转成实体,如果这一步都报错,说明之前的 sbyte -> enum 还没改好
|
||||
var entity = _mapper.Map<Message>(@event);
|
||||
|
||||
// 再从实体转 VO,这是最稳妥的路径,因为这两者的映射你肯定配过了
|
||||
var messageBaseVo = _mapper.Map<MessageBaseVo>(entity);
|
||||
|
||||
// 2. 打印日志确认逻辑执行到这里了
|
||||
Console.WriteLine($"[SignalR] 准备向所有人广播消息: {messageBaseVo.Content}");
|
||||
|
||||
// 3. 执行广播
|
||||
await _hub.Clients.User(@event.MsgRecipientId.ToString()).SendAsync("ReceiveMessage", new HubResponse<MessageBaseVo>("Event", messageBaseVo));
|
||||
|
||||
Console.WriteLine("[SignalR] 广播指令已发出");
|
||||
Console.ResetColor();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[SignalR] 发送失败: {ex.Message}");
|
||||
Console.ResetColor();
|
||||
throw; // 抛出异常触发 MassTransit 重试
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user