Skip to content

Commit

Permalink
[DI-1372] - Bug fix - Descriptors are listed on Lookups screen (#111)
Browse files Browse the repository at this point in the history
* Bug fix - Descriptors are listed on Lookups screen

* Fixes tests
  • Loading branch information
DavidJGapCR authored May 27, 2024
1 parent 8265e4d commit 4671cb6
Show file tree
Hide file tree
Showing 8 changed files with 42 additions and 52 deletions.
1 change: 0 additions & 1 deletion DataImport.EdFi/Api/Resources/LocalEducationAgenciesApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
// See the LICENSE and NOTICES files in the project root for more information.

using System;
using System.Collections.Generic;
using DataImport.Common.ExtensionMethods;
using DataImport.EdFi.Models.Resources;
using RestSharp;
Expand Down
3 changes: 2 additions & 1 deletion DataImport.Web.Tests/Services/EdFiV311Tests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ public EdFiServiceV311Tss(ISwaggerMetadataFetcher metadataFetcher)
GetEncryptionKeyResolver(),
A.Fake<IMapper>(),
metadataFetcher,
A.Fake<IOAuthRequestWrapper>())
A.Fake<IOAuthRequestWrapper>(),
null)
{
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ public SwaggerMetadataFetcherTss(IEnumerable<ISwaggerMetadataProcessor> swaggerM
{
}

public new async Task<string> GetSwaggerBaseDocumentUrl(string apiUrl, string apiVersion, string tenant, string context, ApiSection apiSection)
public new async Task<string> GetSwaggerBaseDocumentUrl(string apiUrl, string apiVersion, ApiSection apiSection)
{
return await base.GetSwaggerBaseDocumentUrl(apiUrl, apiVersion, tenant, context, apiSection);
return await base.GetSwaggerBaseDocumentUrl(apiUrl, apiVersion, apiSection);
}
}

Expand All @@ -54,7 +54,7 @@ public void ShouldThrowIfNoHandlersAvailable()
.Setup("https://someapiurl/metadata/resources/api-docs", testDocument);

var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock);
sut.GetMetadata("https://someapiurl/api/v2.0/2018", OdsApiV25, string.Empty, string.Empty)
sut.GetMetadata("https://someapiurl/api/v2.0/2018", OdsApiV25)
.ShouldThrow<NotSupportedException>()
.Message.ShouldBe("No handler available to process Swagger document");
}
Expand All @@ -72,7 +72,7 @@ public async Task Should_support_Suite2()

// Act
var sut = new SwaggerMetadataFetcherTss(null, null);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(version260Url, apiVersion, string.Empty, string.Empty, apiSection);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(version260Url, apiVersion, apiSection);

// Assert
baseDocumentUrl.ShouldBe(
Expand Down Expand Up @@ -106,7 +106,7 @@ public async Task Should_support_Suite3_Version311_in_Sandbox_mode()

// Act
var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection);

// Assert
baseDocumentUrl.ShouldBe(
Expand Down Expand Up @@ -146,7 +146,7 @@ public async Task Should_support_Suite3_Version510_in_Sandbox_mode()

// Act
var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection);

// Assert
baseDocumentUrl.ShouldBe(
Expand Down Expand Up @@ -179,7 +179,7 @@ public async Task Should_support_Suite3_in_Version311_SharedInstance_mode()

// Act
var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection);

// Assert
baseDocumentUrl.ShouldBe(
Expand Down Expand Up @@ -219,7 +219,7 @@ public async Task Should_support_Suite3_Version510_in_SharedInstance_mode()

// Act
var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection);

// Assert
baseDocumentUrl.ShouldBe(
Expand Down Expand Up @@ -252,7 +252,7 @@ public async Task Should_support_Suite3_Version311_in_YearSpecific_mode()

// Act
var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection);

// Assert
baseDocumentUrl.ShouldBe(
Expand Down Expand Up @@ -293,7 +293,7 @@ public async Task Should_support_Suite3_Version510_in_YearSpecific_mode()

// Act
var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection);

// Assert
baseDocumentUrl.ShouldBe(
Expand Down Expand Up @@ -332,7 +332,7 @@ public async Task Should_support_Suite3_Version52_in_InstanceYearSpecific_mode()

// Act
var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection);
var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection);

// Assert
baseDocumentUrl.ShouldBe(
Expand Down Expand Up @@ -385,7 +385,7 @@ public async Task ShouldHandleV1Point2Document()
var processors = GetMetadataProcessors(swaggerClientMock);
var sut = new SwaggerMetadataFetcherTss(processors, swaggerClientMock);

var resources = (await sut.GetMetadata("https://someapiurl/api/v2.0/2018", OdsApiV25, string.Empty, string.Empty)).ToList();
var resources = (await sut.GetMetadata("https://someapiurl/api/v2.0/2018", OdsApiV25)).ToList();
resources.Count.ShouldBe(3);
resources.Any(e => e.Path == "/student").ShouldBeTrue();
resources.Any(e => e.Path == "/studentAssessments").ShouldBeTrue();
Expand Down Expand Up @@ -438,7 +438,7 @@ public async Task ShouldHandleUrlWithExtraApiInPath()
var processors = GetMetadataProcessors(swaggerClientMock);
var sut = new SwaggerMetadataFetcherTss(processors, swaggerClientMock);

var resources = (await sut.GetMetadata("https://someapiurl/v2/api/api/v2.0/2018", OdsApiV25, string.Empty, string.Empty)).ToList();
var resources = (await sut.GetMetadata("https://someapiurl/v2/api/api/v2.0/2018", OdsApiV25)).ToList();
resources.Count.ShouldBe(3);
}

Expand Down
2 changes: 1 addition & 1 deletion DataImport.Web/Services/ConfigurationService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public async Task FillSwaggerMetadata(ApiServer apiServer)
IEnumerable<SwaggerResource> swaggerResources;
try
{
swaggerResources = await _swaggerMetadataFetcher.GetMetadata(apiServer.Url, apiServer.ApiVersion.Version, apiServer.Tenant, apiServer.Context);
swaggerResources = await _swaggerMetadataFetcher.GetMetadata(apiServer.Url, apiServer.ApiVersion.Version);
}
catch (OdsApiServerException e)
{
Expand Down
10 changes: 8 additions & 2 deletions DataImport.Web/Services/EdFiServiceV25.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using DataImport.Common.Helpers;
using DataImport.EdFi;
using DataImport.Models;
using Microsoft.Extensions.Options;
using RestSharp;
using System;
using System.Threading.Tasks;
Expand All @@ -18,13 +19,14 @@ public class EdFiServiceV25 : EdFiServiceBase
{
private readonly IOAuthRequestWrapper _oauthRequestWrapper;
private readonly string _encryptionKey;
private readonly IOptions<AppSettings> _options;

public EdFiServiceV25(DataImportDbContext dbContext, IEncryptionKeyResolver encryptionKeyResolver, IMapper mapper, IOAuthRequestWrapper oauthRequestWrapper)
public EdFiServiceV25(DataImportDbContext dbContext, IEncryptionKeyResolver encryptionKeyResolver, IMapper mapper, IOAuthRequestWrapper oauthRequestWrapper, IOptions<AppSettings> options)
: base(mapper, dbContext)
{
_encryptionKey = encryptionKeyResolver.GetEncryptionKey();

_oauthRequestWrapper = oauthRequestWrapper ?? throw new ArgumentNullException(nameof(oauthRequestWrapper));
_options = options;
}

public override bool CanHandle(string apiVersion) => apiVersion.IsOdsV2();
Expand All @@ -35,6 +37,10 @@ protected override IRestClient EstablishApiClient(ApiServer apiServer)
var options = new RestClientOptions();
options.Authenticator = new BearerTokenAuthenticator(tokenRetriever);
options.BaseUrl = new Uri(apiServer?.Url);
if (_options.Value.IgnoresCertificateErrors)
{
options.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
}
return new RestClient(options);
}

Expand Down
9 changes: 8 additions & 1 deletion DataImport.Web/Services/EdFiServiceV311.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using DataImport.EdFi;
using DataImport.Models;
using DataImport.Web.Services.Swagger;
using Microsoft.Extensions.Options;
using RestSharp;
using System;
using System.Collections.Generic;
Expand All @@ -22,13 +23,15 @@ public class EdFiServiceV311 : EdFiServiceBase
private readonly Dictionary<string, string> _yearSpecificYearCache = new Dictionary<string, string>();
private readonly IOAuthRequestWrapper _oauthRequestWrapper;
private string _encryptionKey;
private readonly IOptions<AppSettings> _options;

public EdFiServiceV311(DataImportDbContext dbContext, IEncryptionKeyResolver encryptionKeyResolver, IMapper mapper, ISwaggerMetadataFetcher metadataFetcher, IOAuthRequestWrapper oauthRequestWrapper)
public EdFiServiceV311(DataImportDbContext dbContext, IEncryptionKeyResolver encryptionKeyResolver, IMapper mapper, ISwaggerMetadataFetcher metadataFetcher, IOAuthRequestWrapper oauthRequestWrapper, IOptions<AppSettings> options)
: base(mapper, dbContext)
{
_metadataFetcher = metadataFetcher;
_oauthRequestWrapper = oauthRequestWrapper ?? throw new ArgumentNullException(nameof(oauthRequestWrapper));
_encryptionKey = encryptionKeyResolver.GetEncryptionKey();
_options = options;
}

private string EncryptionKey
Expand All @@ -47,6 +50,10 @@ protected override IRestClient EstablishApiClient(ApiServer apiServer)
var options = new RestClientOptions();
options.Authenticator = new BearerTokenAuthenticator(tokenRetriever);
options.BaseUrl = new Uri(apiServer?.Url);
if (_options.Value.IgnoresCertificateErrors)
{
options.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
}
return new RestClient(options);
}

Expand Down
2 changes: 1 addition & 1 deletion DataImport.Web/Services/Swagger/ISwaggerMetadataFetcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace DataImport.Web.Services.Swagger
{
public interface ISwaggerMetadataFetcher
{
Task<IEnumerable<SwaggerResource>> GetMetadata(string apiUrl, string apiVersion, string tenant, string context);
Task<IEnumerable<SwaggerResource>> GetMetadata(string apiUrl, string apiVersion);
Task<string> GetTokenUrl(string apiUrl, string apiVersion, string tenant, string context);
Task<string> GetAuthUrl(string apiUrl, string apiVersion, string tenant, string context);
Task<string> InferOdsApiVersion(string apiUrl);
Expand Down
41 changes: 9 additions & 32 deletions DataImport.Web/Services/Swagger/SwaggerMetadataFetcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ public SwaggerMetadataFetcher(IEnumerable<ISwaggerMetadataProcessor> swaggerMeta
_swaggerWebClient = swaggerWebClient;
}

public async Task<IEnumerable<SwaggerResource>> GetMetadata(string apiUrl, string apiVersion, string tenant, string context)
public async Task<IEnumerable<SwaggerResource>> GetMetadata(string apiUrl, string apiVersion)
{
var (resourcesSwaggerDocument, resourcesHandler) = await GetSwaggerDocument(apiUrl, apiVersion, tenant, context, ApiSection.Resources);
var (descriptorsSwaggerDocument, descriptorsHandler) = await GetSwaggerDocument(apiUrl, apiVersion, tenant, context, ApiSection.Descriptors);
var (resourcesSwaggerDocument, resourcesHandler) = await GetSwaggerDocument(apiUrl, apiVersion, ApiSection.Resources);
var (descriptorsSwaggerDocument, descriptorsHandler) = await GetSwaggerDocument(apiUrl, apiVersion, ApiSection.Descriptors);

var resources = await resourcesHandler.GetMetadata(resourcesSwaggerDocument, ApiSection.Resources);
var descriptors = await descriptorsHandler.GetMetadata(descriptorsSwaggerDocument, ApiSection.Descriptors);
Expand All @@ -37,7 +37,7 @@ public async Task<IEnumerable<SwaggerResource>> GetMetadata(string apiUrl, strin

public async Task<string> GetTokenUrl(string apiUrl, string apiVersion, string tenant, string context)
{
var (swaggerDocument, handler) = await GetSwaggerDocument(apiUrl, apiVersion, tenant, context, ApiSection.Resources);
var (swaggerDocument, handler) = await GetSwaggerDocument(apiUrl, apiVersion, ApiSection.Resources);

if (!string.IsNullOrEmpty(apiVersion) && apiVersion.StartsWith("7."))
{
Expand All @@ -49,7 +49,7 @@ public async Task<string> GetTokenUrl(string apiUrl, string apiVersion, string t

public async Task<string> GetAuthUrl(string apiUrl, string apiVersion, string tenant, string context)
{
var (swaggerDocument, handler) = await GetSwaggerDocument(apiUrl, apiVersion, tenant, context, ApiSection.Resources);
var (swaggerDocument, handler) = await GetSwaggerDocument(apiUrl, apiVersion, ApiSection.Resources);

return handler.GetAuthUrl(swaggerDocument);
}
Expand Down Expand Up @@ -161,9 +161,9 @@ public async Task<string> InferOdsApiVersion(string apiUrl)
}
}

private async Task<(JObject swaggerDocument, ISwaggerMetadataProcessor swaggerMetadataProcessor)> GetSwaggerDocument(string apiUrl, string apiVersion, string tenant, string context, ApiSection apiSection)
private async Task<(JObject swaggerDocument, ISwaggerMetadataProcessor swaggerMetadataProcessor)> GetSwaggerDocument(string apiUrl, string apiVersion, ApiSection apiSection)
{
var baseUrl = await GetSwaggerBaseDocumentUrl(apiUrl, apiVersion, tenant, context, apiSection);
var baseUrl = await GetSwaggerBaseDocumentUrl(apiUrl, apiVersion, apiSection);

var rawApis = await _swaggerWebClient.DownloadString(baseUrl);

Expand All @@ -185,7 +185,7 @@ public async Task<string> InferOdsApiVersion(string apiUrl)
return (swaggerDocument, handler);
}

protected async Task<string> GetSwaggerBaseDocumentUrl(string apiUrl, string apiVersion, string tenant, string context, ApiSection apiSection)
protected async Task<string> GetSwaggerBaseDocumentUrl(string apiUrl, string apiVersion, ApiSection apiSection)
{
if (apiVersion.IsOdsV2())
{
Expand All @@ -195,30 +195,7 @@ protected async Task<string> GetSwaggerBaseDocumentUrl(string apiUrl, string api
else if (apiVersion.IsOdsV3())
{
var baseUrl = Common.Helpers.UrlUtility.RemoveAfterLastInstanceOf(apiUrl.Trim(), "/data/");

string path;
if (!string.IsNullOrEmpty(tenant) && string.IsNullOrEmpty(context))
{
// MultiTenant Environment
path = $"{tenant}/data/v3";
}
else if (!string.IsNullOrEmpty(context) && string.IsNullOrEmpty(tenant))
{
// SingleTenant with ODS Context Routes Environment
path = $"{context}/data/v3";
}
else if (!string.IsNullOrEmpty(context) && !string.IsNullOrEmpty(tenant))
{
// MultiTenant with ODS Context Routes Environments
path = $"{tenant}/{context}/data/v3";
}
else
{
// SingleTenant and Sandbox Environments
path = "data/v3";
}

return $"{baseUrl}/metadata/{path}/{apiSection.ToMetadataRoutePart()}/swagger.json";
return $"{baseUrl}/metadata/data/v3/{apiSection.ToMetadataRoutePart()}/swagger.json";
}
else
{
Expand Down

0 comments on commit 4671cb6

Please sign in to comment.