From 7b1fb70a2eb40bd8c25c5bbc88f5269c0d0a4959 Mon Sep 17 00:00:00 2001 From: meysamhadeli Date: Sat, 15 Oct 2022 01:40:38 +0330 Subject: [PATCH] change grpc service from magic-onion to grpc-dotnet --- README.md | 2 +- booking.rest | 2 +- src/BuildingBlocks/BuildingBlocks.csproj | 9 +- .../Contracts/Grpc/FlightGrpcContracts.cs | 89 ------------------- .../Contracts/Grpc/PassengerGrpcContracts.cs | 35 -------- .../Web/ServiceCollectionExtensions.cs | 4 +- .../Booking/src/Booking.Api/Program.cs | 7 +- .../Booking/src/Booking/Booking.csproj | 17 +++- .../CreateBookingCommandHandler.cs | 38 ++++---- .../Extensions/GrpcClientExtensions.cs | 27 ++++++ .../Extensions/MagicOnionClientExtensions.cs | 21 ----- .../Booking/GrpcClient/Protos/flight.proto | 76 ++++++++++++++++ .../Booking/GrpcClient/Protos/passenger.proto | 30 +++++++ .../Booking/Features/CreateBookingTests.cs | 39 ++++---- .../Fakes/FakeFlightResponse.cs | 23 +++++ .../Fakes/FakeFlightResponseDto.cs | 22 ----- ...esponseDto.cs => FakePassengerResponse.cs} | 6 +- .../Fakes/FakeReserveSeatRequestDto.cs | 13 --- ...sResponseDto.cs => FakeSeatsResponsecs.cs} | 17 ++-- src/Services/Flight/src/Flight.Api/Program.cs | 7 +- .../src/Flight/Data/Seed/FlightDataSeeder.cs | 14 +-- src/Services/Flight/src/Flight/Flight.csproj | 11 ++- .../Flights/{Models => Enums}/FlightStatus.cs | 3 +- .../Events/Domain/FlightCreatedDomainEvent.cs | 2 +- .../Events/Domain/FlightDeletedDomainEvent.cs | 2 +- .../Events/Domain/FlightUpdatedDomainEvent.cs | 2 +- .../CreateFlight/CreateFlightCommand.cs | 2 +- .../CreateFlightCommandValidator.cs | 8 +- .../Reads/CreateFlightMongoCommand.cs | 4 +- .../Reads/DeleteFlightMongoCommand.cs | 4 +- .../Reads/UpdateFlightMongoCommand.cs | 4 +- .../UpdateFlight/UpdateFlightCommand.cs | 2 +- .../UpdateFlightCommandValidator.cs | 8 +- .../src/Flight/Flights/Models/Flight.cs | 8 +- .../Flights/Models/Reads/FlightReadModel.cs | 2 +- .../Flight/GrpcServer/FlightGrpcService.cs | 40 --------- .../src/Flight/GrpcServer/Protos/flight.proto | 76 ++++++++++++++++ .../GrpcServer/Services/FlightGrpcServices.cs | 45 ++++++++++ .../Seats/{Models => Enums}/SeatClass.cs | 3 +- .../Seats/{Models => Enums}/SeatType.cs | 3 +- .../Seats/Events/SeatCreatedDomainEvent.cs | 2 +- .../Seats/Events/SeatReservedDomainEvent.cs | 2 +- .../Features/CreateSeat/CreateSeatCommand.cs | 2 +- .../CreateSeat/CreateSeatCommandValidator.cs | 6 +- .../Reads/CreateSeatMongoCommand.cs | 6 +- .../Reads/ReserveSeatMongoCommand.cs | 6 +- .../Seats/Models/Reads/SeatReadModel.cs | 4 +- .../Flight/src/Flight/Seats/Models/Seat.cs | 6 +- .../Flight/Features/GetFlightByIdTests.cs | 12 +-- .../Seat/Features/GetAvailableSeatsTests.cs | 13 ++- .../Seat/Features/ReserveSeatTests.cs | 7 +- .../tests/UnitTest/Common/DbContextFactory.cs | 2 + .../UnitTest/Fakes/FakeCreateSeatCommand.cs | 1 + .../Fakes/FakeValidateCreateFlightCommand.cs | 1 + .../Fakes/FakeValidateCreateSeatCommand.cs | 1 + ...-key-A7DD53B5F56AA3937910E9A73600964A.json | 1 + .../Passenger/src/Passenger.Api/Program.cs | 4 +- .../Passenger/src/Passenger/EventMapper.cs | 4 +- .../GrpcServer/PassengerGrpcService.cs | 24 ----- .../GrpcServer/Protos/passenger.proto | 30 +++++++ .../Services/PassengerGrpcServices.cs | 22 +++++ .../Passenger/src/Passenger/Passenger.csproj | 5 ++ .../Passengers/Enums/PassengerType.cs | 9 ++ ...ssengerRegistrationCompletedDomainEvent.cs | 2 +- .../CompleteRegisterPassengerCommand.cs | 2 +- ...mpleteRegisterPassengerCommandValidator.cs | 8 +- .../CompleteRegisterPassengerMongoCommand.cs | 4 +- .../Passenger/Passengers/Models/Passenger.cs | 4 +- .../Passengers/Models/PassengerType.cs | 9 -- .../Models/Reads/PassengerReadModel.cs | 2 +- .../FakeCompleteRegisterPassengerCommand.cs | 1 + .../Fakes/FakePassengerResponseDto.cs | 6 +- .../CompleteRegisterPassengerTests.cs | 5 +- .../Features/GetPassengerByIdTests.cs | 26 ++---- 74 files changed, 544 insertions(+), 422 deletions(-) delete mode 100644 src/BuildingBlocks/Contracts/Grpc/FlightGrpcContracts.cs delete mode 100644 src/BuildingBlocks/Contracts/Grpc/PassengerGrpcContracts.cs create mode 100644 src/Services/Booking/src/Booking/Extensions/GrpcClientExtensions.cs delete mode 100644 src/Services/Booking/src/Booking/Extensions/MagicOnionClientExtensions.cs create mode 100644 src/Services/Booking/src/Booking/GrpcClient/Protos/flight.proto create mode 100644 src/Services/Booking/src/Booking/GrpcClient/Protos/passenger.proto create mode 100644 src/Services/Booking/tests/IntegrationTest/Fakes/FakeFlightResponse.cs delete mode 100644 src/Services/Booking/tests/IntegrationTest/Fakes/FakeFlightResponseDto.cs rename src/Services/Booking/tests/IntegrationTest/Fakes/{FakePassengerResponseDto.cs => FakePassengerResponse.cs} (53%) delete mode 100644 src/Services/Booking/tests/IntegrationTest/Fakes/FakeReserveSeatRequestDto.cs rename src/Services/Booking/tests/IntegrationTest/Fakes/{FakeSeatsResponseDto.cs => FakeSeatsResponsecs.cs} (62%) rename src/Services/Flight/src/Flight/Flights/{Models => Enums}/FlightStatus.cs (66%) delete mode 100644 src/Services/Flight/src/Flight/GrpcServer/FlightGrpcService.cs create mode 100644 src/Services/Flight/src/Flight/GrpcServer/Protos/flight.proto create mode 100644 src/Services/Flight/src/Flight/GrpcServer/Services/FlightGrpcServices.cs rename src/Services/Flight/src/Flight/Seats/{Models => Enums}/SeatClass.cs (59%) rename src/Services/Flight/src/Flight/Seats/{Models => Enums}/SeatType.cs (56%) create mode 100644 src/Services/Identity/src/Identity.Api/keys/is-signing-key-A7DD53B5F56AA3937910E9A73600964A.json delete mode 100644 src/Services/Passenger/src/Passenger/GrpcServer/PassengerGrpcService.cs create mode 100644 src/Services/Passenger/src/Passenger/GrpcServer/Protos/passenger.proto create mode 100644 src/Services/Passenger/src/Passenger/GrpcServer/Services/PassengerGrpcServices.cs create mode 100644 src/Services/Passenger/src/Passenger/Passengers/Enums/PassengerType.cs delete mode 100644 src/Services/Passenger/src/Passenger/Passengers/Models/PassengerType.cs diff --git a/README.md b/README.md index abb9eec..456d5bd 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ High-level plan is represented in the table - ✔️ **[`IdGen`](https://github.com/RobThree/IdGen)** - Twitter Snowflake-alike ID generator for .Net - ✔️ **[`Yarp`](https://github.com/microsoft/reverse-proxy)** - Reverse proxy toolkit for building fast proxy servers in .NET - ✔️ **[`Tye`](https://github.com/dotnet/tye)** - Developer tool that makes developing, testing, and deploying microservices and distributed applications easier -- ✔️ **[`MagicOnion`](https://github.com/Cysharp/MagicOnion)** - gRPC based HTTP/2 RPC Streaming Framework for .NET, .NET Core and Unity. +- ✔️ **[`gRPC-dotnet`](https://github.com/grpc/grpc-dotnet)** - gRPC functionality for .NET. - ✔️ **[`EventStore`](https://github.com/EventStore/EventStore)** - The open-source, functional database with Complex Event Processing. - ✔️ **[`MongoDB.Driver`](https://github.com/mongodb/mongo-csharp-driver)** - .NET Driver for MongoDB. - ✔️ **[`xUnit.net`](https://github.com/xunit/xunit)** - A free, open source, community-focused unit testing tool for the .NET Framework. diff --git a/booking.rest b/booking.rest index b76f659..7654805 100644 --- a/booking.rest +++ b/booking.rest @@ -251,7 +251,7 @@ Content-Type: application/json authorization: bearer {{Authenticate.response.body.access_token}} { - "passengerId": 4776722699124736, + "passengerId": 4779536520052736, "flightId": 1, "description": "I want to fly to iran" } diff --git a/src/BuildingBlocks/BuildingBlocks.csproj b/src/BuildingBlocks/BuildingBlocks.csproj index 0c0fbb4..6c782d4 100644 --- a/src/BuildingBlocks/BuildingBlocks.csproj +++ b/src/BuildingBlocks/BuildingBlocks.csproj @@ -21,10 +21,7 @@ - - - - + @@ -124,6 +121,10 @@ + + + + diff --git a/src/BuildingBlocks/Contracts/Grpc/FlightGrpcContracts.cs b/src/BuildingBlocks/Contracts/Grpc/FlightGrpcContracts.cs deleted file mode 100644 index afb3170..0000000 --- a/src/BuildingBlocks/Contracts/Grpc/FlightGrpcContracts.cs +++ /dev/null @@ -1,89 +0,0 @@ -using MagicOnion; -using MessagePack; - -namespace BuildingBlocks.Contracts.Grpc; - - - public interface IFlightGrpcService : IService - { - UnaryResult GetById(long id); - UnaryResult> GetAvailableSeats(long flightId); - UnaryResult ReserveSeat(ReserveSeatRequestDto request); - } - - - [MessagePackObject] - public class ReserveSeatRequestDto - { - [Key(0)] - public long FlightId { get; set; } - [Key(1)] - public string SeatNumber { get; set; } - } - - [MessagePackObject] - public record SeatResponseDto - { - [Key(0)] - public long Id { get; set; } - [Key(1)] - public string SeatNumber { get; init; } - [Key(2)] - public SeatType Type { get; init; } - [Key(3)] - public SeatClass Class { get; init; } - [Key(4)] - public long FlightId { get; init; } - } - - [MessagePackObject] - public record FlightResponseDto - { - [Key(0)] - public long Id { get; init; } - [Key(1)] - public string FlightNumber { get; init; } - [Key(2)] - public long AircraftId { get; init; } - [Key(3)] - public long DepartureAirportId { get; init; } - [Key(4)] - public DateTime DepartureDate { get; init; } - [Key(5)] - public DateTime ArriveDate { get; init; } - [Key(6)] - public long ArriveAirportId { get; init; } - [Key(7)] - public decimal DurationMinutes { get; init; } - [Key(8)] - public DateTime FlightDate { get; init; } - [Key(9)] - public FlightStatus Status { get; init; } - [Key(10)] - public decimal Price { get; init; } - [Key(11)] - public long FlightId { get; init; } - } - - public enum FlightStatus - { - Flying = 1, - Delay = 2, - Canceled = 3, - Completed = 4 - } - - public enum SeatType - { - Window, - Middle, - Aisle - } - - public enum SeatClass - { - FirstClass, - Business, - Economy - } - diff --git a/src/BuildingBlocks/Contracts/Grpc/PassengerGrpcContracts.cs b/src/BuildingBlocks/Contracts/Grpc/PassengerGrpcContracts.cs deleted file mode 100644 index 6bf08ed..0000000 --- a/src/BuildingBlocks/Contracts/Grpc/PassengerGrpcContracts.cs +++ /dev/null @@ -1,35 +0,0 @@ -using MagicOnion; -using MessagePack; - -namespace BuildingBlocks.Contracts.Grpc; - -public interface IPassengerGrpcService : IService -{ - UnaryResult GetById(long id); -} - - -[MessagePackObject] -public class PassengerResponseDto -{ - [Key(0)] - public long Id { get; init; } - [Key(1)] - public string Name { get; init; } - [Key(2)] - public string PassportNumber { get; init; } - [Key(3)] - public PassengerType PassengerType { get; init; } - [Key(4)] - public int Age { get; init; } - [Key(5)] - public string Email { get; init; } -} - -public enum PassengerType -{ - Male, - Female, - Baby, - Unknown -} diff --git a/src/BuildingBlocks/Web/ServiceCollectionExtensions.cs b/src/BuildingBlocks/Web/ServiceCollectionExtensions.cs index 075a2b2..680962c 100644 --- a/src/BuildingBlocks/Web/ServiceCollectionExtensions.cs +++ b/src/BuildingBlocks/Web/ServiceCollectionExtensions.cs @@ -1,6 +1,4 @@ -using BuildingBlocks.Contracts.Grpc; -using Microsoft.Extensions.DependencyInjection; -using Moq; +using Microsoft.Extensions.DependencyInjection; using NSubstitute; namespace BuildingBlocks.Web; diff --git a/src/Services/Booking/src/Booking.Api/Program.cs b/src/Services/Booking/src/Booking.Api/Program.cs index c0d3f96..6f3bbfe 100644 --- a/src/Services/Booking/src/Booking.Api/Program.cs +++ b/src/Services/Booking/src/Booking.Api/Program.cs @@ -15,9 +15,11 @@ using BuildingBlocks.PersistMessageProcessor; using BuildingBlocks.Swagger; using BuildingBlocks.Web; using Figgle; +using Flight; using FluentValidation; using Hellang.Middleware.ProblemDetails; using Microsoft.AspNetCore.Mvc.ApiExplorer; +using Passenger; using Prometheus; using Serilog; @@ -26,7 +28,6 @@ var configuration = builder.Configuration; var env = builder.Environment; var appOptions = builder.Services.GetOptions("AppOptions"); -builder.Services.Configure(options => configuration.GetSection("Grpc").Bind(options)); Console.WriteLine(FiggleFonts.Standard.Render(appOptions.Name)); @@ -49,14 +50,14 @@ builder.Services.AddCustomMassTransit(typeof(BookingRoot).Assembly, env); builder.Services.AddCustomOpenTelemetry(); builder.Services.AddTransient(); -builder.Services.AddMagicOnionClients(); - SnowFlakIdGenerator.Configure(3); // ref: https://github.com/oskardudycz/EventSourcing.NetCore/tree/main/Sample/EventStoreDB/ECommerce builder.Services.AddEventStore(configuration, typeof(BookingRoot).Assembly) .AddEventStoreDBSubscriptionToAll(); +builder.Services.AddGrpcClients(); + var app = builder.Build(); if (app.Environment.IsDevelopment()) diff --git a/src/Services/Booking/src/Booking/Booking.csproj b/src/Services/Booking/src/Booking/Booking.csproj index 84f2ebf..8397725 100644 --- a/src/Services/Booking/src/Booking/Booking.csproj +++ b/src/Services/Booking/src/Booking/Booking.csproj @@ -6,15 +6,30 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers; buildtransitive - + + + + + + + + + + + + diff --git a/src/Services/Booking/src/Booking/Booking/Features/CreateBooking/CreateBookingCommandHandler.cs b/src/Services/Booking/src/Booking/Booking/Features/CreateBooking/CreateBookingCommandHandler.cs index cb449e0..8583e34 100644 --- a/src/Services/Booking/src/Booking/Booking/Features/CreateBooking/CreateBookingCommandHandler.cs +++ b/src/Services/Booking/src/Booking/Booking/Features/CreateBooking/CreateBookingCommandHandler.cs @@ -1,49 +1,54 @@ using Ardalis.GuardClauses; -using Booking.Booking.Events.Domain; using Booking.Booking.Exceptions; using Booking.Booking.Models.ValueObjects; -using BuildingBlocks.Contracts.Grpc; +using Booking.Configuration; using BuildingBlocks.Core; using BuildingBlocks.Core.CQRS; using BuildingBlocks.EventStoreDB.Repository; using BuildingBlocks.Utils; +using Flight; +using Grpc.Net.Client; +using Microsoft.Extensions.Options; +using Passenger; namespace Booking.Booking.Features.CreateBooking; public class CreateBookingCommandHandler : ICommandHandler { private readonly IEventStoreDBRepository _eventStoreDbRepository; - private readonly IFlightGrpcService _flightGrpcService; private readonly ICurrentUserProvider _currentUserProvider; private readonly IEventDispatcher _eventDispatcher; - private readonly IPassengerGrpcService _passengerGrpcService; + private readonly FlightGrpcService.FlightGrpcServiceClient _flightGrpcServiceClient; + private readonly PassengerGrpcService.PassengerGrpcServiceClient _passengerGrpcServiceClient; public CreateBookingCommandHandler(IEventStoreDBRepository eventStoreDbRepository, - IPassengerGrpcService passengerGrpcService, - IFlightGrpcService flightGrpcService, ICurrentUserProvider currentUserProvider, - IEventDispatcher eventDispatcher) + IEventDispatcher eventDispatcher, + FlightGrpcService.FlightGrpcServiceClient flightGrpcServiceClient, + PassengerGrpcService.PassengerGrpcServiceClient passengerGrpcServiceClient) { _eventStoreDbRepository = eventStoreDbRepository; - _passengerGrpcService = passengerGrpcService; - _flightGrpcService = flightGrpcService; _currentUserProvider = currentUserProvider; _eventDispatcher = eventDispatcher; + _flightGrpcServiceClient = flightGrpcServiceClient; + _passengerGrpcServiceClient = passengerGrpcServiceClient; } - public async Task Handle(CreateBookingCommand command, - CancellationToken cancellationToken) + public async Task Handle(CreateBookingCommand command, CancellationToken cancellationToken) { Guard.Against.Null(command, nameof(command)); - var flight = await _flightGrpcService.GetById(command.FlightId); + var flight = await _flightGrpcServiceClient.GetByIdAsync(new Flight.GetByIdRequest {Id = command.FlightId}); if (flight is null) throw new FlightNotFoundException(); - var passenger = await _passengerGrpcService.GetById(command.PassengerId); + var passenger = + await _passengerGrpcServiceClient.GetByIdAsync(new Passenger.GetByIdRequest {Id = command.PassengerId}); - var emptySeat = (await _flightGrpcService.GetAvailableSeats(command.FlightId))?.First(); + var emptySeat = (await _flightGrpcServiceClient + .GetAvailableSeatsAsync(new GetAvailableSeatsRequest {FlightId = command.FlightId}).ResponseAsync) + ?.Items?.FirstOrDefault(); var reservation = await _eventStoreDbRepository.Find(command.Id, cancellationToken); @@ -52,12 +57,13 @@ public class CreateBookingCommandHandler : ICommandHandler("Grpc"); + + services.AddGrpcClient(o => + { + o.Address = new Uri(grpcOptions.FlightAddress); + }); + + services.AddGrpcClient(o => + { + o.Address = new Uri(grpcOptions.PassengerAddress); + }); + + return services; + } +} diff --git a/src/Services/Booking/src/Booking/Extensions/MagicOnionClientExtensions.cs b/src/Services/Booking/src/Booking/Extensions/MagicOnionClientExtensions.cs deleted file mode 100644 index 73ccc3e..0000000 --- a/src/Services/Booking/src/Booking/Extensions/MagicOnionClientExtensions.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Booking.Configuration; -using BuildingBlocks.Contracts.Grpc; -using BuildingBlocks.Web; -using Grpc.Net.Client; -using MagicOnion.Client; -using Microsoft.Extensions.DependencyInjection; - -namespace Booking.Extensions; - -public static class MagicOnionClientExtensions -{ - public static IServiceCollection AddMagicOnionClients(this IServiceCollection services) - { - var grpcOptions = services.GetOptions("Grpc"); - - services.AddSingleton(x => MagicOnionClient.Create(GrpcChannel.ForAddress(grpcOptions.PassengerAddress))); - services.AddSingleton(x => MagicOnionClient.Create(GrpcChannel.ForAddress(grpcOptions.FlightAddress))); - - return services; - } -} diff --git a/src/Services/Booking/src/Booking/GrpcClient/Protos/flight.proto b/src/Services/Booking/src/Booking/GrpcClient/Protos/flight.proto new file mode 100644 index 0000000..d70205c --- /dev/null +++ b/src/Services/Booking/src/Booking/GrpcClient/Protos/flight.proto @@ -0,0 +1,76 @@ +syntax = "proto3"; + +package flight; +import "google/protobuf/timestamp.proto"; + +service FlightGrpcService { + + rpc GetById (GetByIdRequest) returns (FlightResponse); + rpc GetAvailableSeats (GetAvailableSeatsRequest) returns (ListSeatsResponse); + rpc ReserveSeat (ReserveSeatRequest) returns (SeatsResponse); +} + +message GetByIdRequest { + int64 Id = 1; +} + +message FlightResponse { + int64 Id = 1; + string FlightNumber = 2; + int64 AircraftId = 3; + int64 DepartureAirportId = 4; + google.protobuf.Timestamp DepartureDate = 5; + google.protobuf.Timestamp ArriveDate = 6; + int64 ArriveAirportId = 7; + double DurationMinutes = 8; + google.protobuf.Timestamp FlightDate = 9; + FlightStatus Status = 10; + double Price = 11; + int64 FlightId = 12; +} + +message GetAvailableSeatsRequest { + int64 FlightId = 1; +} + +message SeatsResponse { + int64 Id = 1; + string SeatNumber = 2; + SeatType Type = 3; + SeatClass Class = 4; + int64 FlightId = 5; +} + + +message ReserveSeatRequest { + int64 FlightId = 1; + string SeatNumber = 2; +} + +message ListSeatsResponse { + repeated SeatsResponse items = 1; +} + + enum FlightStatus { + FLIGHT_STATUS_UNKNOWN = 0; + FLIGHT_STATUS_FLYING = 1; + FLIGHT_STATUS_DELAY = 2; + FLIGHT_STATUS_CANCELED = 3; + FLIGHT_STATUS_COMPLETED = 4; + } + + + enum SeatType { + SEAT_TYPE_UNKNOWN = 0; + SEAT_TYPE_WINDOW = 1; + SEAT_TYPE_MIDDLE = 2; + SEAT_TYPE_AISLE = 3; + } + + + enum SeatClass { + SEAT_CLASS_UNKNOWN = 0; + SEAT_CLASS_FIRST_CLASS = 1; + SEAT_CLASS_BUSINESS = 2; + SEAT_CLASS_ECONOMY = 3; + } diff --git a/src/Services/Booking/src/Booking/GrpcClient/Protos/passenger.proto b/src/Services/Booking/src/Booking/GrpcClient/Protos/passenger.proto new file mode 100644 index 0000000..dc63f56 --- /dev/null +++ b/src/Services/Booking/src/Booking/GrpcClient/Protos/passenger.proto @@ -0,0 +1,30 @@ +syntax = "proto3"; + +package passenger; + +service PassengerGrpcService { + + rpc GetById (GetByIdRequest) returns (PassengerResponse); +} + +message GetByIdRequest { + int64 Id = 1; +} + +message PassengerResponse { + int64 Id = 1; + string Name = 2; + string PassportNumber = 3; + PassengerType PassengerType = 4; + int32 Age = 5; + string Email = 6; +} + + + enum PassengerType { + PASSENGER_TYPE_UNKNOWN = 0; + PASSENGER_TYPE_MALE = 1; + PASSENGER_TYPE_FEMALE = 2; + PASSENGER_TYPE_BABY = 3; + } + diff --git a/src/Services/Booking/tests/IntegrationTest/Booking/Features/CreateBookingTests.cs b/src/Services/Booking/tests/IntegrationTest/Booking/Features/CreateBookingTests.cs index 5190560..06cac08 100644 --- a/src/Services/Booking/tests/IntegrationTest/Booking/Features/CreateBookingTests.cs +++ b/src/Services/Booking/tests/IntegrationTest/Booking/Features/CreateBookingTests.cs @@ -1,27 +1,30 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Booking.Booking.Models.Reads; using Booking.Data; using BuildingBlocks.Contracts.EventBus.Messages; -using BuildingBlocks.Contracts.Grpc; using BuildingBlocks.PersistMessageProcessor.Data; using BuildingBlocks.TestBase; +using Flight; using FluentAssertions; +using Grpc.Core; +using Grpc.Core.Testing; using Integration.Test.Fakes; -using MagicOnion; using MassTransit; using MassTransit.Testing; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using NSubstitute; +using Passenger; using Xunit; +using GetByIdRequest = Flight.GetByIdRequest; namespace Integration.Test.Booking.Features; public class CreateBookingTests : IntegrationTestBase { private readonly ITestHarness _testHarness; + public CreateBookingTests( IntegrationTestFixture integrationTestFixture) : base( integrationTestFixture) @@ -56,11 +59,13 @@ public class CreateBookingTests : IntegrationTestBase { - var mock = Substitute.For(); - mock.GetById(Arg.Any()) - .Returns(new UnaryResult(new FakePassengerResponseDto().Generate())); + var mockPassenger = Substitute.For(); - return mock; + mockPassenger.GetByIdAsync(Arg.Any()) + .Returns(TestCalls.AsyncUnaryCall(Task.FromResult(new FakePassengerResponse().Generate()), + Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { })); + + return mockPassenger; })); } @@ -68,19 +73,21 @@ public class CreateBookingTests : IntegrationTestBase { - var mock = Substitute.For(); + var mockFlight = Substitute.For(); - mock.GetById(Arg.Any()) - .Returns(new UnaryResult(Task.FromResult(new FakeFlightResponseDto().Generate()))); + mockFlight.GetByIdAsync(Arg.Any()) + .Returns(TestCalls.AsyncUnaryCall(Task.FromResult(new FakeFlightResponse().Generate()), + Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { })); - mock.GetAvailableSeats(Arg.Any()) - .Returns( - new UnaryResult>(Task.FromResult(FakeSeatsResponseDto.Generate()))); + mockFlight.GetAvailableSeatsAsync(Arg.Any()) + .Returns(TestCalls.AsyncUnaryCall(Task.FromResult(FakeSeatsResponse.Generate()), + Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { })); - mock.ReserveSeat(new FakeReserveSeatRequestDto().Generate()) - .Returns(new UnaryResult(Task.FromResult(FakeSeatsResponseDto.Generate().First()))); + mockFlight.ReserveSeatAsync(Arg.Any()) + .Returns(TestCalls.AsyncUnaryCall(Task.FromResult(FakeSeatsResponse.Generate()?.Items?.First()), + Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { })); - return mock; + return mockFlight; })); } } diff --git a/src/Services/Booking/tests/IntegrationTest/Fakes/FakeFlightResponse.cs b/src/Services/Booking/tests/IntegrationTest/Fakes/FakeFlightResponse.cs new file mode 100644 index 0000000..711d5d0 --- /dev/null +++ b/src/Services/Booking/tests/IntegrationTest/Fakes/FakeFlightResponse.cs @@ -0,0 +1,23 @@ +using System; +using AutoBogus; +using Flight; +using Google.Protobuf.WellKnownTypes; + +namespace Integration.Test.Fakes; + +public class FakeFlightResponse : AutoFaker +{ + public FakeFlightResponse() + { + RuleFor(r => r.Id, _ => 1); + RuleFor(r => r.Price, _ => 100); + RuleFor(r => r.Status, _ => FlightStatus.Completed); + RuleFor(r => r.AircraftId, _ => 1); + RuleFor(r => r.ArriveAirportId, _ => 1); + RuleFor(r => r.ArriveDate, _ => DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc).ToTimestamp()); + RuleFor(r => r.DepartureDate, _ => DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc).ToTimestamp()); + RuleFor(r => r.FlightDate, _ => DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc).ToTimestamp()); + RuleFor(r => r.FlightNumber, _ => "121LP"); + RuleFor(r => r.DepartureAirportId, _ => 2); + } +} diff --git a/src/Services/Booking/tests/IntegrationTest/Fakes/FakeFlightResponseDto.cs b/src/Services/Booking/tests/IntegrationTest/Fakes/FakeFlightResponseDto.cs deleted file mode 100644 index 67ff88b..0000000 --- a/src/Services/Booking/tests/IntegrationTest/Fakes/FakeFlightResponseDto.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using AutoBogus; -using BuildingBlocks.Contracts.Grpc; - -namespace Integration.Test.Fakes; - -public class FakeFlightResponseDto : AutoFaker -{ - public FakeFlightResponseDto() - { - RuleFor(r => r.Id, _ => 1); - RuleFor(r => r.Price, _ => 100); - RuleFor(r => r.Status, _ => FlightStatus.Completed); - RuleFor(r => r.AircraftId, _ => 1); - RuleFor(r => r.ArriveAirportId, _ => 1); - RuleFor(r => r.ArriveDate, _ => DateTime.Now); - RuleFor(r => r.DepartureDate, _ => DateTime.Now); - RuleFor(r => r.FlightDate, _ => DateTime.Now); - RuleFor(r => r.FlightNumber, _ => "121LP"); - RuleFor(r => r.DepartureAirportId, _ => 2); - } -} diff --git a/src/Services/Booking/tests/IntegrationTest/Fakes/FakePassengerResponseDto.cs b/src/Services/Booking/tests/IntegrationTest/Fakes/FakePassengerResponse.cs similarity index 53% rename from src/Services/Booking/tests/IntegrationTest/Fakes/FakePassengerResponseDto.cs rename to src/Services/Booking/tests/IntegrationTest/Fakes/FakePassengerResponse.cs index 9aaf4f8..7aabbd7 100644 --- a/src/Services/Booking/tests/IntegrationTest/Fakes/FakePassengerResponseDto.cs +++ b/src/Services/Booking/tests/IntegrationTest/Fakes/FakePassengerResponse.cs @@ -1,12 +1,12 @@ using AutoBogus; -using BuildingBlocks.Contracts.Grpc; using BuildingBlocks.IdsGenerator; +using Passenger; namespace Integration.Test.Fakes; -public class FakePassengerResponseDto : AutoFaker +public class FakePassengerResponse : AutoFaker { - public FakePassengerResponseDto() + public FakePassengerResponse() { RuleFor(r => r.Id, _ => SnowFlakIdGenerator.NewId()); } diff --git a/src/Services/Booking/tests/IntegrationTest/Fakes/FakeReserveSeatRequestDto.cs b/src/Services/Booking/tests/IntegrationTest/Fakes/FakeReserveSeatRequestDto.cs deleted file mode 100644 index 058cee5..0000000 --- a/src/Services/Booking/tests/IntegrationTest/Fakes/FakeReserveSeatRequestDto.cs +++ /dev/null @@ -1,13 +0,0 @@ -using AutoBogus; -using BuildingBlocks.Contracts.Grpc; - -namespace Integration.Test.Fakes; - -public class FakeReserveSeatRequestDto : AutoFaker -{ - public FakeReserveSeatRequestDto() - { - RuleFor(r => r.FlightId, _ => 1); - RuleFor(r => r.SeatNumber, _ => "33F"); - } -} diff --git a/src/Services/Booking/tests/IntegrationTest/Fakes/FakeSeatsResponseDto.cs b/src/Services/Booking/tests/IntegrationTest/Fakes/FakeSeatsResponsecs.cs similarity index 62% rename from src/Services/Booking/tests/IntegrationTest/Fakes/FakeSeatsResponseDto.cs rename to src/Services/Booking/tests/IntegrationTest/Fakes/FakeSeatsResponsecs.cs index b1af511..6fbd781 100644 --- a/src/Services/Booking/tests/IntegrationTest/Fakes/FakeSeatsResponseDto.cs +++ b/src/Services/Booking/tests/IntegrationTest/Fakes/FakeSeatsResponsecs.cs @@ -1,15 +1,16 @@ using System.Collections.Generic; -using BuildingBlocks.Contracts.Grpc; +using Flight; namespace Integration.Test.Fakes; -public static class FakeSeatsResponseDto +public static class FakeSeatsResponse { - public static IEnumerable Generate() + public static ListSeatsResponse Generate() { - return new List() + var result = new ListSeatsResponse(); + result.Items.AddRange(new List { - new SeatResponseDto() + new SeatsResponse() { FlightId = 1, Class = SeatClass.Economy, @@ -17,7 +18,7 @@ public static class FakeSeatsResponseDto SeatNumber = "33F", Id = 1 }, - new SeatResponseDto() + new SeatsResponse() { FlightId = 1, Class = SeatClass.Economy, @@ -25,6 +26,8 @@ public static class FakeSeatsResponseDto SeatNumber = "22D", Id = 2 } - }; + }); + + return result; } } diff --git a/src/Services/Flight/src/Flight.Api/Program.cs b/src/Services/Flight/src/Flight.Api/Program.cs index 975b85e..c0e196e 100644 --- a/src/Services/Flight/src/Flight.Api/Program.cs +++ b/src/Services/Flight/src/Flight.Api/Program.cs @@ -1,3 +1,4 @@ +using System.Net; using System.Reflection; using BuildingBlocks.Caching; using BuildingBlocks.Core; @@ -19,9 +20,11 @@ using Flight; using Flight.Data; using Flight.Data.Seed; using Flight.Extensions; +using Flight.GrpcServer.Services; using FluentValidation; using Hellang.Middleware.ProblemDetails; using Microsoft.AspNetCore.Mvc.ApiExplorer; +using Microsoft.AspNetCore.Server.Kestrel.Core; using Prometheus; using Serilog; @@ -60,8 +63,6 @@ builder.Services.AddGrpc(options => options.Interceptors.Add(); }); -builder.Services.AddMagicOnion(); - SnowFlakIdGenerator.Configure(1); builder.Services.AddCachingRequest(new List {typeof(FlightRoot).Assembly}); @@ -91,7 +92,7 @@ app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapMetrics(); - endpoints.MapMagicOnionService(); + endpoints.MapGrpcService(); }); app.MapGet("/", x => x.Response.WriteAsync(appOptions.Name)); diff --git a/src/Services/Flight/src/Flight/Data/Seed/FlightDataSeeder.cs b/src/Services/Flight/src/Flight/Data/Seed/FlightDataSeeder.cs index e602742..3ae6fec 100644 --- a/src/Services/Flight/src/Flight/Data/Seed/FlightDataSeeder.cs +++ b/src/Services/Flight/src/Flight/Data/Seed/FlightDataSeeder.cs @@ -79,12 +79,12 @@ public class FlightDataSeeder : IDataSeeder { var seats = new List { - Seat.Create(1 ,"12A", SeatType.Window, SeatClass.Economy, 1), - Seat.Create(2, "12B", SeatType.Window, SeatClass.Economy, 1), - Seat.Create(3, "12C", SeatType.Middle, SeatClass.Economy, 1), - Seat.Create(4, "12D", SeatType.Middle, SeatClass.Economy, 1), - Seat.Create(5, "12E", SeatType.Aisle, SeatClass.Economy, 1), - Seat.Create(6, "12F", SeatType.Aisle, SeatClass.Economy, 1) + Seat.Create(1 ,"12A", Seats.Enums.SeatType.Window, Seats.Enums.SeatClass.Economy, 1), + Seat.Create(2, "12B", Seats.Enums.SeatType.Window, Seats.Enums.SeatClass.Economy, 1), + Seat.Create(3, "12C", Seats.Enums.SeatType.Middle, Seats.Enums.SeatClass.Economy, 1), + Seat.Create(4, "12D", Seats.Enums.SeatType.Middle, Seats.Enums.SeatClass.Economy, 1), + Seat.Create(5, "12E", Seats.Enums.SeatType.Aisle, Seats.Enums.SeatClass.Economy, 1), + Seat.Create(6, "12F", Seats.Enums.SeatType.Aisle, Seats.Enums.SeatClass.Economy, 1) }; await _flightDbContext.Seats.AddRangeAsync(seats); @@ -102,7 +102,7 @@ public class FlightDataSeeder : IDataSeeder Flights.Models.Flight.Create(1, "BD467", 1, 1, new DateTime(2022, 1, 31, 12, 0, 0), new DateTime(2022, 1, 31, 14, 0, 0), 2, 120m, - new DateTime(2022, 1, 31), FlightStatus.Completed, + new DateTime(2022, 1, 31), Flights.Enums.FlightStatus.Completed, 8000) }; await _flightDbContext.Flights.AddRangeAsync(flights); diff --git a/src/Services/Flight/src/Flight/Flight.csproj b/src/Services/Flight/src/Flight/Flight.csproj index 2eaa1a9..817c812 100644 --- a/src/Services/Flight/src/Flight/Flight.csproj +++ b/src/Services/Flight/src/Flight/Flight.csproj @@ -5,6 +5,12 @@ + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -15,7 +21,10 @@ - + + + + diff --git a/src/Services/Flight/src/Flight/Flights/Models/FlightStatus.cs b/src/Services/Flight/src/Flight/Flights/Enums/FlightStatus.cs similarity index 66% rename from src/Services/Flight/src/Flight/Flights/Models/FlightStatus.cs rename to src/Services/Flight/src/Flight/Flights/Enums/FlightStatus.cs index 9eacbdf..14de1d3 100644 --- a/src/Services/Flight/src/Flight/Flights/Models/FlightStatus.cs +++ b/src/Services/Flight/src/Flight/Flights/Enums/FlightStatus.cs @@ -1,7 +1,8 @@ -namespace Flight.Flights.Models; +namespace Flight.Flights.Enums; public enum FlightStatus { + Unknown = 0, Flying = 1, Delay = 2, Canceled = 3, diff --git a/src/Services/Flight/src/Flight/Flights/Events/Domain/FlightCreatedDomainEvent.cs b/src/Services/Flight/src/Flight/Flights/Events/Domain/FlightCreatedDomainEvent.cs index f1900ef..9ac0abd 100644 --- a/src/Services/Flight/src/Flight/Flights/Events/Domain/FlightCreatedDomainEvent.cs +++ b/src/Services/Flight/src/Flight/Flights/Events/Domain/FlightCreatedDomainEvent.cs @@ -6,4 +6,4 @@ namespace Flight.Flights.Events.Domain; public record FlightCreatedDomainEvent(long Id, string FlightNumber, long AircraftId, DateTime DepartureDate, long DepartureAirportId, DateTime ArriveDate, long ArriveAirportId, decimal DurationMinutes, - DateTime FlightDate, FlightStatus Status, decimal Price, bool IsDeleted) : IDomainEvent; + DateTime FlightDate, Enums.FlightStatus Status, decimal Price, bool IsDeleted) : IDomainEvent; diff --git a/src/Services/Flight/src/Flight/Flights/Events/Domain/FlightDeletedDomainEvent.cs b/src/Services/Flight/src/Flight/Flights/Events/Domain/FlightDeletedDomainEvent.cs index 0bd8ba6..dc10029 100644 --- a/src/Services/Flight/src/Flight/Flights/Events/Domain/FlightDeletedDomainEvent.cs +++ b/src/Services/Flight/src/Flight/Flights/Events/Domain/FlightDeletedDomainEvent.cs @@ -6,4 +6,4 @@ namespace Flight.Flights.Events.Domain; public record FlightDeletedDomainEvent(long Id, string FlightNumber, long AircraftId, DateTime DepartureDate, long DepartureAirportId, DateTime ArriveDate, long ArriveAirportId, decimal DurationMinutes, - DateTime FlightDate, FlightStatus Status, decimal Price, bool IsDeleted) : IDomainEvent; + DateTime FlightDate, Enums.FlightStatus Status, decimal Price, bool IsDeleted) : IDomainEvent; diff --git a/src/Services/Flight/src/Flight/Flights/Events/Domain/FlightUpdatedDomainEvent.cs b/src/Services/Flight/src/Flight/Flights/Events/Domain/FlightUpdatedDomainEvent.cs index d3bdc27..ae71e11 100644 --- a/src/Services/Flight/src/Flight/Flights/Events/Domain/FlightUpdatedDomainEvent.cs +++ b/src/Services/Flight/src/Flight/Flights/Events/Domain/FlightUpdatedDomainEvent.cs @@ -5,4 +5,4 @@ using Flight.Flights.Models; namespace Flight.Flights.Events.Domain; public record FlightUpdatedDomainEvent(long Id, string FlightNumber, long AircraftId, DateTime DepartureDate, long DepartureAirportId, DateTime ArriveDate, long ArriveAirportId, decimal DurationMinutes, - DateTime FlightDate, FlightStatus Status, decimal Price, bool IsDeleted) : IDomainEvent; + DateTime FlightDate, Enums.FlightStatus Status, decimal Price, bool IsDeleted) : IDomainEvent; diff --git a/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/CreateFlightCommand.cs b/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/CreateFlightCommand.cs index 30f1c0f..e5e1e96 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/CreateFlightCommand.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/CreateFlightCommand.cs @@ -9,7 +9,7 @@ namespace Flight.Flights.Features.CreateFlight; public record CreateFlightCommand(string FlightNumber, long AircraftId, long DepartureAirportId, DateTime DepartureDate, DateTime ArriveDate, long ArriveAirportId, - decimal DurationMinutes, DateTime FlightDate, FlightStatus Status, decimal Price) : ICommand, IInternalCommand + decimal DurationMinutes, DateTime FlightDate, Enums.FlightStatus Status, decimal Price) : ICommand, IInternalCommand { public long Id { get; init; } = SnowFlakIdGenerator.NewId(); } diff --git a/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/CreateFlightCommandValidator.cs b/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/CreateFlightCommandValidator.cs index f4da34a..f88ae34 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/CreateFlightCommandValidator.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/CreateFlightCommandValidator.cs @@ -10,10 +10,10 @@ public class CreateFlightCommandValidator : AbstractValidator x.Price).GreaterThan(0).WithMessage("Price must be greater than 0"); RuleFor(x => x.Status).Must(p => (p.GetType().IsEnum && - p == FlightStatus.Flying) || - p == FlightStatus.Canceled || - p == FlightStatus.Delay || - p == FlightStatus.Completed) + p == Enums.FlightStatus.Flying) || + p == Enums.FlightStatus.Canceled || + p == Enums.FlightStatus.Delay || + p == Enums.FlightStatus.Completed) .WithMessage("Status must be Flying, Delay, Canceled or Completed"); RuleFor(x => x.AircraftId).NotEmpty().WithMessage("AircraftId must be not empty"); diff --git a/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/Reads/CreateFlightMongoCommand.cs b/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/Reads/CreateFlightMongoCommand.cs index 43ae679..69b1a73 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/Reads/CreateFlightMongoCommand.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/Reads/CreateFlightMongoCommand.cs @@ -8,7 +8,7 @@ public class CreateFlightMongoCommand : InternalCommand { public CreateFlightMongoCommand(long id, string flightNumber, long aircraftId, DateTime departureDate, long departureAirportId, - DateTime arriveDate, long arriveAirportId, decimal durationMinutes, DateTime flightDate, FlightStatus status, + DateTime arriveDate, long arriveAirportId, decimal durationMinutes, DateTime flightDate, Enums.FlightStatus status, decimal price, bool isDeleted) { Id = id; @@ -33,7 +33,7 @@ public class CreateFlightMongoCommand : InternalCommand public long ArriveAirportId { get; } public decimal DurationMinutes { get; } public DateTime FlightDate { get; } - public FlightStatus Status { get; } + public Enums.FlightStatus Status { get; } public decimal Price { get; } public bool IsDeleted { get; } } diff --git a/src/Services/Flight/src/Flight/Flights/Features/DeleteFlight/Reads/DeleteFlightMongoCommand.cs b/src/Services/Flight/src/Flight/Flights/Features/DeleteFlight/Reads/DeleteFlightMongoCommand.cs index 5dc6a9b..e8ab371 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/DeleteFlight/Reads/DeleteFlightMongoCommand.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/DeleteFlight/Reads/DeleteFlightMongoCommand.cs @@ -8,7 +8,7 @@ public class DeleteFlightMongoCommand : InternalCommand { public DeleteFlightMongoCommand(long id, string flightNumber, long aircraftId, DateTime departureDate, long departureAirportId, - DateTime arriveDate, long arriveAirportId, decimal durationMinutes, DateTime flightDate, FlightStatus status, + DateTime arriveDate, long arriveAirportId, decimal durationMinutes, DateTime flightDate, Enums.FlightStatus status, decimal price, bool isDeleted) { Id = id; @@ -33,7 +33,7 @@ public class DeleteFlightMongoCommand : InternalCommand public long ArriveAirportId { get; } public decimal DurationMinutes { get; } public DateTime FlightDate { get; } - public FlightStatus Status { get; } + public Enums.FlightStatus Status { get; } public decimal Price { get; } public bool IsDeleted { get; } } diff --git a/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/Reads/UpdateFlightMongoCommand.cs b/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/Reads/UpdateFlightMongoCommand.cs index 12ff399..d6142f1 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/Reads/UpdateFlightMongoCommand.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/Reads/UpdateFlightMongoCommand.cs @@ -8,7 +8,7 @@ public class UpdateFlightMongoCommand : InternalCommand { public UpdateFlightMongoCommand(long Id, string FlightNumber, long AircraftId, DateTime DepartureDate, long DepartureAirportId, - DateTime ArriveDate, long ArriveAirportId, decimal DurationMinutes, DateTime FlightDate, FlightStatus Status, + DateTime ArriveDate, long ArriveAirportId, decimal DurationMinutes, DateTime FlightDate, Enums.FlightStatus Status, decimal Price, bool IsDeleted) { this.Id = Id; @@ -33,7 +33,7 @@ public class UpdateFlightMongoCommand : InternalCommand public long ArriveAirportId { get; } public decimal DurationMinutes { get; } public DateTime FlightDate { get; } - public FlightStatus Status { get; } + public Enums.FlightStatus Status { get; } public decimal Price { get; } public bool IsDeleted { get; } } diff --git a/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/UpdateFlightCommand.cs b/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/UpdateFlightCommand.cs index d636fc2..cf095b4 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/UpdateFlightCommand.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/UpdateFlightCommand.cs @@ -20,7 +20,7 @@ public record UpdateFlightCommand : ICommand, IInvalidateCach public decimal DurationMinutes { get; init; } public DateTime FlightDate { get; init; } - public FlightStatus Status { get; init; } + public Enums.FlightStatus Status { get; init; } public bool IsDeleted { get; init; } = false; public decimal Price { get; init; } diff --git a/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/UpdateFlightCommandValidator.cs b/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/UpdateFlightCommandValidator.cs index 4a48f9d..186c0b9 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/UpdateFlightCommandValidator.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/UpdateFlightCommandValidator.cs @@ -13,10 +13,10 @@ public class UpdateFlightCommandValidator : AbstractValidator x.Price).GreaterThan(0).WithMessage("Price must be greater than 0"); RuleFor(x => x.Status).Must(p => (p.GetType().IsEnum && - p == FlightStatus.Flying) || - p == FlightStatus.Canceled || - p == FlightStatus.Delay || - p == FlightStatus.Completed) + p == Enums.FlightStatus.Flying) || + p == Enums.FlightStatus.Canceled || + p == Enums.FlightStatus.Delay || + p == Enums.FlightStatus.Completed) .WithMessage("Status must be Flying, Delay, Canceled or Completed"); RuleFor(x => x.AircraftId).NotEmpty().WithMessage("AircraftId must be not empty"); diff --git a/src/Services/Flight/src/Flight/Flights/Models/Flight.cs b/src/Services/Flight/src/Flight/Flights/Models/Flight.cs index b31bcda..7e47e48 100644 --- a/src/Services/Flight/src/Flight/Flights/Models/Flight.cs +++ b/src/Services/Flight/src/Flight/Flights/Models/Flight.cs @@ -14,12 +14,12 @@ public record Flight : Aggregate public long ArriveAirportId { get; private set; } public decimal DurationMinutes { get; private set; } public DateTime FlightDate { get; private set; } - public FlightStatus Status { get; private set; } + public Enums.FlightStatus Status { get; private set; } public decimal Price { get; private set; } public static Flight Create(long id, string flightNumber, long aircraftId, long departureAirportId, DateTime departureDate, DateTime arriveDate, - long arriveAirportId, decimal durationMinutes, DateTime flightDate, FlightStatus status, + long arriveAirportId, decimal durationMinutes, DateTime flightDate, Enums.FlightStatus status, decimal price, bool isDeleted = false) { var flight = new Flight @@ -51,7 +51,7 @@ public record Flight : Aggregate public void Update(long id, string flightNumber, long aircraftId, long departureAirportId, DateTime departureDate, DateTime arriveDate, - long arriveAirportId, decimal durationMinutes, DateTime flightDate, FlightStatus status, + long arriveAirportId, decimal durationMinutes, DateTime flightDate, Enums.FlightStatus status, decimal price, bool isDeleted = false) { FlightNumber = flightNumber; @@ -74,7 +74,7 @@ public record Flight : Aggregate public void Delete(long id, string flightNumber, long aircraftId, long departureAirportId, DateTime departureDate, DateTime arriveDate, - long arriveAirportId, decimal durationMinutes, DateTime flightDate, FlightStatus status, + long arriveAirportId, decimal durationMinutes, DateTime flightDate, Enums.FlightStatus status, decimal price, bool isDeleted = true) { FlightNumber = flightNumber; diff --git a/src/Services/Flight/src/Flight/Flights/Models/Reads/FlightReadModel.cs b/src/Services/Flight/src/Flight/Flights/Models/Reads/FlightReadModel.cs index 8fc26cf..3699e13 100644 --- a/src/Services/Flight/src/Flight/Flights/Models/Reads/FlightReadModel.cs +++ b/src/Services/Flight/src/Flight/Flights/Models/Reads/FlightReadModel.cs @@ -16,7 +16,7 @@ public class FlightReadModel public long ArriveAirportId { get; init; } public decimal DurationMinutes { get; init; } public DateTime FlightDate { get; init; } - public FlightStatus Status { get; init; } + public Enums.FlightStatus Status { get; init; } public decimal Price { get; init; } public bool IsDeleted { get; init; } } diff --git a/src/Services/Flight/src/Flight/GrpcServer/FlightGrpcService.cs b/src/Services/Flight/src/Flight/GrpcServer/FlightGrpcService.cs deleted file mode 100644 index 69b53f9..0000000 --- a/src/Services/Flight/src/Flight/GrpcServer/FlightGrpcService.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Collections.Generic; -using BuildingBlocks.Contracts.Grpc; -using Flight.Flights.Features.GetFlightById; -using Flight.Seats.Features.GetAvailableSeats; -using Flight.Seats.Features.ReserveSeat; -using MagicOnion; -using MagicOnion.Server; -using Mapster; -using MediatR; -using SeatResponseDto = BuildingBlocks.Contracts.Grpc.SeatResponseDto; - -namespace Flight.GrpcServer; - -public class FlightGrpcService : ServiceBase, IFlightGrpcService -{ - private readonly IMediator _mediator; - - public FlightGrpcService(IMediator mediator) - { - _mediator = mediator; - } - - public async UnaryResult GetById(long id) - { - var result = await _mediator.Send(new GetFlightByIdQuery(id)); - return result.Adapt(); - } - - public async UnaryResult> GetAvailableSeats(long flightId) - { - var result = await _mediator.Send(new GetAvailableSeatsQuery(flightId)); - return result.Adapt>(); - } - - public async UnaryResult ReserveSeat(ReserveSeatRequestDto request) - { - var result = await _mediator.Send(new ReserveSeatCommand(request.FlightId, request.SeatNumber)); - return result.Adapt(); - } -} diff --git a/src/Services/Flight/src/Flight/GrpcServer/Protos/flight.proto b/src/Services/Flight/src/Flight/GrpcServer/Protos/flight.proto new file mode 100644 index 0000000..d70205c --- /dev/null +++ b/src/Services/Flight/src/Flight/GrpcServer/Protos/flight.proto @@ -0,0 +1,76 @@ +syntax = "proto3"; + +package flight; +import "google/protobuf/timestamp.proto"; + +service FlightGrpcService { + + rpc GetById (GetByIdRequest) returns (FlightResponse); + rpc GetAvailableSeats (GetAvailableSeatsRequest) returns (ListSeatsResponse); + rpc ReserveSeat (ReserveSeatRequest) returns (SeatsResponse); +} + +message GetByIdRequest { + int64 Id = 1; +} + +message FlightResponse { + int64 Id = 1; + string FlightNumber = 2; + int64 AircraftId = 3; + int64 DepartureAirportId = 4; + google.protobuf.Timestamp DepartureDate = 5; + google.protobuf.Timestamp ArriveDate = 6; + int64 ArriveAirportId = 7; + double DurationMinutes = 8; + google.protobuf.Timestamp FlightDate = 9; + FlightStatus Status = 10; + double Price = 11; + int64 FlightId = 12; +} + +message GetAvailableSeatsRequest { + int64 FlightId = 1; +} + +message SeatsResponse { + int64 Id = 1; + string SeatNumber = 2; + SeatType Type = 3; + SeatClass Class = 4; + int64 FlightId = 5; +} + + +message ReserveSeatRequest { + int64 FlightId = 1; + string SeatNumber = 2; +} + +message ListSeatsResponse { + repeated SeatsResponse items = 1; +} + + enum FlightStatus { + FLIGHT_STATUS_UNKNOWN = 0; + FLIGHT_STATUS_FLYING = 1; + FLIGHT_STATUS_DELAY = 2; + FLIGHT_STATUS_CANCELED = 3; + FLIGHT_STATUS_COMPLETED = 4; + } + + + enum SeatType { + SEAT_TYPE_UNKNOWN = 0; + SEAT_TYPE_WINDOW = 1; + SEAT_TYPE_MIDDLE = 2; + SEAT_TYPE_AISLE = 3; + } + + + enum SeatClass { + SEAT_CLASS_UNKNOWN = 0; + SEAT_CLASS_FIRST_CLASS = 1; + SEAT_CLASS_BUSINESS = 2; + SEAT_CLASS_ECONOMY = 3; + } diff --git a/src/Services/Flight/src/Flight/GrpcServer/Services/FlightGrpcServices.cs b/src/Services/Flight/src/Flight/GrpcServer/Services/FlightGrpcServices.cs new file mode 100644 index 0000000..cb39f3a --- /dev/null +++ b/src/Services/Flight/src/Flight/GrpcServer/Services/FlightGrpcServices.cs @@ -0,0 +1,45 @@ +using System.Threading.Tasks; +using Flight.Flights.Features.GetFlightById; +using Flight.Seats.Features.GetAvailableSeats; +using Flight.Seats.Features.ReserveSeat; +using Grpc.Core; +using Mapster; +using MediatR; + +namespace Flight.GrpcServer.Services; + +public class FlightGrpcServices : FlightGrpcService.FlightGrpcServiceBase +{ + private readonly IMediator _mediator; + + public FlightGrpcServices(IMediator mediator) + { + _mediator = mediator; + } + + public override async Task GetById(GetByIdRequest request, ServerCallContext context) + { + var result = await _mediator.Send(new GetFlightByIdQuery(request.Id)); + return result.Adapt(); + } + + public override async Task ReserveSeat(ReserveSeatRequest request, ServerCallContext context) + { + var result = await _mediator.Send(new ReserveSeatCommand(request.FlightId, request.SeatNumber)); + return result.Adapt(); + } + + public override async Task GetAvailableSeats(GetAvailableSeatsRequest request, ServerCallContext context) + { + var result = new ListSeatsResponse(); + + var availableSeats = await _mediator.Send(new GetAvailableSeatsQuery(request.FlightId)); + + foreach (var availableSeat in availableSeats) + { + result.Items.Add(availableSeat.Adapt()); + } + + return result; + } +} diff --git a/src/Services/Flight/src/Flight/Seats/Models/SeatClass.cs b/src/Services/Flight/src/Flight/Seats/Enums/SeatClass.cs similarity index 59% rename from src/Services/Flight/src/Flight/Seats/Models/SeatClass.cs rename to src/Services/Flight/src/Flight/Seats/Enums/SeatClass.cs index 1b689e1..ad49617 100644 --- a/src/Services/Flight/src/Flight/Seats/Models/SeatClass.cs +++ b/src/Services/Flight/src/Flight/Seats/Enums/SeatClass.cs @@ -1,7 +1,8 @@ -namespace Flight.Seats.Models; +namespace Flight.Seats.Enums; public enum SeatClass { + Unknown = 0, FirstClass, Business, Economy diff --git a/src/Services/Flight/src/Flight/Seats/Models/SeatType.cs b/src/Services/Flight/src/Flight/Seats/Enums/SeatType.cs similarity index 56% rename from src/Services/Flight/src/Flight/Seats/Models/SeatType.cs rename to src/Services/Flight/src/Flight/Seats/Enums/SeatType.cs index 5a561c2..0bd0684 100644 --- a/src/Services/Flight/src/Flight/Seats/Models/SeatType.cs +++ b/src/Services/Flight/src/Flight/Seats/Enums/SeatType.cs @@ -1,7 +1,8 @@ -namespace Flight.Seats.Models; +namespace Flight.Seats.Enums; public enum SeatType { + Unknown = 0, Window, Middle, Aisle diff --git a/src/Services/Flight/src/Flight/Seats/Events/SeatCreatedDomainEvent.cs b/src/Services/Flight/src/Flight/Seats/Events/SeatCreatedDomainEvent.cs index 294b3a5..a1faf5e 100644 --- a/src/Services/Flight/src/Flight/Seats/Events/SeatCreatedDomainEvent.cs +++ b/src/Services/Flight/src/Flight/Seats/Events/SeatCreatedDomainEvent.cs @@ -3,4 +3,4 @@ using Flight.Seats.Models; namespace Flight.Seats.Events; -public record SeatCreatedDomainEvent(long Id, string SeatNumber, SeatType Type, SeatClass Class, long FlightId, bool IsDeleted) : IDomainEvent; +public record SeatCreatedDomainEvent(long Id, string SeatNumber, Enums.SeatType Type, Enums.SeatClass Class, long FlightId, bool IsDeleted) : IDomainEvent; diff --git a/src/Services/Flight/src/Flight/Seats/Events/SeatReservedDomainEvent.cs b/src/Services/Flight/src/Flight/Seats/Events/SeatReservedDomainEvent.cs index 2fe4ca4..06f3891 100644 --- a/src/Services/Flight/src/Flight/Seats/Events/SeatReservedDomainEvent.cs +++ b/src/Services/Flight/src/Flight/Seats/Events/SeatReservedDomainEvent.cs @@ -3,4 +3,4 @@ using Flight.Seats.Models; namespace Flight.Seats.Events; -public record SeatReservedDomainEvent(long Id, string SeatNumber, SeatType Type, SeatClass Class, long FlightId, bool IsDeleted) : IDomainEvent; +public record SeatReservedDomainEvent(long Id, string SeatNumber, Enums.SeatType Type, Enums.SeatClass Class, long FlightId, bool IsDeleted) : IDomainEvent; diff --git a/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/CreateSeatCommand.cs b/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/CreateSeatCommand.cs index b354f9c..e62202d 100644 --- a/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/CreateSeatCommand.cs +++ b/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/CreateSeatCommand.cs @@ -6,7 +6,7 @@ using Flight.Seats.Models; namespace Flight.Seats.Features.CreateSeat; -public record CreateSeatCommand(string SeatNumber, SeatType Type, SeatClass Class, long FlightId) : ICommand, IInternalCommand +public record CreateSeatCommand(string SeatNumber, Enums.SeatType Type, Enums.SeatClass Class, long FlightId) : ICommand, IInternalCommand { public long Id { get; init; } = SnowFlakIdGenerator.NewId(); } diff --git a/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/CreateSeatCommandValidator.cs b/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/CreateSeatCommandValidator.cs index 96cde0e..2f103a1 100644 --- a/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/CreateSeatCommandValidator.cs +++ b/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/CreateSeatCommandValidator.cs @@ -11,9 +11,9 @@ public class CreateSeatCommandValidator : AbstractValidator RuleFor(x => x.SeatNumber).NotEmpty().WithMessage("SeatNumber is required"); RuleFor(x => x.FlightId).NotEmpty().WithMessage("FlightId is required"); RuleFor(x => x.Class).Must(p => (p.GetType().IsEnum && - p == SeatClass.FirstClass) || - p == SeatClass.Business || - p == SeatClass.Economy) + p == Enums.SeatClass.FirstClass) || + p == Enums.SeatClass.Business || + p == Enums.SeatClass.Economy) .WithMessage("Status must be FirstClass, Business or Economy"); } } diff --git a/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/Reads/CreateSeatMongoCommand.cs b/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/Reads/CreateSeatMongoCommand.cs index 5673895..baac229 100644 --- a/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/Reads/CreateSeatMongoCommand.cs +++ b/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/Reads/CreateSeatMongoCommand.cs @@ -5,7 +5,7 @@ namespace Flight.Seats.Features.CreateSeat.Reads; public class CreateSeatMongoCommand : InternalCommand { - public CreateSeatMongoCommand(long id, string seatNumber, SeatType type, SeatClass @class, + public CreateSeatMongoCommand(long id, string seatNumber, Enums.SeatType type, Enums.SeatClass @class, long flightId, bool isDeleted) { Id = id; @@ -18,8 +18,8 @@ public class CreateSeatMongoCommand : InternalCommand public long Id { get; } public string SeatNumber { get; } - public SeatType Type { get; } - public SeatClass Class { get; } + public Enums.SeatType Type { get; } + public Enums.SeatClass Class { get; } public long FlightId { get; } public bool IsDeleted { get; } } diff --git a/src/Services/Flight/src/Flight/Seats/Features/ReserveSeat/Reads/ReserveSeatMongoCommand.cs b/src/Services/Flight/src/Flight/Seats/Features/ReserveSeat/Reads/ReserveSeatMongoCommand.cs index 4b8d798..a1f6e31 100644 --- a/src/Services/Flight/src/Flight/Seats/Features/ReserveSeat/Reads/ReserveSeatMongoCommand.cs +++ b/src/Services/Flight/src/Flight/Seats/Features/ReserveSeat/Reads/ReserveSeatMongoCommand.cs @@ -5,7 +5,7 @@ namespace Flight.Seats.Features.ReserveSeat.Reads; public class ReserveSeatMongoCommand : InternalCommand { - public ReserveSeatMongoCommand(long id, string seatNumber, SeatType type, SeatClass @class, long flightId, + public ReserveSeatMongoCommand(long id, string seatNumber, Enums.SeatType type, Enums.SeatClass @class, long flightId, bool isDeleted) { Id = id; @@ -17,8 +17,8 @@ public class ReserveSeatMongoCommand : InternalCommand } public string SeatNumber { get; } - public SeatType Type { get; } - public SeatClass Class { get; } + public Enums.SeatType Type { get; } + public Enums.SeatClass Class { get; } public long FlightId { get; } public bool IsDeleted { get; } } diff --git a/src/Services/Flight/src/Flight/Seats/Models/Reads/SeatReadModel.cs b/src/Services/Flight/src/Flight/Seats/Models/Reads/SeatReadModel.cs index 1d5bd1e..e4719a7 100644 --- a/src/Services/Flight/src/Flight/Seats/Models/Reads/SeatReadModel.cs +++ b/src/Services/Flight/src/Flight/Seats/Models/Reads/SeatReadModel.cs @@ -5,8 +5,8 @@ public class SeatReadModel public long Id { get; init; } public long SeatId { get; init; } public string SeatNumber { get; init; } - public SeatType Type { get; init; } - public SeatClass Class { get; init; } + public Enums.SeatType Type { get; init; } + public Enums.SeatClass Class { get; init; } public long FlightId { get; init; } public bool IsDeleted { get; init; } } diff --git a/src/Services/Flight/src/Flight/Seats/Models/Seat.cs b/src/Services/Flight/src/Flight/Seats/Models/Seat.cs index 7bd38a1..8db8a70 100644 --- a/src/Services/Flight/src/Flight/Seats/Models/Seat.cs +++ b/src/Services/Flight/src/Flight/Seats/Models/Seat.cs @@ -7,7 +7,7 @@ namespace Flight.Seats.Models; public record Seat : Aggregate { - public static Seat Create(long id, string seatNumber, SeatType type, SeatClass @class, long flightId, + public static Seat Create(long id, string seatNumber, Enums.SeatType type, Enums.SeatClass @class, long flightId, bool isDeleted = false) { var seat = new Seat() @@ -52,7 +52,7 @@ public record Seat : Aggregate } public string SeatNumber { get; private set; } - public SeatType Type { get; private set; } - public SeatClass Class { get; private set; } + public Enums.SeatType Type { get; private set; } + public Enums.SeatClass Class { get; private set; } public long FlightId { get; private set; } } diff --git a/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetFlightByIdTests.cs b/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetFlightByIdTests.cs index 23edfda..cf9f01c 100644 --- a/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetFlightByIdTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetFlightByIdTests.cs @@ -1,13 +1,13 @@ using System.Threading.Tasks; -using BuildingBlocks.Contracts.Grpc; using BuildingBlocks.TestBase; +using Flight; using Flight.Data; using Flight.Flights.Features.CreateFlight.Reads; using Flight.Flights.Features.GetFlightById; +using Flight.GrpcServer.Services; using FluentAssertions; using Grpc.Net.Client; using Integration.Test.Fakes; -using MagicOnion.Client; using Xunit; namespace Integration.Test.Flight.Features; @@ -16,7 +16,9 @@ public class GetFlightByIdTests : IntegrationTestBase integrationTestFixture) : base(integrationTestFixture) + public GetFlightByIdTests( + IntegrationTestFixture integrationTestFixture) : base( + integrationTestFixture) { _channel = Fixture.Channel; } @@ -49,10 +51,10 @@ public class GetFlightByIdTests : IntegrationTestBase(); - var flightGrpcClient = MagicOnionClient.Create(_channel); + var flightGrpcClient = new FlightGrpcService.FlightGrpcServiceClient(_channel); // Act - var response = await flightGrpcClient.GetById(command.Id); + var response = await flightGrpcClient.GetByIdAsync(new GetByIdRequest {Id = command.Id}); // Assert response?.Should().NotBeNull(); diff --git a/src/Services/Flight/tests/IntegrationTest/Seat/Features/GetAvailableSeatsTests.cs b/src/Services/Flight/tests/IntegrationTest/Seat/Features/GetAvailableSeatsTests.cs index d28d67b..a0577e5 100644 --- a/src/Services/Flight/tests/IntegrationTest/Seat/Features/GetAvailableSeatsTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Seat/Features/GetAvailableSeatsTests.cs @@ -1,15 +1,12 @@ -using System.Linq; -using System.Threading.Tasks; -using BuildingBlocks.Contracts.Grpc; +using System.Threading.Tasks; using BuildingBlocks.TestBase; +using Flight; using Flight.Data; using Flight.Flights.Features.CreateFlight.Reads; using Flight.Seats.Features.CreateSeat.Reads; using FluentAssertions; using Grpc.Net.Client; using Integration.Test.Fakes; -using MagicOnion.Client; -using MassTransit.Testing; using Xunit; namespace Integration.Test.Seat.Features; @@ -39,13 +36,13 @@ public class GetAvailableSeatsTests : IntegrationTestBase(); - var flightGrpcClient = MagicOnionClient.Create(_channel); + var flightGrpcClient = new FlightGrpcService.FlightGrpcServiceClient(_channel); // Act - var response = await flightGrpcClient.GetAvailableSeats(flightCommand.Id); + var response = await flightGrpcClient.GetAvailableSeatsAsync(new GetAvailableSeatsRequest{FlightId = flightCommand.Id}); // Assert response?.Should().NotBeNull(); - response?.Count().Should().BeGreaterOrEqualTo(1); + response?.Items?.Count.Should().BeGreaterOrEqualTo(1); } } diff --git a/src/Services/Flight/tests/IntegrationTest/Seat/Features/ReserveSeatTests.cs b/src/Services/Flight/tests/IntegrationTest/Seat/Features/ReserveSeatTests.cs index a620fe1..94c4a95 100644 --- a/src/Services/Flight/tests/IntegrationTest/Seat/Features/ReserveSeatTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Seat/Features/ReserveSeatTests.cs @@ -1,13 +1,12 @@ using System.Threading.Tasks; -using BuildingBlocks.Contracts.Grpc; using BuildingBlocks.TestBase; +using Flight; using Flight.Data; using Flight.Flights.Features.CreateFlight.Reads; using Flight.Seats.Features.CreateSeat.Reads; using FluentAssertions; using Grpc.Net.Client; using Integration.Test.Fakes; -using MagicOnion.Client; using Xunit; namespace Integration.Test.Seat.Features; @@ -39,10 +38,10 @@ public class ReserveSeatTests : IntegrationTestBase(); - var flightGrpcClient = MagicOnionClient.Create(_channel); + var flightGrpcClient = new FlightGrpcService.FlightGrpcServiceClient(_channel); // Act - var response = await flightGrpcClient.ReserveSeat(new ReserveSeatRequestDto + var response = await flightGrpcClient.ReserveSeatAsync(new ReserveSeatRequest() { FlightId = seatCommand.FlightId, SeatNumber = seatCommand.SeatNumber }); diff --git a/src/Services/Flight/tests/UnitTest/Common/DbContextFactory.cs b/src/Services/Flight/tests/UnitTest/Common/DbContextFactory.cs index 7bf079f..ee758cd 100644 --- a/src/Services/Flight/tests/UnitTest/Common/DbContextFactory.cs +++ b/src/Services/Flight/tests/UnitTest/Common/DbContextFactory.cs @@ -3,7 +3,9 @@ using System.Collections.Generic; using Flight.Aircrafts.Models; using Flight.Airports.Models; using Flight.Data; +using Flight.Flights.Enums; using Flight.Flights.Models; +using Flight.Seats.Enums; using Flight.Seats.Models; using Microsoft.EntityFrameworkCore; diff --git a/src/Services/Flight/tests/UnitTest/Fakes/FakeCreateSeatCommand.cs b/src/Services/Flight/tests/UnitTest/Fakes/FakeCreateSeatCommand.cs index 96fd7ec..52785b0 100644 --- a/src/Services/Flight/tests/UnitTest/Fakes/FakeCreateSeatCommand.cs +++ b/src/Services/Flight/tests/UnitTest/Fakes/FakeCreateSeatCommand.cs @@ -1,5 +1,6 @@ using AutoBogus; using BuildingBlocks.IdsGenerator; +using Flight.Seats.Enums; using Flight.Seats.Features.CreateSeat; using Flight.Seats.Models; diff --git a/src/Services/Flight/tests/UnitTest/Fakes/FakeValidateCreateFlightCommand.cs b/src/Services/Flight/tests/UnitTest/Fakes/FakeValidateCreateFlightCommand.cs index bddb9a3..8a80b93 100644 --- a/src/Services/Flight/tests/UnitTest/Fakes/FakeValidateCreateFlightCommand.cs +++ b/src/Services/Flight/tests/UnitTest/Fakes/FakeValidateCreateFlightCommand.cs @@ -1,5 +1,6 @@ using System; using AutoBogus; +using Flight.Flights.Enums; using Flight.Flights.Features.CreateFlight; using Flight.Flights.Models; diff --git a/src/Services/Flight/tests/UnitTest/Fakes/FakeValidateCreateSeatCommand.cs b/src/Services/Flight/tests/UnitTest/Fakes/FakeValidateCreateSeatCommand.cs index c62d84d..6647e65 100644 --- a/src/Services/Flight/tests/UnitTest/Fakes/FakeValidateCreateSeatCommand.cs +++ b/src/Services/Flight/tests/UnitTest/Fakes/FakeValidateCreateSeatCommand.cs @@ -1,4 +1,5 @@ using AutoBogus; +using Flight.Seats.Enums; using Flight.Seats.Features.CreateSeat; using Flight.Seats.Models; diff --git a/src/Services/Identity/src/Identity.Api/keys/is-signing-key-A7DD53B5F56AA3937910E9A73600964A.json b/src/Services/Identity/src/Identity.Api/keys/is-signing-key-A7DD53B5F56AA3937910E9A73600964A.json new file mode 100644 index 0000000..c1962ba --- /dev/null +++ b/src/Services/Identity/src/Identity.Api/keys/is-signing-key-A7DD53B5F56AA3937910E9A73600964A.json @@ -0,0 +1 @@ +{"Version":1,"Id":"A7DD53B5F56AA3937910E9A73600964A","Created":"2022-10-13T20:19:56.3638146Z","Algorithm":"RS256","IsX509Certificate":false,"Data":"CfDJ8GjYME9sg_tHn5C8_j2EtO1vvYKDE1hzq5Kp8GHesS2tNpBMrM_9i8n6u2MDK4eczb8P8fRryy3dD8HS7GCrRB4dY-qvHq7eRrDdJz8C-HHEZTRt-H843A7O0aOLgXJoR6P0Yk3EbBBJcmFsEGHy9G9PfmVU6LyCpRcuv9be6YLfBI-ahU3XvkSLTLEV0YIs9HRY24Ue71_vWp7G_IawDuUMjQZgTT-ATwvu97iE1ubfIwh-HQWF34Rfk7xvuyWgWftqWxfzCDqP1VIE088c8zCvGTIDb6P7TCC-PFOtOlb6xNy7TlyHNSnvDLCu8WJvc9r5S0P_6Byl9zHVwxmXtGira_tu-7ZkqaVHHrLVwoV0-f4bTRnXn7nvXvvLdOHCTZcl9zh9pyNYVDlLy6arQcfLY09B6pqdaPxw8lt6hrs9D5vwVzknt9PANW7wod9-hN8RBX0oAf0qOyF2Kn6Bt4wWDTO9-JbNebHmGfq0rkaFHepugz4XS40-NfCYwo9Wn3H0uw5Wq0r4SWxhdU9Vbrgb0SCl4am46O_smKVsM5VVSA_3IqvYSWLq1OpqIasJthonDq8ZAxX9w6i3nXjea-T3kD-eoZxUnB5hSnMN62HoyvBSTIlYjUtw_bRHNmnb7oqneL2zCNGZBPIdOf9QByYOCifJvK27AFeSm6xMEZPMK1MRMr4K64_9Jj61wAZTtYp6tIMig8plHwnxpqjrMBYGvjH_L5YHcnDl784IujzwjYfuTqrD8BzlaTTcbCYl4Jxk5DKP6Jlhg7srv6MwO-Y4jvBfOq9PSLR8nN0KdNMHN-OV46b_aRIyefpAfkJIuAWKc2Qoh3jd6yPObVXwP9qYJ21DnaMuBigxt7c6m71z_3NKiSV1d-O9XNPwbwQ8mlkKwc236KnlSRmLli1HMQIJKJhiC5XI1gBXP6XbSi3bvVXgeEj9cVpBnXFkvkRxfXxZ3jZZG97VNuKuH0LSaeHatZIR8IcdeRYRieyAKFyQlXAhWqqTibaZKBx6SCs-9vSi7zojEkng4Aodgjpf79zH_FRQRWg9xufftZpJlAclE1T5119uCMcwDkOngL3xVbTY7S9Ak9lB7lDyuDKm2kIilbuhtrsLx3XJqLEsH0ub8PUuaBmnOZRz8fGikUoy2ZU9F0fIm3_Advymdohu8jjMQ6x4Cp3YWNusn-FblEC8HcdOgdQOw63ZRwJuij1xdLQlTgx3qsRf8xl2zOMnF3nUWodULk2ynTpkYjCp4lbQGGboZ1lxbrKeMeybvr2hmjANtYQz2ahRdMGoVDB2HSruEOrYHx7lFIk5EVaOBhqLigBkLFw5RtDMMo3x8SdLBkNzP2C3oYTy_iGaTwpSRktabgDTmCySLPXGXWiRy0AVTGwozvLhPl1xz-14vlidGvfxcW-n2ahfpN9kqM3MyB5GT85wq-aYxyYi6m3eF2Gek6xSmtVRhCwWnXlUysfawsCQDK_Bio9nEJiYF9WVHjKXvB7ZKq8dQy0IBWrXFz2p04JdBl6s9rzXUvTWtfJUePRh0gQqV24iFCRkg86_WpLXpgPMg91AXwurgrhgJjfUKhxeyl0Riej_hVndAF16H-lz0-N4mDhyy2liRTX56dlC4cWTv2DU4iPtLOarfCna_m7QTdzyeidkcNzTjdtCkTAciZaA_8HZifDbjyIJeCTHBHoIZqfO1VaRiXytx5gEdtt-DQSanj4EA5cvlRLF1xRD7VGI5FTYR-mua1xdw0xpPj28GQ9Tjh8fi2a1WbwRzmjKnOAPwJyG5YelMRHgYnpLqqmESNuLjgfvlAlFmXqPjaJ8FSiPKZEFpwoy2lH_cSx4lYprq2Z9evdY6yaP6lI0lDi2WF3ddCzEeWj2MMg1Rz7fqYzjxum4RINbugJNeck584dTJnESySSZCqQ67m_vd6QE4u6ujB6yzu7TpXc_sOG2AS3r39XtuiPn570r8Z6LWUfdv8WnyRHJ_P5Sf4YAZ8LrGRuz6UHyKesL3bQnHvj0tv9PlOUv9hxemQcfkDi0nrN_3E3HGXbFHQLJ-9RHuVgE0SvL2JIA0aOfpIl69eN8CkBRHVvFnmfKh6OzFDMToBXkhczBWAmCW9nwGVARd_7yjWpu9y8oeAL3yuPXUvJQTDvjLxFHvGntNISf8KM5g9SW_QIxzUFClw2qlqhRLo29TFiSsVQM-hxSu05Js_fGocSek4nkLAotNpCG1AAoWP8TeI1NpLZVRwwzngaBijL_AbIoeFyTY31XdUztEQsi0dvBpu0iLd68GBTKOdeFeZ2vo9AFa4OwTFZ7SATUYRMgixzLlcuWqn60JKdWSQgSPCTLBHHZfgkmfxXLLwT65GEHlwuI8pb20xBeorUhbs3cc9LqXGnuwno5K5v0LaeFailxaBMl4fcgoBDj8TpdKqFKrcsIPol6suVKZRW_drrkc18p5Nt_MR5Xnd6D9SrkXYOUlc8c7gRrnAxE","DataProtected":true} \ No newline at end of file diff --git a/src/Services/Passenger/src/Passenger.Api/Program.cs b/src/Services/Passenger/src/Passenger.Api/Program.cs index 95eb0bb..9f26fb5 100644 --- a/src/Services/Passenger/src/Passenger.Api/Program.cs +++ b/src/Services/Passenger/src/Passenger.Api/Program.cs @@ -19,6 +19,7 @@ using Microsoft.AspNetCore.Mvc.ApiExplorer; using Passenger; using Passenger.Data; using Passenger.Extensions; +using Passenger.GrpcServer.Services; using Prometheus; using Serilog; @@ -51,7 +52,6 @@ builder.Services.AddGrpc(options => { options.Interceptors.Add(); }); -builder.Services.AddMagicOnion(); SnowFlakIdGenerator.Configure(2); @@ -78,7 +78,7 @@ app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapMetrics(); - endpoints.MapMagicOnionService(); + endpoints.MapGrpcService(); }); app.MapGet("/", x => x.Response.WriteAsync(appOptions.Name)); diff --git a/src/Services/Passenger/src/Passenger/EventMapper.cs b/src/Services/Passenger/src/Passenger/EventMapper.cs index 7a2be7e..47e82b6 100644 --- a/src/Services/Passenger/src/Passenger/EventMapper.cs +++ b/src/Services/Passenger/src/Passenger/EventMapper.cs @@ -3,8 +3,6 @@ using BuildingBlocks.Core; using BuildingBlocks.Core.Event; using Passenger.Passengers.Events.Domain; using Passenger.Passengers.Features.CompleteRegisterPassenger.Reads; -using Passenger.Passengers.Models; -using PassengerType = BuildingBlocks.Contracts.Grpc.PassengerType; namespace Passenger; @@ -26,7 +24,7 @@ public sealed class EventMapper : IEventMapper { PassengerRegistrationCompletedDomainEvent e => new CompleteRegisterPassengerMongoCommand(e.Id, e.PassportNumber, e.Name, e.PassengerType, e.Age, e.IsDeleted), - PassengerCreatedDomainEvent e => new CompleteRegisterPassengerMongoCommand(e.Id, e.PassportNumber, e.Name, Passengers.Models.PassengerType.Unknown, + PassengerCreatedDomainEvent e => new CompleteRegisterPassengerMongoCommand(e.Id, e.PassportNumber, e.Name, Passengers.Enums.PassengerType.Unknown, 0, e.IsDeleted), _ => null }; diff --git a/src/Services/Passenger/src/Passenger/GrpcServer/PassengerGrpcService.cs b/src/Services/Passenger/src/Passenger/GrpcServer/PassengerGrpcService.cs deleted file mode 100644 index 3edd30f..0000000 --- a/src/Services/Passenger/src/Passenger/GrpcServer/PassengerGrpcService.cs +++ /dev/null @@ -1,24 +0,0 @@ -using BuildingBlocks.Contracts.Grpc; -using MagicOnion; -using MagicOnion.Server; -using Mapster; -using MediatR; -using Passenger.Passengers.Features.GetPassengerById; - -namespace Passenger.GrpcServer; - -public class PassengerGrpcService : ServiceBase, IPassengerGrpcService -{ - private readonly IMediator _mediator; - - public PassengerGrpcService(IMediator mediator) - { - _mediator = mediator; - } - - public async UnaryResult GetById(long id) - { - var result = await _mediator.Send(new GetPassengerQueryById(id)); - return result.Adapt(); - } -} diff --git a/src/Services/Passenger/src/Passenger/GrpcServer/Protos/passenger.proto b/src/Services/Passenger/src/Passenger/GrpcServer/Protos/passenger.proto new file mode 100644 index 0000000..dc63f56 --- /dev/null +++ b/src/Services/Passenger/src/Passenger/GrpcServer/Protos/passenger.proto @@ -0,0 +1,30 @@ +syntax = "proto3"; + +package passenger; + +service PassengerGrpcService { + + rpc GetById (GetByIdRequest) returns (PassengerResponse); +} + +message GetByIdRequest { + int64 Id = 1; +} + +message PassengerResponse { + int64 Id = 1; + string Name = 2; + string PassportNumber = 3; + PassengerType PassengerType = 4; + int32 Age = 5; + string Email = 6; +} + + + enum PassengerType { + PASSENGER_TYPE_UNKNOWN = 0; + PASSENGER_TYPE_MALE = 1; + PASSENGER_TYPE_FEMALE = 2; + PASSENGER_TYPE_BABY = 3; + } + diff --git a/src/Services/Passenger/src/Passenger/GrpcServer/Services/PassengerGrpcServices.cs b/src/Services/Passenger/src/Passenger/GrpcServer/Services/PassengerGrpcServices.cs new file mode 100644 index 0000000..3735f64 --- /dev/null +++ b/src/Services/Passenger/src/Passenger/GrpcServer/Services/PassengerGrpcServices.cs @@ -0,0 +1,22 @@ +using Grpc.Core; +using Mapster; +using MediatR; +using Passenger.Passengers.Features.GetPassengerById; + +namespace Passenger.GrpcServer.Services; + +public class PassengerGrpcServices : PassengerGrpcService.PassengerGrpcServiceBase +{ + private readonly IMediator _mediator; + + public PassengerGrpcServices(IMediator mediator) + { + _mediator = mediator; + } + + public override async Task GetById(GetByIdRequest request, ServerCallContext context) + { + var result = await _mediator.Send(new GetPassengerQueryById(request.Id)); + return result.Adapt(); + } +} diff --git a/src/Services/Passenger/src/Passenger/Passenger.csproj b/src/Services/Passenger/src/Passenger/Passenger.csproj index 24f41b5..3e9a9b8 100644 --- a/src/Services/Passenger/src/Passenger/Passenger.csproj +++ b/src/Services/Passenger/src/Passenger/Passenger.csproj @@ -6,6 +6,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -21,4 +22,8 @@ + + + + diff --git a/src/Services/Passenger/src/Passenger/Passengers/Enums/PassengerType.cs b/src/Services/Passenger/src/Passenger/Passengers/Enums/PassengerType.cs new file mode 100644 index 0000000..4767301 --- /dev/null +++ b/src/Services/Passenger/src/Passenger/Passengers/Enums/PassengerType.cs @@ -0,0 +1,9 @@ +namespace Passenger.Passengers.Enums; + +public enum PassengerType +{ + Unknown = 0, + Male, + Female, + Baby +} diff --git a/src/Services/Passenger/src/Passenger/Passengers/Events/Domain/PassengerRegistrationCompletedDomainEvent.cs b/src/Services/Passenger/src/Passenger/Passengers/Events/Domain/PassengerRegistrationCompletedDomainEvent.cs index f31f80a..aa5423a 100644 --- a/src/Services/Passenger/src/Passenger/Passengers/Events/Domain/PassengerRegistrationCompletedDomainEvent.cs +++ b/src/Services/Passenger/src/Passenger/Passengers/Events/Domain/PassengerRegistrationCompletedDomainEvent.cs @@ -4,4 +4,4 @@ using Passenger.Passengers.Models; namespace Passenger.Passengers.Events.Domain; public record PassengerRegistrationCompletedDomainEvent(long Id, string Name, string PassportNumber, - PassengerType PassengerType, int Age, bool IsDeleted = false) : IDomainEvent; + Enums.PassengerType PassengerType, int Age, bool IsDeleted = false) : IDomainEvent; diff --git a/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/CompleteRegisterPassengerCommand.cs b/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/CompleteRegisterPassengerCommand.cs index 33f9ba7..ec56999 100644 --- a/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/CompleteRegisterPassengerCommand.cs +++ b/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/CompleteRegisterPassengerCommand.cs @@ -6,7 +6,7 @@ using Passenger.Passengers.Models; namespace Passenger.Passengers.Features.CompleteRegisterPassenger; -public record CompleteRegisterPassengerCommand(string PassportNumber, PassengerType PassengerType, int Age) : ICommand, IInternalCommand +public record CompleteRegisterPassengerCommand(string PassportNumber, Enums.PassengerType PassengerType, int Age) : ICommand, IInternalCommand { public long Id { get; init; } = SnowFlakIdGenerator.NewId(); } diff --git a/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/CompleteRegisterPassengerCommandValidator.cs b/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/CompleteRegisterPassengerCommandValidator.cs index f296b10..27aba32 100644 --- a/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/CompleteRegisterPassengerCommandValidator.cs +++ b/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/CompleteRegisterPassengerCommandValidator.cs @@ -12,10 +12,10 @@ public class CompleteRegisterPassengerCommandValidator : AbstractValidator x.PassportNumber).NotNull().WithMessage("The PassportNumber is required!"); RuleFor(x => x.Age).GreaterThan(0).WithMessage("The Age must be greater than 0!"); RuleFor(x => x.PassengerType).Must(p => p.GetType().IsEnum && - p == PassengerType.Baby || - p == PassengerType.Female || - p == PassengerType.Male || - p == PassengerType.Unknown) + p == Enums.PassengerType.Baby || + p == Enums.PassengerType.Female || + p == Enums.PassengerType.Male || + p == Enums.PassengerType.Unknown) .WithMessage("PassengerType must be Male, Female, Baby or Unknown"); } } diff --git a/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/Reads/CompleteRegisterPassengerMongoCommand.cs b/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/Reads/CompleteRegisterPassengerMongoCommand.cs index a3f6baa..9a40d8a 100644 --- a/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/Reads/CompleteRegisterPassengerMongoCommand.cs +++ b/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/Reads/CompleteRegisterPassengerMongoCommand.cs @@ -6,7 +6,7 @@ namespace Passenger.Passengers.Features.CompleteRegisterPassenger.Reads; public class CompleteRegisterPassengerMongoCommand : InternalCommand { public CompleteRegisterPassengerMongoCommand(long id, string passportNumber, string name, - PassengerType passengerType, int age, bool isDeleted) + Enums.PassengerType passengerType, int age, bool isDeleted) { Id = id; PassportNumber = passportNumber; @@ -18,7 +18,7 @@ public class CompleteRegisterPassengerMongoCommand : InternalCommand public string PassportNumber { get; } public string Name { get; } - public PassengerType PassengerType { get; } + public Enums.PassengerType PassengerType { get; } public int Age { get; } public bool IsDeleted { get; } } diff --git a/src/Services/Passenger/src/Passenger/Passengers/Models/Passenger.cs b/src/Services/Passenger/src/Passenger/Passengers/Models/Passenger.cs index e818eb7..0903693 100644 --- a/src/Services/Passenger/src/Passenger/Passengers/Models/Passenger.cs +++ b/src/Services/Passenger/src/Passenger/Passengers/Models/Passenger.cs @@ -5,7 +5,7 @@ namespace Passenger.Passengers.Models; public record Passenger : Aggregate { - public Passenger CompleteRegistrationPassenger(long id, string name, string passportNumber, PassengerType passengerType, int age, bool isDeleted = false) + public Passenger CompleteRegistrationPassenger(long id, string name, string passportNumber, Enums.PassengerType passengerType, int age, bool isDeleted = false) { var passenger = new Passenger { @@ -40,6 +40,6 @@ public record Passenger : Aggregate public string PassportNumber { get; private set; } public string Name { get; private set; } - public PassengerType PassengerType { get; private set; } + public Enums.PassengerType PassengerType { get; private set; } public int Age { get; private set; } } diff --git a/src/Services/Passenger/src/Passenger/Passengers/Models/PassengerType.cs b/src/Services/Passenger/src/Passenger/Passengers/Models/PassengerType.cs deleted file mode 100644 index 52ad478..0000000 --- a/src/Services/Passenger/src/Passenger/Passengers/Models/PassengerType.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Passenger.Passengers.Models; - -public enum PassengerType -{ - Male, - Female, - Baby, - Unknown -} \ No newline at end of file diff --git a/src/Services/Passenger/src/Passenger/Passengers/Models/Reads/PassengerReadModel.cs b/src/Services/Passenger/src/Passenger/Passengers/Models/Reads/PassengerReadModel.cs index ebe2ebe..a45601e 100644 --- a/src/Services/Passenger/src/Passenger/Passengers/Models/Reads/PassengerReadModel.cs +++ b/src/Services/Passenger/src/Passenger/Passengers/Models/Reads/PassengerReadModel.cs @@ -6,7 +6,7 @@ public class PassengerReadModel public long PassengerId { get; init; } public string PassportNumber { get; private set; } public string Name { get; private set; } - public PassengerType PassengerType { get; private set; } + public Enums.PassengerType PassengerType { get; private set; } public int Age { get; private set; } public bool IsDeleted { get; init; } } diff --git a/src/Services/Passenger/tests/IntegrationTest/Fakes/FakeCompleteRegisterPassengerCommand.cs b/src/Services/Passenger/tests/IntegrationTest/Fakes/FakeCompleteRegisterPassengerCommand.cs index e6035a9..76d08f8 100644 --- a/src/Services/Passenger/tests/IntegrationTest/Fakes/FakeCompleteRegisterPassengerCommand.cs +++ b/src/Services/Passenger/tests/IntegrationTest/Fakes/FakeCompleteRegisterPassengerCommand.cs @@ -1,5 +1,6 @@ using AutoBogus; using BuildingBlocks.IdsGenerator; +using Passenger.Passengers.Enums; using Passenger.Passengers.Features.CompleteRegisterPassenger; using Passenger.Passengers.Models; diff --git a/src/Services/Passenger/tests/IntegrationTest/Fakes/FakePassengerResponseDto.cs b/src/Services/Passenger/tests/IntegrationTest/Fakes/FakePassengerResponseDto.cs index 43a2f6c..c291696 100644 --- a/src/Services/Passenger/tests/IntegrationTest/Fakes/FakePassengerResponseDto.cs +++ b/src/Services/Passenger/tests/IntegrationTest/Fakes/FakePassengerResponseDto.cs @@ -1,10 +1,10 @@ using AutoBogus; -using BuildingBlocks.Contracts.Grpc; using BuildingBlocks.IdsGenerator; +using Passenger; -public class FakePassengerResponseDto : AutoFaker +public class FakePassengerResponse : AutoFaker { - public FakePassengerResponseDto() + public FakePassengerResponse() { RuleFor(r => r.Id, _ => SnowFlakIdGenerator.NewId()); } diff --git a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs index a04d6b9..3eac82e 100644 --- a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs +++ b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs @@ -13,7 +13,8 @@ public class CompleteRegisterPassengerTests : IntegrationTestBase integrationTestFixture) : base(integrationTestFixture) + public CompleteRegisterPassengerTests(IntegrationTestFixture integrationTestFixture) : + base(integrationTestFixture) { _testHarness = Fixture.TestHarness; } @@ -36,7 +37,7 @@ public class CompleteRegisterPassengerTests : IntegrationTestBase integrationTestFixture) : base(integrationTestFixture) + public GetPassengerByIdTests(IntegrationTestFixture integrationTestFixture) : base( + integrationTestFixture) { _channel = Fixture.Channel; _testHarness = Fixture.TestHarness; @@ -30,7 +27,6 @@ public class GetPassengerByIdTests : IntegrationTestBase(_channel); + var passengerGrpcClient = new PassengerGrpcService.PassengerGrpcServiceClient(_channel); // Act - var response = await passengerGrpcClient.GetById(passengerEntity.Id); + var response = await passengerGrpcClient.GetByIdAsync(new GetByIdRequest {Id = passengerEntity.Id}); // Assert response?.Should().NotBeNull(); response?.Id.Should().Be(passengerEntity.Id); } - - private void MockPassengerGrpcServices(IServiceCollection services) - { - services.Replace(ServiceDescriptor.Singleton(x => - { - var mock = Substitute.For(); - mock.GetById(Arg.Any()) - .Returns(new UnaryResult(new FakePassengerResponseDto().Generate())); - - return mock; - })); - } }