Files
IM_NEW/MessageService.Infrastructure/Reposities/MessageReposity.cs
T
2026-05-09 17:06:30 +08:00

56 lines
1.7 KiB
C#

using MessageService.Domain.Entities;
using MessageService.Domain.IReposities;
using Microsoft.EntityFrameworkCore;
namespace MessageService.Infrastructure.Reposities
{
public class MessageReposity : IMessageReposity
{
private readonly MessageDbContext db;
public MessageReposity(MessageDbContext db)
{
this.db = db;
}
public void Create(Message message)
{
db.Messages.Add(message);
}
public async Task<Message?> FindByIdAsync(Guid id)
{
return await db.Messages.FirstOrDefaultAsync(x => x.Id == id);
}
public async Task<(IEnumerable<Message> messages, bool hasMore)> GetAsync(string streamKey, long? cusor, int direction, int limit)
{
var query = db.Messages.Where(x => x.StreamKey == streamKey);
List<Message> messages = [];
if (direction == 0) // Before: 找比锚点小的,按倒序排
{
if (cusor.HasValue)
query = query.Where(m => m.SequenceId < cusor.Value);
var list = await query
.OrderByDescending(m => m.SequenceId) // 最新消息在最前
.Take(limit + 1)
.ToListAsync();
messages = [.. list.OrderBy(s => s.SequenceId)];
}
else
{
if (cusor is null)
return (messages, false);
messages = await query.OrderBy(o => o.SequenceId)
.Take(limit + 1)
.ToListAsync();
}
return (messages, messages.Count > limit);
}
}
}