74 lines
2.2 KiB
C#
74 lines
2.2 KiB
C#
|
|
using FluentValidation;
|
|||
|
|
using FluentValidation.Results;
|
|||
|
|
using Vegasco.WebApi.Cars;
|
|||
|
|
using Vegasco.WebApi.Common;
|
|||
|
|
using Vegasco.WebApi.Persistence;
|
|||
|
|
|
|||
|
|
namespace Vegasco.WebApi.Consumptions;
|
|||
|
|
|
|||
|
|
public static class CreateConsumption
|
|||
|
|
{
|
|||
|
|
public record Request(DateTimeOffset DateTime, double Distance, double Amount, bool IgnoreInCalculation, Guid CarId);
|
|||
|
|
|
|||
|
|
public record Response(Guid Id, DateTimeOffset DateTime, double Distance, double Amount, bool IgnoreInCalculation, Guid CarId);
|
|||
|
|
|
|||
|
|
public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
|||
|
|
{
|
|||
|
|
return builder
|
|||
|
|
.MapPost("consumptions", Endpoint)
|
|||
|
|
.WithTags("Consumptions");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
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);
|
|||
|
|
|
|||
|
|
RuleFor(x => x.CarId)
|
|||
|
|
.NotEmpty();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static async Task<IResult> Endpoint(
|
|||
|
|
ApplicationDbContext dbContext,
|
|||
|
|
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()));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Car? car = await dbContext.Cars.FindAsync([new CarId(request.CarId)], cancellationToken);
|
|||
|
|
if (car is null)
|
|||
|
|
{
|
|||
|
|
return TypedResults.NotFound();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var consumption = new Consumption
|
|||
|
|
{
|
|||
|
|
DateTime = request.DateTime.ToUniversalTime(),
|
|||
|
|
Distance = request.Distance,
|
|||
|
|
Amount = request.Amount,
|
|||
|
|
IgnoreInCalculation = request.IgnoreInCalculation,
|
|||
|
|
CarId = new CarId(request.CarId)
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
dbContext.Consumptions.Add(consumption);
|
|||
|
|
await dbContext.SaveChangesAsync(cancellationToken);
|
|||
|
|
|
|||
|
|
return TypedResults.Created($"consumptions/{consumption.Id.Value}",
|
|||
|
|
new Response(consumption.Id.Value, consumption.DateTime, consumption.Distance, consumption.Amount, consumption.IgnoreInCalculation, consumption.CarId.Value));
|
|||
|
|
}
|
|||
|
|
}
|