From e9cf678a2bbceb28029266e74874e70417b2988f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 16:51:22 +0100 Subject: [PATCH 1/2] Fix note --- src/Turnierplan.App/Endpoints/Images/UploadImageEndpoint.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Turnierplan.App/Endpoints/Images/UploadImageEndpoint.cs b/src/Turnierplan.App/Endpoints/Images/UploadImageEndpoint.cs index e03f37df..7d4d4ad0 100644 --- a/src/Turnierplan.App/Endpoints/Images/UploadImageEndpoint.cs +++ b/src/Turnierplan.App/Endpoints/Images/UploadImageEndpoint.cs @@ -24,8 +24,7 @@ internal sealed class UploadImageEndpoint : EndpointBase protected override Delegate Handler => Handle; private static async Task Handle( - // Note the usage of [FromForm] instead of [FromBody] - [FromForm] UploadImageEndpointRequest request, + [FromForm] UploadImageEndpointRequest request, // Note: We use [FromForm] instead of [FromBody] IOrganizationRepository organizationRepository, IAccessValidator accessValidator, IImageStorage imageStorage, From 01475882f12901c73b1e05d63b1788e6ffe3b30e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sat, 24 Jan 2026 17:19:41 +0100 Subject: [PATCH 2/2] Add endpoint --- .../Endpoints/Images/SetImageNameEndpoint.cs | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/Turnierplan.App/Endpoints/Images/SetImageNameEndpoint.cs diff --git a/src/Turnierplan.App/Endpoints/Images/SetImageNameEndpoint.cs b/src/Turnierplan.App/Endpoints/Images/SetImageNameEndpoint.cs new file mode 100644 index 00000000..a04c4491 --- /dev/null +++ b/src/Turnierplan.App/Endpoints/Images/SetImageNameEndpoint.cs @@ -0,0 +1,64 @@ +using FluentValidation; +using Microsoft.AspNetCore.Mvc; +using Turnierplan.App.Extensions; +using Turnierplan.App.Security; +using Turnierplan.Core.PublicId; +using Turnierplan.Dal.Repositories; + +namespace Turnierplan.App.Endpoints.Images; + +internal sealed class SetImageNameEndpoint : EndpointBase +{ + protected override HttpMethod Method => HttpMethod.Patch; + + protected override string Route => "/api/images/{id}/name"; + + protected override Delegate Handler => Handle; + + private static async Task Handle( + [FromRoute] PublicId id, + [FromBody] SetImageNameEndpointRequest request, + IImageRepository repository, + IAccessValidator accessValidator, + CancellationToken cancellationToken) + { + if (!Validator.Instance.ValidateAndGetResult(request, out var result)) + { + return result; + } + + var image = await repository.GetByPublicIdAsync(id); + + if (image is null) + { + return Results.NotFound(); + } + + if (!accessValidator.IsActionAllowed(image, Actions.GenericWrite)) + { + return Results.Forbid(); + } + + image.Name = request.Name; + + await repository.UnitOfWork.SaveChangesAsync(cancellationToken); + + return Results.NoContent(); + } + + public sealed record SetImageNameEndpointRequest + { + public required string Name { get; init; } + } + + private sealed class Validator : AbstractValidator + { + public static readonly Validator Instance = new(); + + private Validator() + { + RuleFor(x => x.Name) + .NotEmpty(); + } + } +}