Skip to content

Commit

Permalink
Fix IdentificaitonCode parameters in profile-specific swagger metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
mjaksn committed Oct 17, 2024
1 parent 2dabad3 commit 708e10a
Show file tree
Hide file tree
Showing 11 changed files with 56 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@ protected override void Load(ContainerBuilder builder)
.SingleInstance();

builder.RegisterType<ResourceIdentificationCodePropertiesProvider>()
.As<IResourceIdentificationCodeQueryablePropertiesProvider>()
.As<IResourceIdentificationCodePropertiesProvider>()
.SingleInstance();

builder.RegisterInstance(TimeProvider.System)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public class IdentificationCodeAggregateQueryCriteriaApplicator : IAggregateRoot
{
private readonly IDescriptorResolver _descriptorResolver;
private readonly IResourceModelProvider _resourceModelProvider;
private readonly IResourceIdentificationCodeQueryablePropertiesProvider _resourceIdentificationCodeQueryablePropertiesProvider;
private readonly IResourceIdentificationCodePropertiesProvider _resourceIdentificationCodePropertiesProvider;
private readonly DatabaseEngine _databaseEngine;

private const string IdentificationCodeTableAlias = "idct";
Expand All @@ -34,11 +34,11 @@ public class IdentificationCodeAggregateQueryCriteriaApplicator : IAggregateRoot
public IdentificationCodeAggregateQueryCriteriaApplicator(
IDescriptorResolver descriptorResolver,
IResourceModelProvider resourceModelProvider,
IResourceIdentificationCodeQueryablePropertiesProvider resourceIdentificationCodeQueryablePropertiesProvider,
IResourceIdentificationCodePropertiesProvider resourceIdentificationCodePropertiesProvider,
DatabaseEngine databaseEngine)
{
_descriptorResolver = descriptorResolver;
_resourceIdentificationCodeQueryablePropertiesProvider = resourceIdentificationCodeQueryablePropertiesProvider;
_resourceIdentificationCodePropertiesProvider = resourceIdentificationCodePropertiesProvider;
_resourceModelProvider = resourceModelProvider;
_databaseEngine = databaseEngine;
}
Expand All @@ -53,7 +53,7 @@ public void ApplyAdditionalParameters(QueryBuilder queryBuilder, Entity entity,
var resource = _resourceModelProvider.GetResourceModel().GetResourceByFullName(entity.FullName);

// If the entity does not have an identificationCodes collection with queryable properties, return
if (!_resourceIdentificationCodeQueryablePropertiesProvider.TryGetIdentificationCodeProperties(
if (!_resourceIdentificationCodePropertiesProvider.TryGetIdentificationCodeProperties(
resource, out List<ResourceProperty> identificationCodeProperties))
return;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace EdFi.Ods.Common.Providers.Queries;
/// <summary>
/// Provides an interface for retrieving the queryable properties of the identificationCode collection of a resource
/// </summary>
public interface IResourceIdentificationCodeQueryablePropertiesProvider
public interface IResourceIdentificationCodePropertiesProvider
{
/// <summary>
/// Attempts to get the queryable properties of an resource's identificationCode collection.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,8 @@

namespace EdFi.Ods.Common.Providers.Queries;

public class ResourceIdentificationCodePropertiesProvider : IResourceIdentificationCodeQueryablePropertiesProvider
public class ResourceIdentificationCodePropertiesProvider : IResourceIdentificationCodePropertiesProvider
{
private readonly IResourceModelProvider _resourceModelProvider;

public ResourceIdentificationCodePropertiesProvider(IResourceModelProvider resourceModelProvider)
{
_resourceModelProvider = resourceModelProvider;
}

private readonly ConcurrentDictionary<FullName, List<ResourceProperty>>
_identificationCodePropertiesByRootResourceFullName = new();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ public class OpenApiMetadataDocumentFactory : IOpenApiMetadataDocumentFactory
private readonly IDefaultPageSizeLimitProvider _defaultPageSizeLimitProvider;
private readonly IOpenApiIdentityProvider _openApiIdentityProvider;
private readonly IOpenApiUpconversionProvider _openApiUpconversionProvider;
private readonly IResourceIdentificationCodeQueryablePropertiesProvider _resourceIdentificationCodeQueryablePropertiesProvider;
private readonly IResourceIdentificationCodePropertiesProvider _resourceIdentificationCodePropertiesProvider;

public OpenApiMetadataDocumentFactory(ApiSettings apiSettings, IDefaultPageSizeLimitProvider defaultPageSizeLimitProvider, IOpenApiUpconversionProvider openApiUpconversionProvider, IResourceIdentificationCodeQueryablePropertiesProvider resourceIdentificationCodeQueryablePropertiesProvider, IOpenApiIdentityProvider openApiIdentityProvider)
public OpenApiMetadataDocumentFactory(ApiSettings apiSettings, IDefaultPageSizeLimitProvider defaultPageSizeLimitProvider, IOpenApiUpconversionProvider openApiUpconversionProvider, IResourceIdentificationCodePropertiesProvider resourceIdentificationCodePropertiesProvider, IOpenApiIdentityProvider openApiIdentityProvider)
{
_apiSettings = apiSettings;
_defaultPageSizeLimitProvider = defaultPageSizeLimitProvider;
_openApiIdentityProvider = openApiIdentityProvider;
_resourceIdentificationCodeQueryablePropertiesProvider = resourceIdentificationCodeQueryablePropertiesProvider;
_resourceIdentificationCodePropertiesProvider = resourceIdentificationCodePropertiesProvider;
_openApiUpconversionProvider = openApiUpconversionProvider;
}

Expand All @@ -51,7 +51,7 @@ public string Create(IOpenApiMetadataResourceStrategy resourceStrategy, OpenApiM

var pathsFactory =
OpenApiMetadataDocumentFactoryHelper.CreateOpenApiMetadataPathsFactory(
documentContext, _openApiIdentityProvider, _resourceIdentificationCodeQueryablePropertiesProvider, _apiSettings);
documentContext, _openApiIdentityProvider, _resourceIdentificationCodePropertiesProvider, _apiSettings);

var tagsFactory =
OpenApiMetadataDocumentFactoryHelper.CreateOpenApiMetadataTagsFactory(documentContext);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,15 +78,15 @@ public static OpenApiMetadataDefinitionsFactory CreateOpenApiMetadataDefinitions
}

public static OpenApiMetadataPathsFactory CreateOpenApiMetadataPathsFactory(
OpenApiMetadataDocumentContext openApiMetadataDocumentContext, IOpenApiIdentityProvider openApiIdentityProvider, IResourceIdentificationCodeQueryablePropertiesProvider resourceIdentificationCodeQueryablePropertiesProvider, ApiSettings apiSettings)
OpenApiMetadataDocumentContext openApiMetadataDocumentContext, IOpenApiIdentityProvider openApiIdentityProvider, IResourceIdentificationCodePropertiesProvider resourceIdentificationCodePropertiesProvider, ApiSettings apiSettings)
{
if (openApiMetadataDocumentContext.IsProfileContext)
{
var profileStrategy = new OpenApiMetadataPathsFactoryProfileStrategy(openApiMetadataDocumentContext);

//Profile strategy implements each of the interfaces in the signature of the paths factory constructor
//Hence the odd parameter repetition.
return new OpenApiMetadataPathsFactory(profileStrategy, profileStrategy, profileStrategy, openApiIdentityProvider, resourceIdentificationCodeQueryablePropertiesProvider, apiSettings);
return new OpenApiMetadataPathsFactory(profileStrategy, profileStrategy, profileStrategy, openApiIdentityProvider, resourceIdentificationCodePropertiesProvider, apiSettings);
}

IOpenApiMetadataPathsFactorySelectorStrategy selectorStrategy = null;
Expand All @@ -110,7 +110,7 @@ public static OpenApiMetadataPathsFactory CreateOpenApiMetadataPathsFactory(
selectorStrategy ??= defaultStrategy;
resourceNamingStrategy ??= defaultResourceDefinitionNamingStrategy;

return new OpenApiMetadataPathsFactory(selectorStrategy, contentTypeStrategy, resourceNamingStrategy, openApiIdentityProvider, resourceIdentificationCodeQueryablePropertiesProvider, apiSettings);
return new OpenApiMetadataPathsFactory(selectorStrategy, contentTypeStrategy, resourceNamingStrategy, openApiIdentityProvider, resourceIdentificationCodePropertiesProvider, apiSettings);
}

public static OpenApiMetadataTagsFactory CreateOpenApiMetadataTagsFactory(OpenApiMetadataDocumentContext documentContext)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,22 @@ public class OpenApiMetadataPathsFactory
private readonly IOpenApiMetadataPathsFactorySelectorStrategy _openApiMetadataPathsFactorySelectorStrategy;
private readonly IOpenApiMetadataPathsFactoryNamingStrategy _pathsFactoryNamingStrategy;
private readonly IOpenApiIdentityProvider _openApiIdentityProvider;
private readonly IResourceIdentificationCodeQueryablePropertiesProvider
_resourceIdentificationCodeQueryablePropertiesProvider;
private readonly IResourceIdentificationCodePropertiesProvider
_resourceIdentificationCodePropertiesProvider;

public OpenApiMetadataPathsFactory(
IOpenApiMetadataPathsFactorySelectorStrategy openApiMetadataPathsFactorySelectorStrategy,
IOpenApiMetadataPathsFactoryContentTypeStrategy contentTypeStrategy,
IOpenApiMetadataPathsFactoryNamingStrategy pathsFactoryNamingStrategy,
IOpenApiIdentityProvider openApiIdentityProvider,
IResourceIdentificationCodeQueryablePropertiesProvider resourceIdentificationCodeQueryablePropertiesProvider,
IResourceIdentificationCodePropertiesProvider resourceIdentificationCodePropertiesProvider,
ApiSettings apiSettings)
{
_openApiMetadataPathsFactorySelectorStrategy = openApiMetadataPathsFactorySelectorStrategy;
_contentTypeStrategy = contentTypeStrategy;
_pathsFactoryNamingStrategy = pathsFactoryNamingStrategy;
_openApiIdentityProvider = openApiIdentityProvider;
_resourceIdentificationCodeQueryablePropertiesProvider = resourceIdentificationCodeQueryablePropertiesProvider;
_resourceIdentificationCodePropertiesProvider = resourceIdentificationCodePropertiesProvider;
_apiSettings = apiSettings;
}

Expand Down Expand Up @@ -311,9 +311,20 @@ private IList<Parameter> CreateGetByExampleParameters(OpenApiMetadataPathsResour
});
}

if (_resourceIdentificationCodeQueryablePropertiesProvider.TryGetIdentificationCodeProperties(
// Try to get any queryable identification code properties for the resource
// Use the unfiltered root resource (if applicable) to avoid populating the IdentificationCodePropertiesProvider's cache with results based on a filtered resource.
if (_resourceIdentificationCodePropertiesProvider.TryGetIdentificationCodeProperties(
openApiMetadataResource.Resource.FilterContext.UnfilteredResourceClass?.ResourceRoot ??
openApiMetadataResource.Resource, out List<ResourceProperty> queryableIdentificationCodeProperties))
{
//If this is a profile resource, do not include IdentificationCode query parameters unless the IdentificationCode collection is included in the filtered resource
if (openApiMetadataResource.IsProfileResource)
{
queryableIdentificationCodeProperties = queryableIdentificationCodeProperties.Where(
p => openApiMetadataResource.Resource.Collections.Select(c => c.ItemType.FullName)
.Contains(p.Parent.FullName)).ToList();
}

IEnumerableExtensions.ForEach(
queryableIdentificationCodeProperties, x =>
{
Expand All @@ -325,8 +336,8 @@ private IList<Parameter> CreateGetByExampleParameters(OpenApiMetadataPathsResour
description = x.Description,
type = OpenApiMetadataDocumentHelper.PropertyType(x),
format = x.PropertyType.ToOpenApiFormat(),
required = openApiMetadataResource.IsPathParameter(x),
isIdentity = OpenApiMetadataDocumentHelper.GetIsIdentity(x, _openApiIdentityProvider),
required = false,
isIdentity = null,
maxLength = OpenApiMetadataDocumentHelper.GetMaxLength(x),
isDeprecated = OpenApiMetadataDocumentHelper.GetIsDeprecated(x),
deprecatedReasons = OpenApiMetadataDocumentHelper.GetDeprecatedReasons(x)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using EdFi.Ods.Common;
using EdFi.Ods.Common.Configuration;
using EdFi.Ods.Common.Models;
using EdFi.Ods.Common.Providers.Queries;
using EdFi.Ods.Features.OpenApiMetadata.Dtos;
using EdFi.Ods.Features.OpenApiMetadata.Factories;
using EdFi.Ods.Features.OpenApiMetadata.Models;
Expand All @@ -29,6 +30,8 @@ namespace EdFi.Ods.Tests.EdFi.Ods.Features.OpenApiMetadata.Factories
public class OpenApiMetadataDocumentFactoryTests
{
protected static IOpenApiUpconversionProvider OpenApiV3UpconversionProvider = A.Fake<IOpenApiUpconversionProvider>();

private static readonly IResourceIdentificationCodePropertiesProvider _resourceIdentificationCodePropertiesProvider = new ResourceIdentificationCodePropertiesProvider();

protected static IResourceModelProvider
ResourceModelProvider = DomainModelDefinitionsProviderHelper.ResourceModelProvider;
Expand Down Expand Up @@ -108,6 +111,7 @@ protected override void Arrange()
var defaultPageSizeLimitProvider = new DefaultPageSizeLimitProvider(GetConfiguration().GetValue<int>("DefaultPageSizeLimit"));
_openApiMetadataDocumentFactory = new OpenApiMetadataDocumentFactory(
CreateApiSettings(), defaultPageSizeLimitProvider, OpenApiV3UpconversionProvider,
_resourceIdentificationCodePropertiesProvider,
new FakeOpenApiIdentityProvider());
}

Expand Down Expand Up @@ -221,6 +225,7 @@ protected override void Arrange()
_openApiMetadataDocumentFactory = new OpenApiMetadataDocumentFactory(
CreateApiSettings(), defaultPageSizeLimitProvider,
OpenApiV3UpconversionProvider,
_resourceIdentificationCodePropertiesProvider,
new FakeOpenApiIdentityProvider());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using EdFi.Ods.Common.Models;
using EdFi.Ods.Common.Models.Resource;
using EdFi.Ods.Common.Models.Validation;
using EdFi.Ods.Common.Providers.Queries;
using EdFi.Ods.Common.Utils.Profiles;
using EdFi.Ods.Features.OpenApiMetadata.Dtos;
using EdFi.Ods.Features.OpenApiMetadata.Factories;
Expand All @@ -35,6 +36,8 @@ public class OpenApiMetadataPathsFactoryTests
protected static IResourceModelProvider ResourceModelProvider = DomainModelDefinitionsProviderHelper.ResourceModelProvider;

protected static ISchemaNameMapProvider SchemaNameMapProvider = DomainModelDefinitionsProviderHelper.SchemaNameMapProvider;

private static readonly IResourceIdentificationCodePropertiesProvider _resourceIdentificationCodePropertiesProvider = new ResourceIdentificationCodePropertiesProvider();

private static ApiSettings CreateApiSettings()
{
Expand Down Expand Up @@ -82,7 +85,9 @@ protected override void Act()
.ToList();

_actualPaths = OpenApiMetadataDocumentFactoryHelper.CreateOpenApiMetadataPathsFactory(
DomainModelDefinitionsProviderHelper.DefaultopenApiMetadataDocumentContext, new FakeOpenApiIdentityProvider(), CreateApiSettings())
DomainModelDefinitionsProviderHelper.DefaultopenApiMetadataDocumentContext, new FakeOpenApiIdentityProvider(),
_resourceIdentificationCodePropertiesProvider,
CreateApiSettings())
.Create(openApiMetadataResources, false);
}

Expand Down Expand Up @@ -220,7 +225,7 @@ protected override void Act()
appSettings.Features.Single(f => f.Name == "ChangeQueries").IsEnabled = false;

_actualPaths = OpenApiMetadataDocumentFactoryHelper.CreateOpenApiMetadataPathsFactory(
DomainModelDefinitionsProviderHelper.DefaultopenApiMetadataDocumentContext, new FakeOpenApiIdentityProvider(), appSettings)
DomainModelDefinitionsProviderHelper.DefaultopenApiMetadataDocumentContext, new FakeOpenApiIdentityProvider(), _resourceIdentificationCodePropertiesProvider, appSettings)
.Create(openApiMetadataResources, false);
}

Expand Down Expand Up @@ -316,7 +321,7 @@ protected override void Arrange()
protected override void Act()
{
_actualPaths = OpenApiMetadataDocumentFactoryHelper
.CreateOpenApiMetadataPathsFactory(_openApiMetadataDocumentContext, new FakeOpenApiIdentityProvider(), CreateApiSettings())
.CreateOpenApiMetadataPathsFactory(_openApiMetadataDocumentContext, new FakeOpenApiIdentityProvider(), _resourceIdentificationCodePropertiesProvider, CreateApiSettings())
.Create(_openApiMetadataResources, false);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using EdFi.Ods.Common.Configuration;
using EdFi.Ods.Common.Conventions;
using EdFi.Ods.Common.Models;
using EdFi.Ods.Common.Providers.Queries;
using EdFi.Ods.Features.OpenApiMetadata.Dtos;
using EdFi.Ods.Features.OpenApiMetadata.Factories;
using EdFi.Ods.Features.OpenApiMetadata.Models;
Expand Down Expand Up @@ -102,6 +103,7 @@ protected override void Arrange()
_extensionOnlyOpenApiMetadataDocumentFactory = new OpenApiMetadataDocumentFactory(
CreateApiSettings(), defaultPageSieLimitProvider,
upconversionProvider,
Stub<IResourceIdentificationCodePropertiesProvider>(),
new FakeOpenApiIdentityProvider());

_resourceStrategy = new SdkGenExtensionResourceStrategy();
Expand Down Expand Up @@ -218,6 +220,7 @@ protected override void Arrange()
_extensionOnlyOpenApiMetadataDocumentFactory = new OpenApiMetadataDocumentFactory(
CreateApiSettings(), defaultPageSieLimitProvider,
upconversionProvider,
Stub<IResourceIdentificationCodePropertiesProvider>(),
new FakeOpenApiIdentityProvider());

_resourceStrategy = new SdkGenExtensionResourceStrategy();
Expand Down
Loading

0 comments on commit 708e10a

Please sign in to comment.