using Hutopy.Modules.Contents.Data; namespace Hutopy.Modules.Contents.Features; [PublicAPI] public record GetAlbumRequest( Guid AlbumId); [PublicAPI] public record AlbumPhotoDto( Guid Id, string OriginalUrl, string ThumbnailUrl, string? Caption, int Order, DateTimeOffset CreatedAt); [PublicAPI] public record GetAlbumResponse( Guid Id, string Title, IReadOnlyList Photos, DateTimeOffset CreatedAt); [PublicAPI] public sealed class GetAlbumRequestValidator : Validator { public GetAlbumRequestValidator() { RuleFor(x => x.AlbumId) .NotNull() .NotEmpty(); } } [PublicAPI] public class GetAlbumHandler( ContentsDbContext context) : Endpoint { public override void Configure() { AllowAnonymous(); Get("/api/albums/{AlbumId}"); Options(o => o.WithTags("Albums")); } public override async Task HandleAsync( GetAlbumRequest request, CancellationToken ct) { Album? album = await context .Albums .Include(a => a.Photos.OrderBy(p => p.Order)) .SingleOrDefaultAsync( a => a.Id == request.AlbumId, ct); if (album is null) { await SendNotFoundAsync(ct); return; } List photos = album.Photos .Select(p => new AlbumPhotoDto( p.Id, p.OriginalUrl, p.ThumbnailUrl, p.Caption, p.Order, p.CreatedAt)) .ToList(); await SendOkAsync( new GetAlbumResponse( album.Id, album.Title, photos, album.CreatedAt), ct); } }