using Hutopy.Infrastructure.Security; using Hutopy.Modules.Contents.Data; namespace Hutopy.Modules.Contents.Features; [PublicAPI] public record CreateAlbumRequest( Guid AlbumId, string Title, string? Description = null); [PublicAPI] public record CreateAlbumResponse( Guid AlbumId); [PublicAPI] public sealed class CreateAlbumRequestValidator : Validator { public CreateAlbumRequestValidator() { RuleFor(x => x.AlbumId) .NotNull() .NotEmpty(); RuleFor(x => x.Title) .NotNull() .NotEmpty() .MaximumLength(255); RuleFor(x => x.Description) .MaximumLength(1000); } } [PublicAPI] public class CreateAlbumHandler( ContentsDbContext context) : Endpoint { public override void Configure() { Post("/api/albums"); Options(o => o.WithTags("Albums")); } public override async Task HandleAsync( CreateAlbumRequest request, CancellationToken ct) { // Check if an album with the same ID already exists bool existingAlbum = await context .Albums .AnyAsync(a => a.Id == request.AlbumId, ct); if (existingAlbum) { await SendErrorsAsync(409, ct); return; } Album album = new() { Id = request.AlbumId, CreatedBy = User.GetUserId(), Title = request.Title }; context.Albums.Add(album); await context.SaveChangesAsync(ct); await SendOkAsync( new CreateAlbumResponse(album.Id), ct); } }