Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DI-1372] - Bug fix - Descriptors are listed on Lookups screen #111

Merged
merged 2 commits into from
May 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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