예제 #1
0
        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);
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
            }
        }