public async Task <ActionResult> UpdateTransits([FromBody] TransitDto transits, [FromRoute] int forwardingOrderId) { var updateTransitResult = await transitService.UpdateTransits(transits, forwardingOrderId); if (!updateTransitResult.IsSuccessful) { return(BadRequest(updateTransitResult)); } return(Ok(updateTransitResult)); }
public async Task <GenericResponse> UpdateTransits(TransitDto transits, int forwardingOrderId) { if (transits == null || transits.Transits == null) { return(new GenericResponse(false, "Dane przejazdów nie zostały podane")); } // get old transits from transitForwardingOrders table var oldTransitForwardingOrders = await unitOfWork.TransitForwardingOrderRepository.GetTransitForwardingOrdersByForwardingOrderAsync(forwardingOrderId); var oldTransits = new List <Transit>(); foreach (var oldTransitForwardingOrder in oldTransitForwardingOrders) { var oldTransit = await unitOfWork.TransitRepository.GetTransitByIdAsync(oldTransitForwardingOrder.TransitId); if (oldTransit == null) { continue; } oldTransits.Add(oldTransit); } // create new list of transits to add or update var transitsToAddOrUpdate = new List <Transit>(); // create new list of transitForwardingOders to add or update var transitForwardingOrdersToAddOrUpdate = new List <TransitForwardingOrder>(); foreach (var _transit in transits.Transits) { var transitToUpdate = await unitOfWork.TransitRepository.GetTransitByIdAsync(_transit.Id); if (transitToUpdate == null) { transitsToAddOrUpdate.Add(_transit); continue; } #region Transit data update transitToUpdate.GrossPrice = _transit.GrossPrice; transitToUpdate.NetPrice = _transit.NetPrice; transitToUpdate.TransportDistance = _transit.TransportDistance; transitToUpdate.PaymentFormId = _transit.PaymentFormId; transitToUpdate.DriverId = _transit.DriverId; transitToUpdate.StartDate = _transit.StartDate; transitToUpdate.EndDate = _transit.EndDate; transitToUpdate.TransporterId = _transit.TransporterId; transitToUpdate.VehicleId = _transit.VehicleId; transitToUpdate.RouteShortPath = _transit.RouteShortPath; transitToUpdate.TransitDestinationCity = _transit.TransitDestinationCity; transitToUpdate.TransitDestinationCountry = _transit.TransitDestinationCountry; transitToUpdate.TransitDestinationStreetAddress = _transit.TransitDestinationStreetAddress; transitToUpdate.TransitDestinationZipCode = _transit.TransitDestinationZipCode; transitToUpdate.TransitSourceCity = _transit.TransitSourceCity; transitToUpdate.TransitSourceCountry = _transit.TransitSourceCountry; transitToUpdate.TransitSourceStreetAddress = _transit.TransitSourceStreetAddress; transitToUpdate.TransitSourceZipCode = _transit.TransitSourceZipCode; transitsToAddOrUpdate.Add(transitToUpdate); #endregion } // catch removed transits from given forwarding order foreach (var oldTransit in oldTransits) { var transitToDelete = transitsToAddOrUpdate.FirstOrDefault(x => x.Id.Equals(oldTransit.Id)); if (transitToDelete == null) { // get all transit forwarding order by transit id to check, if there are other forwarding orders that use this transit var transitsForwardingOrderToDeleteByTransitId = await unitOfWork.TransitForwardingOrderRepository.GetTransitForwardingOrdersByTransitAsync(oldTransit.Id); if (transitsForwardingOrderToDeleteByTransitId == null || transitsForwardingOrderToDeleteByTransitId.Count() == 0) { continue; } try { var _transitForwardinOrderToDelete = transitsForwardingOrderToDeleteByTransitId.FirstOrDefault(x => x.ForwardingOrderId.Equals(forwardingOrderId)); await unitOfWork.TransitForwardingOrderRepository.RemoveTransitForwardingOrder(_transitForwardinOrderToDelete); } catch (DbUpdateConcurrencyException ex) { return(new GenericResponse(false, ex.InnerException.Message)); } catch (DbUpdateException ex) { return(new GenericResponse(false, ex.InnerException.Message)); } // filter those which are not related to given forwarding order var transitsForwardingOrderToDelete = transitsForwardingOrderToDeleteByTransitId.Where(x => x.ForwardingOrderId != forwardingOrderId); if (transitsForwardingOrderToDelete.Count() == 0) { // delete also transit from transits table try { await unitOfWork.TransitRepository.RemoveTransit(oldTransit); } catch (DbUpdateConcurrencyException ex) { return(new GenericResponse(false, ex.InnerException.Message)); } catch (DbUpdateException ex) { return(new GenericResponse(false, ex.InnerException.Message)); } continue; } } } try { await unitOfWork.TransitRepository.UpdateTransits(transitsToAddOrUpdate); foreach (var _transit in transits.Transits) { var transitForwardingOrderToUpdate = await unitOfWork.TransitForwardingOrderRepository.GetTransitForwardingOrderByTransitAndForwardingOrderAsync(_transit.Id, forwardingOrderId); if (transitForwardingOrderToUpdate == null) { var newTransitForwardingOrder = new TransitForwardingOrder() { TransitId = _transit.Id, ForwardingOrderId = forwardingOrderId }; transitForwardingOrdersToAddOrUpdate.Add(newTransitForwardingOrder); } } await unitOfWork.TransitForwardingOrderRepository.UpdateTransitForwardingOrders(transitForwardingOrdersToAddOrUpdate); } catch (DbUpdateConcurrencyException ex) { return(new GenericResponse(false, ex.InnerException.Message)); } catch (DbUpdateException ex) { return(new GenericResponse(false, ex.InnerException.Message)); } return(new GenericResponse(true, "Transit has been updated.")); }