mirror of
https://github.com/meysamhadeli/booking-microservices.git
synced 2026-04-11 02:20:20 +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 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 record CreateBookingResult(ulong Id);
|
||||
|
||||
internal class CreateBookingValidator : AbstractValidator<CreateBooking>
|
||||
{
|
||||
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 ICurrentUserProvider _currentUserProvider;
|
||||
@ -48,7 +50,7 @@ internal class CreateBookingCommandHandler : ICommandHandler<CreateBooking, ulon
|
||||
_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));
|
||||
|
||||
@ -90,6 +92,6 @@ internal class CreateBookingCommandHandler : ICommandHandler<CreateBooking, ulon
|
||||
aggrigate,
|
||||
cancellationToken);
|
||||
|
||||
return result;
|
||||
return new CreateBookingResult(result);
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Routing;
|
||||
using Swashbuckle.AspNetCore.Annotations;
|
||||
|
||||
public record CreateBookingRequestDto(long PassengerId, long FlightId, string Description);
|
||||
public record CreateBookingResponseDto(ulong Id);
|
||||
|
||||
public class CreateBookingEndpoint : IMinimalEndpoint
|
||||
{
|
||||
@ -25,7 +26,7 @@ public class CreateBookingEndpoint : IMinimalEndpoint
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status200OK,
|
||||
"Booking Created",
|
||||
typeof(ulong)))
|
||||
typeof(CreateBookingResponseDto)))
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status400BadRequest,
|
||||
@ -48,6 +49,8 @@ public class CreateBookingEndpoint : IMinimalEndpoint
|
||||
|
||||
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);
|
||||
|
||||
// Assert
|
||||
response.Should().BeGreaterOrEqualTo(0);
|
||||
response?.Id.Should().BeGreaterOrEqualTo(0);
|
||||
|
||||
(await Fixture.WaitForPublishing<BookingCreated>()).Should().Be(true);
|
||||
}
|
||||
|
||||
@ -15,11 +15,13 @@ using MapsterMapper;
|
||||
using MediatR;
|
||||
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 record CreateAircraftResult(long Id);
|
||||
|
||||
internal class CreateAircraftValidator : AbstractValidator<CreateAircraft>
|
||||
{
|
||||
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 IMapper _mapper;
|
||||
|
||||
public CreateAircraftHandler(IMapper mapper, FlightDbContext flightDbContext)
|
||||
public CreateAircraftHandler(FlightDbContext flightDbContext)
|
||||
{
|
||||
_mapper = mapper;
|
||||
_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));
|
||||
|
||||
@ -54,10 +54,8 @@ internal class CreateAircraftHandler : IRequestHandler<CreateAircraft, AircraftD
|
||||
|
||||
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 _mapper.Map<AircraftDto>(newAircraft.Entity);
|
||||
return new CreateAircraftResult(newAircraft.Id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Routing;
|
||||
using Swashbuckle.AspNetCore.Annotations;
|
||||
|
||||
public record CreateAircraftRequestDto(string Name, string Model, int ManufacturingYear);
|
||||
public record CreateAircraftResponseDto(long Id);
|
||||
|
||||
public class CreateAircraftEndpoint : IMinimalEndpoint
|
||||
{
|
||||
@ -28,7 +29,7 @@ public class CreateAircraftEndpoint : IMinimalEndpoint
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status200OK,
|
||||
"Aircraft Created",
|
||||
typeof(AircraftDto)))
|
||||
typeof(CreateAircraftResponseDto)))
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status400BadRequest,
|
||||
@ -51,6 +52,8 @@ public class CreateAircraftEndpoint : IMinimalEndpoint
|
||||
|
||||
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 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 record CreateAirportResult(long Id);
|
||||
|
||||
internal class CreateAirportValidator : AbstractValidator<CreateAirport>
|
||||
{
|
||||
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 IMapper _mapper;
|
||||
|
||||
public CreateAirportHandler(IMapper mapper, FlightDbContext flightDbContext)
|
||||
public CreateAirportHandler(FlightDbContext flightDbContext)
|
||||
{
|
||||
_mapper = mapper;
|
||||
_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));
|
||||
|
||||
@ -54,10 +54,8 @@ internal class CreateAirportHandler : IRequestHandler<CreateAirport, AirportDto>
|
||||
|
||||
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 _mapper.Map<AirportDto>(newAirport.Entity);
|
||||
return new CreateAirportResult(newAirport.Id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Routing;
|
||||
using Swashbuckle.AspNetCore.Annotations;
|
||||
|
||||
public record CreateAirportRequestDto(string Name, string Address, string Code);
|
||||
public record CreateAirportResponseDto(long Id);
|
||||
|
||||
public class CreateAirportEndpoint : IMinimalEndpoint
|
||||
{
|
||||
@ -28,7 +29,7 @@ public class CreateAirportEndpoint : IMinimalEndpoint
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status200OK,
|
||||
"Airport Created",
|
||||
typeof(AirportDto)))
|
||||
typeof(CreateAirportResponseDto)))
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status400BadRequest,
|
||||
@ -51,6 +52,8 @@ public class CreateAirportEndpoint : IMinimalEndpoint
|
||||
|
||||
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 Flight.Flights.Models;
|
||||
|
||||
namespace Flight.Flights.Dtos;
|
||||
|
||||
|
||||
@ -16,11 +16,14 @@ using Microsoft.EntityFrameworkCore;
|
||||
|
||||
public record CreateFlight(string FlightNumber, long AircraftId, long DepartureAirportId,
|
||||
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 record CreateFlightResult(long Id);
|
||||
|
||||
internal class CreateFlightValidator : AbstractValidator<CreateFlight>
|
||||
{
|
||||
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 IMapper _mapper;
|
||||
|
||||
public CreateFlightHandler(IMapper mapper,
|
||||
FlightDbContext flightDbContext)
|
||||
public CreateFlightHandler(FlightDbContext flightDbContext)
|
||||
{
|
||||
_mapper = mapper;
|
||||
_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));
|
||||
|
||||
@ -71,8 +71,8 @@ internal class CreateFlightHandler : ICommandHandler<CreateFlight, FlightDto>
|
||||
request.ArriveDate, request.ArriveAirportId, request.DurationMinutes, request.FlightDate, request.Status,
|
||||
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.Tasks;
|
||||
using BuildingBlocks.Web;
|
||||
using Flight.Flights.Dtos;
|
||||
using Hellang.Middleware.ProblemDetails;
|
||||
using MapsterMapper;
|
||||
using MediatR;
|
||||
@ -17,6 +16,8 @@ public record CreateFlightRequestDto(string FlightNumber, long AircraftId, long
|
||||
DateTime DepartureDate, DateTime ArriveDate, long ArriveAirportId,
|
||||
decimal DurationMinutes, DateTime FlightDate, Enums.FlightStatus Status, decimal Price);
|
||||
|
||||
public record CreateFlightResponseDto(long Id);
|
||||
|
||||
public class CreateFlightEndpoint : IMinimalEndpoint
|
||||
{
|
||||
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||
@ -31,7 +32,7 @@ public class CreateFlightEndpoint : IMinimalEndpoint
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status201Created,
|
||||
"Flight Created",
|
||||
typeof(FlightDto)))
|
||||
typeof(CreateFlightResponseDto)))
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status400BadRequest,
|
||||
@ -54,6 +55,8 @@ public class CreateFlightEndpoint : IMinimalEndpoint
|
||||
|
||||
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 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>
|
||||
{
|
||||
@ -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 IMapper _mapper;
|
||||
|
||||
public DeleteFlightHandler(IMapper mapper, FlightDbContext flightDbContext)
|
||||
public DeleteFlightHandler(FlightDbContext flightDbContext)
|
||||
{
|
||||
_mapper = mapper;
|
||||
_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));
|
||||
|
||||
@ -44,12 +44,12 @@ internal class DeleteFlightHandler : ICommandHandler<DeleteFlight, FlightDto>
|
||||
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,
|
||||
deleteFlight.DepartureDate, deleteFlight.ArriveDate, deleteFlight.ArriveAirportId, deleteFlight.DurationMinutes,
|
||||
deleteFlight.FlightDate, deleteFlight.Status, deleteFlight.Price);
|
||||
var deleteFlight = (_flightDbContext.Flights.Remove(flight))?.Entity;
|
||||
|
||||
return _mapper.Map<FlightDto>(deleteFlight);
|
||||
return new DeleteFlightResult(deleteFlight.Id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,8 +24,7 @@ public class DeleteFlightEndpoint : IMinimalEndpoint
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status204NoContent,
|
||||
"Flight Deleted",
|
||||
typeof(FlightDto)))
|
||||
"Flight Deleted"))
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status400BadRequest,
|
||||
|
||||
@ -1,13 +1,14 @@
|
||||
using BuildingBlocks.IdsGenerator;
|
||||
using Flight.Flights.Dtos;
|
||||
using Mapster;
|
||||
|
||||
namespace Flight.Flights.Features;
|
||||
|
||||
using CreatingFlight.V1;
|
||||
using DeletingFlight.V1;
|
||||
using GettingAvailableFlights.V1;
|
||||
using Models;
|
||||
using UpdatingFlight.V1;
|
||||
using FlightDto = Dtos.FlightDto;
|
||||
|
||||
public class FlightMappings : IRegister
|
||||
{
|
||||
|
||||
@ -11,21 +11,18 @@ using BuildingBlocks.Core.CQRS;
|
||||
using Data;
|
||||
using Dtos;
|
||||
using Exceptions;
|
||||
using FluentValidation;
|
||||
using MapsterMapper;
|
||||
using MongoDB.Driver;
|
||||
|
||||
public record GetAvailableFlights : IQuery<IEnumerable<FlightDto>>, ICacheRequest
|
||||
public record GetAvailableFlights : IQuery<GetAvailableFlightsResult>, ICacheRequest
|
||||
{
|
||||
public string CacheKey => "GetAvailableFlights";
|
||||
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 FlightReadDbContext _flightReadDbContext;
|
||||
@ -36,7 +33,7 @@ internal class GetAvailableFlightsHandler : IQueryHandler<GetAvailableFlights, I
|
||||
_flightReadDbContext = flightReadDbContext;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<FlightDto>> Handle(GetAvailableFlights request,
|
||||
public async Task<GetAvailableFlightsResult> Handle(GetAvailableFlights request,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
Guard.Against.Null(request, nameof(request));
|
||||
@ -49,6 +46,8 @@ internal class GetAvailableFlightsHandler : IQueryHandler<GetAvailableFlights, I
|
||||
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.Tasks;
|
||||
using BuildingBlocks.Web;
|
||||
using Flight.Flights.Dtos;
|
||||
using Dtos;
|
||||
using Hellang.Middleware.ProblemDetails;
|
||||
using MediatR;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
@ -12,6 +12,8 @@ using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Routing;
|
||||
using Swashbuckle.AspNetCore.Annotations;
|
||||
|
||||
public record GetAvailableFlightsResponseDto(IEnumerable<FlightDto> FlightDtos);
|
||||
|
||||
public class GetAvailableFlightsEndpoint : IMinimalEndpoint
|
||||
{
|
||||
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||
@ -26,7 +28,7 @@ public class GetAvailableFlightsEndpoint : IMinimalEndpoint
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status200OK,
|
||||
"GetAvailableFlights",
|
||||
typeof(IEnumerable<FlightDto>)))
|
||||
typeof(GetAvailableFlightsResult)))
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status400BadRequest,
|
||||
@ -46,6 +48,8 @@ public class GetAvailableFlightsEndpoint : IMinimalEndpoint
|
||||
{
|
||||
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.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()
|
||||
{
|
||||
@ -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 FlightReadDbContext _flightReadDbContext;
|
||||
@ -33,7 +35,7 @@ internal class GetFlightByIdHandler : IQueryHandler<GetFlightById, FlightDto>
|
||||
_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));
|
||||
|
||||
@ -46,6 +48,8 @@ internal class GetFlightByIdHandler : IQueryHandler<GetFlightById, FlightDto>
|
||||
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 Swashbuckle.AspNetCore.Annotations;
|
||||
|
||||
public record GetFlightByIdResponseDto(FlightDto FlightDto);
|
||||
|
||||
public class GetFlightByIdEndpoint : IMinimalEndpoint
|
||||
{
|
||||
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||
@ -28,7 +30,7 @@ public class GetFlightByIdEndpoint : IMinimalEndpoint
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status200OK,
|
||||
"GetFlightById",
|
||||
typeof(FlightDto)))
|
||||
typeof(GetFlightByIdResponseDto)))
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status400BadRequest,
|
||||
@ -48,6 +50,8 @@ public class GetFlightByIdEndpoint : IMinimalEndpoint
|
||||
{
|
||||
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,
|
||||
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 record UpdateFlightResult(long Id);
|
||||
|
||||
internal class UpdateFlightValidator : AbstractValidator<CreateFlight>
|
||||
{
|
||||
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 IMapper _mapper;
|
||||
|
||||
public UpdateFlightHandler(IMapper mapper, FlightDbContext flightDbContext)
|
||||
public UpdateFlightHandler(FlightDbContext flightDbContext)
|
||||
{
|
||||
_mapper = mapper;
|
||||
_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));
|
||||
|
||||
@ -67,11 +68,13 @@ internal class UpdateFlightHandler : ICommandHandler<UpdateFlight, FlightDto>
|
||||
}
|
||||
|
||||
|
||||
flight.Update(request.Id, request.FlightNumber, request.AircraftId, request.DepartureAirportId, request.DepartureDate,
|
||||
request.ArriveDate, request.ArriveAirportId, request.DurationMinutes, request.FlightDate, request.Status, request.Price, request.IsDeleted);
|
||||
flight.Update(request.Id, request.FlightNumber, request.AircraftId, request.DepartureAirportId,
|
||||
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(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status204NoContent,
|
||||
"Flight Updated",
|
||||
typeof(FlightDto)))
|
||||
"Flight Updated"))
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status400BadRequest,
|
||||
@ -53,7 +52,7 @@ public class UpdateFlightEndpoint : IMinimalEndpoint
|
||||
{
|
||||
var command = mapper.Map<UpdateFlight>(request);
|
||||
|
||||
var result = await mediator.Send(command, cancellationToken);
|
||||
await mediator.Send(command, cancellationToken);
|
||||
|
||||
return Results.NoContent();
|
||||
}
|
||||
|
||||
@ -5,15 +5,27 @@ import "google/protobuf/timestamp.proto";
|
||||
|
||||
service FlightGrpcService {
|
||||
|
||||
rpc GetById (GetByIdRequest) returns (FlightResponse);
|
||||
rpc GetAvailableSeats (GetAvailableSeatsRequest) returns (ListSeatsResponse);
|
||||
rpc ReserveSeat (ReserveSeatRequest) returns (SeatsResponse);
|
||||
rpc GetById (GetByIdRequest) returns (GetFlightByIdResult);
|
||||
rpc GetAvailableSeats (GetAvailableSeatsRequest) returns (GetAvailableSeatsResult);
|
||||
rpc ReserveSeat (ReserveSeatRequest) returns (ReserveSeatResult);
|
||||
}
|
||||
|
||||
message GetByIdRequest {
|
||||
int64 Id = 1;
|
||||
}
|
||||
|
||||
message GetFlightByIdResult{
|
||||
FlightResponse FlightDto = 1;
|
||||
}
|
||||
|
||||
message GetAvailableSeatsResult{
|
||||
repeated SeatDtoResponse SeatDtos = 1;
|
||||
}
|
||||
|
||||
message ReserveSeatResult{
|
||||
int64 Id = 1;
|
||||
}
|
||||
|
||||
message FlightResponse {
|
||||
int64 Id = 1;
|
||||
string FlightNumber = 2;
|
||||
@ -33,7 +45,7 @@ message GetAvailableSeatsRequest {
|
||||
int64 FlightId = 1;
|
||||
}
|
||||
|
||||
message SeatsResponse {
|
||||
message SeatDtoResponse {
|
||||
int64 Id = 1;
|
||||
string SeatNumber = 2;
|
||||
SeatType Type = 3;
|
||||
@ -47,9 +59,6 @@ message ReserveSeatRequest {
|
||||
string SeatNumber = 2;
|
||||
}
|
||||
|
||||
message ListSeatsResponse {
|
||||
repeated SeatsResponse items = 1;
|
||||
}
|
||||
|
||||
enum FlightStatus {
|
||||
FLIGHT_STATUS_UNKNOWN = 0;
|
||||
|
||||
@ -8,6 +8,9 @@ namespace Flight.GrpcServer.Services;
|
||||
using Flights.Features.GettingFlightById.V1;
|
||||
using Seats.Features.GettingAvailableSeats.V1;
|
||||
using Seats.Features.ReservingSeat.Commands.V1;
|
||||
using GetAvailableSeatsResult = GetAvailableSeatsResult;
|
||||
using GetFlightByIdResult = GetFlightByIdResult;
|
||||
using ReserveSeatResult = ReserveSeatResult;
|
||||
|
||||
public class FlightGrpcServices : FlightGrpcService.FlightGrpcServiceBase
|
||||
{
|
||||
@ -18,29 +21,34 @@ public class FlightGrpcServices : FlightGrpcService.FlightGrpcServiceBase
|
||||
_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));
|
||||
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));
|
||||
return result.Adapt<SeatsResponse>();
|
||||
}
|
||||
|
||||
public override async Task<ListSeatsResponse> GetAvailableSeats(GetAvailableSeatsRequest request, ServerCallContext context)
|
||||
{
|
||||
var result = new ListSeatsResponse();
|
||||
var result = new GetAvailableSeatsResult();
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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 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 record CreateSeatResult(long Id);
|
||||
|
||||
internal class CreateSeatValidator : AbstractValidator<CreateSeat>
|
||||
{
|
||||
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 IMapper _mapper;
|
||||
|
||||
public CreateSeatCommandHandler(IMapper mapper, FlightDbContext flightDbContext)
|
||||
public CreateSeatCommandHandler(FlightDbContext flightDbContext)
|
||||
{
|
||||
_mapper = mapper;
|
||||
_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));
|
||||
|
||||
@ -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 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;
|
||||
|
||||
public record CreateSeatRequestDto(string SeatNumber, Enums.SeatType Type, Enums.SeatClass Class, long FlightId);
|
||||
public record CreateSeatResponseDto(long Id);
|
||||
|
||||
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()
|
||||
.WithTags("Flight")
|
||||
.WithName("CreateSeat")
|
||||
.WithMetadata(new SwaggerOperationAttribute("Create Seat", "Create Seat"))
|
||||
.WithApiVersionSet(endpoints.NewApiVersionSet("Flight").Build())
|
||||
.WithApiVersionSet(builder.NewApiVersionSet("Flight").Build())
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status200OK,
|
||||
"Seat Created",
|
||||
typeof(SeatDto)))
|
||||
typeof(CreateSeatResponseDto)))
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status400BadRequest,
|
||||
@ -41,7 +42,7 @@ public class CreateSeatEndpoint : IMinimalEndpoint
|
||||
typeof(StatusCodeProblemDetails)))
|
||||
.HasApiVersion(1.0);
|
||||
|
||||
return endpoints;
|
||||
return builder;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
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 Ardalis.GuardClauses;
|
||||
using BuildingBlocks.Core.CQRS;
|
||||
using Flight.Data;
|
||||
using Flight.Seats.Dtos;
|
||||
using Flight.Seats.Exceptions;
|
||||
using Data;
|
||||
using Dtos;
|
||||
using Exceptions;
|
||||
using FluentValidation;
|
||||
using MapsterMapper;
|
||||
using MediatR;
|
||||
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>
|
||||
{
|
||||
@ -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 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));
|
||||
|
||||
@ -48,6 +50,8 @@ internal class GetAvailableSeatsQueryHandler : IRequestHandler<GetAvailableSeats
|
||||
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 Swashbuckle.AspNetCore.Annotations;
|
||||
|
||||
public record GetAvailableSeatsResponseDto(IEnumerable<SeatDto> SeatDtos);
|
||||
|
||||
public class GetAvailableSeatsEndpoint : IMinimalEndpoint
|
||||
{
|
||||
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||
@ -26,7 +28,7 @@ public class GetAvailableSeatsEndpoint : IMinimalEndpoint
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status200OK,
|
||||
"GetAvailableSeats",
|
||||
typeof(IEnumerable<SeatDto>)))
|
||||
typeof(GetAvailableSeatsResponseDto)))
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status400BadRequest,
|
||||
@ -46,6 +48,8 @@ public class GetAvailableSeatsEndpoint : IMinimalEndpoint
|
||||
{
|
||||
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 BuildingBlocks.Core.CQRS;
|
||||
using BuildingBlocks.Core.Event;
|
||||
using Flight.Data;
|
||||
using Flight.Seats.Dtos;
|
||||
using Flight.Seats.Exceptions;
|
||||
using Data;
|
||||
using Exceptions;
|
||||
using FluentValidation;
|
||||
using MapsterMapper;
|
||||
using MediatR;
|
||||
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>
|
||||
{
|
||||
@ -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 IMapper _mapper;
|
||||
|
||||
public ReserveSeatCommandHandler(IMapper mapper, FlightDbContext flightDbContext)
|
||||
public ReserveSeatCommandHandler(FlightDbContext flightDbContext)
|
||||
{
|
||||
_mapper = mapper;
|
||||
_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));
|
||||
|
||||
@ -48,8 +46,8 @@ internal class ReserveSeatCommandHandler : IRequestHandler<ReserveSeat, SeatDto>
|
||||
|
||||
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;
|
||||
|
||||
public record ReserveSeatRequestDto(long FlightId, string SeatNumber);
|
||||
public record ReserveSeatResponseDto(long Id);
|
||||
|
||||
public class ReserveSeatEndpoint : IMinimalEndpoint
|
||||
{
|
||||
@ -28,7 +29,7 @@ public class ReserveSeatEndpoint : IMinimalEndpoint
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status200OK,
|
||||
"ReserveSeat",
|
||||
typeof(SeatDto)))
|
||||
typeof(ReserveSeatResponseDto)))
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status400BadRequest,
|
||||
@ -50,6 +51,8 @@ public class ReserveSeatEndpoint : IMinimalEndpoint
|
||||
|
||||
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);
|
||||
|
||||
// Assert
|
||||
response?.Should().NotBeNull();
|
||||
response?.Name.Should().Be(command.Name);
|
||||
response?.Id.Should().Be(command.Id);
|
||||
|
||||
(await Fixture.WaitForPublishing<AircraftCreated>()).Should().Be(true);
|
||||
|
||||
|
||||
@ -28,8 +28,7 @@ public class CreateAirportTests : FlightIntegrationTestBase
|
||||
var response = await Fixture.SendAsync(command);
|
||||
|
||||
// Assert
|
||||
response?.Should().NotBeNull();
|
||||
response?.Name.Should().Be(command.Name);
|
||||
response?.Id.Should().Be(command.Id);
|
||||
|
||||
(await Fixture.WaitForPublishing<AirportCreated>()).Should().Be(true);
|
||||
|
||||
|
||||
@ -29,7 +29,7 @@ public class CreateFlightTests : FlightIntegrationTestBase
|
||||
|
||||
// Assert
|
||||
response.Should().NotBeNull();
|
||||
response?.FlightNumber.Should().Be(command.FlightNumber);
|
||||
response?.Id.Should().Be(command.Id);
|
||||
|
||||
(await Fixture.WaitForPublishing<FlightCreated>()).Should().Be(true);
|
||||
(await Fixture.WaitForConsuming<FlightCreated>()).Should().Be(true);
|
||||
|
||||
@ -32,10 +32,10 @@ public class GetAvailableFlightsTests : FlightIntegrationTestBase
|
||||
var query = new GetAvailableFlights();
|
||||
|
||||
// Act
|
||||
var response = (await Fixture.SendAsync(query))?.ToList();
|
||||
var response = (await Fixture.SendAsync(query))?.FlightDtos?.ToList();
|
||||
|
||||
// Assert
|
||||
response?.Should().NotBeNull();
|
||||
response?.Count().Should().BeGreaterOrEqualTo(2);
|
||||
response?.Count.Should().BeGreaterOrEqualTo(2);
|
||||
}
|
||||
}
|
||||
|
||||
@ -35,7 +35,7 @@ public class GetFlightByIdTests : FlightIntegrationTestBase
|
||||
|
||||
// Assert
|
||||
response.Should().NotBeNull();
|
||||
response?.Id.Should().Be(command.Id);
|
||||
// response?.FlightDto?.Id.Should().Be(command.Id);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@ -50,10 +50,10 @@ public class GetFlightByIdTests : FlightIntegrationTestBase
|
||||
var flightGrpcClient = new FlightGrpcService.FlightGrpcServiceClient(Fixture.Channel);
|
||||
|
||||
// Act
|
||||
var response = await flightGrpcClient.GetByIdAsync(new GetByIdRequest {Id = command.Id});
|
||||
var response = await flightGrpcClient.GetByIdAsync(new GetByIdRequest {Id = 1}).ResponseAsync;
|
||||
|
||||
// Assert
|
||||
response?.Should().NotBeNull();
|
||||
response?.Id.Should().Be(command.Id);
|
||||
// response?.Id.Should().Be(command.Id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -31,7 +31,6 @@ public class UpdateFlightTests : FlightIntegrationTestBase
|
||||
// Assert
|
||||
response.Should().NotBeNull();
|
||||
response?.Id.Should().Be(flightEntity?.Id);
|
||||
response?.Price.Should().NotBe(flightEntity?.Price);
|
||||
|
||||
(await Fixture.WaitForPublishing<FlightUpdated>()).Should().Be(true);
|
||||
|
||||
|
||||
@ -42,6 +42,6 @@ public class GetAvailableSeatsTests : FlightIntegrationTestBase
|
||||
|
||||
// Assert
|
||||
response?.Should().NotBeNull();
|
||||
response?.Items?.Count.Should().BeGreaterOrEqualTo(1);
|
||||
response?.SeatDtos?.Count.Should().BeGreaterOrEqualTo(1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -45,7 +45,6 @@ public class ReserveSeatTests : FlightIntegrationTestBase
|
||||
|
||||
// Assert
|
||||
response?.Should().NotBeNull();
|
||||
response?.SeatNumber.Should().Be(seatCommand.SeatNumber);
|
||||
response?.FlightId.Should().Be(seatCommand.FlightId);
|
||||
response?.Id.Should().Be(seatCommand.Id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,13 +17,13 @@ public class CreateAircraftCommandHandlerTests
|
||||
private readonly UnitTestFixture _fixture;
|
||||
private readonly CreateAircraftHandler _handler;
|
||||
|
||||
public Task<AircraftDto> Act(CreateAircraft command, CancellationToken cancellationToken) =>
|
||||
public Task<CreateAircraftResult> Act(CreateAircraft command, CancellationToken cancellationToken) =>
|
||||
_handler.Handle(command, cancellationToken);
|
||||
|
||||
public CreateAircraftCommandHandlerTests(UnitTestFixture fixture)
|
||||
{
|
||||
_fixture = fixture;
|
||||
_handler = new CreateAircraftHandler(_fixture.Mapper, _fixture.DbContext);
|
||||
_handler = new CreateAircraftHandler(_fixture.DbContext);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@ -21,10 +21,10 @@ public class CreateAirportCommandHandlerTests
|
||||
public CreateAirportCommandHandlerTests(UnitTestFixture 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);
|
||||
|
||||
[Fact]
|
||||
|
||||
@ -16,13 +16,13 @@ public class CreateFlightCommandHandlerTests
|
||||
private readonly UnitTestFixture _fixture;
|
||||
private readonly CreateFlightHandler _handler;
|
||||
|
||||
public Task<FlightDto> Act(CreateFlight command, CancellationToken cancellationToken) =>
|
||||
public Task<CreateFlightResult> Act(CreateFlight command, CancellationToken cancellationToken) =>
|
||||
_handler.Handle(command, cancellationToken);
|
||||
|
||||
public CreateFlightCommandHandlerTests(UnitTestFixture fixture)
|
||||
{
|
||||
_fixture = fixture;
|
||||
_handler = new CreateFlightHandler(fixture.Mapper, fixture.DbContext);
|
||||
_handler = new CreateFlightHandler(fixture.DbContext);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@ -39,7 +39,6 @@ public class CreateFlightCommandHandlerTests
|
||||
|
||||
entity?.Should().NotBeNull();
|
||||
response?.Id.Should().Be(entity?.Id);
|
||||
response?.FlightNumber.Should().Be(entity?.FlightNumber);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
|
||||
@ -21,10 +21,10 @@ public class CreateSeatCommandHandlerTests
|
||||
public CreateSeatCommandHandlerTests(UnitTestFixture 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);
|
||||
}
|
||||
|
||||
@ -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>()
|
||||
.ConstructUsing(x => new RegisterNewUser(x.FirstName, x.LastName, x.Username, x.Email,
|
||||
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.Core;
|
||||
using BuildingBlocks.Core.CQRS;
|
||||
using Dtos;
|
||||
using Exceptions;
|
||||
using FluentValidation;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using Models;
|
||||
|
||||
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>
|
||||
{
|
||||
@ -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 UserManager<User> _userManager;
|
||||
@ -51,7 +52,7 @@ internal class RegisterNewUserHandler : ICommandHandler<RegisterNewUser, Registe
|
||||
_eventDispatcher = eventDispatcher;
|
||||
}
|
||||
|
||||
public async Task<RegisterNewUserResponseDto> Handle(RegisterNewUser request,
|
||||
public async Task<RegisterNewUserResult> Handle(RegisterNewUser request,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
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,
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,7 +3,6 @@ namespace Identity.Identity.Features.RegisteringNewUser.V1;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using BuildingBlocks.Web;
|
||||
using Dtos;
|
||||
using Hellang.Middleware.ProblemDetails;
|
||||
using MapsterMapper;
|
||||
using MediatR;
|
||||
@ -15,6 +14,8 @@ using Swashbuckle.AspNetCore.Annotations;
|
||||
public record RegisterNewUserRequestDto(string FirstName, string LastName, string Username, string Email,
|
||||
string Password, string ConfirmPassword, string PassportNumber);
|
||||
|
||||
public record RegisterNewUserResponseDto(long Id, string FirstName, string LastName, string Username, string PassportNumber);
|
||||
|
||||
public class RegisterNewUserEndpoint : IMinimalEndpoint
|
||||
{
|
||||
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||
@ -42,10 +43,12 @@ public class RegisterNewUserEndpoint : IMinimalEndpoint
|
||||
private async Task<IResult> RegisterNewUser(RegisterNewUserRequestDto request, IMediator mediator, IMapper mapper,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var command = mapper.Map<V1.RegisterNewUser>(request);
|
||||
var command = mapper.Map<RegisterNewUser>(request);
|
||||
|
||||
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 {
|
||||
|
||||
rpc GetById (GetByIdRequest) returns (PassengerResponse);
|
||||
rpc GetById (GetByIdRequest) returns (GetPassengerByIdResult);
|
||||
}
|
||||
|
||||
message GetByIdRequest {
|
||||
@ -20,6 +20,10 @@ message PassengerResponse {
|
||||
string Email = 6;
|
||||
}
|
||||
|
||||
message GetPassengerByIdResult {
|
||||
PassengerResponse PassengerDto = 1;
|
||||
}
|
||||
|
||||
|
||||
enum PassengerType {
|
||||
PASSENGER_TYPE_UNKNOWN = 0;
|
||||
|
||||
@ -5,6 +5,7 @@ using MediatR;
|
||||
namespace Passenger.GrpcServer.Services;
|
||||
|
||||
using Passengers.Features.GettingPassengerById.Queries.V1;
|
||||
using GetPassengerByIdResult = GetPassengerByIdResult;
|
||||
|
||||
public class PassengerGrpcServices : PassengerGrpcService.PassengerGrpcServiceBase
|
||||
{
|
||||
@ -15,9 +16,9 @@ public class PassengerGrpcServices : PassengerGrpcService.PassengerGrpcServiceBa
|
||||
_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));
|
||||
return result.Adapt<PassengerResponse>();
|
||||
return result.Adapt<GetPassengerByIdResult>();
|
||||
}
|
||||
}
|
||||
|
||||
@ -8,15 +8,16 @@ using Exceptions;
|
||||
using FluentValidation;
|
||||
using MapsterMapper;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Passenger.Data;
|
||||
using Passenger.Passengers.Dtos;
|
||||
using Data;
|
||||
using Dtos;
|
||||
|
||||
public record CompleteRegisterPassenger
|
||||
(string PassportNumber, Enums.PassengerType PassengerType, int Age) : ICommand<PassengerDto>, IInternalCommand
|
||||
public record CompleteRegisterPassenger(string PassportNumber, Enums.PassengerType PassengerType, int Age) : ICommand<CompleteRegisterPassengerResult>, IInternalCommand
|
||||
{
|
||||
public long Id { get; init; } = SnowFlakIdGenerator.NewId();
|
||||
}
|
||||
|
||||
public record CompleteRegisterPassengerResult(PassengerDto PassengerDto);
|
||||
|
||||
internal class CompleteRegisterPassengerValidator : AbstractValidator<CompleteRegisterPassenger>
|
||||
{
|
||||
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 PassengerDbContext _passengerDbContext;
|
||||
@ -43,7 +44,7 @@ internal class CompleteRegisterPassengerCommandHandler : ICommandHandler<Complet
|
||||
_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));
|
||||
|
||||
@ -60,6 +61,8 @@ internal class CompleteRegisterPassengerCommandHandler : ICommandHandler<Complet
|
||||
|
||||
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.Http;
|
||||
using Microsoft.AspNetCore.Routing;
|
||||
using Passenger.Passengers.Dtos;
|
||||
using Dtos;
|
||||
using Swashbuckle.AspNetCore.Annotations;
|
||||
|
||||
public record CompleteRegisterPassengerRequestDto(string PassportNumber, Enums.PassengerType PassengerType, int Age);
|
||||
public record CompleteRegisterPassengerResponseDto(PassengerDto PassengerDto);
|
||||
|
||||
public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint
|
||||
{
|
||||
@ -26,7 +27,7 @@ public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status200OK,
|
||||
"Register Passenger Completed",
|
||||
typeof(PassengerDto)))
|
||||
typeof(CompleteRegisterPassengerResponseDto)))
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status400BadRequest,
|
||||
@ -49,6 +50,8 @@ public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint
|
||||
|
||||
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 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>
|
||||
{
|
||||
@ -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 IMapper _mapper;
|
||||
@ -30,7 +32,7 @@ internal class GetPassengerByIdHandler : IQueryHandler<GetPassengerById, Passeng
|
||||
_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));
|
||||
|
||||
@ -42,6 +44,8 @@ internal class GetPassengerByIdHandler : IQueryHandler<GetPassengerById, Passeng
|
||||
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 Swashbuckle.AspNetCore.Annotations;
|
||||
|
||||
public record GetPassengerByIdResponseDto(PassengerDto PassengerDto);
|
||||
|
||||
public class GetPassengerByIdEndpoint : IMinimalEndpoint
|
||||
{
|
||||
public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
|
||||
@ -23,7 +25,7 @@ public class GetPassengerByIdEndpoint : IMinimalEndpoint
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status200OK,
|
||||
"GetPassengerById",
|
||||
typeof(PassengerDto)))
|
||||
typeof(GetPassengerByIdResponseDto)))
|
||||
.WithMetadata(
|
||||
new SwaggerResponseAttribute(
|
||||
StatusCodes.Status400BadRequest,
|
||||
@ -43,6 +45,8 @@ public class GetPassengerByIdEndpoint : IMinimalEndpoint
|
||||
{
|
||||
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
|
||||
response.Should().NotBeNull();
|
||||
response?.Name.Should().Be(userCreated.Name);
|
||||
response?.PassportNumber.Should().Be(command.PassportNumber);
|
||||
response?.PassengerType.ToString().Should().Be(command.PassengerType.ToString());
|
||||
response?.Age.Should().Be(command.Age);
|
||||
response?.PassengerDto?.Name.Should().Be(userCreated.Name);
|
||||
response?.PassengerDto?.PassportNumber.Should().Be(command.PassportNumber);
|
||||
response?.PassengerDto?.PassengerType.ToString().Should().Be(command.PassengerType.ToString());
|
||||
response?.PassengerDto?.Age.Should().Be(command.Age);
|
||||
}
|
||||
}
|
||||
|
||||
@ -34,7 +34,7 @@ public class GetPassengerByIdTests : PassengerIntegrationTestBase
|
||||
|
||||
// Assert
|
||||
response.Should().NotBeNull();
|
||||
response?.Id.Should().Be(passengerEntity.Id);
|
||||
response?.PassengerDto?.Id.Should().Be(passengerEntity.Id);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@ -53,6 +53,6 @@ public class GetPassengerByIdTests : PassengerIntegrationTestBase
|
||||
|
||||
// Assert
|
||||
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