using Hutopy.Web.Features.Messages.Handlers.Models; namespace Hutopy.Web.Features.Messages.Data; public class MessagingDbContext( DbContextOptions options) : DbContext(options) { public const string SchemaName = "Messaging"; protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.HasDefaultSchema(SchemaName); modelBuilder .Entity() .Property(c => c.CreatedAt) .ValueGeneratedOnAdd() .HasDefaultValueSql("CURRENT_TIMESTAMP"); } public DbSet Messages { get; set; } public async Task> GetMessagesAsync( Guid subjectId, Guid? parentId, Guid? lastId, int pageSize, CancellationToken ct = default) { var query = Messages .Where(c => c.SubjectId == subjectId) .Where(c => c.ParentId == parentId); if (lastId.HasValue) { var lastMessage = await Messages .Where(c => c.Id == lastId.Value) .Select(c => new { c.CreatedAt, c.Id }) .FirstOrDefaultAsync(cancellationToken: ct); if (lastMessage != null) { query = query .Where(c => c.CreatedAt < lastMessage.CreatedAt || (c.CreatedAt == lastMessage.CreatedAt && c.Id < lastMessage.Id)); } } var messages = await query .OrderByDescending(c => c.CreatedAt) .ThenByDescending(c => c.Id) .Take(pageSize) .Select(message => message.ToDto()) .ToListAsync(cancellationToken: ct); return messages; } }