Apply Chnages in Comment

This commit is contained in:
amir.gholami 2023-05-27 23:47:12 +03:30
parent f639619940
commit 78f4a764f7
25 changed files with 145 additions and 498 deletions

View File

@ -0,0 +1,10 @@
namespace Flight.Aircrafts.Exceptions;
using BuildingBlocks.Exception;
public class InvalidManufacturingYearException : BadRequestException
{
public InvalidManufacturingYearException() : base("ManufacturingYear cannot be empty or whitespace.")
{
}
}

View File

@ -0,0 +1,10 @@
namespace Flight.Aircrafts.Exceptions;
using BuildingBlocks.Exception;
public class InvalidModelException : BadRequestException
{
public InvalidModelException() : base("Model cannot be empty or whitespace.")
{
}
}

View File

@ -0,0 +1,10 @@
namespace Flight.Aircrafts.Exceptions;
using BuildingBlocks.Exception;
public class InvalidNameException : BadRequestException
{
public InvalidNameException() : base("Name cannot be empty or whitespace.")
{
}
}

View File

@ -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<CreateAircraft, CreateAir
{
Guard.Against.Null(request, nameof(request));
//var aircraft =
// await _flightDbContext.Aircraft.SingleOrDefaultAsync(x => 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)

View File

@ -1,19 +1,26 @@
namespace Flight.Aircrafts.Models.ValueObjects;
using System;
using Flight.Aircrafts.Exceptions;
public record ManufacturingYear : GenericValueObject<int>
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;
}
}

View File

@ -1,17 +1,24 @@
namespace Flight.Aircrafts.Models.ValueObjects;
using System;
public record Model : GenericValueObject<string>
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;
}
}

View File

@ -1,18 +1,24 @@
namespace Flight.Aircrafts.Models.ValueObjects;
using System;
using Exceptions;
public record Name : GenericValueObject<string>
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;
}
}

View File

@ -1,363 +0,0 @@
// <auto-generated />
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
{
/// <inheritdoc />
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<Guid>("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property<DateTime?>("CreatedAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at");
b.Property<long?>("CreatedBy")
.HasColumnType("bigint")
.HasColumnName("created_by");
b.Property<bool>("IsDeleted")
.HasColumnType("boolean")
.HasColumnName("is_deleted");
b.Property<DateTime?>("LastModified")
.HasColumnType("timestamp with time zone")
.HasColumnName("last_modified");
b.Property<long?>("LastModifiedBy")
.HasColumnType("bigint")
.HasColumnName("last_modified_by");
b.Property<long>("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<Guid>("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property<string>("Address")
.HasColumnType("text")
.HasColumnName("address");
b.Property<string>("Code")
.HasColumnType("text")
.HasColumnName("code");
b.Property<DateTime?>("CreatedAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at");
b.Property<long?>("CreatedBy")
.HasColumnType("bigint")
.HasColumnName("created_by");
b.Property<bool>("IsDeleted")
.HasColumnType("boolean")
.HasColumnName("is_deleted");
b.Property<DateTime?>("LastModified")
.HasColumnType("timestamp with time zone")
.HasColumnName("last_modified");
b.Property<long?>("LastModifiedBy")
.HasColumnType("bigint")
.HasColumnName("last_modified_by");
b.Property<string>("Name")
.HasColumnType("text")
.HasColumnName("name");
b.Property<long>("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<Guid>("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property<Guid?>("AircraftId")
.HasColumnType("uuid")
.HasColumnName("aircraft_id");
b.Property<Guid>("ArriveAirportId")
.HasColumnType("uuid")
.HasColumnName("arrive_airport_id");
b.Property<DateTime>("ArriveDate")
.HasColumnType("timestamp with time zone")
.HasColumnName("arrive_date");
b.Property<DateTime?>("CreatedAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at");
b.Property<long?>("CreatedBy")
.HasColumnType("bigint")
.HasColumnName("created_by");
b.Property<Guid>("DepartureAirportId")
.HasColumnType("uuid")
.HasColumnName("departure_airport_id");
b.Property<DateTime>("DepartureDate")
.HasColumnType("timestamp with time zone")
.HasColumnName("departure_date");
b.Property<decimal>("DurationMinutes")
.HasColumnType("numeric")
.HasColumnName("duration_minutes");
b.Property<DateTime>("FlightDate")
.HasColumnType("timestamp with time zone")
.HasColumnName("flight_date");
b.Property<string>("FlightNumber")
.HasColumnType("text")
.HasColumnName("flight_number");
b.Property<bool>("IsDeleted")
.HasColumnType("boolean")
.HasColumnName("is_deleted");
b.Property<DateTime?>("LastModified")
.HasColumnType("timestamp with time zone")
.HasColumnName("last_modified");
b.Property<long?>("LastModifiedBy")
.HasColumnType("bigint")
.HasColumnName("last_modified_by");
b.Property<decimal>("Price")
.HasColumnType("numeric")
.HasColumnName("price");
b.Property<string>("Status")
.IsRequired()
.ValueGeneratedOnAdd()
.HasColumnType("text")
.HasDefaultValue("Unknown")
.HasColumnName("status");
b.Property<long>("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<Guid>("Id")
.HasColumnType("uuid")
.HasColumnName("id");
b.Property<string>("Class")
.IsRequired()
.ValueGeneratedOnAdd()
.HasColumnType("text")
.HasDefaultValue("Unknown")
.HasColumnName("class");
b.Property<DateTime?>("CreatedAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at");
b.Property<long?>("CreatedBy")
.HasColumnType("bigint")
.HasColumnName("created_by");
b.Property<Guid>("FlightId")
.HasColumnType("uuid")
.HasColumnName("flight_id");
b.Property<bool>("IsDeleted")
.HasColumnType("boolean")
.HasColumnName("is_deleted");
b.Property<DateTime?>("LastModified")
.HasColumnType("timestamp with time zone")
.HasColumnName("last_modified");
b.Property<long?>("LastModifiedBy")
.HasColumnType("bigint")
.HasColumnName("last_modified_by");
b.Property<string>("SeatNumber")
.HasColumnType("text")
.HasColumnName("seat_number");
b.Property<string>("Type")
.IsRequired()
.ValueGeneratedOnAdd()
.HasColumnType("text")
.HasDefaultValue("Unknown")
.HasColumnName("type");
b.Property<long>("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<Guid>("AircraftId")
.HasColumnType("uuid")
.HasColumnName("id");
b1.Property<int>("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<Guid>("AircraftId")
.HasColumnType("uuid")
.HasColumnName("id");
b1.Property<string>("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<Guid>("AircraftId")
.HasColumnType("uuid")
.HasColumnName("id");
b1.Property<string>("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
}
}
}

View File

@ -1,22 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Flight.Data.Migrations
{
/// <inheritdoc />
public partial class aircraftValueObject : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
}

View File

@ -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),

View File

@ -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);

View File

@ -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;

View File

@ -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<Models.Flight, FlightDto>()
.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<CreateFlightMongo, FlightReadModel>()

View File

@ -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; }

View File

@ -1,13 +0,0 @@
namespace Flight;
public record GenericValueObject<T>(T Value)
{
public override string ToString()
{
return Value.ToString();
}
public static implicit operator T(GenericValueObject<T> valueObject)
{
return valueObject.Value;
}
}

View File

@ -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<AircraftCreated>()).Should().Be(true);
}

View File

@ -0,0 +1,9 @@
namespace Passenger.Passengers.Exceptions;
using BuildingBlocks.Exception;
public class InvalidAgeException : BadRequestException
{
public InvalidAgeException() : base("Age Cannot be null or negative")
{
}
}

View File

@ -0,0 +1,10 @@
namespace Passenger.Passengers.Exceptions;
using BuildingBlocks.Exception;
public class InvalidNameException : BadRequestException
{
public InvalidNameException() : base("Name cannot be empty or whitespace.")
{
}
}

View File

@ -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.")
{
}
}

View File

@ -96,11 +96,9 @@ internal class CompleteRegisterPassengerCommandHandler : ICommandHandler<Complet
{
Guard.Against.Null(request, nameof(request));
//var passenger = await _passengerDbContext.Passengers.AsNoTracking().SingleOrDefaultAsync(
// x => 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)
{

View File

@ -1,18 +1,25 @@
namespace Passenger.Passengers.Models.ValueObjects;
using System;
using global::Passenger.Passengers.Exceptions;
public record Age : GenericValueObject<int>
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;
}
}

View File

@ -1,13 +0,0 @@
namespace Passenger.Passengers.Models.ValueObjects;
public record GenericValueObject<T>(T Value)
{
public override string ToString()
{
return Value.ToString();
}
public static implicit operator T(GenericValueObject<T> valueObject)
{
return valueObject.Value;
}
}

View File

@ -1,13 +1,14 @@
namespace Passenger.Passengers.Models.ValueObjects;
using System;
using Exceptions;
public record Name : GenericValueObject<string>
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<string>
{
return new Name(value);
}
public static implicit operator string(Name name)
{
return name.Value;
}
}

View File

@ -1,46 +1,6 @@
namespace Passenger.Passengers.Models.ValueObjects;
using System;
using Exceptions;
//public record PassportNumber : GenericValueObject<string>
//{
// 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;
}
}

View File

@ -23,8 +23,8 @@ public class CompleteRegisterPassengerTests : PassengerIntegrationTestBase
var userCreated = new FakeUserCreated().Generate();
await Fixture.Publish(userCreated);
(await Fixture.WaitForPublishing<UserCreated>()).Should().Be(true);
(await Fixture.WaitForConsuming<UserCreated>()).Should().Be(true);
await Fixture.WaitForPublishing<UserCreated>();
await Fixture.WaitForConsuming<UserCreated>();
var command = new FakeCompleteRegisterPassengerCommand(userCreated.PassportNumber).Generate();