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