private IEnumerable <LinkDto> CreateLinksForTank(
            TankResourceParameters tankResourceParameters,
            bool hasNext, bool hasPrevious)
        {
            var links = new List <LinkDto>();

            // self
            links.Add(
                new LinkDto(CreateTanksResourceUri(
                                tankResourceParameters, ResourceUriType.Current)
                            , "self", "GET"));

            if (hasNext)
            {
                links.Add(
                    new LinkDto(CreateTanksResourceUri(
                                    tankResourceParameters, ResourceUriType.NextPage),
                                "nextPage", "GET"));
            }

            if (hasPrevious)
            {
                links.Add(
                    new LinkDto(CreateTanksResourceUri(
                                    tankResourceParameters, ResourceUriType.PreviousPage),
                                "previousPage", "GET"));
            }

            return(links);
        }
示例#2
0
        public PagedList <Tank> GetTanks(TankResourceParameters tankParameters)
        {
            if (tankParameters == null)
            {
                throw new ArgumentNullException(nameof(tankParameters));
            }

            var collection = _context.Tanks as IQueryable <Tank>;

            if (!string.IsNullOrWhiteSpace(tankParameters.SearchQuery))
            {
                var searchQuery = tankParameters.SearchQuery.Trim();
                collection = collection.Where(a => a.Name.Contains(searchQuery));
            }

            if (!string.IsNullOrWhiteSpace(tankParameters.OrderBy))
            {
                var tankPropertyMappingDictionary = _propertyMappingService.GetFuelTypePropertyMapping <TankDto, Tank>();

                collection = collection.ApplySort(tankParameters.OrderBy, tankPropertyMappingDictionary);
            }

            //Paging.... happens LAST
            return(PagedList <Tank> .Create(collection,
                                            tankParameters.PageNumber,
                                            tankParameters.PageSize));
        }
示例#3
0
        public Tank GetTank(TankResourceParameters tankParameters, Guid tankId)
        {
            if (tankId == Guid.Empty)
            {
                throw new ArgumentNullException(nameof(tankId));
            }

            return(_context.Tanks.FirstOrDefault(a => a.Id == tankId));;
        }
        public IActionResult GetTanks(Guid terminalId, Guid dispenserId, Guid fuelTypeId,
                                      [FromQuery] TankResourceParameters tankResourceParameters)
        {
            if (!_propertyMappingService.ValidTankMappingExistsFor <TankDto, Entities.Tank>
                    (tankResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            tankResourceParameters.TermimalId  = terminalId;
            tankResourceParameters.DispenserId = dispenserId;
            tankResourceParameters.FuelTypeId  = fuelTypeId;

            var tanksFromRepo = _tankRepository.GetTanks(tankResourceParameters);

            var paginationMetadata = new
            {
                totalCount  = tanksFromRepo.TotalCount,
                pageSize    = tanksFromRepo.PageSize,
                currentPage = tanksFromRepo.CurrentPage,
                totalPages  = tanksFromRepo.TotalPages
            };

            Response.Headers.Add("X-Pagination",
                                 JsonSerializer.Serialize(paginationMetadata));

            var links = CreateLinksForTank(tankResourceParameters,
                                           tanksFromRepo.HasNext,
                                           tanksFromRepo.HasPrevious);

            var shapedTank = _mapper.Map <IEnumerable <TankDto> >(tanksFromRepo)
                             .ShapeData(tankResourceParameters.Fields);

            var shapedTankWithLinks = shapedTank.Select(tanks =>
            {
                var tankAsDictionary = tanks as IDictionary <string, object>;
                var tankLinks        = CreateLinksForTank(terminalId.ToString(), dispenserId.ToString(), fuelTypeId.ToString(), (string)tankAsDictionary["Id"], null);
                tankAsDictionary.Add("links", tankLinks);
                return(tankAsDictionary);
            });

            var linkedCollectionResource = new
            {
                value = shapedTankWithLinks,
                links
            };

            return(Ok(linkedCollectionResource));
        }
        private string CreateTanksResourceUri(
            TankResourceParameters tankResourceParameters,
            ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link("GetTanks",
                                new
                {
                    fields = tankResourceParameters.Fields,
                    orderBy = tankResourceParameters.OrderBy,
                    pageNumber = tankResourceParameters.PageNumber - 1,
                    pageSize = tankResourceParameters.PageSize,
                    searchQuery = tankResourceParameters.SearchQuery
                }));

            case ResourceUriType.NextPage:
                return(Url.Link("GetTanks",
                                new
                {
                    fields = tankResourceParameters.Fields,
                    orderBy = tankResourceParameters.OrderBy,
                    pageNumber = tankResourceParameters.PageNumber + 1,
                    pageSize = tankResourceParameters.PageSize,
                    searchQuery = tankResourceParameters.SearchQuery
                }));

            case ResourceUriType.Current:
            default:
                return(Url.Link("GetTanks",
                                new
                {
                    fields = tankResourceParameters.Fields,
                    orderBy = tankResourceParameters.OrderBy,
                    pageNumber = tankResourceParameters.PageNumber,
                    pageSize = tankResourceParameters.PageSize,
                    searchQuery = tankResourceParameters.SearchQuery
                }));
            }
        }
        public ActionResult PatchSite(Guid terminalId, Guid dispenserId, Guid fuelTypeId, Guid tankId, [FromBody] JsonPatchDocument <TankForUpdateDto> patchDocument)
        {
            TankResourceParameters tankResourceParameters = new TankResourceParameters();

            if (terminalId == Guid.Empty || dispenserId == Guid.Empty || fuelTypeId == Guid.Empty || tankId == Guid.Empty)
            {
                return(BadRequest());
            }

            if (patchDocument == null)
            {
                return(BadRequest());
            }

            if (!_tankRepository.TankExists(tankId))
            {
                return(NotFound());
            }

            tankResourceParameters.TermimalId  = terminalId;
            tankResourceParameters.DispenserId = dispenserId;
            tankResourceParameters.FuelTypeId  = fuelTypeId;

            var siteFromRepo = _tankRepository.GetTank(tankResourceParameters, tankId);

            if (siteFromRepo == null)
            {
                var tankDto = new TankForUpdateDto();
                patchDocument.ApplyTo(tankDto, ModelState);

                if (!TryValidateModel(tankDto))
                {
                    return(ValidationProblem(ModelState));
                }

                var tankToAdd = _mapper.Map <Entities.Tank>(tankDto);
                tankToAdd.TerminalId  = terminalId;
                tankToAdd.DispenserId = dispenserId;
                tankToAdd.FuelTypeId  = fuelTypeId;


                _tankRepository.AddTank(tankToAdd, tankId);

                _tankRepository.Save();

                var siteToReturn = _mapper.Map <SiteDto>(siteToAdd);

                return(CreatedAtRoute("GetSite",
                                      new { siteId }, siteToReturn));
            }

            var siteToPatch = _mapper.Map <SiteForUpdateDto>(siteFromRepo);

            patchDocument.ApplyTo(siteToPatch);

            if (!TryValidateModel(siteToPatch))
            {
                return(ValidationProblem(ModelState));
            }

            _mapper.Map(siteToPatch, siteFromRepo);

            _siteRepository.UpdateSite(siteFromRepo);

            _siteRepository.Save();

            return(NoContent());
        }
        public IActionResult GetTank(Guid terminalId, Guid dispenserId, Guid fuelTypeId, Guid tankId, string fields,
                                     [FromHeader(Name = "Accept")] string mediaType)
        {
            TankResourceParameters tankResourceParameters = new TankResourceParameters();

            tankResourceParameters.TermimalId  = terminalId;
            tankResourceParameters.DispenserId = dispenserId;
            tankResourceParameters.TermimalId  = fuelTypeId;

            if (!MediaTypeHeaderValue.TryParse(mediaType,
                                               out MediaTypeHeaderValue parsedMediaType))
            {
                return(BadRequest());
            }

            if (!_propertyCheckerService.TypeHasProperties <TankDto>
                    (fields))
            {
                return(BadRequest());
            }

            var tankFromRepo = _tankRepository.GetTank(tankResourceParameters, tankId);

            if (tankFromRepo == null)
            {
                return(NotFound());
            }

            var includeLinks = parsedMediaType.SubTypeWithoutSuffix
                               .EndsWith("hateoas", StringComparison.InvariantCultureIgnoreCase);

            IEnumerable <LinkDto> links = new List <LinkDto>();

            if (includeLinks)
            {
                links = CreateLinksForTank(terminalId.ToString(), dispenserId.ToString(), fuelTypeId.ToString(), tankId.ToString(), fields);
            }

            var primaryMediaType = includeLinks ?
                                   parsedMediaType.SubTypeWithoutSuffix
                                   .Substring(0, parsedMediaType.SubTypeWithoutSuffix.Length - 8)
              : parsedMediaType.SubTypeWithoutSuffix;

            // full tank
            if (primaryMediaType == "vnd.marvin.tank.full")
            {
                var fullResourceToReturn = _mapper.Map <TankFullDto>(tankFromRepo)
                                           .ShapeData(fields) as IDictionary <string, object>;

                if (includeLinks)
                {
                    fullResourceToReturn.Add("links", links);
                }

                return(Ok(fullResourceToReturn));
            }

            // friendly tank
            var friendlyResourceToReturn = _mapper.Map <TankDto>(tankFromRepo)
                                           .ShapeData(fields) as IDictionary <string, object>;

            if (includeLinks)
            {
                friendlyResourceToReturn.Add("links", links);
            }

            return(Ok(friendlyResourceToReturn));
        }