From 78f4a764f7d71c3de4dcc72156f3ab1f99f1c55b Mon Sep 17 00:00:00 2001 From: "amir.gholami" Date: Sat, 27 May 2023 23:47:12 +0330 Subject: [PATCH] Apply Chnages in Comment --- .../InvalidManufacturingYearException.cs | 10 + .../Exceptions/InvalidModelException.cs | 10 + .../Exceptions/InvalidNameException.cs | 10 + .../CreatingAircraft/V1/CreateAircraft.cs | 8 +- .../Models/ValueObjects/ManufacturingYear.cs | 17 +- .../Aircrafts/Models/ValueObjects/Model.cs | 17 +- .../Aircrafts/Models/ValueObjects/Name.cs | 16 +- ...0526093041_aircraftValueObject.Designer.cs | 363 ------------------ .../20230526093041_aircraftValueObject.cs | 22 -- src/Services/Flight/src/Flight/EventMapper.cs | 3 +- .../src/Flight/Flights/Dtos/FlightDto.cs | 4 +- .../CreatingFlight/V1/CreateFlightMongo.cs | 5 +- .../Flight/Flights/Features/FlightMappings.cs | 4 +- .../Flight/Flights/Models/FlightReadModel.cs | 3 +- .../Flight/src/Flight/GenericValueObject.cs | 13 - .../Aircraft/Features/CreateAircraftTests.cs | 4 +- .../Exceptions/InvalidAgeException.cs | 9 + .../Exceptions/InvalidNameException.cs | 10 + .../InvalidPassportNumberException.cs | 10 + .../V1/CompleteRegisterPassenger.cs | 6 +- .../Passengers/Models/ValueObjects/Age.cs | 17 +- .../Models/ValueObjects/GenericValueObject.cs | 13 - .../Passengers/Models/ValueObjects/Name.cs | 14 +- .../Models/ValueObjects/PassportNumber.cs | 51 +-- .../CompleteRegisterPassengerTests.cs | 4 +- 25 files changed, 145 insertions(+), 498 deletions(-) create mode 100644 src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidManufacturingYearException.cs create mode 100644 src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidModelException.cs create mode 100644 src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidNameException.cs delete mode 100644 src/Services/Flight/src/Flight/Data/Migrations/20230526093041_aircraftValueObject.Designer.cs delete mode 100644 src/Services/Flight/src/Flight/Data/Migrations/20230526093041_aircraftValueObject.cs delete mode 100644 src/Services/Flight/src/Flight/GenericValueObject.cs create mode 100644 src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidAgeException.cs create mode 100644 src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidNameException.cs create mode 100644 src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidPassportNumberException.cs delete mode 100644 src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/GenericValueObject.cs diff --git a/src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidManufacturingYearException.cs b/src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidManufacturingYearException.cs new file mode 100644 index 0000000..13de436 --- /dev/null +++ b/src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidManufacturingYearException.cs @@ -0,0 +1,10 @@ +namespace Flight.Aircrafts.Exceptions; +using BuildingBlocks.Exception; + + +public class InvalidManufacturingYearException : BadRequestException +{ + public InvalidManufacturingYearException() : base("ManufacturingYear cannot be empty or whitespace.") + { + } +} diff --git a/src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidModelException.cs b/src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidModelException.cs new file mode 100644 index 0000000..276e733 --- /dev/null +++ b/src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidModelException.cs @@ -0,0 +1,10 @@ +namespace Flight.Aircrafts.Exceptions; +using BuildingBlocks.Exception; + + +public class InvalidModelException : BadRequestException +{ + public InvalidModelException() : base("Model cannot be empty or whitespace.") + { + } +} diff --git a/src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidNameException.cs b/src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidNameException.cs new file mode 100644 index 0000000..d2a7354 --- /dev/null +++ b/src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidNameException.cs @@ -0,0 +1,10 @@ +namespace Flight.Aircrafts.Exceptions; +using BuildingBlocks.Exception; + + +public class InvalidNameException : BadRequestException +{ + public InvalidNameException() : base("Name cannot be empty or whitespace.") + { + } +} diff --git a/src/Services/Flight/src/Flight/Aircrafts/Features/CreatingAircraft/V1/CreateAircraft.cs b/src/Services/Flight/src/Flight/Aircrafts/Features/CreatingAircraft/V1/CreateAircraft.cs index 06e2751..10a81fe 100644 --- a/src/Services/Flight/src/Flight/Aircrafts/Features/CreatingAircraft/V1/CreateAircraft.cs +++ b/src/Services/Flight/src/Flight/Aircrafts/Features/CreatingAircraft/V1/CreateAircraft.cs @@ -18,6 +18,7 @@ using MediatR; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; +using Microsoft.EntityFrameworkCore; using Models; using Models.ValueObjects; @@ -89,11 +90,8 @@ internal class CreateAircraftHandler : IRequestHandler x.Model == Model.Of(request.Model), cancellationToken); - - var aircraft = _flightDbContext.Aircraft.AsEnumerable() - .FirstOrDefault(a => a.Model.Equals(Model.Of(request.Model))); + var aircraft = await _flightDbContext.Aircraft.AsNoTracking().SingleOrDefaultAsync( + a => a.Model.Value.Equals(Model.Of(request.Model)), cancellationToken); if (aircraft is not null) diff --git a/src/Services/Flight/src/Flight/Aircrafts/Models/ValueObjects/ManufacturingYear.cs b/src/Services/Flight/src/Flight/Aircrafts/Models/ValueObjects/ManufacturingYear.cs index 5e68c6e..521b1a0 100644 --- a/src/Services/Flight/src/Flight/Aircrafts/Models/ValueObjects/ManufacturingYear.cs +++ b/src/Services/Flight/src/Flight/Aircrafts/Models/ValueObjects/ManufacturingYear.cs @@ -1,19 +1,26 @@ namespace Flight.Aircrafts.Models.ValueObjects; -using System; +using Flight.Aircrafts.Exceptions; -public record ManufacturingYear : GenericValueObject +public record ManufacturingYear { - public ManufacturingYear(int value) : base(value) + public int Value { get; } + public ManufacturingYear(int value) { if (string.IsNullOrWhiteSpace(value.ToString())) { - throw new ArgumentException("ManufacturingYear cannot be empty or whitespace."); + throw new InvalidManufacturingYearException(); } - } + Value = value; + } public static ManufacturingYear Of(int value) { return new ManufacturingYear(value); } + + public static implicit operator int(ManufacturingYear manufacturingYear) + { + return manufacturingYear.Value; + } } diff --git a/src/Services/Flight/src/Flight/Aircrafts/Models/ValueObjects/Model.cs b/src/Services/Flight/src/Flight/Aircrafts/Models/ValueObjects/Model.cs index ddbb0cc..c7ec562 100644 --- a/src/Services/Flight/src/Flight/Aircrafts/Models/ValueObjects/Model.cs +++ b/src/Services/Flight/src/Flight/Aircrafts/Models/ValueObjects/Model.cs @@ -1,17 +1,24 @@ namespace Flight.Aircrafts.Models.ValueObjects; -using System; -public record Model : GenericValueObject +using Flight.Aircrafts.Exceptions; + +public record Model { - public Model(string value) : base(value) + public string Value { get; } + public Model(string value) { if (string.IsNullOrWhiteSpace(value)) { - throw new ArgumentException("Model cannot be empty or whitespace."); + throw new InvalidModelException(); } + Value = value; } - public static Model Of(string value) { return new Model(value); } + + public static implicit operator string(Model model) + { + return model.Value; + } } diff --git a/src/Services/Flight/src/Flight/Aircrafts/Models/ValueObjects/Name.cs b/src/Services/Flight/src/Flight/Aircrafts/Models/ValueObjects/Name.cs index 577e62f..91ddcfe 100644 --- a/src/Services/Flight/src/Flight/Aircrafts/Models/ValueObjects/Name.cs +++ b/src/Services/Flight/src/Flight/Aircrafts/Models/ValueObjects/Name.cs @@ -1,18 +1,24 @@ namespace Flight.Aircrafts.Models.ValueObjects; -using System; +using Exceptions; -public record Name : GenericValueObject +public record Name { - public Name(string value) : base(value) + public string Value { get; } + public Name(string value) { if (string.IsNullOrWhiteSpace(value)) { - throw new ArgumentException("Name cannot be empty or whitespace."); + throw new InvalidNameException(); } + Value = value; } - public static Name Of(string value) { return new Name(value); } + + public static implicit operator string(Name name) + { + return name.Value; + } } diff --git a/src/Services/Flight/src/Flight/Data/Migrations/20230526093041_aircraftValueObject.Designer.cs b/src/Services/Flight/src/Flight/Data/Migrations/20230526093041_aircraftValueObject.Designer.cs deleted file mode 100644 index 72f0f19..0000000 --- a/src/Services/Flight/src/Flight/Data/Migrations/20230526093041_aircraftValueObject.Designer.cs +++ /dev/null @@ -1,363 +0,0 @@ -// -using System; -using Flight.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace Flight.Data.Migrations -{ - [DbContext(typeof(FlightDbContext))] - [Migration("20230526093041_aircraftValueObject")] - partial class aircraftValueObject - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.2") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("Flight.Aircrafts.Models.Aircraft", b => - { - b.Property("Id") - .HasColumnType("uuid") - .HasColumnName("id"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("bigint") - .HasColumnName("created_by"); - - b.Property("IsDeleted") - .HasColumnType("boolean") - .HasColumnName("is_deleted"); - - b.Property("LastModified") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_modified"); - - b.Property("LastModifiedBy") - .HasColumnType("bigint") - .HasColumnName("last_modified_by"); - - b.Property("Version") - .IsConcurrencyToken() - .HasColumnType("bigint") - .HasColumnName("version"); - - b.HasKey("Id") - .HasName("pk_aircraft"); - - b.ToTable("aircraft", (string)null); - }); - - modelBuilder.Entity("Flight.Airports.Models.Airport", b => - { - b.Property("Id") - .HasColumnType("uuid") - .HasColumnName("id"); - - b.Property("Address") - .HasColumnType("text") - .HasColumnName("address"); - - b.Property("Code") - .HasColumnType("text") - .HasColumnName("code"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("bigint") - .HasColumnName("created_by"); - - b.Property("IsDeleted") - .HasColumnType("boolean") - .HasColumnName("is_deleted"); - - b.Property("LastModified") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_modified"); - - b.Property("LastModifiedBy") - .HasColumnType("bigint") - .HasColumnName("last_modified_by"); - - b.Property("Name") - .HasColumnType("text") - .HasColumnName("name"); - - b.Property("Version") - .IsConcurrencyToken() - .HasColumnType("bigint") - .HasColumnName("version"); - - b.HasKey("Id") - .HasName("pk_airport"); - - b.ToTable("airport", (string)null); - }); - - modelBuilder.Entity("Flight.Flights.Models.Flight", b => - { - b.Property("Id") - .HasColumnType("uuid") - .HasColumnName("id"); - - b.Property("AircraftId") - .HasColumnType("uuid") - .HasColumnName("aircraft_id"); - - b.Property("ArriveAirportId") - .HasColumnType("uuid") - .HasColumnName("arrive_airport_id"); - - b.Property("ArriveDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("arrive_date"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("bigint") - .HasColumnName("created_by"); - - b.Property("DepartureAirportId") - .HasColumnType("uuid") - .HasColumnName("departure_airport_id"); - - b.Property("DepartureDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("departure_date"); - - b.Property("DurationMinutes") - .HasColumnType("numeric") - .HasColumnName("duration_minutes"); - - b.Property("FlightDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("flight_date"); - - b.Property("FlightNumber") - .HasColumnType("text") - .HasColumnName("flight_number"); - - b.Property("IsDeleted") - .HasColumnType("boolean") - .HasColumnName("is_deleted"); - - b.Property("LastModified") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_modified"); - - b.Property("LastModifiedBy") - .HasColumnType("bigint") - .HasColumnName("last_modified_by"); - - b.Property("Price") - .HasColumnType("numeric") - .HasColumnName("price"); - - b.Property("Status") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("text") - .HasDefaultValue("Unknown") - .HasColumnName("status"); - - b.Property("Version") - .IsConcurrencyToken() - .HasColumnType("bigint") - .HasColumnName("version"); - - b.HasKey("Id") - .HasName("pk_flight"); - - b.HasIndex("AircraftId") - .HasDatabaseName("ix_flight_aircraft_id"); - - b.HasIndex("ArriveAirportId") - .HasDatabaseName("ix_flight_arrive_airport_id"); - - b.ToTable("flight", (string)null); - }); - - modelBuilder.Entity("Flight.Seats.Models.Seat", b => - { - b.Property("Id") - .HasColumnType("uuid") - .HasColumnName("id"); - - b.Property("Class") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("text") - .HasDefaultValue("Unknown") - .HasColumnName("class"); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("created_at"); - - b.Property("CreatedBy") - .HasColumnType("bigint") - .HasColumnName("created_by"); - - b.Property("FlightId") - .HasColumnType("uuid") - .HasColumnName("flight_id"); - - b.Property("IsDeleted") - .HasColumnType("boolean") - .HasColumnName("is_deleted"); - - b.Property("LastModified") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_modified"); - - b.Property("LastModifiedBy") - .HasColumnType("bigint") - .HasColumnName("last_modified_by"); - - b.Property("SeatNumber") - .HasColumnType("text") - .HasColumnName("seat_number"); - - b.Property("Type") - .IsRequired() - .ValueGeneratedOnAdd() - .HasColumnType("text") - .HasDefaultValue("Unknown") - .HasColumnName("type"); - - b.Property("Version") - .IsConcurrencyToken() - .HasColumnType("bigint") - .HasColumnName("version"); - - b.HasKey("Id") - .HasName("pk_seat"); - - b.HasIndex("FlightId") - .HasDatabaseName("ix_seat_flight_id"); - - b.ToTable("seat", (string)null); - }); - - modelBuilder.Entity("Flight.Aircrafts.Models.Aircraft", b => - { - b.OwnsOne("Flight.Aircrafts.Models.ValueObjects.ManufacturingYearValue", "ManufacturingYear", b1 => - { - b1.Property("AircraftId") - .HasColumnType("uuid") - .HasColumnName("id"); - - b1.Property("Value") - .HasMaxLength(5) - .HasColumnType("integer") - .HasColumnName("manufacturing_year"); - - b1.HasKey("AircraftId") - .HasName("pk_aircraft"); - - b1.ToTable("aircraft"); - - b1.WithOwner() - .HasForeignKey("AircraftId") - .HasConstraintName("fk_aircraft_aircraft_id"); - }); - - b.OwnsOne("Flight.Aircrafts.Models.ValueObjects.ModelValue", "Model", b1 => - { - b1.Property("AircraftId") - .HasColumnType("uuid") - .HasColumnName("id"); - - b1.Property("Value") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("model"); - - b1.HasKey("AircraftId") - .HasName("pk_aircraft"); - - b1.ToTable("aircraft"); - - b1.WithOwner() - .HasForeignKey("AircraftId") - .HasConstraintName("fk_aircraft_aircraft_id"); - }); - - b.OwnsOne("Flight.Aircrafts.Models.ValueObjects.NameValue", "Name", b1 => - { - b1.Property("AircraftId") - .HasColumnType("uuid") - .HasColumnName("id"); - - b1.Property("Value") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("name"); - - b1.HasKey("AircraftId") - .HasName("pk_aircraft"); - - b1.ToTable("aircraft"); - - b1.WithOwner() - .HasForeignKey("AircraftId") - .HasConstraintName("fk_aircraft_aircraft_id"); - }); - - b.Navigation("ManufacturingYear"); - - b.Navigation("Model"); - - b.Navigation("Name"); - }); - - modelBuilder.Entity("Flight.Flights.Models.Flight", b => - { - b.HasOne("Flight.Aircrafts.Models.Aircraft", null) - .WithMany() - .HasForeignKey("AircraftId") - .HasConstraintName("fk_flight_aircraft_aircraft_id"); - - b.HasOne("Flight.Airports.Models.Airport", null) - .WithMany() - .HasForeignKey("ArriveAirportId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_flight_airport_arrive_airport_id"); - }); - - modelBuilder.Entity("Flight.Seats.Models.Seat", b => - { - b.HasOne("Flight.Flights.Models.Flight", null) - .WithMany() - .HasForeignKey("FlightId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_seat_flight_flight_id"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/Services/Flight/src/Flight/Data/Migrations/20230526093041_aircraftValueObject.cs b/src/Services/Flight/src/Flight/Data/Migrations/20230526093041_aircraftValueObject.cs deleted file mode 100644 index 82cf3d7..0000000 --- a/src/Services/Flight/src/Flight/Data/Migrations/20230526093041_aircraftValueObject.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Flight.Data.Migrations -{ - /// - public partial class aircraftValueObject : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - - } - } -} diff --git a/src/Services/Flight/src/Flight/EventMapper.cs b/src/Services/Flight/src/Flight/EventMapper.cs index d367bb6..cd85a5c 100644 --- a/src/Services/Flight/src/Flight/EventMapper.cs +++ b/src/Services/Flight/src/Flight/EventMapper.cs @@ -5,6 +5,7 @@ using BuildingBlocks.Core.Event; namespace Flight; using Aircrafts.Features.CreatingAircraft.V1; +using Aircrafts.Models.ValueObjects; using Airports.Features.CreatingAirport.V1; using Flights.Features.CreatingFlight.V1; using Flights.Features.DeletingFlight.V1; @@ -34,7 +35,7 @@ public sealed class EventMapper : IEventMapper { return @event switch { - FlightCreatedDomainEvent e => new CreateFlightMongo(e.Id, e.FlightNumber, e.AircraftId, e.DepartureDate, e.DepartureAirportId, + FlightCreatedDomainEvent e => new CreateFlightMongo(e.Id, e.FlightNumber, AircraftId.Of(e.AircraftId), e.DepartureDate, e.DepartureAirportId, e.ArriveDate, e.ArriveAirportId, e.DurationMinutes, e.FlightDate, e.Status, e.Price, e.IsDeleted), FlightUpdatedDomainEvent e => new UpdateFlightMongo(e.Id, e.FlightNumber, e.AircraftId, e.DepartureDate, e.DepartureAirportId, e.ArriveDate, e.ArriveAirportId, e.DurationMinutes, e.FlightDate, e.Status, e.Price, e.IsDeleted), diff --git a/src/Services/Flight/src/Flight/Flights/Dtos/FlightDto.cs b/src/Services/Flight/src/Flight/Flights/Dtos/FlightDto.cs index 9610506..d6340cd 100644 --- a/src/Services/Flight/src/Flight/Flights/Dtos/FlightDto.cs +++ b/src/Services/Flight/src/Flight/Flights/Dtos/FlightDto.cs @@ -2,6 +2,8 @@ using System; namespace Flight.Flights.Dtos; -public record FlightDto(Guid Id, string FlightNumber, Guid AircraftId, Guid DepartureAirportId, +using Aircrafts.Models.ValueObjects; + +public record FlightDto(Guid Id, string FlightNumber, AircraftId AircraftId, Guid DepartureAirportId, DateTime DepartureDate, DateTime ArriveDate, Guid ArriveAirportId, decimal DurationMinutes, DateTime FlightDate, Enums.FlightStatus Status, decimal Price); diff --git a/src/Services/Flight/src/Flight/Flights/Features/CreatingFlight/V1/CreateFlightMongo.cs b/src/Services/Flight/src/Flight/Flights/Features/CreatingFlight/V1/CreateFlightMongo.cs index b53e5a5..7913d6c 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/CreatingFlight/V1/CreateFlightMongo.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/CreatingFlight/V1/CreateFlightMongo.cs @@ -1,8 +1,9 @@ -namespace Flight.Flights.Features.CreatingFlight.V1; +namespace Flight.Flights.Features.CreatingFlight.V1; using System; using System.Threading; using System.Threading.Tasks; +using Aircrafts.Models.ValueObjects; using Ardalis.GuardClauses; using BuildingBlocks.Core.CQRS; using BuildingBlocks.Core.Event; @@ -14,7 +15,7 @@ using Models; using MongoDB.Driver; using MongoDB.Driver.Linq; -public record CreateFlightMongo(Guid Id, string FlightNumber, Guid AircraftId, DateTime DepartureDate, +public record CreateFlightMongo(Guid Id, string FlightNumber, AircraftId AircraftId, DateTime DepartureDate, Guid DepartureAirportId, DateTime ArriveDate, Guid ArriveAirportId, decimal DurationMinutes, DateTime FlightDate, Enums.FlightStatus Status, decimal Price, bool IsDeleted = false) : InternalCommand; diff --git a/src/Services/Flight/src/Flight/Flights/Features/FlightMappings.cs b/src/Services/Flight/src/Flight/Flights/Features/FlightMappings.cs index 5b529f6..9d4bf6f 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/FlightMappings.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/FlightMappings.cs @@ -4,7 +4,6 @@ namespace Flight.Flights.Features; using CreatingFlight.V1; using DeletingFlight.V1; -using GettingAvailableFlights.V1; using MassTransit; using Models; using UpdatingFlight.V1; @@ -15,7 +14,8 @@ public class FlightMappings : IRegister public void Register(TypeAdapterConfig config) { config.NewConfig() - .ConstructUsing(x => new FlightDto(x.Id, x.FlightNumber, x.AircraftId, x.DepartureAirportId, x.DepartureDate, + .ConstructUsing(x => new FlightDto(x.Id, x.FlightNumber, x.AircraftId, x.DepartureAirportId, + x.DepartureDate, x.ArriveDate, x.ArriveAirportId, x.DurationMinutes, x.FlightDate, x.Status, x.Price)); config.NewConfig() diff --git a/src/Services/Flight/src/Flight/Flights/Models/FlightReadModel.cs b/src/Services/Flight/src/Flight/Flights/Models/FlightReadModel.cs index 74eec28..dbeec2a 100644 --- a/src/Services/Flight/src/Flight/Flights/Models/FlightReadModel.cs +++ b/src/Services/Flight/src/Flight/Flights/Models/FlightReadModel.cs @@ -1,13 +1,14 @@ namespace Flight.Flights.Models; using System; +using Aircrafts.Models.ValueObjects; public class FlightReadModel { public required Guid Id { get; init; } public required Guid FlightId { get; init; } public required string FlightNumber { get; init; } - public required Guid AircraftId { get; init; } + public required AircraftId AircraftId { get; init; } public required DateTime DepartureDate { get; init; } public required Guid DepartureAirportId { get; init; } public required DateTime ArriveDate { get; init; } diff --git a/src/Services/Flight/src/Flight/GenericValueObject.cs b/src/Services/Flight/src/Flight/GenericValueObject.cs deleted file mode 100644 index 9088ed7..0000000 --- a/src/Services/Flight/src/Flight/GenericValueObject.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Flight; -public record GenericValueObject(T Value) -{ - public override string ToString() - { - return Value.ToString(); - } - - public static implicit operator T(GenericValueObject valueObject) - { - return valueObject.Value; - } -} diff --git a/src/Services/Flight/tests/IntegrationTest/Aircraft/Features/CreateAircraftTests.cs b/src/Services/Flight/tests/IntegrationTest/Aircraft/Features/CreateAircraftTests.cs index 352c9a7..7077139 100644 --- a/src/Services/Flight/tests/IntegrationTest/Aircraft/Features/CreateAircraftTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Aircraft/Features/CreateAircraftTests.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using BuildingBlocks.Contracts.EventBus.Messages; using BuildingBlocks.TestBase; using Flight.Api; @@ -26,7 +26,7 @@ public class CreateAircraftTests : FlightIntegrationTestBase var response = await Fixture.SendAsync(command); // Assert - response?.Id.Should().Be(command.Id); + response?.Id.Value.Should().Be(command.Id); (await Fixture.WaitForPublishing()).Should().Be(true); } diff --git a/src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidAgeException.cs b/src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidAgeException.cs new file mode 100644 index 0000000..df9a826 --- /dev/null +++ b/src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidAgeException.cs @@ -0,0 +1,9 @@ +namespace Passenger.Passengers.Exceptions; +using BuildingBlocks.Exception; + +public class InvalidAgeException : BadRequestException +{ + public InvalidAgeException() : base("Age Cannot be null or negative") + { + } +} diff --git a/src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidNameException.cs b/src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidNameException.cs new file mode 100644 index 0000000..0a44de6 --- /dev/null +++ b/src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidNameException.cs @@ -0,0 +1,10 @@ +namespace Passenger.Passengers.Exceptions; +using BuildingBlocks.Exception; + + +public class InvalidNameException : BadRequestException +{ + public InvalidNameException() : base("Name cannot be empty or whitespace.") + { + } +} diff --git a/src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidPassportNumberException.cs b/src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidPassportNumberException.cs new file mode 100644 index 0000000..bb6429b --- /dev/null +++ b/src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidPassportNumberException.cs @@ -0,0 +1,10 @@ +namespace Passenger.Passengers.Exceptions; +using BuildingBlocks.Exception; + + +public class InvalidPassportNumberException : BadRequestException +{ + public InvalidPassportNumberException() : base("Passport number cannot be empty or whitespace.") + { + } +} diff --git a/src/Services/Passenger/src/Passenger/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassenger.cs b/src/Services/Passenger/src/Passenger/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassenger.cs index bfec595..e97043e 100644 --- a/src/Services/Passenger/src/Passenger/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassenger.cs +++ b/src/Services/Passenger/src/Passenger/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassenger.cs @@ -96,11 +96,9 @@ internal class CompleteRegisterPassengerCommandHandler : ICommandHandler x.PassportNumber == PassportNumber.Of(request.PassportNumber), cancellationToken); + var passenger = await _passengerDbContext.Passengers.AsNoTracking().SingleOrDefaultAsync( + x => x.PassportNumber.Value.Equals(PassportNumber.Of(request.PassportNumber)), cancellationToken); - var passenger = _passengerDbContext.Passengers.AsEnumerable() - .FirstOrDefault(a => a.PassportNumber.Equals(PassportNumber.Of(request.PassportNumber))); if (passenger is null) { diff --git a/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/Age.cs b/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/Age.cs index 7a13ee6..8426520 100644 --- a/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/Age.cs +++ b/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/Age.cs @@ -1,18 +1,25 @@ namespace Passenger.Passengers.Models.ValueObjects; -using System; +using global::Passenger.Passengers.Exceptions; -public record Age : GenericValueObject +public record Age { - public Age(int value) : base(value) + public int Value { get; } + public Age(int value) { - if (value < 0) + if (value <= 0 || value == null) { - throw new ArgumentException("Age cannot be negative."); + throw new InvalidAgeException(); } + Value = value; } public static Age Of(int value) { return new Age(value); } + + public static implicit operator int(Age age) + { + return age.Value; + } } diff --git a/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/GenericValueObject.cs b/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/GenericValueObject.cs deleted file mode 100644 index ee0353a..0000000 --- a/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/GenericValueObject.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Passenger.Passengers.Models.ValueObjects; -public record GenericValueObject(T Value) -{ - public override string ToString() - { - return Value.ToString(); - } - - public static implicit operator T(GenericValueObject valueObject) - { - return valueObject.Value; - } -} diff --git a/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/Name.cs b/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/Name.cs index aa35d74..a137285 100644 --- a/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/Name.cs +++ b/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/Name.cs @@ -1,13 +1,14 @@ namespace Passenger.Passengers.Models.ValueObjects; -using System; +using Exceptions; -public record Name : GenericValueObject +public record Name { - public Name(string value) : base(value) + public string Value { get; } + public Name(string value) { if (string.IsNullOrWhiteSpace(value)) { - throw new ArgumentException("Name cannot be empty or whitespace."); + throw new InvalidNameException(); } Value = value; } @@ -15,4 +16,9 @@ public record Name : GenericValueObject { return new Name(value); } + + public static implicit operator string(Name name) + { + return name.Value; + } } diff --git a/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/PassportNumber.cs b/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/PassportNumber.cs index 28e0aec..0cc0834 100644 --- a/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/PassportNumber.cs +++ b/src/Services/Passenger/src/Passenger/Passengers/Models/ValueObjects/PassportNumber.cs @@ -1,46 +1,6 @@ namespace Passenger.Passengers.Models.ValueObjects; -using System; +using Exceptions; - -//public record PassportNumber : GenericValueObject -//{ - -// public PassportNumber(string value) : base(value) -// { -// if (string.IsNullOrWhiteSpace(value)) -// { -// throw new ArgumentException("Passport number cannot be empty or whitespace."); -// } -// Value = value; -// } -// public static PassportNumber Of(string value) -// { -// return new PassportNumber(value); -// } -//} -//public record PassportNumber -//{ -// public string Value { get; } - -// public PassportNumber(string value) -// { -// if (string.IsNullOrWhiteSpace(value)) -// { -// throw new ArgumentException("Passport number cannot be empty or whitespace."); -// } -// Value = value; -// } - -// public static PassportNumber Of(string value) -// { -// return new PassportNumber(value); -// } - -// public static implicit operator string(PassportNumber aircraftId) -// { -// return aircraftId.Value; -// } -//} public record PassportNumber { public string Value { get; } @@ -54,7 +14,7 @@ public record PassportNumber { if (string.IsNullOrWhiteSpace(value)) { - throw new ArgumentException("Passport number cannot be empty or whitespace."); + throw new InvalidPassportNumberException(); } Value = value; } @@ -63,5 +23,10 @@ public record PassportNumber { return new PassportNumber(value); } - public static implicit operator string(PassportNumber passportNumber) => passportNumber.Value; + + public static implicit operator string(PassportNumber passportNumber) + { + return passportNumber.Value; + } } + diff --git a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs index ecc88af..91b19c2 100644 --- a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs +++ b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs @@ -23,8 +23,8 @@ public class CompleteRegisterPassengerTests : PassengerIntegrationTestBase var userCreated = new FakeUserCreated().Generate(); await Fixture.Publish(userCreated); - (await Fixture.WaitForPublishing()).Should().Be(true); - (await Fixture.WaitForConsuming()).Should().Be(true); + await Fixture.WaitForPublishing(); + await Fixture.WaitForConsuming(); var command = new FakeCompleteRegisterPassengerCommand(userCreated.PassportNumber).Generate();