Skip to content

Commit 10a8f7c

Browse files
Allow to reference OpenApiDocumentParser from net8.0
1 parent cbbb298 commit 10a8f7c

27 files changed

+301
-71
lines changed

src/All.slnx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@
190190
<Project Path="HotChocolate/Adapters/src/Fusion.Adapters.Mcp/HotChocolate.Fusion.Adapters.Mcp.csproj" />
191191
<Project Path="HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/HotChocolate.Fusion.Adapters.OpenApi.csproj" />
192192
<Project Path="HotChocolate/Adapters/src/Adapters.OpenApi.Packaging/HotChocolate.Adapters.OpenApi.Packaging.csproj" />
193+
<Project Path="HotChocolate/Adapters/src/Adapters.OpenApi.AspNetCore/HotChocolate.Adapters.OpenApi.AspNetCore.csproj" />
193194
</Folder>
194195
<Folder Name="/HotChocolate/Adapters/test/">
195196
<Project Path="HotChocolate/Adapters/test/Adapters.Mcp.Tests/HotChocolate.Adapters.Mcp.Tests.csproj" />

src/Directory.Packages.props

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
<PackageVersion Include="Microsoft.Azure.Functions.Worker.Extensions.Abstractions" Version="1.1.0" />
3131
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.14.0" />
3232
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.14.0" />
33+
<PackageVersion Include="Microsoft.Extensions.FileSystemGlobbing" Version="10.0.0" />
3334
<PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" />
3435
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
3536
<PackageVersion Include="Microsoft.OpenApi.Readers" Version="1.6.14" />
@@ -170,4 +171,4 @@
170171
<PackageVersion Include="Roslynator.CodeAnalysis.Analyzers" Version="4.14.1" />
171172
<PackageVersion Include="Roslynator.Formatting.Analyzers" Version="4.14.1" />
172173
</ItemGroup>
173-
</Project>
174+
</Project>

src/HotChocolate/Adapters/Adapters.slnx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<Project Path="src\Adapters.OpenApi.Core\HotChocolate.Adapters.OpenApi.Core.csproj" />
1010
<Project Path="src\Adapters.OpenApi\HotChocolate.Adapters.OpenApi.csproj" />
1111
<Project Path="src\Adapters.OpenApi.Packaging\HotChocolate.Adapters.OpenApi.Packaging.csproj" />
12+
<Project Path="src\Adapters.OpenApi.AspNetCore\HotChocolate.Adapters.OpenApi.AspNetCore.csproj" />
1213
<Project Path="src\Fusion.Adapters.OpenApi\HotChocolate.Fusion.Adapters.OpenApi.csproj" />
1314
</Folder>
1415
<Folder Name="/test/" />

src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/DynamicOpenApiDocumentTransformer.cs renamed to src/HotChocolate/Adapters/src/Adapters.OpenApi.AspNetCore/DynamicDynamicOpenApiDocumentTransformer.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
namespace HotChocolate.Adapters.OpenApi;
1717

18-
internal sealed class DynamicOpenApiDocumentTransformer : IOpenApiDocumentTransformer
18+
internal sealed class DynamicDynamicOpenApiDocumentTransformer : IOpenApiDocumentTransformer, IDynamicOpenApiDocumentTransformer
1919
{
2020
private List<OperationDescriptor> _operations = [];
2121
private List<ComponentDescriptor> _components = [];
@@ -74,7 +74,7 @@ private static OperationDescriptor CreateOperationDescriptor(
7474
var operation = new OpenApiOperation
7575
{
7676
Description = operationDocument.Description,
77-
OperationId = OpenApiHelpers.GetOperationId(operationDocument.Name),
77+
OperationId = GetOperationId(operationDocument.Name),
7878
Parameters = [],
7979
Responses = []
8080
};
@@ -165,9 +165,15 @@ private static ComponentDescriptor CreateComponentDescriptor(
165165
ISchemaDefinition schema,
166166
Dictionary<string, OpenApiFragmentDocument> fragmentDocumentLookup)
167167
{
168+
if (!schema.Types.TryGetType(fragmentDocument.FragmentDefinition.TypeCondition.Name.Value,
169+
out var typeCondition))
170+
{
171+
throw new InvalidOperationException("Expected to find type condition type in the schema.");
172+
}
173+
168174
var componentSchema = CreateOpenApiSchemaForSelectionSet(
169175
fragmentDocument.FragmentDefinition.SelectionSet,
170-
(IOutputType)fragmentDocument.TypeCondition,
176+
(IOutputType)typeCondition,
171177
schema,
172178
fragmentDocument.LocalFragmentLookup,
173179
fragmentDocumentLookup);
@@ -708,7 +714,7 @@ private static OpenApiSchemaAbstraction CreateOpenApiSchemaForSelectionSet(
708714

709715
if (externalFragmentLookup.TryGetValue(fragmentName, out var externalFragment))
710716
{
711-
var typeName = externalFragment.TypeCondition.Name;
717+
var typeName = externalFragment.FragmentDefinition.TypeCondition.Name.Value;
712718

713719
fragmentSchemasByType ??= new Dictionary<string, List<OpenApiSchemaAbstraction>>();
714720

@@ -992,4 +998,18 @@ private static void RemovePropertiesFromSchema(
992998
}
993999
}
9941000
}
1001+
1002+
private static string GetOperationId(string operationName)
1003+
{
1004+
if (char.IsLower(operationName[0]))
1005+
{
1006+
return operationName;
1007+
}
1008+
1009+
return string.Create(operationName.Length, operationName, (span, str) =>
1010+
{
1011+
str.AsSpan().CopyTo(span);
1012+
span[0] = char.ToLowerInvariant(span[0]);
1013+
});
1014+
}
9951015
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Microsoft.Extensions.DependencyInjection.Extensions;
3+
4+
namespace HotChocolate.Adapters.OpenApi;
5+
6+
internal static class InternalServiceCollectionExtensions
7+
{
8+
public static IServiceCollection AddOpenApiAspNetCoreServices(this IServiceCollection services, string schemaName)
9+
{
10+
services.TryAddKeyedSingleton<DynamicDynamicOpenApiDocumentTransformer>(schemaName);
11+
services.TryAddKeyedSingleton<IDynamicOpenApiDocumentTransformer>(
12+
schemaName,
13+
(sp, key) => sp.GetRequiredKeyedService<DynamicDynamicOpenApiDocumentTransformer>(key));
14+
15+
return services;
16+
}
17+
}

src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Extensions/OpenApiOptionsExtensions.cs renamed to src/HotChocolate/Adapters/src/Adapters.OpenApi.AspNetCore/Extensions/OpenApiOptionsExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public static OpenApiOptions AddGraphQLTransformer(this OpenApiOptions options,
1212
return options.AddDocumentTransformer((document, context, ct) =>
1313
{
1414
var transformer = context.ApplicationServices
15-
.GetRequiredKeyedService<DynamicOpenApiDocumentTransformer>(schemaName);
15+
.GetRequiredKeyedService<DynamicDynamicOpenApiDocumentTransformer>(schemaName);
1616

1717
return transformer.TransformAsync(document, context, ct);
1818
});
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<RootNamespace>HotChocolate.Adapters.OpenApi</RootNamespace>
5+
<PackageId>HotChocolate.Adapters.OpenApi.AspNetCore</PackageId>
6+
<TargetFrameworks>$(OpenApiTargetFrameworks)</TargetFrameworks>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<InternalsVisibleTo Include="HotChocolate.Adapters.OpenApi" />
11+
<InternalsVisibleTo Include="HotChocolate.Fusion.Adapters.OpenApi" />
12+
</ItemGroup>
13+
14+
<ItemGroup>
15+
<PackageReference Include="Microsoft.AspNetCore.OpenApi"/>
16+
</ItemGroup>
17+
18+
<ItemGroup>
19+
<ProjectReference Include="..\..\..\Core\src\Types.Abstractions\HotChocolate.Types.Abstractions.csproj" />
20+
<ProjectReference Include="..\Adapters.OpenApi.Core\HotChocolate.Adapters.OpenApi.Core.csproj" />
21+
</ItemGroup>
22+
23+
</Project>

src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Documents/OpenApiDocumentParser.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace HotChocolate.Adapters.OpenApi;
88

9-
public sealed class OpenApiDocumentParser(ISchemaDefinition schema)
9+
public sealed class OpenApiDocumentParser
1010
{
1111
private static readonly ExternalFragmentReferenceFinder s_externalFragmentReferenceFinder = new();
1212

@@ -62,23 +62,13 @@ private OpenApiParseResult ParseFragment(
6262
var name = fragment.Name.Value;
6363
var description = fragment.Description?.Value;
6464

65-
if (!schema.Types.TryGetType(fragment.TypeCondition.Name.Value, out var typeCondition))
66-
{
67-
var error = new OpenApiParsingError(
68-
$"Type condition '{fragment.TypeCondition.Name.Value}' not found in schema.",
69-
id,
70-
document);
71-
return OpenApiParseResult.Failure(error);
72-
}
73-
7465
var context = new FragmentSpreadFinderContext(localFragmentLookup);
7566
s_externalFragmentReferenceFinder.Visit(document, context);
7667

7768
var fragmentDocument = new OpenApiFragmentDocument(
7869
id,
7970
name,
8071
description,
81-
typeCondition,
8272
fragment,
8373
localFragmentLookup,
8474
context.ExternalFragmentReferences);

src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Documents/OpenApiFragmentDocument.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ public sealed record OpenApiFragmentDocument(
77
string Id,
88
string Name,
99
string? Description,
10-
ITypeDefinition TypeCondition,
1110
FragmentDefinitionNode FragmentDefinition,
1211
Dictionary<string, FragmentDefinitionNode> LocalFragmentLookup,
1312
HashSet<string> ExternalFragmentReferences) : IOpenApiDocument;

src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/DynamicEndpointDataSource.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ internal sealed class DynamicEndpointDataSource : EndpointDataSource, IDynamicEn
99
private IReadOnlyList<Endpoint> _endpoints = [];
1010
private CancellationTokenSource _cts = new();
1111
private CancellationChangeToken _changeToken;
12+
#if NET9_0_OR_GREATER
1213
private readonly Lock _lock = new();
14+
#else
15+
private readonly object _lock = new();
16+
#endif
1317

1418
public DynamicEndpointDataSource()
1519
{

0 commit comments

Comments
 (0)