public IActionResult InsertTrips([FromBody] ViewModels.Trip tripViewModel) { if (ModelState.IsValid) { var newTrip = Mapper.Map <Models.Trip>(tripViewModel); _worldRepository.AddTrip(newTrip); return(Created($"api/trips/{tripViewModel.Name}", Mapper.Map <ViewModels.Trip>(newTrip))); } return(BadRequest(ModelState)); }
public virtual IActionResult TripsTripIdGet([FromRoute][Required] string tripId) { var trip = GetTripById(tripId); if (trip == null) { return(StatusCode(404)); } // The mean could be stored at container level and calculated here with a smaller number of data points, but // there is the potential for rounding issues, so I have favoured runtime accuracy here float meanTemp = 0; float maxTemp = 0; double containerCount = _repo.Containers.Where(x => x.TripId == trip.Id).Count(); double spoiledContainerCount = 0; double spoiledProductCount = 0; if (containerCount > 0) { // These could be stored on their respective objects if performance of these queries were to become an issue // Note. If that is the case, ensure that all update queries use the .Updated field to avoid lost DB updates meanTemp = _repo.TemperatureRecords.Where(x => x.TripId.Equals(trip.Id)).Average(r => r.Value); maxTemp = _repo.Containers.Max(x => x.MaxTemperature); spoiledContainerCount = _repo.Containers.Where(x => x.TripId == trip.Id && x.IsSpoiled == true).Count(); spoiledProductCount = _repo.Containers.Where(x => x.TripId == trip.Id && x.IsSpoiled == true).Select(x => x.ProductCount).Sum(); } var result = new ViewModels.Trip() { Id = tripId, ContainerCount = containerCount, MaxTemperature = maxTemp, MeanTemperature = meanTemp, SpoiledContainerCount = spoiledContainerCount, SpoiledProductCount = spoiledProductCount }; // .Updated timestamp is as good as anything to use here... var resourceVersion = Math.Abs(trip.Updated.GetHashCode()); Response.Headers.Add("ETag", new StringValues(resourceVersion.ToString())); // Prepare controller output var output = new ObjectResult(result); // Explicitly add the status code as a concession to unit testing this action outside of MVC output.StatusCode = 200; return(output); }