fix:修复已知问题
This commit is contained in:
@@ -42,7 +42,7 @@ namespace IM_API.Services
|
||||
var groupList = await (from c in _context.Conversations
|
||||
join g in _context.Groups on c.TargetId equals g.Id
|
||||
where c.UserId == userId && c.ChatType == ChatType.GROUP
|
||||
select new { c, g.Avatar, g.Name })
|
||||
select new { c, g.Avatar, g.Name,g.MaxSequenceId,g.LastMessage })
|
||||
.ToListAsync();
|
||||
|
||||
var privateDtos = privateList.Select(x =>
|
||||
@@ -58,6 +58,9 @@ namespace IM_API.Services
|
||||
var dto = _mapper.Map<ConversationVo>(x.c);
|
||||
dto.TargetAvatar = x.Avatar;
|
||||
dto.TargetName = x.Name;
|
||||
dto.UnreadCount = (int)(x.MaxSequenceId - x.c.LastReadSequenceId ?? 0);
|
||||
dto.LastSequenceId = x.MaxSequenceId;
|
||||
dto.LastMessage = x.LastMessage;
|
||||
return dto;
|
||||
});
|
||||
|
||||
|
||||
@@ -125,5 +125,16 @@ namespace IM_API.Services
|
||||
.ToListAsync();
|
||||
return list;
|
||||
}
|
||||
public async Task UpdateGroupConversationAsync(GroupUpdateConversationDto dto)
|
||||
{
|
||||
var group = await _context.Groups.FirstOrDefaultAsync(x => x.Id == dto.GroupId);
|
||||
if (group is null) return;
|
||||
group.LastMessage = dto.LastMessage;
|
||||
group.MaxSequenceId = dto.MaxSequenceId;
|
||||
group.LastSenderName = dto.LastSenderName;
|
||||
group.LastUpdateTime = dto.LastUpdateTime;
|
||||
_context.Groups.Update(group);
|
||||
await _context.SaveChangesAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ using IM_API.VOs.Message;
|
||||
using MassTransit;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using StackExchange.Redis;
|
||||
using System.Text.Json;
|
||||
using System.Text.RegularExpressions;
|
||||
using static MassTransit.Monitoring.Performance.BuiltInCounters;
|
||||
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
|
||||
@@ -26,9 +27,11 @@ namespace IM_API.Services
|
||||
//private readonly IEventBus _eventBus;
|
||||
private readonly IPublishEndpoint _endpoint;
|
||||
private readonly ISequenceIdService _sequenceIdService;
|
||||
private readonly IUserService _userService;
|
||||
public MessageService(
|
||||
ImContext context, ILogger<MessageService> logger, IMapper mapper,
|
||||
IPublishEndpoint publishEndpoint, ISequenceIdService sequenceIdService
|
||||
IPublishEndpoint publishEndpoint, ISequenceIdService sequenceIdService,
|
||||
IUserService userService
|
||||
)
|
||||
{
|
||||
_context = context;
|
||||
@@ -37,6 +40,7 @@ namespace IM_API.Services
|
||||
//_eventBus = eventBus;
|
||||
_endpoint = publishEndpoint;
|
||||
_sequenceIdService = sequenceIdService;
|
||||
_userService = userService;
|
||||
}
|
||||
|
||||
public async Task<List<MessageBaseVo>> GetMessagesAsync(int userId,MessageQueryDto dto)
|
||||
@@ -48,6 +52,7 @@ namespace IM_API.Services
|
||||
if (conversation is null) throw new BaseException(CodeDefine.CONVERSATION_NOT_FOUND);
|
||||
|
||||
var baseQuery = _context.Messages.Where(x => x.StreamKey == conversation.StreamKey);
|
||||
List<MessageBaseVo> messages = new List<MessageBaseVo>();
|
||||
if (dto.Direction == 0) // Before: 找比锚点小的,按倒序排
|
||||
{
|
||||
if (dto.Cursor.HasValue)
|
||||
@@ -59,20 +64,41 @@ namespace IM_API.Services
|
||||
.Select(m => _mapper.Map<MessageBaseVo>(m))
|
||||
.ToListAsync();
|
||||
|
||||
return list.OrderBy(s => s.SequenceId).ToList();
|
||||
messages = list.OrderBy(s => s.SequenceId).ToList();
|
||||
}
|
||||
else // After: 找比锚点大的,按正序排(用于补洞或刷新)
|
||||
{
|
||||
// 如果 Cursor 为空且是 After,逻辑上说不通,通常直接返回空或报错
|
||||
if (!dto.Cursor.HasValue) return new List<MessageBaseVo>();
|
||||
|
||||
return await baseQuery
|
||||
messages = await baseQuery
|
||||
.Where(m => m.SequenceId > dto.Cursor.Value)
|
||||
.OrderBy(m => m.SequenceId) // 按时间线正序
|
||||
.Take(dto.Limit)
|
||||
.Select(m => _mapper.Map<MessageBaseVo>(m))
|
||||
.ToListAsync();
|
||||
}
|
||||
//取发送者信息,用于前端展示
|
||||
if(messages.Count > 0)
|
||||
{
|
||||
var ids = messages
|
||||
.Select(s => s.SenderId)
|
||||
.Distinct()
|
||||
.ToList();
|
||||
var userinfoList = await _userService.GetUserInfoListAsync(ids);
|
||||
// 转为字典,提高查询效率
|
||||
var userDict = userinfoList.ToDictionary(x => x.Id, x => x);
|
||||
|
||||
foreach (var item in messages)
|
||||
{
|
||||
if(userDict.TryGetValue(item.SenderId, out var user))
|
||||
{
|
||||
item.SenderName = user.NickName;
|
||||
item.SenderAvatar = user.Avatar ?? "";
|
||||
}
|
||||
}
|
||||
}
|
||||
return messages;
|
||||
}
|
||||
|
||||
public Task<int> GetUnreadCountAsync(int userId)
|
||||
|
||||
Reference in New Issue
Block a user