Use wrapper class for get all api endpoints
All checks were successful
continuous-integration/drone/push Build is passing

To enable e.g. pagination in the future
This commit is contained in:
2024-08-25 13:39:00 +02:00
parent 136dd2311d
commit d6c75654b0
4 changed files with 80 additions and 35 deletions

View File

@@ -1,27 +1,46 @@
using Microsoft.EntityFrameworkCore; using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Vegasco.WebApi.Persistence; using Vegasco.WebApi.Persistence;
namespace Vegasco.WebApi.Cars; namespace Vegasco.WebApi.Cars;
public static class GetCars public static class GetCars
{ {
public record Response(Guid Id, string Name); public class ApiResponse
{
public IEnumerable<ResponseDto> Cars { get; set; } = [];
}
public record ResponseDto(Guid Id, string Name);
public class Request
{
[FromQuery(Name = "page")] public int? Page { get; set; }
[FromQuery(Name = "pageSize")] public int? PageSize { get; set; }
}
public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder) public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder)
{ {
return builder return builder
.MapGet("cars", Endpoint) .MapGet("cars", Endpoint)
.WithDescription("Returns all cars")
.WithTags("Cars"); .WithTags("Cars");
} }
private static async Task<IResult> Endpoint( private static async Task<Ok<ApiResponse>> Endpoint(
[AsParameters] Request request,
ApplicationDbContext dbContext, ApplicationDbContext dbContext,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var cars = await dbContext.Cars List<ResponseDto> cars = await dbContext.Cars
.Select(x => new Response(x.Id.Value, x.Name)) .Select(x => new ResponseDto(x.Id.Value, x.Name))
.ToListAsync(cancellationToken); .ToListAsync(cancellationToken);
return TypedResults.Ok(cars); var response = new ApiResponse
{
Cars = cars
};
return TypedResults.Ok(response);
} }
} }

View File

@@ -1,27 +1,53 @@
using Microsoft.EntityFrameworkCore; using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Vegasco.WebApi.Persistence; using Vegasco.WebApi.Persistence;
namespace Vegasco.WebApi.Consumptions; namespace Vegasco.WebApi.Consumptions;
public static class GetConsumptions public static class GetConsumptions
{ {
public record Response(Guid Id, DateTimeOffset DateTime, double Distance, double Amount, bool IgnoreInCalculation, Guid CarId); public class ApiResponse
{
public IEnumerable<ResponseDto> Consumptions { get; set; } = [];
}
public record ResponseDto(
Guid Id,
DateTimeOffset DateTime,
double Distance,
double Amount,
bool IgnoreInCalculation,
Guid CarId);
public class Request
{
[FromQuery(Name = "page")] public int? Page { get; set; }
[FromQuery(Name = "pageSize")] public int? PageSize { get; set; }
}
public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder) public static RouteHandlerBuilder MapEndpoint(IEndpointRouteBuilder builder)
{ {
return builder return builder
.MapGet("consumptions", Endpoint) .MapGet("consumptions", Endpoint)
.WithDescription("Returns all consumption entries")
.WithTags("Consumptions"); .WithTags("Consumptions");
} }
private static async Task<IResult> Endpoint( private static async Task<Ok<ApiResponse>> Endpoint(
[AsParameters] Request request,
ApplicationDbContext dbContext, ApplicationDbContext dbContext,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var consumptions = await dbContext.Consumptions List<ResponseDto> consumptions = await dbContext.Consumptions
.Select(x => new Response(x.Id.Value, x.DateTime, x.Distance, x.Amount, x.IgnoreInCalculation, x.CarId.Value)) .Select(x =>
new ResponseDto(x.Id.Value, x.DateTime, x.Distance, x.Amount, x.IgnoreInCalculation, x.CarId.Value))
.ToListAsync(cancellationToken); .ToListAsync(cancellationToken);
return TypedResults.Ok(consumptions); var apiResponse = new ApiResponse
{
Consumptions = consumptions
};
return TypedResults.Ok(apiResponse);
} }
} }

View File

@@ -23,12 +23,12 @@ public class GetCarsTests : IAsyncLifetime
// Arrange // Arrange
// Act // Act
var response = await _factory.HttpClient.GetAsync("v1/cars"); using HttpResponseMessage response = await _factory.HttpClient.GetAsync("v1/cars");
// Assert // Assert
response.StatusCode.Should().Be(HttpStatusCode.OK); response.StatusCode.Should().Be(HttpStatusCode.OK);
var cars = await response.Content.ReadFromJsonAsync<IEnumerable<GetCars.Response>>(); var apiResponse = await response.Content.ReadFromJsonAsync<GetCars.ApiResponse>();
cars.Should().BeEmpty(); apiResponse!.Cars.Should().BeEmpty();
} }
[Fact] [Fact]
@@ -40,8 +40,8 @@ public class GetCarsTests : IAsyncLifetime
const int numberOfCars = 5; const int numberOfCars = 5;
for (var i = 0; i < numberOfCars; i++) for (var i = 0; i < numberOfCars; i++)
{ {
var createCarRequest = _carFaker.CreateCarRequest(); CreateCar.Request createCarRequest = _carFaker.CreateCarRequest();
var createCarResponse = await _factory.HttpClient.PostAsJsonAsync("v1/cars", createCarRequest); HttpResponseMessage createCarResponse = await _factory.HttpClient.PostAsJsonAsync("v1/cars", createCarRequest);
createCarResponse.EnsureSuccessStatusCode(); createCarResponse.EnsureSuccessStatusCode();
var createdCar = await createCarResponse.Content.ReadFromJsonAsync<CreateCar.Response>(); var createdCar = await createCarResponse.Content.ReadFromJsonAsync<CreateCar.Response>();
@@ -49,12 +49,12 @@ public class GetCarsTests : IAsyncLifetime
} }
// Act // Act
var response = await _factory.HttpClient.GetAsync("v1/cars"); using HttpResponseMessage response = await _factory.HttpClient.GetAsync("v1/cars");
// Assert // Assert
response.StatusCode.Should().Be(HttpStatusCode.OK); response.StatusCode.Should().Be(HttpStatusCode.OK);
var cars = await response.Content.ReadFromJsonAsync<IEnumerable<GetCars.Response>>(); var apiResponse = await response.Content.ReadFromJsonAsync<GetCars.ApiResponse>();
cars.Should().BeEquivalentTo(createdCars); apiResponse!.Cars.Should().BeEquivalentTo(createdCars);
} }
public Task InitializeAsync() => Task.CompletedTask; public Task InitializeAsync() => Task.CompletedTask;

View File

@@ -42,8 +42,8 @@ public class GetConsumptionsTests : IAsyncLifetime
// Assert // Assert
response.StatusCode.Should().Be(HttpStatusCode.OK); response.StatusCode.Should().Be(HttpStatusCode.OK);
var consumptions = await response.Content.ReadFromJsonAsync<List<GetConsumptions.Response>>(); var apiResponse = await response.Content.ReadFromJsonAsync<GetConsumptions.ApiResponse>();
consumptions.Should().BeEquivalentTo(createdConsumptions); apiResponse!.Consumptions.Should().BeEquivalentTo(createdConsumptions);
} }
[Fact] [Fact]
@@ -56,8 +56,8 @@ public class GetConsumptionsTests : IAsyncLifetime
// Assert // Assert
response.StatusCode.Should().Be(HttpStatusCode.OK); response.StatusCode.Should().Be(HttpStatusCode.OK);
var consumptions = await response.Content.ReadFromJsonAsync<List<GetConsumptions.Response>>(); var apiResponse = await response.Content.ReadFromJsonAsync<GetConsumptions.ApiResponse>();
consumptions.Should().BeEmpty(); apiResponse!.Consumptions.Should().BeEmpty();
} }
private async Task<CreateConsumption.Response> CreateConsumptionAsync() private async Task<CreateConsumption.Response> CreateConsumptionAsync()