using AutobusApi.Application.Common.Interfaces; using AutobusApi.Domain.Entities; using MediatR; namespace AutobusApi.Application.VehicleEnrollments.Commands.CreateVehicleEnrollment; public class CreateVehicleEnrollmentCommandHandler : IRequestHandler { private readonly IApplicationDbContext _dbContext; public CreateVehicleEnrollmentCommandHandler(IApplicationDbContext dbContext) { _dbContext = dbContext; } public async Task Handle( CreateVehicleEnrollmentCommand request, CancellationToken cancellationToken) { var vehicleEnrollment = new VehicleEnrollment(); vehicleEnrollment.VehicleId = request.VehicleId; vehicleEnrollment.RouteId = request.RouteId; vehicleEnrollment.DepartureDateTimeUtc = request.DepartureDateTimeUtc; var routeAddresses = _dbContext.RouteAddresses .Where(ra => ra.RouteId == request.RouteId) .ToList(); if (routeAddresses.Count != request.RouteAddressDetails.Count) { // TODO: Throw validation exception throw new NotImplementedException(); } vehicleEnrollment.RouteAddressDetails = new List(); foreach (var detail in request.RouteAddressDetails) { if (!routeAddresses.Any(ra => ra.Id == detail.RouteAddressId)) { // TODO: Throw validation exception throw new NotImplementedException(); } vehicleEnrollment.RouteAddressDetails.Add(new RouteAddressDetails() { RouteAddressId = detail.RouteAddressId, TimeToNextAddress = detail.TimeToNextAddress, CurrentAddressStopTime = detail.CurrentAddressStopTime, CostToNextAddress = detail.CostToNextAddress }); } _dbContext.VehicleEnrollments.Add(vehicleEnrollment); await _dbContext.SaveChangesAsync(cancellationToken); return vehicleEnrollment.Id; } }