Exemple #1
0
 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));
 }
Exemple #2
0
        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);
        }