add vehicle and company info to vehicle enrollment search dto

This commit is contained in:
cuqmbr 2025-05-27 14:08:40 +03:00
parent a97b95a704
commit 57264b384c
Signed by: cuqmbr
GPG Key ID: 0AA446880C766199
5 changed files with 195 additions and 6 deletions

View File

@ -12,6 +12,7 @@ namespace cuqmbr.TravelGuide.Application
.VehicleEnrollmentSearch.Queries.SearchAll; .VehicleEnrollmentSearch.Queries.SearchAll;
// TODO: Add configurable time between transfers. // TODO: Add configurable time between transfers.
// TODO: Refactor DTO creation code to use mapper as much as possible.
public class SearchAllQueryHandler : public class SearchAllQueryHandler :
IRequestHandler<SearchAllQuery, IEnumerable<VehicleEnrollmentSearchDto>> IRequestHandler<SearchAllQuery, IEnumerable<VehicleEnrollmentSearchDto>>
{ {
@ -71,8 +72,24 @@ public class SearchAllQueryHandler :
1, int.MaxValue, cancellationToken)) 1, int.MaxValue, cancellationToken))
.Items; .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) foreach (var vehicleEnrollment in vehicleEnrollments)
{ {
@ -80,6 +97,12 @@ public class SearchAllQueryHandler :
.Where(e => e.VehicleEnrollmentId == vehicleEnrollment.Id) .Where(e => e.VehicleEnrollmentId == vehicleEnrollment.Id)
.OrderBy(e => e.RouteAddress.Order) .OrderBy(e => e.RouteAddress.Order)
.ToArray(); .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, VehicleType = source.VehicleType.Name,
Uuid = tag.VehicleEnrollment.Guid, Uuid = tag.VehicleEnrollment.Guid,
Order = enrollmentOrder, Order = enrollmentOrder,
Addresses = addressDtos Addresses = addressDtos,
Company = _mapper
.Map<VehicleEnrollmentSearchCompanyDto>(
tag.VehicleEnrollment.Vehicle.Company),
Vehicle = _mapper
.Map<VehicleEnrollmentSearchVehicleDto>(
tag.VehicleEnrollment.Vehicle)
}); });
@ -443,7 +472,11 @@ public class SearchAllQueryHandler :
VehicleType = source.VehicleType.Name, VehicleType = source.VehicleType.Name,
Uuid = tag.VehicleEnrollment.Guid, Uuid = tag.VehicleEnrollment.Guid,
Order = enrollmentOrder, Order = enrollmentOrder,
Addresses = addressDtos Addresses = addressDtos,
Company = _mapper.Map<VehicleEnrollmentSearchCompanyDto>(
tag.VehicleEnrollment.Vehicle.Company),
Vehicle = _mapper.Map<VehicleEnrollmentSearchVehicleDto>(
tag.VehicleEnrollment.Vehicle)
}); });
// --------------- // ---------------

View File

@ -12,6 +12,7 @@ namespace cuqmbr.TravelGuide.Application
.VehicleEnrollmentSearch.Queries.SearchShortest; .VehicleEnrollmentSearch.Queries.SearchShortest;
// TODO: Add configurable time between transfers. // TODO: Add configurable time between transfers.
// TODO: Refactor DTO creation code to use mapper as much as possible.
public class SearchShortestQueryHandler : public class SearchShortestQueryHandler :
IRequestHandler<SearchShortestQuery, VehicleEnrollmentSearchDto> IRequestHandler<SearchShortestQuery, VehicleEnrollmentSearchDto>
{ {
@ -71,8 +72,24 @@ public class SearchShortestQueryHandler :
1, int.MaxValue, cancellationToken)) 1, int.MaxValue, cancellationToken))
.Items; .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) foreach (var vehicleEnrollment in vehicleEnrollments)
{ {
@ -80,6 +97,12 @@ public class SearchShortestQueryHandler :
.Where(e => e.VehicleEnrollmentId == vehicleEnrollment.Id) .Where(e => e.VehicleEnrollmentId == vehicleEnrollment.Id)
.OrderBy(e => e.RouteAddress.Order) .OrderBy(e => e.RouteAddress.Order)
.ToArray(); .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, VehicleType = source.VehicleType.Name,
Uuid = tag.VehicleEnrollment.Guid, Uuid = tag.VehicleEnrollment.Guid,
Order = enrollmentOrder, Order = enrollmentOrder,
Addresses = addressDtos Addresses = addressDtos,
Company = _mapper
.Map<VehicleEnrollmentSearchCompanyDto>(
tag.VehicleEnrollment.Vehicle.Company),
Vehicle = _mapper
.Map<VehicleEnrollmentSearchVehicleDto>(
tag.VehicleEnrollment.Vehicle)
}); });
firstRouteAddressId = nextTag.RouteAddressId; firstRouteAddressId = nextTag.RouteAddressId;
@ -422,7 +451,11 @@ public class SearchShortestQueryHandler :
VehicleType = source.VehicleType.Name, VehicleType = source.VehicleType.Name,
Uuid = tag.VehicleEnrollment.Guid, Uuid = tag.VehicleEnrollment.Guid,
Order = enrollmentOrder, Order = enrollmentOrder,
Addresses = addressDtos Addresses = addressDtos,
Company = _mapper.Map<VehicleEnrollmentSearchCompanyDto>(
tag.VehicleEnrollment.Vehicle.Company),
Vehicle = _mapper.Map<VehicleEnrollmentSearchVehicleDto>(
tag.VehicleEnrollment.Vehicle)
}); });
} }
else else

View File

@ -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<Company>
{
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<Company, VehicleEnrollmentSearchCompanyDto>()
.ForMember(
d => d.Uuid,
opt => opt.MapFrom(s => s.Guid));
}
}

View File

@ -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<Vehicle>
{
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<Vehicle, VehicleEnrollmentSearchVehicleDto>()
.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();
}
}));
}
}

View File

@ -24,6 +24,10 @@ public sealed class VehicleEnrollmentSearchVehicleEnrollmentDto
public short Order { get; set; } public short Order { get; set; }
public VehicleEnrollmentSearchCompanyDto Company { get; set; }
public VehicleEnrollmentSearchVehicleDto Vehicle { get; set; }
public ICollection<VehicleEnrollmentSearchAddressDto> public ICollection<VehicleEnrollmentSearchAddressDto>
Addresses { get; set; } Addresses { get; set; }
} }