Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions src/Turnierplan.App/Endpoints/Images/SetImageNameEndpoint.cs
Original file line number Diff line number Diff line change
@@ -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<IResult> 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<SetImageNameEndpointRequest>
{
public static readonly Validator Instance = new();

private Validator()
{
RuleFor(x => x.Name)
.NotEmpty();
}
}
}
3 changes: 1 addition & 2 deletions src/Turnierplan.App/Endpoints/Images/UploadImageEndpoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ internal sealed class UploadImageEndpoint : EndpointBase<ImageDto>
protected override Delegate Handler => Handle;

private static async Task<IResult> 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,
Expand Down
Loading