using Hutopy.Web.Extensions; using Hutopy.Web.Features.Contents.Data; using Hutopy.Web.Features.Contents.Handlers.Models; namespace Hutopy.Web.Features.Contents.Handlers; [PublicAPI] public sealed class GetFeaturedContentsRequest { [BindFrom("page_size")] public int PageSize { get; set; } = 10; [BindFrom("last_id")] public Guid? LastId { get; set; } } [PublicAPI] public class GetFeaturedContentsHandler( ContentDbContext context) : Endpoint> { public override void Configure() { Get("/api/contents/featured"); Options(o => o.WithTags("Contents")); AllowAnonymous(); } public override async Task HandleAsync( GetFeaturedContentsRequest req, CancellationToken ct) { var query = context.Contents .Where(c => c.DeletedAt == null); if (req.LastId.HasValue) { query = query.Where(c => c.Id > req.LastId.Value); } query = query.OrderByDescending(x => x.Reactions.Count); var content = await query .Select(c => new ContentModel { Id = c.Id, CreatedBy = c.CreatedBy, CreatedByName = c.Creator!.Name, CreatedByPortraitUrl = c.Creator.Images.Logo, CreatedAt = c.CreatedAt, ColorMenu = c.Creator.Colors.Menu, ColorAccent = c.Creator.Colors.Accent, DeletedBy = c.DeletedBy, DeletedAt = c.DeletedAt, Title = c.Title, Description = c.Description, Urls = c.Urls, Reactions = c.Reactions.Select(x => new ReactionModel { Reaction = x.Reaction.FromEnum(), UserId = x.UserId, UserName = x.UserName }).ToList() }) .Take(req.PageSize) .ToListAsync(ct); await SendAsync(content, cancellation: ct); } }