using Hutopy.Infrastructure.Security; using Hutopy.Modules.Creators.Data; namespace Hutopy.Modules.Creators.Features; [PublicAPI] public record ChangeEmailRequest( Guid CreatorId, string? Email); [PublicAPI] public sealed class ChangeEmailRequestValidator : Validator { public ChangeEmailRequestValidator() { RuleFor(x => x.CreatorId) .NotEmpty() .WithMessage("Creator ID is required"); RuleFor(x => x.Email) .Must(email => email == null || !string.IsNullOrWhiteSpace(email)) .WithMessage("Email cannot be empty if provided"); } } [PublicAPI] public class ChangeEmailHandler( CreatorsDbContext context) : Endpoint { public override void Configure() { Post("/api/creators/{CreatorId}/email"); Options(o => o.WithTags("Creators")); } public override async Task HandleAsync( ChangeEmailRequest request, CancellationToken ct) { Creator? creator = await context .Creators .Include(c => c.Presentation) .SingleOrDefaultAsync( c => c.Id == request.CreatorId, ct); if (creator is null) { await SendNotFoundAsync(ct); return; } // Check if the current user is the creator if (creator.CreatedBy != User.GetUserId()) { await SendUnauthorizedAsync(ct); return; } creator.Presentation.Email = request.Email?.Trim(); await context.SaveChangesAsync(ct); await SendOkAsync(ct); } }