public async Task <IActionResult> UpdateTripRoute([FromBody] LatLonDto latLon) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var driverId = Guid.Parse(User.Claims .FirstOrDefault(c => c.Type == Helpers.Constants.Strings.JwtClaimIdentifiers.DriverId)?.Value); var trip = _tripsRepo.GetTripByDriver(driverId); if (trip == null) { return(NotFound()); } if (trip.StartTime == default(DateTime)) { ModelState.AddModelError(nameof(Trip), "Trip not started."); return(BadRequest(ModelState)); } var delta = Helpers.Location.CalculateKilometersDistance(trip.LastLat, trip.LastLon, latLon.Latitude, latLon.Longitude); if (Math.Abs(delta) > 0.001) //traveled 1+ meters { var node = _mapper.Map <TripRouteNode>(latLon); node.UpdateTime = DateTime.UtcNow; node.TripId = trip.Id; await _tripsRepo.AddNode(node); // trip.Distance += delta; trip.LastLat = latLon.Latitude; trip.LastLon = latLon.Longitude; trip.LastUpdateTime = node.UpdateTime; try { // Sending driver's position to the customer await _hubContext.Clients.Client(_usersRepository.GetCustomerById(trip.CustomerId).ConnectionId) .SendAsync("postGeoData", trip.LastLat, trip.LastLon); } catch { } await _tripsRepo.UpdateTrip(trip); } var from = trip.From; var to = trip.To; var tripToReturn = new UpdateResultTripDto() { CustomerId = trip.CustomerId, From = Taxi.Helpers.Location.PointToPlaceDto(from), To = Taxi.Helpers.Location.PointToPlaceDto(to), LastUpdatePoint = new PlaceDto() { Longitude = trip.LastLon, Latitude = trip.LastLat }, //TraveledDistance = trip.Distance }; return(Ok(tripToReturn)); }