From 57264b384c7c7da813d453e4206947c509dc2b84 Mon Sep 17 00:00:00 2001 From: cuqmbr Date: Tue, 27 May 2025 14:08:40 +0300 Subject: [PATCH] add vehicle and company info to vehicle enrollment search dto --- .../SearchAll/SearchAllQueryHandler.cs | 39 +++++++- .../SearchShortestQueryHandler.cs | 39 +++++++- .../VehicleEnrollmentSearchCompanyDto.cs | 25 +++++ .../VehicleEnrollmentSearchVehicleDto.cs | 94 +++++++++++++++++++ ...cleEnrollmentSearchVehicleEnrollmentDto.cs | 4 + 5 files changed, 195 insertions(+), 6 deletions(-) create mode 100644 src/Application/VehicleEnrollmentSearch/VehicleEnrollmentSearchCompanyDto.cs create mode 100644 src/Application/VehicleEnrollmentSearch/VehicleEnrollmentSearchVehicleDto.cs diff --git a/src/Application/VehicleEnrollmentSearch/Queries/SearchAll/SearchAllQueryHandler.cs b/src/Application/VehicleEnrollmentSearch/Queries/SearchAll/SearchAllQueryHandler.cs index 4cd7fa8..f25ba6c 100644 --- a/src/Application/VehicleEnrollmentSearch/Queries/SearchAll/SearchAllQueryHandler.cs +++ b/src/Application/VehicleEnrollmentSearch/Queries/SearchAll/SearchAllQueryHandler.cs @@ -12,6 +12,7 @@ namespace cuqmbr.TravelGuide.Application .VehicleEnrollmentSearch.Queries.SearchAll; // TODO: Add configurable time between transfers. +// TODO: Refactor DTO creation code to use mapper as much as possible. public class SearchAllQueryHandler : IRequestHandler> { @@ -71,8 +72,24 @@ public class SearchAllQueryHandler : 1, int.MaxValue, cancellationToken)) .Items; + var vehicles = (await _unitOfWork.VehicleRepository + .GetPageAsync( + e => e.Enrollments.All(e => vehicleEnrollmentIds.Contains(e.Id)), + 1, int.MaxValue, cancellationToken)) + .Items; - // Hydrate vehicle enrollments with route address details + var companyIds = vehicles.Select(e => e.CompanyId); + var companies = (await _unitOfWork.CompanyRepository + .GetPageAsync( + e => companyIds.Contains(e.Id), + 1, int.MaxValue, cancellationToken)) + .Items; + + + // Hydrate vehicle enrollments with: + // - route address details; + // - vehicle info; + // - comapny info. foreach (var vehicleEnrollment in vehicleEnrollments) { @@ -80,6 +97,12 @@ public class SearchAllQueryHandler : .Where(e => e.VehicleEnrollmentId == vehicleEnrollment.Id) .OrderBy(e => e.RouteAddress.Order) .ToArray(); + + vehicleEnrollment.Vehicle = vehicles + .Single(e => e.Id == vehicleEnrollment.VehicleId); + + vehicleEnrollment.Vehicle.Company = companies + .Single(e => e.Id == vehicleEnrollment.Vehicle.CompanyId); } @@ -310,7 +333,13 @@ public class SearchAllQueryHandler : VehicleType = source.VehicleType.Name, Uuid = tag.VehicleEnrollment.Guid, Order = enrollmentOrder, - Addresses = addressDtos + Addresses = addressDtos, + Company = _mapper + .Map( + tag.VehicleEnrollment.Vehicle.Company), + Vehicle = _mapper + .Map( + tag.VehicleEnrollment.Vehicle) }); @@ -443,7 +472,11 @@ public class SearchAllQueryHandler : VehicleType = source.VehicleType.Name, Uuid = tag.VehicleEnrollment.Guid, Order = enrollmentOrder, - Addresses = addressDtos + Addresses = addressDtos, + Company = _mapper.Map( + tag.VehicleEnrollment.Vehicle.Company), + Vehicle = _mapper.Map( + tag.VehicleEnrollment.Vehicle) }); // --------------- diff --git a/src/Application/VehicleEnrollmentSearch/Queries/SearchShortest/SearchShortestQueryHandler.cs b/src/Application/VehicleEnrollmentSearch/Queries/SearchShortest/SearchShortestQueryHandler.cs index c1acabb..afbcc45 100644 --- a/src/Application/VehicleEnrollmentSearch/Queries/SearchShortest/SearchShortestQueryHandler.cs +++ b/src/Application/VehicleEnrollmentSearch/Queries/SearchShortest/SearchShortestQueryHandler.cs @@ -12,6 +12,7 @@ namespace cuqmbr.TravelGuide.Application .VehicleEnrollmentSearch.Queries.SearchShortest; // TODO: Add configurable time between transfers. +// TODO: Refactor DTO creation code to use mapper as much as possible. public class SearchShortestQueryHandler : IRequestHandler { @@ -71,8 +72,24 @@ public class SearchShortestQueryHandler : 1, int.MaxValue, cancellationToken)) .Items; + var vehicles = (await _unitOfWork.VehicleRepository + .GetPageAsync( + e => e.Enrollments.All(e => vehicleEnrollmentIds.Contains(e.Id)), + 1, int.MaxValue, cancellationToken)) + .Items; - // Hydrate vehicle enrollments with route address details + var companyIds = vehicles.Select(e => e.CompanyId); + var companies = (await _unitOfWork.CompanyRepository + .GetPageAsync( + e => companyIds.Contains(e.Id), + 1, int.MaxValue, cancellationToken)) + .Items; + + + // Hydrate vehicle enrollments with: + // - route address details; + // - vehicle info; + // - comapny info. foreach (var vehicleEnrollment in vehicleEnrollments) { @@ -80,6 +97,12 @@ public class SearchShortestQueryHandler : .Where(e => e.VehicleEnrollmentId == vehicleEnrollment.Id) .OrderBy(e => e.RouteAddress.Order) .ToArray(); + + vehicleEnrollment.Vehicle = vehicles + .Single(e => e.Id == vehicleEnrollment.VehicleId); + + vehicleEnrollment.Vehicle.Company = companies + .Single(e => e.Id == vehicleEnrollment.Vehicle.CompanyId); } @@ -300,7 +323,13 @@ public class SearchShortestQueryHandler : VehicleType = source.VehicleType.Name, Uuid = tag.VehicleEnrollment.Guid, Order = enrollmentOrder, - Addresses = addressDtos + Addresses = addressDtos, + Company = _mapper + .Map( + tag.VehicleEnrollment.Vehicle.Company), + Vehicle = _mapper + .Map( + tag.VehicleEnrollment.Vehicle) }); firstRouteAddressId = nextTag.RouteAddressId; @@ -422,7 +451,11 @@ public class SearchShortestQueryHandler : VehicleType = source.VehicleType.Name, Uuid = tag.VehicleEnrollment.Guid, Order = enrollmentOrder, - Addresses = addressDtos + Addresses = addressDtos, + Company = _mapper.Map( + tag.VehicleEnrollment.Vehicle.Company), + Vehicle = _mapper.Map( + tag.VehicleEnrollment.Vehicle) }); } else diff --git a/src/Application/VehicleEnrollmentSearch/VehicleEnrollmentSearchCompanyDto.cs b/src/Application/VehicleEnrollmentSearch/VehicleEnrollmentSearchCompanyDto.cs new file mode 100644 index 0000000..40e5155 --- /dev/null +++ b/src/Application/VehicleEnrollmentSearch/VehicleEnrollmentSearchCompanyDto.cs @@ -0,0 +1,25 @@ +using cuqmbr.TravelGuide.Application.Common.Mappings; +using cuqmbr.TravelGuide.Domain.Entities; + +namespace cuqmbr.TravelGuide.Application.VehicleEnrollmentSearch; + +public sealed class VehicleEnrollmentSearchCompanyDto : IMapFrom +{ + public string Uuid { get; set; } + + public string Name { get; set; } + + public string LegalAddress { get; set; } + + public string ContactEmail { get; set; } + + public string ContactPhoneNumber { get; set; } + + public void Mapping(MappingProfile profile) + { + profile.CreateMap() + .ForMember( + d => d.Uuid, + opt => opt.MapFrom(s => s.Guid)); + } +} diff --git a/src/Application/VehicleEnrollmentSearch/VehicleEnrollmentSearchVehicleDto.cs b/src/Application/VehicleEnrollmentSearch/VehicleEnrollmentSearchVehicleDto.cs new file mode 100644 index 0000000..acc05f4 --- /dev/null +++ b/src/Application/VehicleEnrollmentSearch/VehicleEnrollmentSearchVehicleDto.cs @@ -0,0 +1,94 @@ +using cuqmbr.TravelGuide.Application.Common.Mappings; +using cuqmbr.TravelGuide.Domain.Entities; + +namespace cuqmbr.TravelGuide.Application.VehicleEnrollmentSearch; + +public sealed class VehicleEnrollmentSearchVehicleDto : IMapFrom +{ + public string Uuid { get; set; } + + public string Type { get; set; } + + public string Number { get; set; } + + public string Model { get; set; } + + public short Capacity { get; set; } + + public void Mapping(MappingProfile profile) + { + profile.CreateMap() + .ForMember( + d => d.Uuid, + opt => opt.MapFrom(s => s.Guid)) + .ForMember( + d => d.Type, + opt => opt.MapFrom(s => s.VehicleType.Name)) + .ForMember( + d => d.Number, + opt => opt.MapFrom( + (s, d) => + { + if (s is Bus) + { + return ((Bus)s).Number; + } + else if (s is Aircraft) + { + return ((Aircraft)s).Number; + } + else if (s is Train) + { + return ((Train)s).Number; + } + else + { + throw new NotImplementedException(); + } + })) + .ForMember( + d => d.Model, + opt => opt.MapFrom( + (s, d) => + { + if (s is Bus) + { + return ((Bus)s).Model; + } + else if (s is Aircraft) + { + return ((Aircraft)s).Model; + } + else if (s is Train) + { + return ((Train)s).Model; + } + else + { + throw new NotImplementedException(); + } + })) + .ForMember( + d => d.Capacity, + opt => opt.MapFrom( + (s, d) => + { + if (s is Bus) + { + return ((Bus)s).Capacity; + } + else if (s is Aircraft) + { + return ((Aircraft)s).Capacity; + } + else if (s is Train) + { + return ((Train)s).Capacity; + } + else + { + throw new NotImplementedException(); + } + })); + } +} diff --git a/src/Application/VehicleEnrollmentSearch/VehicleEnrollmentSearchVehicleEnrollmentDto.cs b/src/Application/VehicleEnrollmentSearch/VehicleEnrollmentSearchVehicleEnrollmentDto.cs index 5481f76..37c959d 100644 --- a/src/Application/VehicleEnrollmentSearch/VehicleEnrollmentSearchVehicleEnrollmentDto.cs +++ b/src/Application/VehicleEnrollmentSearch/VehicleEnrollmentSearchVehicleEnrollmentDto.cs @@ -24,6 +24,10 @@ public sealed class VehicleEnrollmentSearchVehicleEnrollmentDto public short Order { get; set; } + public VehicleEnrollmentSearchCompanyDto Company { get; set; } + + public VehicleEnrollmentSearchVehicleDto Vehicle { get; set; } + public ICollection Addresses { get; set; } }