2024-08-23 18:02:18 +02:00
|
|
|
|
using FluentValidation;
|
|
|
|
|
|
using FluentValidation.Results;
|
2025-06-12 18:22:37 +02:00
|
|
|
|
using Vegasco.Server.Api.Common;
|
|
|
|
|
|
using Vegasco.Server.Api.Persistence;
|
2024-08-23 18:02:18 +02:00
|
|
|
|
|
2025-06-12 18:22:37 +02:00
|
|
|
|
namespace Vegasco.Server.Api.Consumptions;
|
2024-08-23 18:02:18 +02:00
|
|
|
|
|
|
|
|
|
|
public static class UpdateConsumption
|
|
|
|
|
|
{
|
|
|
|
|
|
public record Request(DateTimeOffset DateTime, double Distance, double Amount, bool IgnoreInCalculation);
|
|
|
|
|
|
|
|
|
|
|
|
public record Response(Guid Id, DateTimeOffset DateTime, double Distance, double Amount, bool IgnoreInCalculation, Guid CarId);
|
|
|
|
|
|
|
|
|
|
|
|
public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
|
|
|
|
|
{
|
|
|
|
|
|
return builder
|
|
|
|
|
|
.MapPut("consumptions/{id:guid}", Endpoint)
|
2025-06-16 20:28:37 +02:00
|
|
|
|
.WithTags("Consumptions")
|
2025-06-16 20:34:09 +02:00
|
|
|
|
.WithDescription("Updates a consumption entry by ID")
|
2025-06-16 20:28:37 +02:00
|
|
|
|
.Produces<Response>()
|
|
|
|
|
|
.ProducesValidationProblem()
|
|
|
|
|
|
.Produces(404);
|
2024-08-23 18:02:18 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public class Validator : AbstractValidator<Request>
|
|
|
|
|
|
{
|
|
|
|
|
|
public Validator(TimeProvider timeProvider)
|
|
|
|
|
|
{
|
|
|
|
|
|
RuleFor(x => x.DateTime.ToUniversalTime())
|
|
|
|
|
|
.LessThanOrEqualTo(timeProvider.GetUtcNow())
|
|
|
|
|
|
.WithName(nameof(Request.DateTime));
|
|
|
|
|
|
|
|
|
|
|
|
RuleFor(x => x.Distance)
|
|
|
|
|
|
.GreaterThan(0);
|
|
|
|
|
|
|
|
|
|
|
|
RuleFor(x => x.Amount)
|
|
|
|
|
|
.GreaterThan(0);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private static async Task<IResult> Endpoint(
|
|
|
|
|
|
ApplicationDbContext dbContext,
|
|
|
|
|
|
Guid id,
|
|
|
|
|
|
Request request,
|
|
|
|
|
|
IEnumerable<IValidator<Request>> validators,
|
|
|
|
|
|
CancellationToken cancellationToken)
|
|
|
|
|
|
{
|
|
|
|
|
|
List<ValidationResult> failedValidations = await validators.ValidateAllAsync(request, cancellationToken);
|
|
|
|
|
|
if (failedValidations.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
return TypedResults.BadRequest(new HttpValidationProblemDetails(failedValidations.ToCombinedDictionary()));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Consumption? consumption = await dbContext.Consumptions.FindAsync([new ConsumptionId(id)], cancellationToken);
|
|
|
|
|
|
if (consumption is null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return TypedResults.NotFound();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
consumption.DateTime = request.DateTime.ToUniversalTime();
|
|
|
|
|
|
consumption.Distance = request.Distance;
|
|
|
|
|
|
consumption.Amount = request.Amount;
|
|
|
|
|
|
consumption.IgnoreInCalculation = request.IgnoreInCalculation;
|
|
|
|
|
|
|
|
|
|
|
|
await dbContext.SaveChangesAsync(cancellationToken);
|
|
|
|
|
|
|
|
|
|
|
|
return TypedResults.Ok(new Response(consumption.Id.Value, consumption.DateTime, consumption.Distance, consumption.Amount, consumption.IgnoreInCalculation, consumption.CarId.Value));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|