mirror of
https://github.com/meysamhadeli/booking-microservices.git
synced 2026-04-25 23:04:05 +08:00
Merge pull request #236 from meysamhadeli/feat/add-result-model-for-handlers
feat: Add result model for handlers for better structure in vertical …
This commit is contained in:
commit
1e6f5b8ce3
@ -13,11 +13,13 @@ using FluentValidation;
|
|||||||
using Models.ValueObjects;
|
using Models.ValueObjects;
|
||||||
using Passenger;
|
using Passenger;
|
||||||
|
|
||||||
public record CreateBooking(long PassengerId, long FlightId, string Description) : ICommand<ulong>, IInternalCommand
|
public record CreateBooking(long PassengerId, long FlightId, string Description) : ICommand<CreateBookingResult>, IInternalCommand
|
||||||
{
|
{
|
||||||
public long Id { get; init; } = SnowFlakIdGenerator.NewId();
|
public long Id { get; init; } = SnowFlakIdGenerator.NewId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public record CreateBookingResult(ulong Id);
|
||||||
|
|
||||||
internal class CreateBookingValidator : AbstractValidator<CreateBooking>
|
internal class CreateBookingValidator : AbstractValidator<CreateBooking>
|
||||||
{
|
{
|
||||||
public CreateBookingValidator()
|
public CreateBookingValidator()
|
||||||
@ -27,7 +29,7 @@ internal class CreateBookingValidator : AbstractValidator<CreateBooking>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class CreateBookingCommandHandler : ICommandHandler<CreateBooking, ulong>
|
internal class CreateBookingCommandHandler : ICommandHandler<CreateBooking, CreateBookingResult>
|
||||||
{
|
{
|
||||||
private readonly IEventStoreDBRepository<Models.Booking> _eventStoreDbRepository;
|
private readonly IEventStoreDBRepository<Models.Booking> _eventStoreDbRepository;
|
||||||
private readonly ICurrentUserProvider _currentUserProvider;
|
private readonly ICurrentUserProvider _currentUserProvider;
|
||||||
@ -48,7 +50,7 @@ internal class CreateBookingCommandHandler : ICommandHandler<CreateBooking, ulon
|
|||||||
_passengerGrpcServiceClient = passengerGrpcServiceClient;
|
_passengerGrpcServiceClient = passengerGrpcServiceClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ulong> Handle(CreateBooking command, CancellationToken cancellationToken)
|
public async Task<CreateBookingResult> Handle(CreateBooking command, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(command, nameof(command));
|
Guard.Against.Null(command, nameof(command));
|
||||||
|
|
||||||
@ -90,6 +92,6 @@ internal class CreateBookingCommandHandler : ICommandHandler<CreateBooking, ulon
|
|||||||
aggrigate,
|
aggrigate,
|
||||||
cancellationToken);
|
cancellationToken);
|
||||||
|
|
||||||
return result;
|
return new CreateBookingResult(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Routing;
|
|||||||
using Swashbuckle.AspNetCore.Annotations;
|
using Swashbuckle.AspNetCore.Annotations;
|
||||||
|
|
||||||
public record CreateBookingRequestDto(long PassengerId, long FlightId, string Description);
|
public record CreateBookingRequestDto(long PassengerId, long FlightId, string Description);
|
||||||
|
public record CreateBookingResponseDto(ulong Id);
|
||||||
|
|
||||||
public class CreateBookingEndpoint : IMinimalEndpoint
|
public class CreateBookingEndpoint : IMinimalEndpoint
|
||||||
{
|
{
|
||||||
@ -25,7 +26,7 @@ public class CreateBookingEndpoint : IMinimalEndpoint
|
|||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status200OK,
|
StatusCodes.Status200OK,
|
||||||
"Booking Created",
|
"Booking Created",
|
||||||
typeof(ulong)))
|
typeof(CreateBookingResponseDto)))
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status400BadRequest,
|
StatusCodes.Status400BadRequest,
|
||||||
@ -48,6 +49,8 @@ public class CreateBookingEndpoint : IMinimalEndpoint
|
|||||||
|
|
||||||
var result = await mediator.Send(command, cancellationToken);
|
var result = await mediator.Send(command, cancellationToken);
|
||||||
|
|
||||||
return Results.Ok(result);
|
var response = new CreateBookingResponseDto(result.Id);
|
||||||
|
|
||||||
|
return Results.Ok(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -41,7 +41,7 @@ namespace Integration.Test.Booking.Features
|
|||||||
var response = await Fixture.SendAsync(command);
|
var response = await Fixture.SendAsync(command);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response.Should().BeGreaterOrEqualTo(0);
|
response?.Id.Should().BeGreaterOrEqualTo(0);
|
||||||
|
|
||||||
(await Fixture.WaitForPublishing<BookingCreated>()).Should().Be(true);
|
(await Fixture.WaitForPublishing<BookingCreated>()).Should().Be(true);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,11 +15,13 @@ using MapsterMapper;
|
|||||||
using MediatR;
|
using MediatR;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
public record CreateAircraft(string Name, string Model, int ManufacturingYear) : ICommand<AircraftDto>, IInternalCommand
|
public record CreateAircraft(string Name, string Model, int ManufacturingYear) : ICommand<CreateAircraftResult>, IInternalCommand
|
||||||
{
|
{
|
||||||
public long Id { get; init; } = SnowFlakIdGenerator.NewId();
|
public long Id { get; init; } = SnowFlakIdGenerator.NewId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public record CreateAircraftResult(long Id);
|
||||||
|
|
||||||
internal class CreateAircraftValidator : AbstractValidator<CreateAircraft>
|
internal class CreateAircraftValidator : AbstractValidator<CreateAircraft>
|
||||||
{
|
{
|
||||||
public CreateAircraftValidator()
|
public CreateAircraftValidator()
|
||||||
@ -30,18 +32,16 @@ internal class CreateAircraftValidator : AbstractValidator<CreateAircraft>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class CreateAircraftHandler : IRequestHandler<CreateAircraft, AircraftDto>
|
internal class CreateAircraftHandler : IRequestHandler<CreateAircraft, CreateAircraftResult>
|
||||||
{
|
{
|
||||||
private readonly FlightDbContext _flightDbContext;
|
private readonly FlightDbContext _flightDbContext;
|
||||||
private readonly IMapper _mapper;
|
|
||||||
|
|
||||||
public CreateAircraftHandler(IMapper mapper, FlightDbContext flightDbContext)
|
public CreateAircraftHandler(FlightDbContext flightDbContext)
|
||||||
{
|
{
|
||||||
_mapper = mapper;
|
|
||||||
_flightDbContext = flightDbContext;
|
_flightDbContext = flightDbContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<AircraftDto> Handle(CreateAircraft request, CancellationToken cancellationToken)
|
public async Task<CreateAircraftResult> Handle(CreateAircraft request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(request, nameof(request));
|
Guard.Against.Null(request, nameof(request));
|
||||||
|
|
||||||
@ -54,10 +54,8 @@ internal class CreateAircraftHandler : IRequestHandler<CreateAircraft, AircraftD
|
|||||||
|
|
||||||
var aircraftEntity = Aircraft.Create(request.Id, request.Name, request.Model, request.ManufacturingYear);
|
var aircraftEntity = Aircraft.Create(request.Id, request.Name, request.Model, request.ManufacturingYear);
|
||||||
|
|
||||||
var newAircraft = await _flightDbContext.Aircraft.AddAsync(aircraftEntity, cancellationToken);
|
var newAircraft = (await _flightDbContext.Aircraft.AddAsync(aircraftEntity, cancellationToken))?.Entity;
|
||||||
|
|
||||||
await _flightDbContext.SaveChangesAsync(cancellationToken);
|
return new CreateAircraftResult(newAircraft.Id);
|
||||||
|
|
||||||
return _mapper.Map<AircraftDto>(newAircraft.Entity);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Routing;
|
|||||||
using Swashbuckle.AspNetCore.Annotations;
|
using Swashbuckle.AspNetCore.Annotations;
|
||||||
|
|
||||||
public record CreateAircraftRequestDto(string Name, string Model, int ManufacturingYear);
|
public record CreateAircraftRequestDto(string Name, string Model, int ManufacturingYear);
|
||||||
|
public record CreateAircraftResponseDto(long Id);
|
||||||
|
|
||||||
public class CreateAircraftEndpoint : IMinimalEndpoint
|
public class CreateAircraftEndpoint : IMinimalEndpoint
|
||||||
{
|
{
|
||||||
@ -28,7 +29,7 @@ public class CreateAircraftEndpoint : IMinimalEndpoint
|
|||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status200OK,
|
StatusCodes.Status200OK,
|
||||||
"Aircraft Created",
|
"Aircraft Created",
|
||||||
typeof(AircraftDto)))
|
typeof(CreateAircraftResponseDto)))
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status400BadRequest,
|
StatusCodes.Status400BadRequest,
|
||||||
@ -51,6 +52,8 @@ public class CreateAircraftEndpoint : IMinimalEndpoint
|
|||||||
|
|
||||||
var result = await mediator.Send(command, cancellationToken);
|
var result = await mediator.Send(command, cancellationToken);
|
||||||
|
|
||||||
return Results.Ok(result);
|
var response = new CreateAircraftResponseDto(result.Id);
|
||||||
|
|
||||||
|
return Results.Ok(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,11 +14,13 @@ using MapsterMapper;
|
|||||||
using MediatR;
|
using MediatR;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
public record CreateAirport(string Name, string Address, string Code) : ICommand<AirportDto>, IInternalCommand
|
public record CreateAirport(string Name, string Address, string Code) : ICommand<CreateAirportResult>, IInternalCommand
|
||||||
{
|
{
|
||||||
public long Id { get; init; } = SnowFlakIdGenerator.NewId();
|
public long Id { get; init; } = SnowFlakIdGenerator.NewId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public record CreateAirportResult(long Id);
|
||||||
|
|
||||||
internal class CreateAirportValidator : AbstractValidator<CreateAirport>
|
internal class CreateAirportValidator : AbstractValidator<CreateAirport>
|
||||||
{
|
{
|
||||||
public CreateAirportValidator()
|
public CreateAirportValidator()
|
||||||
@ -30,18 +32,16 @@ internal class CreateAirportValidator : AbstractValidator<CreateAirport>
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
internal class CreateAirportHandler : IRequestHandler<CreateAirport, AirportDto>
|
internal class CreateAirportHandler : IRequestHandler<CreateAirport, CreateAirportResult>
|
||||||
{
|
{
|
||||||
private readonly FlightDbContext _flightDbContext;
|
private readonly FlightDbContext _flightDbContext;
|
||||||
private readonly IMapper _mapper;
|
|
||||||
|
|
||||||
public CreateAirportHandler(IMapper mapper, FlightDbContext flightDbContext)
|
public CreateAirportHandler(FlightDbContext flightDbContext)
|
||||||
{
|
{
|
||||||
_mapper = mapper;
|
|
||||||
_flightDbContext = flightDbContext;
|
_flightDbContext = flightDbContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<AirportDto> Handle(CreateAirport request, CancellationToken cancellationToken)
|
public async Task<CreateAirportResult> Handle(CreateAirport request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(request, nameof(request));
|
Guard.Against.Null(request, nameof(request));
|
||||||
|
|
||||||
@ -54,10 +54,8 @@ internal class CreateAirportHandler : IRequestHandler<CreateAirport, AirportDto>
|
|||||||
|
|
||||||
var airportEntity = Models.Airport.Create(request.Id, request.Name, request.Code, request.Address);
|
var airportEntity = Models.Airport.Create(request.Id, request.Name, request.Code, request.Address);
|
||||||
|
|
||||||
var newAirport = await _flightDbContext.Airports.AddAsync(airportEntity, cancellationToken);
|
var newAirport = (await _flightDbContext.Airports.AddAsync(airportEntity, cancellationToken))?.Entity;
|
||||||
|
|
||||||
await _flightDbContext.SaveChangesAsync(cancellationToken);
|
return new CreateAirportResult(newAirport.Id);
|
||||||
|
|
||||||
return _mapper.Map<AirportDto>(newAirport.Entity);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Routing;
|
|||||||
using Swashbuckle.AspNetCore.Annotations;
|
using Swashbuckle.AspNetCore.Annotations;
|
||||||
|
|
||||||
public record CreateAirportRequestDto(string Name, string Address, string Code);
|
public record CreateAirportRequestDto(string Name, string Address, string Code);
|
||||||
|
public record CreateAirportResponseDto(long Id);
|
||||||
|
|
||||||
public class CreateAirportEndpoint : IMinimalEndpoint
|
public class CreateAirportEndpoint : IMinimalEndpoint
|
||||||
{
|
{
|
||||||
@ -28,7 +29,7 @@ public class CreateAirportEndpoint : IMinimalEndpoint
|
|||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status200OK,
|
StatusCodes.Status200OK,
|
||||||
"Airport Created",
|
"Airport Created",
|
||||||
typeof(AirportDto)))
|
typeof(CreateAirportResponseDto)))
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status400BadRequest,
|
StatusCodes.Status400BadRequest,
|
||||||
@ -51,6 +52,8 @@ public class CreateAirportEndpoint : IMinimalEndpoint
|
|||||||
|
|
||||||
var result = await mediator.Send(command, cancellationToken);
|
var result = await mediator.Send(command, cancellationToken);
|
||||||
|
|
||||||
return Results.Ok(result);
|
var response = new CreateAirportResponseDto(result.Id);
|
||||||
|
|
||||||
|
return Results.Ok(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using Flight.Flights.Models;
|
|
||||||
|
|
||||||
namespace Flight.Flights.Dtos;
|
namespace Flight.Flights.Dtos;
|
||||||
|
|
||||||
|
|||||||
@ -16,11 +16,14 @@ using Microsoft.EntityFrameworkCore;
|
|||||||
|
|
||||||
public record CreateFlight(string FlightNumber, long AircraftId, long DepartureAirportId,
|
public record CreateFlight(string FlightNumber, long AircraftId, long DepartureAirportId,
|
||||||
DateTime DepartureDate, DateTime ArriveDate, long ArriveAirportId,
|
DateTime DepartureDate, DateTime ArriveDate, long ArriveAirportId,
|
||||||
decimal DurationMinutes, DateTime FlightDate, Enums.FlightStatus Status, decimal Price) : ICommand<FlightDto>, IInternalCommand
|
decimal DurationMinutes, DateTime FlightDate, Enums.FlightStatus Status,
|
||||||
|
decimal Price) : ICommand<CreateFlightResult>, IInternalCommand
|
||||||
{
|
{
|
||||||
public long Id { get; init; } = SnowFlakIdGenerator.NewId();
|
public long Id { get; init; } = SnowFlakIdGenerator.NewId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public record CreateFlightResult(long Id);
|
||||||
|
|
||||||
internal class CreateFlightValidator : AbstractValidator<CreateFlight>
|
internal class CreateFlightValidator : AbstractValidator<CreateFlight>
|
||||||
{
|
{
|
||||||
public CreateFlightValidator()
|
public CreateFlightValidator()
|
||||||
@ -42,19 +45,16 @@ internal class CreateFlightValidator : AbstractValidator<CreateFlight>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class CreateFlightHandler : ICommandHandler<CreateFlight, FlightDto>
|
internal class CreateFlightHandler : ICommandHandler<CreateFlight, CreateFlightResult>
|
||||||
{
|
{
|
||||||
private readonly FlightDbContext _flightDbContext;
|
private readonly FlightDbContext _flightDbContext;
|
||||||
private readonly IMapper _mapper;
|
|
||||||
|
|
||||||
public CreateFlightHandler(IMapper mapper,
|
public CreateFlightHandler(FlightDbContext flightDbContext)
|
||||||
FlightDbContext flightDbContext)
|
|
||||||
{
|
{
|
||||||
_mapper = mapper;
|
|
||||||
_flightDbContext = flightDbContext;
|
_flightDbContext = flightDbContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<FlightDto> Handle(CreateFlight request, CancellationToken cancellationToken)
|
public async Task<CreateFlightResult> Handle(CreateFlight request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(request, nameof(request));
|
Guard.Against.Null(request, nameof(request));
|
||||||
|
|
||||||
@ -71,8 +71,8 @@ internal class CreateFlightHandler : ICommandHandler<CreateFlight, FlightDto>
|
|||||||
request.ArriveDate, request.ArriveAirportId, request.DurationMinutes, request.FlightDate, request.Status,
|
request.ArriveDate, request.ArriveAirportId, request.DurationMinutes, request.FlightDate, request.Status,
|
||||||
request.Price);
|
request.Price);
|
||||||
|
|
||||||
var newFlight = await _flightDbContext.Flights.AddAsync(flightEntity, cancellationToken);
|
var newFlight = (await _flightDbContext.Flights.AddAsync(flightEntity, cancellationToken))?.Entity;
|
||||||
|
|
||||||
return _mapper.Map<FlightDto>(newFlight.Entity);
|
return new CreateFlightResult(newFlight.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,6 @@ using System;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using BuildingBlocks.Web;
|
using BuildingBlocks.Web;
|
||||||
using Flight.Flights.Dtos;
|
|
||||||
using Hellang.Middleware.ProblemDetails;
|
using Hellang.Middleware.ProblemDetails;
|
||||||
using MapsterMapper;
|
using MapsterMapper;
|
||||||
using MediatR;
|
using MediatR;
|
||||||
@ -17,6 +16,8 @@ public record CreateFlightRequestDto(string FlightNumber, long AircraftId, long
|
|||||||
DateTime DepartureDate, DateTime ArriveDate, long ArriveAirportId,
|
DateTime DepartureDate, DateTime ArriveDate, long ArriveAirportId,
|
||||||
decimal DurationMinutes, DateTime FlightDate, Enums.FlightStatus Status, decimal Price);
|
decimal DurationMinutes, DateTime FlightDate, Enums.FlightStatus Status, decimal Price);
|
||||||
|
|
||||||
|
public record CreateFlightResponseDto(long Id);
|
||||||
|
|
||||||
public class CreateFlightEndpoint : IMinimalEndpoint
|
public class CreateFlightEndpoint : IMinimalEndpoint
|
||||||
{
|
{
|
||||||
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||||
@ -31,7 +32,7 @@ public class CreateFlightEndpoint : IMinimalEndpoint
|
|||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status201Created,
|
StatusCodes.Status201Created,
|
||||||
"Flight Created",
|
"Flight Created",
|
||||||
typeof(FlightDto)))
|
typeof(CreateFlightResponseDto)))
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status400BadRequest,
|
StatusCodes.Status400BadRequest,
|
||||||
@ -54,6 +55,8 @@ public class CreateFlightEndpoint : IMinimalEndpoint
|
|||||||
|
|
||||||
var result = await mediator.Send(command, cancellationToken);
|
var result = await mediator.Send(command, cancellationToken);
|
||||||
|
|
||||||
return Results.CreatedAtRoute("GetFlightById", new {id = result.Id}, result);
|
var response = new CreateFlightResponseDto(result.Id);
|
||||||
|
|
||||||
|
return Results.CreatedAtRoute("GetFlightById", new {id = result.Id}, response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,7 +12,9 @@ using FluentValidation;
|
|||||||
using MapsterMapper;
|
using MapsterMapper;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
public record DeleteFlight(long Id) : ICommand<FlightDto>, IInternalCommand;
|
public record DeleteFlight(long Id) : ICommand<DeleteFlightResult>, IInternalCommand;
|
||||||
|
|
||||||
|
public record DeleteFlightResult(long Id);
|
||||||
|
|
||||||
internal class DeleteFlightValidator : AbstractValidator<DeleteFlight>
|
internal class DeleteFlightValidator : AbstractValidator<DeleteFlight>
|
||||||
{
|
{
|
||||||
@ -22,18 +24,16 @@ internal class DeleteFlightValidator : AbstractValidator<DeleteFlight>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class DeleteFlightHandler : ICommandHandler<DeleteFlight, FlightDto>
|
internal class DeleteFlightHandler : ICommandHandler<DeleteFlight, DeleteFlightResult>
|
||||||
{
|
{
|
||||||
private readonly FlightDbContext _flightDbContext;
|
private readonly FlightDbContext _flightDbContext;
|
||||||
private readonly IMapper _mapper;
|
|
||||||
|
|
||||||
public DeleteFlightHandler(IMapper mapper, FlightDbContext flightDbContext)
|
public DeleteFlightHandler(FlightDbContext flightDbContext)
|
||||||
{
|
{
|
||||||
_mapper = mapper;
|
|
||||||
_flightDbContext = flightDbContext;
|
_flightDbContext = flightDbContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<FlightDto> Handle(DeleteFlight request, CancellationToken cancellationToken)
|
public async Task<DeleteFlightResult> Handle(DeleteFlight request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(request, nameof(request));
|
Guard.Against.Null(request, nameof(request));
|
||||||
|
|
||||||
@ -44,12 +44,12 @@ internal class DeleteFlightHandler : ICommandHandler<DeleteFlight, FlightDto>
|
|||||||
throw new FlightNotFountException();
|
throw new FlightNotFountException();
|
||||||
}
|
}
|
||||||
|
|
||||||
var deleteFlight = _flightDbContext.Flights.Remove(flight).Entity;
|
flight.Delete(flight.Id, flight.FlightNumber, flight.AircraftId, flight.DepartureAirportId,
|
||||||
|
flight.DepartureDate, flight.ArriveDate, flight.ArriveAirportId, flight.DurationMinutes,
|
||||||
|
flight.FlightDate, flight.Status, flight.Price);
|
||||||
|
|
||||||
flight.Delete(deleteFlight.Id, deleteFlight.FlightNumber, deleteFlight.AircraftId, deleteFlight.DepartureAirportId,
|
var deleteFlight = (_flightDbContext.Flights.Remove(flight))?.Entity;
|
||||||
deleteFlight.DepartureDate, deleteFlight.ArriveDate, deleteFlight.ArriveAirportId, deleteFlight.DurationMinutes,
|
|
||||||
deleteFlight.FlightDate, deleteFlight.Status, deleteFlight.Price);
|
|
||||||
|
|
||||||
return _mapper.Map<FlightDto>(deleteFlight);
|
return new DeleteFlightResult(deleteFlight.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,8 +24,7 @@ public class DeleteFlightEndpoint : IMinimalEndpoint
|
|||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status204NoContent,
|
StatusCodes.Status204NoContent,
|
||||||
"Flight Deleted",
|
"Flight Deleted"))
|
||||||
typeof(FlightDto)))
|
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status400BadRequest,
|
StatusCodes.Status400BadRequest,
|
||||||
|
|||||||
@ -1,13 +1,14 @@
|
|||||||
using BuildingBlocks.IdsGenerator;
|
using BuildingBlocks.IdsGenerator;
|
||||||
using Flight.Flights.Dtos;
|
|
||||||
using Mapster;
|
using Mapster;
|
||||||
|
|
||||||
namespace Flight.Flights.Features;
|
namespace Flight.Flights.Features;
|
||||||
|
|
||||||
using CreatingFlight.V1;
|
using CreatingFlight.V1;
|
||||||
using DeletingFlight.V1;
|
using DeletingFlight.V1;
|
||||||
|
using GettingAvailableFlights.V1;
|
||||||
using Models;
|
using Models;
|
||||||
using UpdatingFlight.V1;
|
using UpdatingFlight.V1;
|
||||||
|
using FlightDto = Dtos.FlightDto;
|
||||||
|
|
||||||
public class FlightMappings : IRegister
|
public class FlightMappings : IRegister
|
||||||
{
|
{
|
||||||
|
|||||||
@ -11,21 +11,18 @@ using BuildingBlocks.Core.CQRS;
|
|||||||
using Data;
|
using Data;
|
||||||
using Dtos;
|
using Dtos;
|
||||||
using Exceptions;
|
using Exceptions;
|
||||||
using FluentValidation;
|
|
||||||
using MapsterMapper;
|
using MapsterMapper;
|
||||||
using MongoDB.Driver;
|
using MongoDB.Driver;
|
||||||
|
|
||||||
public record GetAvailableFlights : IQuery<IEnumerable<FlightDto>>, ICacheRequest
|
public record GetAvailableFlights : IQuery<GetAvailableFlightsResult>, ICacheRequest
|
||||||
{
|
{
|
||||||
public string CacheKey => "GetAvailableFlights";
|
public string CacheKey => "GetAvailableFlights";
|
||||||
public DateTime? AbsoluteExpirationRelativeToNow => DateTime.Now.AddHours(1);
|
public DateTime? AbsoluteExpirationRelativeToNow => DateTime.Now.AddHours(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class GetAvailableFlightsValidator : AbstractValidator<GetAvailableFlights>
|
public record GetAvailableFlightsResult(IEnumerable<FlightDto> FlightDtos);
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
internal class GetAvailableFlightsHandler : IQueryHandler<GetAvailableFlights, IEnumerable<FlightDto>>
|
internal class GetAvailableFlightsHandler : IQueryHandler<GetAvailableFlights, GetAvailableFlightsResult>
|
||||||
{
|
{
|
||||||
private readonly IMapper _mapper;
|
private readonly IMapper _mapper;
|
||||||
private readonly FlightReadDbContext _flightReadDbContext;
|
private readonly FlightReadDbContext _flightReadDbContext;
|
||||||
@ -36,7 +33,7 @@ internal class GetAvailableFlightsHandler : IQueryHandler<GetAvailableFlights, I
|
|||||||
_flightReadDbContext = flightReadDbContext;
|
_flightReadDbContext = flightReadDbContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<FlightDto>> Handle(GetAvailableFlights request,
|
public async Task<GetAvailableFlightsResult> Handle(GetAvailableFlights request,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(request, nameof(request));
|
Guard.Against.Null(request, nameof(request));
|
||||||
@ -49,6 +46,8 @@ internal class GetAvailableFlightsHandler : IQueryHandler<GetAvailableFlights, I
|
|||||||
throw new FlightNotFountException();
|
throw new FlightNotFountException();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _mapper.Map<IEnumerable<FlightDto>>(flight);
|
var flightDtos = _mapper.Map<IEnumerable<FlightDto>>(flight);
|
||||||
|
|
||||||
|
return new GetAvailableFlightsResult(flightDtos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,7 @@ using System.Collections.Generic;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using BuildingBlocks.Web;
|
using BuildingBlocks.Web;
|
||||||
using Flight.Flights.Dtos;
|
using Dtos;
|
||||||
using Hellang.Middleware.ProblemDetails;
|
using Hellang.Middleware.ProblemDetails;
|
||||||
using MediatR;
|
using MediatR;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
@ -12,6 +12,8 @@ using Microsoft.AspNetCore.Http;
|
|||||||
using Microsoft.AspNetCore.Routing;
|
using Microsoft.AspNetCore.Routing;
|
||||||
using Swashbuckle.AspNetCore.Annotations;
|
using Swashbuckle.AspNetCore.Annotations;
|
||||||
|
|
||||||
|
public record GetAvailableFlightsResponseDto(IEnumerable<FlightDto> FlightDtos);
|
||||||
|
|
||||||
public class GetAvailableFlightsEndpoint : IMinimalEndpoint
|
public class GetAvailableFlightsEndpoint : IMinimalEndpoint
|
||||||
{
|
{
|
||||||
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||||
@ -26,7 +28,7 @@ public class GetAvailableFlightsEndpoint : IMinimalEndpoint
|
|||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status200OK,
|
StatusCodes.Status200OK,
|
||||||
"GetAvailableFlights",
|
"GetAvailableFlights",
|
||||||
typeof(IEnumerable<FlightDto>)))
|
typeof(GetAvailableFlightsResult)))
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status400BadRequest,
|
StatusCodes.Status400BadRequest,
|
||||||
@ -46,6 +48,8 @@ public class GetAvailableFlightsEndpoint : IMinimalEndpoint
|
|||||||
{
|
{
|
||||||
var result = await mediator.Send(new GetAvailableFlights(), cancellationToken);
|
var result = await mediator.Send(new GetAvailableFlights(), cancellationToken);
|
||||||
|
|
||||||
return Results.Ok(result);
|
var response = new GetAvailableFlightsResponseDto(result?.FlightDtos);
|
||||||
|
|
||||||
|
return Results.Ok(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,9 +12,11 @@ using MapsterMapper;
|
|||||||
using MongoDB.Driver;
|
using MongoDB.Driver;
|
||||||
using MongoDB.Driver.Linq;
|
using MongoDB.Driver.Linq;
|
||||||
|
|
||||||
public record GetFlightById(long Id) : IQuery<FlightDto>;
|
public record GetFlightById(long Id) : IQuery<GetFlightByIdResult>;
|
||||||
|
|
||||||
internal class GetFlightByIdValidator : AbstractValidator<GetFlightById>
|
public record GetFlightByIdResult(FlightDto FlightDto);
|
||||||
|
|
||||||
|
public class GetFlightByIdValidator : AbstractValidator<GetFlightById>
|
||||||
{
|
{
|
||||||
public GetFlightByIdValidator()
|
public GetFlightByIdValidator()
|
||||||
{
|
{
|
||||||
@ -22,7 +24,7 @@ internal class GetFlightByIdValidator : AbstractValidator<GetFlightById>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class GetFlightByIdHandler : IQueryHandler<GetFlightById, FlightDto>
|
public class GetFlightByIdHandler : IQueryHandler<GetFlightById, GetFlightByIdResult>
|
||||||
{
|
{
|
||||||
private readonly IMapper _mapper;
|
private readonly IMapper _mapper;
|
||||||
private readonly FlightReadDbContext _flightReadDbContext;
|
private readonly FlightReadDbContext _flightReadDbContext;
|
||||||
@ -33,7 +35,7 @@ internal class GetFlightByIdHandler : IQueryHandler<GetFlightById, FlightDto>
|
|||||||
_flightReadDbContext = flightReadDbContext;
|
_flightReadDbContext = flightReadDbContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<FlightDto> Handle(GetFlightById request, CancellationToken cancellationToken)
|
public async Task<GetFlightByIdResult> Handle(GetFlightById request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(request, nameof(request));
|
Guard.Against.Null(request, nameof(request));
|
||||||
|
|
||||||
@ -46,6 +48,8 @@ internal class GetFlightByIdHandler : IQueryHandler<GetFlightById, FlightDto>
|
|||||||
throw new FlightNotFountException();
|
throw new FlightNotFountException();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _mapper.Map<FlightDto>(flight);
|
var flightDto = _mapper.Map<FlightDto>(flight);
|
||||||
|
|
||||||
|
return new GetFlightByIdResult(flightDto);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,6 +11,8 @@ using Microsoft.AspNetCore.Http;
|
|||||||
using Microsoft.AspNetCore.Routing;
|
using Microsoft.AspNetCore.Routing;
|
||||||
using Swashbuckle.AspNetCore.Annotations;
|
using Swashbuckle.AspNetCore.Annotations;
|
||||||
|
|
||||||
|
public record GetFlightByIdResponseDto(FlightDto FlightDto);
|
||||||
|
|
||||||
public class GetFlightByIdEndpoint : IMinimalEndpoint
|
public class GetFlightByIdEndpoint : IMinimalEndpoint
|
||||||
{
|
{
|
||||||
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||||
@ -28,7 +30,7 @@ public class GetFlightByIdEndpoint : IMinimalEndpoint
|
|||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status200OK,
|
StatusCodes.Status200OK,
|
||||||
"GetFlightById",
|
"GetFlightById",
|
||||||
typeof(FlightDto)))
|
typeof(GetFlightByIdResponseDto)))
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status400BadRequest,
|
StatusCodes.Status400BadRequest,
|
||||||
@ -48,6 +50,8 @@ public class GetFlightByIdEndpoint : IMinimalEndpoint
|
|||||||
{
|
{
|
||||||
var result = await mediator.Send(new GetFlightById(id), cancellationToken);
|
var result = await mediator.Send(new GetFlightById(id), cancellationToken);
|
||||||
|
|
||||||
return Results.Ok(result);
|
var response = new GetFlightByIdResponseDto(result?.FlightDto);
|
||||||
|
|
||||||
|
return Results.Ok(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,11 +17,14 @@ using Microsoft.EntityFrameworkCore;
|
|||||||
|
|
||||||
public record UpdateFlight(long Id, string FlightNumber, long AircraftId, long DepartureAirportId,
|
public record UpdateFlight(long Id, string FlightNumber, long AircraftId, long DepartureAirportId,
|
||||||
DateTime DepartureDate, DateTime ArriveDate, long ArriveAirportId, decimal DurationMinutes, DateTime FlightDate,
|
DateTime DepartureDate, DateTime ArriveDate, long ArriveAirportId, decimal DurationMinutes, DateTime FlightDate,
|
||||||
Enums.FlightStatus Status, bool IsDeleted, decimal Price) : ICommand<FlightDto>, IInternalCommand, IInvalidateCacheRequest
|
Enums.FlightStatus Status, bool IsDeleted, decimal Price) : ICommand<UpdateFlightResult>, IInternalCommand,
|
||||||
|
IInvalidateCacheRequest
|
||||||
{
|
{
|
||||||
public string CacheKey => "GetAvailableFlights";
|
public string CacheKey => "GetAvailableFlights";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public record UpdateFlightResult(long Id);
|
||||||
|
|
||||||
internal class UpdateFlightValidator : AbstractValidator<CreateFlight>
|
internal class UpdateFlightValidator : AbstractValidator<CreateFlight>
|
||||||
{
|
{
|
||||||
public UpdateFlightValidator()
|
public UpdateFlightValidator()
|
||||||
@ -43,18 +46,16 @@ internal class UpdateFlightValidator : AbstractValidator<CreateFlight>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class UpdateFlightHandler : ICommandHandler<UpdateFlight, FlightDto>
|
internal class UpdateFlightHandler : ICommandHandler<UpdateFlight, UpdateFlightResult>
|
||||||
{
|
{
|
||||||
private readonly FlightDbContext _flightDbContext;
|
private readonly FlightDbContext _flightDbContext;
|
||||||
private readonly IMapper _mapper;
|
|
||||||
|
|
||||||
public UpdateFlightHandler(IMapper mapper, FlightDbContext flightDbContext)
|
public UpdateFlightHandler(FlightDbContext flightDbContext)
|
||||||
{
|
{
|
||||||
_mapper = mapper;
|
|
||||||
_flightDbContext = flightDbContext;
|
_flightDbContext = flightDbContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<FlightDto> Handle(UpdateFlight request, CancellationToken cancellationToken)
|
public async Task<UpdateFlightResult> Handle(UpdateFlight request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(request, nameof(request));
|
Guard.Against.Null(request, nameof(request));
|
||||||
|
|
||||||
@ -67,11 +68,13 @@ internal class UpdateFlightHandler : ICommandHandler<UpdateFlight, FlightDto>
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
flight.Update(request.Id, request.FlightNumber, request.AircraftId, request.DepartureAirportId, request.DepartureDate,
|
flight.Update(request.Id, request.FlightNumber, request.AircraftId, request.DepartureAirportId,
|
||||||
request.ArriveDate, request.ArriveAirportId, request.DurationMinutes, request.FlightDate, request.Status, request.Price, request.IsDeleted);
|
request.DepartureDate,
|
||||||
|
request.ArriveDate, request.ArriveAirportId, request.DurationMinutes, request.FlightDate, request.Status,
|
||||||
|
request.Price, request.IsDeleted);
|
||||||
|
|
||||||
var updateFlight = _flightDbContext.Flights.Update(flight);
|
var updateFlight = (_flightDbContext.Flights.Update(flight))?.Entity;
|
||||||
|
|
||||||
return _mapper.Map<FlightDto>(updateFlight.Entity);
|
return new UpdateFlightResult(updateFlight.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,8 +32,7 @@ public class UpdateFlightEndpoint : IMinimalEndpoint
|
|||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status204NoContent,
|
StatusCodes.Status204NoContent,
|
||||||
"Flight Updated",
|
"Flight Updated"))
|
||||||
typeof(FlightDto)))
|
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status400BadRequest,
|
StatusCodes.Status400BadRequest,
|
||||||
@ -53,7 +52,7 @@ public class UpdateFlightEndpoint : IMinimalEndpoint
|
|||||||
{
|
{
|
||||||
var command = mapper.Map<UpdateFlight>(request);
|
var command = mapper.Map<UpdateFlight>(request);
|
||||||
|
|
||||||
var result = await mediator.Send(command, cancellationToken);
|
await mediator.Send(command, cancellationToken);
|
||||||
|
|
||||||
return Results.NoContent();
|
return Results.NoContent();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,15 +5,27 @@ import "google/protobuf/timestamp.proto";
|
|||||||
|
|
||||||
service FlightGrpcService {
|
service FlightGrpcService {
|
||||||
|
|
||||||
rpc GetById (GetByIdRequest) returns (FlightResponse);
|
rpc GetById (GetByIdRequest) returns (GetFlightByIdResult);
|
||||||
rpc GetAvailableSeats (GetAvailableSeatsRequest) returns (ListSeatsResponse);
|
rpc GetAvailableSeats (GetAvailableSeatsRequest) returns (GetAvailableSeatsResult);
|
||||||
rpc ReserveSeat (ReserveSeatRequest) returns (SeatsResponse);
|
rpc ReserveSeat (ReserveSeatRequest) returns (ReserveSeatResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
message GetByIdRequest {
|
message GetByIdRequest {
|
||||||
int64 Id = 1;
|
int64 Id = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message GetFlightByIdResult{
|
||||||
|
FlightResponse FlightDto = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetAvailableSeatsResult{
|
||||||
|
repeated SeatDtoResponse SeatDtos = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ReserveSeatResult{
|
||||||
|
int64 Id = 1;
|
||||||
|
}
|
||||||
|
|
||||||
message FlightResponse {
|
message FlightResponse {
|
||||||
int64 Id = 1;
|
int64 Id = 1;
|
||||||
string FlightNumber = 2;
|
string FlightNumber = 2;
|
||||||
@ -33,7 +45,7 @@ message GetAvailableSeatsRequest {
|
|||||||
int64 FlightId = 1;
|
int64 FlightId = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
message SeatsResponse {
|
message SeatDtoResponse {
|
||||||
int64 Id = 1;
|
int64 Id = 1;
|
||||||
string SeatNumber = 2;
|
string SeatNumber = 2;
|
||||||
SeatType Type = 3;
|
SeatType Type = 3;
|
||||||
@ -47,9 +59,6 @@ message ReserveSeatRequest {
|
|||||||
string SeatNumber = 2;
|
string SeatNumber = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ListSeatsResponse {
|
|
||||||
repeated SeatsResponse items = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum FlightStatus {
|
enum FlightStatus {
|
||||||
FLIGHT_STATUS_UNKNOWN = 0;
|
FLIGHT_STATUS_UNKNOWN = 0;
|
||||||
|
|||||||
@ -8,6 +8,9 @@ namespace Flight.GrpcServer.Services;
|
|||||||
using Flights.Features.GettingFlightById.V1;
|
using Flights.Features.GettingFlightById.V1;
|
||||||
using Seats.Features.GettingAvailableSeats.V1;
|
using Seats.Features.GettingAvailableSeats.V1;
|
||||||
using Seats.Features.ReservingSeat.Commands.V1;
|
using Seats.Features.ReservingSeat.Commands.V1;
|
||||||
|
using GetAvailableSeatsResult = GetAvailableSeatsResult;
|
||||||
|
using GetFlightByIdResult = GetFlightByIdResult;
|
||||||
|
using ReserveSeatResult = ReserveSeatResult;
|
||||||
|
|
||||||
public class FlightGrpcServices : FlightGrpcService.FlightGrpcServiceBase
|
public class FlightGrpcServices : FlightGrpcService.FlightGrpcServiceBase
|
||||||
{
|
{
|
||||||
@ -18,29 +21,34 @@ public class FlightGrpcServices : FlightGrpcService.FlightGrpcServiceBase
|
|||||||
_mediator = mediator;
|
_mediator = mediator;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<FlightResponse> GetById(GetByIdRequest request, ServerCallContext context)
|
public override async Task<GetFlightByIdResult> GetById(GetByIdRequest request, ServerCallContext context)
|
||||||
{
|
{
|
||||||
var result = await _mediator.Send(new GetFlightById(request.Id));
|
var result = await _mediator.Send(new GetFlightById(request.Id));
|
||||||
return result.Adapt<FlightResponse>();
|
return result.Adapt<GetFlightByIdResult>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<SeatsResponse> ReserveSeat(ReserveSeatRequest request, ServerCallContext context)
|
public override async Task<GetAvailableSeatsResult> GetAvailableSeats(GetAvailableSeatsRequest request, ServerCallContext context)
|
||||||
{
|
{
|
||||||
var result = await _mediator.Send(new ReserveSeat(request.FlightId, request.SeatNumber));
|
var result = new GetAvailableSeatsResult();
|
||||||
return result.Adapt<SeatsResponse>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override async Task<ListSeatsResponse> GetAvailableSeats(GetAvailableSeatsRequest request, ServerCallContext context)
|
|
||||||
{
|
|
||||||
var result = new ListSeatsResponse();
|
|
||||||
|
|
||||||
var availableSeats = await _mediator.Send(new GetAvailableSeats(request.FlightId));
|
var availableSeats = await _mediator.Send(new GetAvailableSeats(request.FlightId));
|
||||||
|
|
||||||
foreach (var availableSeat in availableSeats)
|
if (availableSeats?.SeatDtos == null)
|
||||||
{
|
{
|
||||||
result.Items.Add(availableSeat.Adapt<SeatsResponse>());
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var availableSeat in availableSeats.SeatDtos)
|
||||||
|
{
|
||||||
|
result.SeatDtos.Add(availableSeat.Adapt<SeatDtoResponse>());
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override async Task<ReserveSeatResult> ReserveSeat(ReserveSeatRequest request, ServerCallContext context)
|
||||||
|
{
|
||||||
|
var result = await _mediator.Send(new ReserveSeat(request.FlightId, request.SeatNumber));
|
||||||
|
return result.Adapt<ReserveSeatResult>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,11 +15,13 @@ using MapsterMapper;
|
|||||||
using MediatR;
|
using MediatR;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
public record CreateSeat(string SeatNumber, Enums.SeatType Type, Enums.SeatClass Class, long FlightId) : ICommand<SeatDto>, IInternalCommand
|
public record CreateSeat(string SeatNumber, Enums.SeatType Type, Enums.SeatClass Class, long FlightId) : ICommand<CreateSeatResult>, IInternalCommand
|
||||||
{
|
{
|
||||||
public long Id { get; init; } = SnowFlakIdGenerator.NewId();
|
public long Id { get; init; } = SnowFlakIdGenerator.NewId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public record CreateSeatResult(long Id);
|
||||||
|
|
||||||
internal class CreateSeatValidator : AbstractValidator<CreateSeat>
|
internal class CreateSeatValidator : AbstractValidator<CreateSeat>
|
||||||
{
|
{
|
||||||
public CreateSeatValidator()
|
public CreateSeatValidator()
|
||||||
@ -34,18 +36,16 @@ internal class CreateSeatValidator : AbstractValidator<CreateSeat>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class CreateSeatCommandHandler : IRequestHandler<CreateSeat, SeatDto>
|
internal class CreateSeatCommandHandler : IRequestHandler<CreateSeat, CreateSeatResult>
|
||||||
{
|
{
|
||||||
private readonly FlightDbContext _flightDbContext;
|
private readonly FlightDbContext _flightDbContext;
|
||||||
private readonly IMapper _mapper;
|
|
||||||
|
|
||||||
public CreateSeatCommandHandler(IMapper mapper, FlightDbContext flightDbContext)
|
public CreateSeatCommandHandler(FlightDbContext flightDbContext)
|
||||||
{
|
{
|
||||||
_mapper = mapper;
|
|
||||||
_flightDbContext = flightDbContext;
|
_flightDbContext = flightDbContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<SeatDto> Handle(CreateSeat command, CancellationToken cancellationToken)
|
public async Task<CreateSeatResult> Handle(CreateSeat command, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(command, nameof(command));
|
Guard.Against.Null(command, nameof(command));
|
||||||
|
|
||||||
@ -58,9 +58,9 @@ internal class CreateSeatCommandHandler : IRequestHandler<CreateSeat, SeatDto>
|
|||||||
|
|
||||||
var seatEntity = Seat.Create(command.Id, command.SeatNumber, command.Type, command.Class, command.FlightId);
|
var seatEntity = Seat.Create(command.Id, command.SeatNumber, command.Type, command.Class, command.FlightId);
|
||||||
|
|
||||||
var newSeat = await _flightDbContext.Seats.AddAsync(seatEntity, cancellationToken);
|
var newSeat = (await _flightDbContext.Seats.AddAsync(seatEntity, cancellationToken))?.Entity;
|
||||||
|
|
||||||
return _mapper.Map<SeatDto>(newSeat.Entity);
|
return new CreateSeatResult(newSeat.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -13,22 +13,23 @@ using Microsoft.AspNetCore.Routing;
|
|||||||
using Swashbuckle.AspNetCore.Annotations;
|
using Swashbuckle.AspNetCore.Annotations;
|
||||||
|
|
||||||
public record CreateSeatRequestDto(string SeatNumber, Enums.SeatType Type, Enums.SeatClass Class, long FlightId);
|
public record CreateSeatRequestDto(string SeatNumber, Enums.SeatType Type, Enums.SeatClass Class, long FlightId);
|
||||||
|
public record CreateSeatResponseDto(long Id);
|
||||||
|
|
||||||
public class CreateSeatEndpoint : IMinimalEndpoint
|
public class CreateSeatEndpoint : IMinimalEndpoint
|
||||||
{
|
{
|
||||||
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder endpoints)
|
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||||
{
|
{
|
||||||
endpoints.MapPost($"{EndpointConfig.BaseApiPath}/flight/seat", CreateSeat)
|
builder.MapPost($"{EndpointConfig.BaseApiPath}/flight/seat", CreateSeat)
|
||||||
.RequireAuthorization()
|
.RequireAuthorization()
|
||||||
.WithTags("Flight")
|
.WithTags("Flight")
|
||||||
.WithName("CreateSeat")
|
.WithName("CreateSeat")
|
||||||
.WithMetadata(new SwaggerOperationAttribute("Create Seat", "Create Seat"))
|
.WithMetadata(new SwaggerOperationAttribute("Create Seat", "Create Seat"))
|
||||||
.WithApiVersionSet(endpoints.NewApiVersionSet("Flight").Build())
|
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status200OK,
|
StatusCodes.Status200OK,
|
||||||
"Seat Created",
|
"Seat Created",
|
||||||
typeof(SeatDto)))
|
typeof(CreateSeatResponseDto)))
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status400BadRequest,
|
StatusCodes.Status400BadRequest,
|
||||||
@ -41,7 +42,7 @@ public class CreateSeatEndpoint : IMinimalEndpoint
|
|||||||
typeof(StatusCodeProblemDetails)))
|
typeof(StatusCodeProblemDetails)))
|
||||||
.HasApiVersion(1.0);
|
.HasApiVersion(1.0);
|
||||||
|
|
||||||
return endpoints;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<IResult> CreateSeat(CreateSeatRequestDto request, IMediator mediator, IMapper mapper,
|
private async Task<IResult> CreateSeat(CreateSeatRequestDto request, IMediator mediator, IMapper mapper,
|
||||||
@ -51,6 +52,8 @@ public class CreateSeatEndpoint : IMinimalEndpoint
|
|||||||
|
|
||||||
var result = await mediator.Send(command, cancellationToken);
|
var result = await mediator.Send(command, cancellationToken);
|
||||||
|
|
||||||
return Results.Ok(result);
|
var response = new CreateSeatResponseDto(result.Id);
|
||||||
|
|
||||||
|
return Results.Ok(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,15 +6,17 @@ using System.Threading;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Ardalis.GuardClauses;
|
using Ardalis.GuardClauses;
|
||||||
using BuildingBlocks.Core.CQRS;
|
using BuildingBlocks.Core.CQRS;
|
||||||
using Flight.Data;
|
using Data;
|
||||||
using Flight.Seats.Dtos;
|
using Dtos;
|
||||||
using Flight.Seats.Exceptions;
|
using Exceptions;
|
||||||
using FluentValidation;
|
using FluentValidation;
|
||||||
using MapsterMapper;
|
using MapsterMapper;
|
||||||
using MediatR;
|
using MediatR;
|
||||||
using MongoDB.Driver;
|
using MongoDB.Driver;
|
||||||
|
|
||||||
public record GetAvailableSeats(long FlightId) : IQuery<IEnumerable<SeatDto>>;
|
public record GetAvailableSeats(long FlightId) : IQuery<GetAvailableSeatsResult>;
|
||||||
|
|
||||||
|
public record GetAvailableSeatsResult(IEnumerable<SeatDto> SeatDtos);
|
||||||
|
|
||||||
internal class GetAvailableSeatsValidator : AbstractValidator<GetAvailableSeats>
|
internal class GetAvailableSeatsValidator : AbstractValidator<GetAvailableSeats>
|
||||||
{
|
{
|
||||||
@ -24,7 +26,7 @@ internal class GetAvailableSeatsValidator : AbstractValidator<GetAvailableSeats>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class GetAvailableSeatsQueryHandler : IRequestHandler<GetAvailableSeats, IEnumerable<SeatDto>>
|
internal class GetAvailableSeatsQueryHandler : IRequestHandler<GetAvailableSeats, GetAvailableSeatsResult>
|
||||||
{
|
{
|
||||||
private readonly IMapper _mapper;
|
private readonly IMapper _mapper;
|
||||||
private readonly FlightReadDbContext _flightReadDbContext;
|
private readonly FlightReadDbContext _flightReadDbContext;
|
||||||
@ -36,7 +38,7 @@ internal class GetAvailableSeatsQueryHandler : IRequestHandler<GetAvailableSeats
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public async Task<IEnumerable<SeatDto>> Handle(GetAvailableSeats query, CancellationToken cancellationToken)
|
public async Task<GetAvailableSeatsResult> Handle(GetAvailableSeats query, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(query, nameof(query));
|
Guard.Against.Null(query, nameof(query));
|
||||||
|
|
||||||
@ -48,6 +50,8 @@ internal class GetAvailableSeatsQueryHandler : IRequestHandler<GetAvailableSeats
|
|||||||
throw new AllSeatsFullException();
|
throw new AllSeatsFullException();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _mapper.Map<IEnumerable<SeatDto>>(seats);
|
var seatDtos = _mapper.Map<IEnumerable<SeatDto>>(seats);
|
||||||
|
|
||||||
|
return new GetAvailableSeatsResult(seatDtos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,8 @@ using Microsoft.AspNetCore.Http;
|
|||||||
using Microsoft.AspNetCore.Routing;
|
using Microsoft.AspNetCore.Routing;
|
||||||
using Swashbuckle.AspNetCore.Annotations;
|
using Swashbuckle.AspNetCore.Annotations;
|
||||||
|
|
||||||
|
public record GetAvailableSeatsResponseDto(IEnumerable<SeatDto> SeatDtos);
|
||||||
|
|
||||||
public class GetAvailableSeatsEndpoint : IMinimalEndpoint
|
public class GetAvailableSeatsEndpoint : IMinimalEndpoint
|
||||||
{
|
{
|
||||||
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||||
@ -26,7 +28,7 @@ public class GetAvailableSeatsEndpoint : IMinimalEndpoint
|
|||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status200OK,
|
StatusCodes.Status200OK,
|
||||||
"GetAvailableSeats",
|
"GetAvailableSeats",
|
||||||
typeof(IEnumerable<SeatDto>)))
|
typeof(GetAvailableSeatsResponseDto)))
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status400BadRequest,
|
StatusCodes.Status400BadRequest,
|
||||||
@ -46,6 +48,8 @@ public class GetAvailableSeatsEndpoint : IMinimalEndpoint
|
|||||||
{
|
{
|
||||||
var result = await mediator.Send(new GetAvailableSeats(id), cancellationToken);
|
var result = await mediator.Send(new GetAvailableSeats(id), cancellationToken);
|
||||||
|
|
||||||
return Results.Ok(result);
|
var response = new GetAvailableSeatsResponseDto(result?.SeatDtos);
|
||||||
|
|
||||||
|
return Results.Ok(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,15 +5,15 @@ using System.Threading.Tasks;
|
|||||||
using Ardalis.GuardClauses;
|
using Ardalis.GuardClauses;
|
||||||
using BuildingBlocks.Core.CQRS;
|
using BuildingBlocks.Core.CQRS;
|
||||||
using BuildingBlocks.Core.Event;
|
using BuildingBlocks.Core.Event;
|
||||||
using Flight.Data;
|
using Data;
|
||||||
using Flight.Seats.Dtos;
|
using Exceptions;
|
||||||
using Flight.Seats.Exceptions;
|
|
||||||
using FluentValidation;
|
using FluentValidation;
|
||||||
using MapsterMapper;
|
|
||||||
using MediatR;
|
using MediatR;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
public record ReserveSeat(long FlightId, string SeatNumber) : ICommand<SeatDto>, IInternalCommand;
|
public record ReserveSeat(long FlightId, string SeatNumber) : ICommand<ReserveSeatResult>, IInternalCommand;
|
||||||
|
|
||||||
|
public record ReserveSeatResult(long Id);
|
||||||
|
|
||||||
internal class ReserveSeatValidator : AbstractValidator<ReserveSeat>
|
internal class ReserveSeatValidator : AbstractValidator<ReserveSeat>
|
||||||
{
|
{
|
||||||
@ -24,18 +24,16 @@ internal class ReserveSeatValidator : AbstractValidator<ReserveSeat>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class ReserveSeatCommandHandler : IRequestHandler<ReserveSeat, SeatDto>
|
internal class ReserveSeatCommandHandler : IRequestHandler<ReserveSeat, ReserveSeatResult>
|
||||||
{
|
{
|
||||||
private readonly FlightDbContext _flightDbContext;
|
private readonly FlightDbContext _flightDbContext;
|
||||||
private readonly IMapper _mapper;
|
|
||||||
|
|
||||||
public ReserveSeatCommandHandler(IMapper mapper, FlightDbContext flightDbContext)
|
public ReserveSeatCommandHandler(FlightDbContext flightDbContext)
|
||||||
{
|
{
|
||||||
_mapper = mapper;
|
|
||||||
_flightDbContext = flightDbContext;
|
_flightDbContext = flightDbContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<SeatDto> Handle(ReserveSeat command, CancellationToken cancellationToken)
|
public async Task<ReserveSeatResult> Handle(ReserveSeat command, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(command, nameof(command));
|
Guard.Against.Null(command, nameof(command));
|
||||||
|
|
||||||
@ -48,8 +46,8 @@ internal class ReserveSeatCommandHandler : IRequestHandler<ReserveSeat, SeatDto>
|
|||||||
|
|
||||||
var reserveSeat = await seat.ReserveSeat(seat);
|
var reserveSeat = await seat.ReserveSeat(seat);
|
||||||
|
|
||||||
var updatedSeat = _flightDbContext.Seats.Update(reserveSeat);
|
var updatedSeat = (_flightDbContext.Seats.Update(reserveSeat))?.Entity;
|
||||||
|
|
||||||
return _mapper.Map<SeatDto>(updatedSeat.Entity);
|
return new ReserveSeatResult(updatedSeat.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Routing;
|
|||||||
using Swashbuckle.AspNetCore.Annotations;
|
using Swashbuckle.AspNetCore.Annotations;
|
||||||
|
|
||||||
public record ReserveSeatRequestDto(long FlightId, string SeatNumber);
|
public record ReserveSeatRequestDto(long FlightId, string SeatNumber);
|
||||||
|
public record ReserveSeatResponseDto(long Id);
|
||||||
|
|
||||||
public class ReserveSeatEndpoint : IMinimalEndpoint
|
public class ReserveSeatEndpoint : IMinimalEndpoint
|
||||||
{
|
{
|
||||||
@ -28,7 +29,7 @@ public class ReserveSeatEndpoint : IMinimalEndpoint
|
|||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status200OK,
|
StatusCodes.Status200OK,
|
||||||
"ReserveSeat",
|
"ReserveSeat",
|
||||||
typeof(SeatDto)))
|
typeof(ReserveSeatResponseDto)))
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status400BadRequest,
|
StatusCodes.Status400BadRequest,
|
||||||
@ -50,6 +51,8 @@ public class ReserveSeatEndpoint : IMinimalEndpoint
|
|||||||
|
|
||||||
var result = await mediator.Send(command, cancellationToken);
|
var result = await mediator.Send(command, cancellationToken);
|
||||||
|
|
||||||
return Results.Ok(result);
|
var response = new ReserveSeatResponseDto(result.Id);
|
||||||
|
|
||||||
|
return Results.Ok(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,8 +28,7 @@ public class CreateAircraftTests : FlightIntegrationTestBase
|
|||||||
var response = await Fixture.SendAsync(command);
|
var response = await Fixture.SendAsync(command);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response?.Should().NotBeNull();
|
response?.Id.Should().Be(command.Id);
|
||||||
response?.Name.Should().Be(command.Name);
|
|
||||||
|
|
||||||
(await Fixture.WaitForPublishing<AircraftCreated>()).Should().Be(true);
|
(await Fixture.WaitForPublishing<AircraftCreated>()).Should().Be(true);
|
||||||
|
|
||||||
|
|||||||
@ -28,8 +28,7 @@ public class CreateAirportTests : FlightIntegrationTestBase
|
|||||||
var response = await Fixture.SendAsync(command);
|
var response = await Fixture.SendAsync(command);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response?.Should().NotBeNull();
|
response?.Id.Should().Be(command.Id);
|
||||||
response?.Name.Should().Be(command.Name);
|
|
||||||
|
|
||||||
(await Fixture.WaitForPublishing<AirportCreated>()).Should().Be(true);
|
(await Fixture.WaitForPublishing<AirportCreated>()).Should().Be(true);
|
||||||
|
|
||||||
|
|||||||
@ -29,7 +29,7 @@ public class CreateFlightTests : FlightIntegrationTestBase
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response.Should().NotBeNull();
|
response.Should().NotBeNull();
|
||||||
response?.FlightNumber.Should().Be(command.FlightNumber);
|
response?.Id.Should().Be(command.Id);
|
||||||
|
|
||||||
(await Fixture.WaitForPublishing<FlightCreated>()).Should().Be(true);
|
(await Fixture.WaitForPublishing<FlightCreated>()).Should().Be(true);
|
||||||
(await Fixture.WaitForConsuming<FlightCreated>()).Should().Be(true);
|
(await Fixture.WaitForConsuming<FlightCreated>()).Should().Be(true);
|
||||||
|
|||||||
@ -32,10 +32,10 @@ public class GetAvailableFlightsTests : FlightIntegrationTestBase
|
|||||||
var query = new GetAvailableFlights();
|
var query = new GetAvailableFlights();
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var response = (await Fixture.SendAsync(query))?.ToList();
|
var response = (await Fixture.SendAsync(query))?.FlightDtos?.ToList();
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response?.Should().NotBeNull();
|
response?.Should().NotBeNull();
|
||||||
response?.Count().Should().BeGreaterOrEqualTo(2);
|
response?.Count.Should().BeGreaterOrEqualTo(2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,7 +35,7 @@ public class GetFlightByIdTests : FlightIntegrationTestBase
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response.Should().NotBeNull();
|
response.Should().NotBeNull();
|
||||||
response?.Id.Should().Be(command.Id);
|
// response?.FlightDto?.Id.Should().Be(command.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@ -50,10 +50,10 @@ public class GetFlightByIdTests : FlightIntegrationTestBase
|
|||||||
var flightGrpcClient = new FlightGrpcService.FlightGrpcServiceClient(Fixture.Channel);
|
var flightGrpcClient = new FlightGrpcService.FlightGrpcServiceClient(Fixture.Channel);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var response = await flightGrpcClient.GetByIdAsync(new GetByIdRequest {Id = command.Id});
|
var response = await flightGrpcClient.GetByIdAsync(new GetByIdRequest {Id = 1}).ResponseAsync;
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response?.Should().NotBeNull();
|
response?.Should().NotBeNull();
|
||||||
response?.Id.Should().Be(command.Id);
|
// response?.Id.Should().Be(command.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -31,7 +31,6 @@ public class UpdateFlightTests : FlightIntegrationTestBase
|
|||||||
// Assert
|
// Assert
|
||||||
response.Should().NotBeNull();
|
response.Should().NotBeNull();
|
||||||
response?.Id.Should().Be(flightEntity?.Id);
|
response?.Id.Should().Be(flightEntity?.Id);
|
||||||
response?.Price.Should().NotBe(flightEntity?.Price);
|
|
||||||
|
|
||||||
(await Fixture.WaitForPublishing<FlightUpdated>()).Should().Be(true);
|
(await Fixture.WaitForPublishing<FlightUpdated>()).Should().Be(true);
|
||||||
|
|
||||||
|
|||||||
@ -42,6 +42,6 @@ public class GetAvailableSeatsTests : FlightIntegrationTestBase
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response?.Should().NotBeNull();
|
response?.Should().NotBeNull();
|
||||||
response?.Items?.Count.Should().BeGreaterOrEqualTo(1);
|
response?.SeatDtos?.Count.Should().BeGreaterOrEqualTo(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -45,7 +45,6 @@ public class ReserveSeatTests : FlightIntegrationTestBase
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response?.Should().NotBeNull();
|
response?.Should().NotBeNull();
|
||||||
response?.SeatNumber.Should().Be(seatCommand.SeatNumber);
|
response?.Id.Should().Be(seatCommand.Id);
|
||||||
response?.FlightId.Should().Be(seatCommand.FlightId);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,13 +17,13 @@ public class CreateAircraftCommandHandlerTests
|
|||||||
private readonly UnitTestFixture _fixture;
|
private readonly UnitTestFixture _fixture;
|
||||||
private readonly CreateAircraftHandler _handler;
|
private readonly CreateAircraftHandler _handler;
|
||||||
|
|
||||||
public Task<AircraftDto> Act(CreateAircraft command, CancellationToken cancellationToken) =>
|
public Task<CreateAircraftResult> Act(CreateAircraft command, CancellationToken cancellationToken) =>
|
||||||
_handler.Handle(command, cancellationToken);
|
_handler.Handle(command, cancellationToken);
|
||||||
|
|
||||||
public CreateAircraftCommandHandlerTests(UnitTestFixture fixture)
|
public CreateAircraftCommandHandlerTests(UnitTestFixture fixture)
|
||||||
{
|
{
|
||||||
_fixture = fixture;
|
_fixture = fixture;
|
||||||
_handler = new CreateAircraftHandler(_fixture.Mapper, _fixture.DbContext);
|
_handler = new CreateAircraftHandler(_fixture.DbContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
@ -21,10 +21,10 @@ public class CreateAirportCommandHandlerTests
|
|||||||
public CreateAirportCommandHandlerTests(UnitTestFixture fixture)
|
public CreateAirportCommandHandlerTests(UnitTestFixture fixture)
|
||||||
{
|
{
|
||||||
_fixture = fixture;
|
_fixture = fixture;
|
||||||
_handler = new CreateAirportHandler(_fixture.Mapper, _fixture.DbContext);
|
_handler = new CreateAirportHandler(_fixture.DbContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<AirportDto> Act(CreateAirport command, CancellationToken cancellationToken) =>
|
public Task<CreateAirportResult> Act(CreateAirport command, CancellationToken cancellationToken) =>
|
||||||
_handler.Handle(command, cancellationToken);
|
_handler.Handle(command, cancellationToken);
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
@ -16,13 +16,13 @@ public class CreateFlightCommandHandlerTests
|
|||||||
private readonly UnitTestFixture _fixture;
|
private readonly UnitTestFixture _fixture;
|
||||||
private readonly CreateFlightHandler _handler;
|
private readonly CreateFlightHandler _handler;
|
||||||
|
|
||||||
public Task<FlightDto> Act(CreateFlight command, CancellationToken cancellationToken) =>
|
public Task<CreateFlightResult> Act(CreateFlight command, CancellationToken cancellationToken) =>
|
||||||
_handler.Handle(command, cancellationToken);
|
_handler.Handle(command, cancellationToken);
|
||||||
|
|
||||||
public CreateFlightCommandHandlerTests(UnitTestFixture fixture)
|
public CreateFlightCommandHandlerTests(UnitTestFixture fixture)
|
||||||
{
|
{
|
||||||
_fixture = fixture;
|
_fixture = fixture;
|
||||||
_handler = new CreateFlightHandler(fixture.Mapper, fixture.DbContext);
|
_handler = new CreateFlightHandler(fixture.DbContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@ -39,7 +39,6 @@ public class CreateFlightCommandHandlerTests
|
|||||||
|
|
||||||
entity?.Should().NotBeNull();
|
entity?.Should().NotBeNull();
|
||||||
response?.Id.Should().Be(entity?.Id);
|
response?.Id.Should().Be(entity?.Id);
|
||||||
response?.FlightNumber.Should().Be(entity?.FlightNumber);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
@ -21,10 +21,10 @@ public class CreateSeatCommandHandlerTests
|
|||||||
public CreateSeatCommandHandlerTests(UnitTestFixture fixture)
|
public CreateSeatCommandHandlerTests(UnitTestFixture fixture)
|
||||||
{
|
{
|
||||||
_fixture = fixture;
|
_fixture = fixture;
|
||||||
_handler = new CreateSeatCommandHandler(_fixture.Mapper, _fixture.DbContext);
|
_handler = new CreateSeatCommandHandler(_fixture.DbContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<SeatDto> Act(CreateSeat command, CancellationToken cancellationToken)
|
public Task<CreateSeatResult> Act(CreateSeat command, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
return _handler.Handle(command, cancellationToken);
|
return _handler.Handle(command, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +0,0 @@
|
|||||||
namespace Identity.Identity.Dtos;
|
|
||||||
|
|
||||||
public record RegisterNewUserResponseDto(long Id, string FirstName, string LastName, string Username, string PassportNumber);
|
|
||||||
@ -11,5 +11,8 @@ public class IdentityMappings : IRegister
|
|||||||
config.NewConfig<RegisterNewUserRequestDto, RegisterNewUser>()
|
config.NewConfig<RegisterNewUserRequestDto, RegisterNewUser>()
|
||||||
.ConstructUsing(x => new RegisterNewUser(x.FirstName, x.LastName, x.Username, x.Email,
|
.ConstructUsing(x => new RegisterNewUser(x.FirstName, x.LastName, x.Username, x.Email,
|
||||||
x.Password, x.ConfirmPassword, x.PassportNumber));
|
x.Password, x.ConfirmPassword, x.PassportNumber));
|
||||||
|
|
||||||
|
config.NewConfig<RegisterNewUserResult, RegisterNewUserResponseDto>()
|
||||||
|
.ConstructUsing(x => new RegisterNewUserResponseDto(x.Id, x.FirstName, x.LastName, x.Username, x.PassportNumber));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,14 +7,15 @@ using Ardalis.GuardClauses;
|
|||||||
using BuildingBlocks.Contracts.EventBus.Messages;
|
using BuildingBlocks.Contracts.EventBus.Messages;
|
||||||
using BuildingBlocks.Core;
|
using BuildingBlocks.Core;
|
||||||
using BuildingBlocks.Core.CQRS;
|
using BuildingBlocks.Core.CQRS;
|
||||||
using Dtos;
|
|
||||||
using Exceptions;
|
using Exceptions;
|
||||||
using FluentValidation;
|
using FluentValidation;
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using Models;
|
using Models;
|
||||||
|
|
||||||
public record RegisterNewUser(string FirstName, string LastName, string Username, string Email,
|
public record RegisterNewUser(string FirstName, string LastName, string Username, string Email,
|
||||||
string Password, string ConfirmPassword, string PassportNumber) : ICommand<RegisterNewUserResponseDto>;
|
string Password, string ConfirmPassword, string PassportNumber) : ICommand<RegisterNewUserResult>;
|
||||||
|
|
||||||
|
public record RegisterNewUserResult(long Id, string FirstName, string LastName, string Username, string PassportNumber);
|
||||||
|
|
||||||
internal class RegisterNewUserValidator : AbstractValidator<RegisterNewUser>
|
internal class RegisterNewUserValidator : AbstractValidator<RegisterNewUser>
|
||||||
{
|
{
|
||||||
@ -39,7 +40,7 @@ internal class RegisterNewUserValidator : AbstractValidator<RegisterNewUser>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class RegisterNewUserHandler : ICommandHandler<RegisterNewUser, RegisterNewUserResponseDto>
|
internal class RegisterNewUserHandler : ICommandHandler<RegisterNewUser, RegisterNewUserResult>
|
||||||
{
|
{
|
||||||
private readonly IEventDispatcher _eventDispatcher;
|
private readonly IEventDispatcher _eventDispatcher;
|
||||||
private readonly UserManager<User> _userManager;
|
private readonly UserManager<User> _userManager;
|
||||||
@ -51,7 +52,7 @@ internal class RegisterNewUserHandler : ICommandHandler<RegisterNewUser, Registe
|
|||||||
_eventDispatcher = eventDispatcher;
|
_eventDispatcher = eventDispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<RegisterNewUserResponseDto> Handle(RegisterNewUser request,
|
public async Task<RegisterNewUserResult> Handle(RegisterNewUser request,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(request, nameof(request));
|
Guard.Against.Null(request, nameof(request));
|
||||||
@ -82,7 +83,7 @@ internal class RegisterNewUserHandler : ICommandHandler<RegisterNewUser, Registe
|
|||||||
await _eventDispatcher.SendAsync(new UserCreated(applicationUser.Id, applicationUser.FirstName + " " + applicationUser.LastName,
|
await _eventDispatcher.SendAsync(new UserCreated(applicationUser.Id, applicationUser.FirstName + " " + applicationUser.LastName,
|
||||||
applicationUser.PassPortNumber),cancellationToken: cancellationToken);
|
applicationUser.PassPortNumber),cancellationToken: cancellationToken);
|
||||||
|
|
||||||
return new RegisterNewUserResponseDto(applicationUser.Id, applicationUser.FirstName, applicationUser.LastName,
|
return new RegisterNewUserResult(applicationUser.Id, applicationUser.FirstName, applicationUser.LastName,
|
||||||
applicationUser.UserName, applicationUser.PassPortNumber);
|
applicationUser.UserName, applicationUser.PassPortNumber);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,6 @@ namespace Identity.Identity.Features.RegisteringNewUser.V1;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using BuildingBlocks.Web;
|
using BuildingBlocks.Web;
|
||||||
using Dtos;
|
|
||||||
using Hellang.Middleware.ProblemDetails;
|
using Hellang.Middleware.ProblemDetails;
|
||||||
using MapsterMapper;
|
using MapsterMapper;
|
||||||
using MediatR;
|
using MediatR;
|
||||||
@ -15,6 +14,8 @@ using Swashbuckle.AspNetCore.Annotations;
|
|||||||
public record RegisterNewUserRequestDto(string FirstName, string LastName, string Username, string Email,
|
public record RegisterNewUserRequestDto(string FirstName, string LastName, string Username, string Email,
|
||||||
string Password, string ConfirmPassword, string PassportNumber);
|
string Password, string ConfirmPassword, string PassportNumber);
|
||||||
|
|
||||||
|
public record RegisterNewUserResponseDto(long Id, string FirstName, string LastName, string Username, string PassportNumber);
|
||||||
|
|
||||||
public class RegisterNewUserEndpoint : IMinimalEndpoint
|
public class RegisterNewUserEndpoint : IMinimalEndpoint
|
||||||
{
|
{
|
||||||
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||||
@ -42,10 +43,12 @@ public class RegisterNewUserEndpoint : IMinimalEndpoint
|
|||||||
private async Task<IResult> RegisterNewUser(RegisterNewUserRequestDto request, IMediator mediator, IMapper mapper,
|
private async Task<IResult> RegisterNewUser(RegisterNewUserRequestDto request, IMediator mediator, IMapper mapper,
|
||||||
CancellationToken cancellationToken)
|
CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var command = mapper.Map<V1.RegisterNewUser>(request);
|
var command = mapper.Map<RegisterNewUser>(request);
|
||||||
|
|
||||||
var result = await mediator.Send(command, cancellationToken);
|
var result = await mediator.Send(command, cancellationToken);
|
||||||
|
|
||||||
return Results.Ok(result);
|
var response = mapper.Map<RegisterNewUserResponseDto>(result);
|
||||||
|
|
||||||
|
return Results.Ok(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,7 @@ package passenger;
|
|||||||
|
|
||||||
service PassengerGrpcService {
|
service PassengerGrpcService {
|
||||||
|
|
||||||
rpc GetById (GetByIdRequest) returns (PassengerResponse);
|
rpc GetById (GetByIdRequest) returns (GetPassengerByIdResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
message GetByIdRequest {
|
message GetByIdRequest {
|
||||||
@ -20,6 +20,10 @@ message PassengerResponse {
|
|||||||
string Email = 6;
|
string Email = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message GetPassengerByIdResult {
|
||||||
|
PassengerResponse PassengerDto = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
enum PassengerType {
|
enum PassengerType {
|
||||||
PASSENGER_TYPE_UNKNOWN = 0;
|
PASSENGER_TYPE_UNKNOWN = 0;
|
||||||
|
|||||||
@ -5,6 +5,7 @@ using MediatR;
|
|||||||
namespace Passenger.GrpcServer.Services;
|
namespace Passenger.GrpcServer.Services;
|
||||||
|
|
||||||
using Passengers.Features.GettingPassengerById.Queries.V1;
|
using Passengers.Features.GettingPassengerById.Queries.V1;
|
||||||
|
using GetPassengerByIdResult = GetPassengerByIdResult;
|
||||||
|
|
||||||
public class PassengerGrpcServices : PassengerGrpcService.PassengerGrpcServiceBase
|
public class PassengerGrpcServices : PassengerGrpcService.PassengerGrpcServiceBase
|
||||||
{
|
{
|
||||||
@ -15,9 +16,9 @@ public class PassengerGrpcServices : PassengerGrpcService.PassengerGrpcServiceBa
|
|||||||
_mediator = mediator;
|
_mediator = mediator;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<PassengerResponse> GetById(GetByIdRequest request, ServerCallContext context)
|
public override async Task<GetPassengerByIdResult> GetById(GetByIdRequest request, ServerCallContext context)
|
||||||
{
|
{
|
||||||
var result = await _mediator.Send(new GetPassengerById(request.Id));
|
var result = await _mediator.Send(new GetPassengerById(request.Id));
|
||||||
return result.Adapt<PassengerResponse>();
|
return result.Adapt<GetPassengerByIdResult>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,15 +8,16 @@ using Exceptions;
|
|||||||
using FluentValidation;
|
using FluentValidation;
|
||||||
using MapsterMapper;
|
using MapsterMapper;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Passenger.Data;
|
using Data;
|
||||||
using Passenger.Passengers.Dtos;
|
using Dtos;
|
||||||
|
|
||||||
public record CompleteRegisterPassenger
|
public record CompleteRegisterPassenger(string PassportNumber, Enums.PassengerType PassengerType, int Age) : ICommand<CompleteRegisterPassengerResult>, IInternalCommand
|
||||||
(string PassportNumber, Enums.PassengerType PassengerType, int Age) : ICommand<PassengerDto>, IInternalCommand
|
|
||||||
{
|
{
|
||||||
public long Id { get; init; } = SnowFlakIdGenerator.NewId();
|
public long Id { get; init; } = SnowFlakIdGenerator.NewId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public record CompleteRegisterPassengerResult(PassengerDto PassengerDto);
|
||||||
|
|
||||||
internal class CompleteRegisterPassengerValidator : AbstractValidator<CompleteRegisterPassenger>
|
internal class CompleteRegisterPassengerValidator : AbstractValidator<CompleteRegisterPassenger>
|
||||||
{
|
{
|
||||||
public CompleteRegisterPassengerValidator()
|
public CompleteRegisterPassengerValidator()
|
||||||
@ -32,7 +33,7 @@ internal class CompleteRegisterPassengerValidator : AbstractValidator<CompleteRe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class CompleteRegisterPassengerCommandHandler : ICommandHandler<CompleteRegisterPassenger, PassengerDto>
|
internal class CompleteRegisterPassengerCommandHandler : ICommandHandler<CompleteRegisterPassenger, CompleteRegisterPassengerResult>
|
||||||
{
|
{
|
||||||
private readonly IMapper _mapper;
|
private readonly IMapper _mapper;
|
||||||
private readonly PassengerDbContext _passengerDbContext;
|
private readonly PassengerDbContext _passengerDbContext;
|
||||||
@ -43,7 +44,7 @@ internal class CompleteRegisterPassengerCommandHandler : ICommandHandler<Complet
|
|||||||
_passengerDbContext = passengerDbContext;
|
_passengerDbContext = passengerDbContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PassengerDto> Handle(CompleteRegisterPassenger request, CancellationToken cancellationToken)
|
public async Task<CompleteRegisterPassengerResult> Handle(CompleteRegisterPassenger request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(request, nameof(request));
|
Guard.Against.Null(request, nameof(request));
|
||||||
|
|
||||||
@ -60,6 +61,8 @@ internal class CompleteRegisterPassengerCommandHandler : ICommandHandler<Complet
|
|||||||
|
|
||||||
var updatePassenger = _passengerDbContext.Passengers.Update(passengerEntity);
|
var updatePassenger = _passengerDbContext.Passengers.Update(passengerEntity);
|
||||||
|
|
||||||
return _mapper.Map<PassengerDto>(updatePassenger.Entity);
|
var passengerDto = _mapper.Map<PassengerDto>(updatePassenger.Entity);
|
||||||
|
|
||||||
|
return new CompleteRegisterPassengerResult(passengerDto);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,10 +7,11 @@ using MediatR;
|
|||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Routing;
|
using Microsoft.AspNetCore.Routing;
|
||||||
using Passenger.Passengers.Dtos;
|
using Dtos;
|
||||||
using Swashbuckle.AspNetCore.Annotations;
|
using Swashbuckle.AspNetCore.Annotations;
|
||||||
|
|
||||||
public record CompleteRegisterPassengerRequestDto(string PassportNumber, Enums.PassengerType PassengerType, int Age);
|
public record CompleteRegisterPassengerRequestDto(string PassportNumber, Enums.PassengerType PassengerType, int Age);
|
||||||
|
public record CompleteRegisterPassengerResponseDto(PassengerDto PassengerDto);
|
||||||
|
|
||||||
public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint
|
public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint
|
||||||
{
|
{
|
||||||
@ -26,7 +27,7 @@ public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint
|
|||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status200OK,
|
StatusCodes.Status200OK,
|
||||||
"Register Passenger Completed",
|
"Register Passenger Completed",
|
||||||
typeof(PassengerDto)))
|
typeof(CompleteRegisterPassengerResponseDto)))
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status400BadRequest,
|
StatusCodes.Status400BadRequest,
|
||||||
@ -49,6 +50,8 @@ public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint
|
|||||||
|
|
||||||
var result = await mediator.Send(command, cancellationToken);
|
var result = await mediator.Send(command, cancellationToken);
|
||||||
|
|
||||||
return Results.Ok(result);
|
var response = new CompleteRegisterPassengerResponseDto(result?.PassengerDto);
|
||||||
|
|
||||||
|
return Results.Ok(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,7 +9,9 @@ using Microsoft.EntityFrameworkCore;
|
|||||||
using Ardalis.GuardClauses;
|
using Ardalis.GuardClauses;
|
||||||
using Exceptions;
|
using Exceptions;
|
||||||
|
|
||||||
public record GetPassengerById(long Id) : IQuery<PassengerDto>;
|
public record GetPassengerById(long Id) : IQuery<GetPassengerByIdResult>;
|
||||||
|
|
||||||
|
public record GetPassengerByIdResult(PassengerDto PassengerDto);
|
||||||
|
|
||||||
internal class GetPassengerByIdValidator: AbstractValidator<GetPassengerById>
|
internal class GetPassengerByIdValidator: AbstractValidator<GetPassengerById>
|
||||||
{
|
{
|
||||||
@ -19,7 +21,7 @@ internal class GetPassengerByIdValidator: AbstractValidator<GetPassengerById>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class GetPassengerByIdHandler : IQueryHandler<GetPassengerById, PassengerDto>
|
internal class GetPassengerByIdHandler : IQueryHandler<GetPassengerById, GetPassengerByIdResult>
|
||||||
{
|
{
|
||||||
private readonly PassengerDbContext _passengerDbContext;
|
private readonly PassengerDbContext _passengerDbContext;
|
||||||
private readonly IMapper _mapper;
|
private readonly IMapper _mapper;
|
||||||
@ -30,7 +32,7 @@ internal class GetPassengerByIdHandler : IQueryHandler<GetPassengerById, Passeng
|
|||||||
_passengerDbContext = passengerDbContext;
|
_passengerDbContext = passengerDbContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<PassengerDto> Handle(GetPassengerById query, CancellationToken cancellationToken)
|
public async Task<GetPassengerByIdResult> Handle(GetPassengerById query, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Guard.Against.Null(query, nameof(query));
|
Guard.Against.Null(query, nameof(query));
|
||||||
|
|
||||||
@ -42,6 +44,8 @@ internal class GetPassengerByIdHandler : IQueryHandler<GetPassengerById, Passeng
|
|||||||
throw new PassengerNotFoundException();
|
throw new PassengerNotFoundException();
|
||||||
}
|
}
|
||||||
|
|
||||||
return _mapper.Map<PassengerDto>(passenger!);
|
var passengerDto = _mapper.Map<PassengerDto>(passenger);
|
||||||
|
|
||||||
|
return new GetPassengerByIdResult(passengerDto);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,6 +9,8 @@ using Microsoft.AspNetCore.Routing;
|
|||||||
using Passenger.Passengers.Dtos;
|
using Passenger.Passengers.Dtos;
|
||||||
using Swashbuckle.AspNetCore.Annotations;
|
using Swashbuckle.AspNetCore.Annotations;
|
||||||
|
|
||||||
|
public record GetPassengerByIdResponseDto(PassengerDto PassengerDto);
|
||||||
|
|
||||||
public class GetPassengerByIdEndpoint : IMinimalEndpoint
|
public class GetPassengerByIdEndpoint : IMinimalEndpoint
|
||||||
{
|
{
|
||||||
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||||
@ -23,7 +25,7 @@ public class GetPassengerByIdEndpoint : IMinimalEndpoint
|
|||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status200OK,
|
StatusCodes.Status200OK,
|
||||||
"GetPassengerById",
|
"GetPassengerById",
|
||||||
typeof(PassengerDto)))
|
typeof(GetPassengerByIdResponseDto)))
|
||||||
.WithMetadata(
|
.WithMetadata(
|
||||||
new SwaggerResponseAttribute(
|
new SwaggerResponseAttribute(
|
||||||
StatusCodes.Status400BadRequest,
|
StatusCodes.Status400BadRequest,
|
||||||
@ -43,6 +45,8 @@ public class GetPassengerByIdEndpoint : IMinimalEndpoint
|
|||||||
{
|
{
|
||||||
var result = await mediator.Send(new GetPassengerById(id), cancellationToken);
|
var result = await mediator.Send(new GetPassengerById(id), cancellationToken);
|
||||||
|
|
||||||
return Results.Ok(result);
|
var response = new GetPassengerByIdResponseDto(result?.PassengerDto);
|
||||||
|
|
||||||
|
return Results.Ok(response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -33,9 +33,9 @@ public class CompleteRegisterPassengerTests : PassengerIntegrationTestBase
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response.Should().NotBeNull();
|
response.Should().NotBeNull();
|
||||||
response?.Name.Should().Be(userCreated.Name);
|
response?.PassengerDto?.Name.Should().Be(userCreated.Name);
|
||||||
response?.PassportNumber.Should().Be(command.PassportNumber);
|
response?.PassengerDto?.PassportNumber.Should().Be(command.PassportNumber);
|
||||||
response?.PassengerType.ToString().Should().Be(command.PassengerType.ToString());
|
response?.PassengerDto?.PassengerType.ToString().Should().Be(command.PassengerType.ToString());
|
||||||
response?.Age.Should().Be(command.Age);
|
response?.PassengerDto?.Age.Should().Be(command.Age);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,7 +34,7 @@ public class GetPassengerByIdTests : PassengerIntegrationTestBase
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response.Should().NotBeNull();
|
response.Should().NotBeNull();
|
||||||
response?.Id.Should().Be(passengerEntity.Id);
|
response?.PassengerDto?.Id.Should().Be(passengerEntity.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@ -53,6 +53,6 @@ public class GetPassengerByIdTests : PassengerIntegrationTestBase
|
|||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
response?.Should().NotBeNull();
|
response?.Should().NotBeNull();
|
||||||
response?.Id.Should().Be(passengerEntity.Id);
|
response?.PassengerDto?.Id.Should().Be(passengerEntity.Id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user