public void Should_return_valid_http_response_message()
            {
                var request = new OpenApiMetadataSectionRequest
                {
                    Sdk = true,
                    SchoolYearFromRoute = 2020
                };

                var response           = (OkObjectResult)_controller.Get(request);
                var openapisectionlist = (List <OpenApiMetadataSectionDetails>)response.Value;

                Assert.AreEqual(200, response.StatusCode);
                Assert.IsNotNull(response);
                Assert.IsTrue(openapisectionlist.Count > 0);
                Assert.AreEqual("Identity", openapisectionlist[0].Name);
                Assert.IsTrue(openapisectionlist[0].EndpointUri.Contains("localhost"));
                Assert.IsTrue(openapisectionlist[0].EndpointUri.Contains("metadata"));
                Assert.IsTrue(openapisectionlist[0].EndpointUri.Contains("2020"));
            }
Пример #2
0
        public IActionResult Get([FromRoute] OpenApiMetadataSectionRequest request)
        {
            if (!IsFeatureEnabled())
            {
                return(NotFound());
            }

            if (Request.Query.ContainsKey("sdk"))
            {
                if (bool.TryParse(Request.Query["sdk"], out bool sdk))
                {
                    request.Sdk = sdk;
                }
            }

            var content = _openApiMetadataCacheProvider.GetAllSectionDocuments(request.Sdk)
                          .OrderBy(x => x.Section)
                          .ThenBy(x => x.Name)
                          .Select(GetSwaggerSectionDetailsForCacheItem)
                          .ToList();

            var eTag = HashHelper.GetSha256Hash(content.ToString())
                       .ToHexString()
                       .DoubleQuoted();

            if (Request.TryGetRequestHeader(HeaderConstants.IfNoneMatch, out string headerValue))
            {
                if (headerValue.EqualsIgnoreCase(eTag))
                {
                    return(StatusCode((int)HttpStatusCode.NotModified));
                }
            }

            Response.GetTypedHeaders().ETag = new EntityTagHeaderValue(eTag);

            return(Ok(content));

            OpenApiMetadataSectionDetails GetSwaggerSectionDetailsForCacheItem(OpenApiContent apiContent)
            {
                // Construct fully qualified metadata url
                var url =
                    new Uri(
                        new Uri(
                            new Uri(Request.RootUrl(_useProxyHeaders).EnsureSuffixApplied("/")),
                            "metadata/"),
                        GetMetadataUrlSegmentForCacheItem(apiContent, request.SchoolYearFromRoute, request.InstanceIdFromRoute));

                return(new OpenApiMetadataSectionDetails
                {
                    EndpointUri = url.AbsoluteUri,
                    Name = apiContent.Name.NormalizeCompositeTermForDisplay('-')
                           .Replace(" ", "-"),
                    Prefix =
                        apiContent.Section.EqualsIgnoreCase(OpenApiMetadataSections.SwaggerUi)
                            ? string.Empty
                            : apiContent.Section
                });
            }

            string GetMetadataUrlSegmentForCacheItem(OpenApiContent apiContent, int?schoolYear, string instanceId)
            {
                // 'Other' sections (Identity) do not live under 'ods' as other metadata endpoints do.
                // eg identity/v1/2017/swagger.json,
                // eg identity/v1/swagger.json,
                // SDKgen All
                // eg data/v3/2017/swagger.json,
                // eg data/v3/swagger.json,
                var basePath = GetBasePath(apiContent, schoolYear, instanceId);

                // Profiles and composites endpoints have an extra url segment (profiles or composites).
                // eg data/v3/2017/profiles/assessment/swagger.json
                // eg data/v3/profiles/assessment/swagger.json
                // eg composites/v1/2017/ed-fi/swagger.json
                // eg composites/v1/ed-fi/assessment/swagger.json
                var relativeSectionUri = string.IsNullOrWhiteSpace(apiContent.RelativeSectionPath)
                    ? string.Empty
                    : apiContent.RelativeSectionPath.EnsureSuffixApplied("/");

                return($"{basePath}/{relativeSectionUri}{OpenApiMetadataDocumentHelper.Json}".ToLowerInvariant());
            }

            string GetBasePath(OpenApiContent apiContent, int?schoolYear, string instanceId)
            {
                string basePath = $"{apiContent.BasePath}";

                if (!string.IsNullOrEmpty(instanceId))
                {
                    basePath += $"/{instanceId}";
                }

                if (schoolYear.HasValue)
                {
                    basePath += $"/{schoolYear.Value}";
                }

                return(basePath);
            }

            bool IsFeatureEnabled()
            {
                if (_isEnabled)
                {
                    return(true);
                }

                _logger.Info("Open Api Metadata is disabled.");
                return(false);
            }
        }