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); }
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)); }
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)); }