private IEnumerable <ResourceLink> CreateLinksForArtifacts(HttpContext context, ArtifactResourceQueryParameters artifactParameters, bool hasNext, bool hasPrevious) { var links = new List <ResourceLink> { // self links new ResourceLink( CreateArtifactsResourceUri(context, artifactParameters, ResourceUriType.Current), "self", "GET") }; if (hasNext) { links.Add( new ResourceLink( CreateArtifactsResourceUri(context, artifactParameters, ResourceUriType.NextPage), "nextPage", "GET")); } if (hasPrevious) { links.Add( new ResourceLink( CreateArtifactsResourceUri(context, artifactParameters, ResourceUriType.PreviousPage), "previousPage", "GET")); } return(links); }
public async Task <IActionResult> GetArtifacts( [HttpTrigger(AuthorizationLevel.Function, "get", Route = "artifacts")] HttpRequest req, ILogger log) { var queryParams = new ArtifactResourceQueryParameters(); queryParams.Fields = req.Query.ContainsKey("fields") ? req.Query["fields"].ToString() : string.Empty; queryParams.OrderBy = req.Query.ContainsKey("orderby") ? req.Query["orderby"].ToString() : string.Empty; queryParams.Filter = req.Query.ContainsKey("filter") ? req.Query["filter"].ToString() : string.Empty; queryParams.Page = req.Query.ContainsKey("page") ? int.Parse(req.Query["page"]) : 1; queryParams.Limit = req.Query.ContainsKey("limit") ? int.Parse(req.Query["limit"]) : 10; if (!typeof(Artifact).HasProperties(queryParams.Fields)) { return(new BadRequestResult()); } var pagedRecords = await _documentStore.GetArtifacts(queryParams); var records = pagedRecords.ChooseFields(queryParams.Fields); var links = CreateLinksForArtifacts(req.HttpContext, queryParams, pagedRecords.HasNextPage, pagedRecords.HasPreviousPage); var responseBody = new ApiResponse <ExpandoObject>(links, records); return(new OkObjectResult(responseBody)); }
private string CreateArtifactsResourceUri(HttpContext context, ArtifactResourceQueryParameters artifactParameters, ResourceUriType type) { var uriBuilder = new UriBuilder(context.Request.Scheme, context.Request.Host.Host) { Path = $"api/artifacts", }; if (context.Request.Host.Port.HasValue) { uriBuilder.Port = context.Request.Host.Port.Value; } var query = HttpUtility.ParseQueryString(uriBuilder.Query); query["fields"] = artifactParameters.Fields; query["orderBy"] = artifactParameters.OrderBy; query["limit"] = artifactParameters.Limit.ToString(); switch (type) { case ResourceUriType.PreviousPage: query["page"] = (artifactParameters.Page - 1).ToString(); uriBuilder.Query = query.ToString(); return(uriBuilder.ToString()); case ResourceUriType.NextPage: query["page"] = (artifactParameters.Page + 1).ToString(); uriBuilder.Query = query.ToString(); return(uriBuilder.ToString()); case ResourceUriType.Current: query["page"] = (artifactParameters.Page).ToString(); uriBuilder.Query = query.ToString(); return(uriBuilder.ToString()); default: return(string.Empty); } }