Use wrapper class for get all api endpoints
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
To enable e.g. pagination in the future
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user