Skip to content

Commit 5eafe40

Browse files
author
Bart Koelman
committed
Post-merge fixes
1 parent 83836e9 commit 5eafe40

File tree

11 files changed

+82
-66
lines changed

11 files changed

+82
-66
lines changed

JsonApiDotNetCore.sln

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,15 +52,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SourceGeneratorTests", "tes
5252
EndProject
5353
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JsonApiDotNetCore.Annotations", "src\JsonApiDotNetCore.Annotations\JsonApiDotNetCore.Annotations.csproj", "{83FF097C-C8C6-477B-9FAB-DF99B84978B5}"
5454
EndProject
55-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonApiDotNetCore.OpenApi", "src\JsonApiDotNetCore.OpenApi\JsonApiDotNetCore.OpenApi.csproj", "{71287D6F-6C3B-44B4-9FCA-E78FE3F02289}"
55+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JsonApiDotNetCore.OpenApi", "src\JsonApiDotNetCore.OpenApi\JsonApiDotNetCore.OpenApi.csproj", "{71287D6F-6C3B-44B4-9FCA-E78FE3F02289}"
5656
EndProject
57-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenApiTests", "test\OpenApiTests\OpenApiTests.csproj", "{B693DE14-BB28-496F-AB39-B4E674ABCA80}"
57+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenApiTests", "test\OpenApiTests\OpenApiTests.csproj", "{B693DE14-BB28-496F-AB39-B4E674ABCA80}"
5858
EndProject
59-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonApiDotNetCore.OpenApi.Client", "src\JsonApiDotNetCore.OpenApi.Client\JsonApiDotNetCore.OpenApi.Client.csproj", "{5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}"
59+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JsonApiDotNetCore.OpenApi.Client", "src\JsonApiDotNetCore.OpenApi.Client\JsonApiDotNetCore.OpenApi.Client.csproj", "{5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}"
6060
EndProject
61-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JsonApiDotNetCoreExampleClient", "src\Examples\JsonApiDotNetCoreExampleClient\JsonApiDotNetCoreExampleClient.csproj", "{7FC5DFA3-6F66-4FD8-820D-81E93856F252}"
61+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JsonApiDotNetCoreExampleClient", "src\Examples\JsonApiDotNetCoreExampleClient\JsonApiDotNetCoreExampleClient.csproj", "{7FC5DFA3-6F66-4FD8-820D-81E93856F252}"
6262
EndProject
63-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenApiClientTests", "test\OpenApiClientTests\OpenApiClientTests.csproj", "{77F98215-3085-422E-B99D-4C404C2114CF}"
63+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenApiClientTests", "test\OpenApiClientTests\OpenApiClientTests.csproj", "{77F98215-3085-422E-B99D-4C404C2114CF}"
6464
EndProject
6565
Global
6666
GlobalSection(SolutionConfigurationPlatforms) = preSolution

JsonApiDotNetCore.sln.DotSettings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ JsonApiDotNetCore.ArgumentGuard.NotNull($EXPR$, $NAME$);</s:String>
1414
<s:Int64 x:Key="/Default/CodeEditing/NullCheckPatterns/PatternTypeNamesToPriority/=JetBrains_002EReSharper_002EFeature_002EServices_002ECSharp_002ENullChecking_002EThrowExpressionNullCheckPattern/@EntryIndexedValue">3000</s:Int64>
1515
<s:Int64 x:Key="/Default/CodeEditing/NullCheckPatterns/PatternTypeNamesToPriority/=JetBrains_002EReSharper_002EFeature_002EServices_002ECSharp_002ENullChecking_002ETraceAssertPattern/@EntryIndexedValue">50</s:Int64>
1616
<s:Boolean x:Key="/Default/CodeInspection/CodeAnnotations/PropagateAnnotations/@EntryValue">False</s:Boolean>
17+
<s:Boolean x:Key="/Default/CodeInspection/ExcludedFiles/FileMasksToSkip/=swagger_002Ejson/@EntryIndexedValue">True</s:Boolean>
1718
<s:String x:Key="/Default/CodeInspection/Highlighting/AnalysisEnabled/@EntryValue">SOLUTION</s:String>
1819
<s:Boolean x:Key="/Default/CodeInspection/Highlighting/IdentifierHighlightingEnabled/@EntryValue">True</s:Boolean>
1920
<s:Boolean x:Key="/Default/CodeInspection/Highlighting/IncludeWarningsInSwea/@EntryValue">True</s:Boolean>

docs/usage/openapi.md

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,47 +11,33 @@ JsonApiDotNetCore provides an extension package that enables you to produce an [
1111
dotnet add package JsonApiDotNetCore.OpenApi
1212
```
1313
14-
2. Add the integration in your `Startup` class.
14+
2. Add the integration in your `Program.cs` file.
1515
1616
```c#
17-
public class Startup
18-
{
19-
public void ConfigureServices(IServiceCollection services)
20-
{
21-
IMvcCoreBuilder mvcBuilder = services.AddMvcCore();
22-
23-
services.AddJsonApi<AppDbContext>(mvcBuilder: mvcBuilder);
24-
25-
// Adds the Swashbuckle integration.
26-
services.AddOpenApi(mvcBuilder);
27-
}
28-
29-
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
30-
{
31-
app.UseRouting();
32-
app.UseJsonApi();
33-
34-
// Adds the Swashbuckle middleware.
35-
app.UseSwagger();
36-
37-
app.UseEndpoints(endpoints => endpoints.MapControllers());
38-
}
39-
}
17+
IMvcCoreBuilder mvcCoreBuilder = builder.Services.AddMvcCore();
18+
19+
builder.Services.AddJsonApi<AppDbContext>(mvcBuilder: mvcCoreBuilder);
20+
21+
// Configures Swashbuckle for JSON:API.
22+
builder.Services.AddOpenApi(mvcCoreBuilder);
23+
24+
var app = builder.Build();
25+
26+
app.UseRouting();
27+
app.UseJsonApi();
28+
29+
// Adds the Swashbuckle middleware.
30+
app.UseSwagger();
4031
```
4132
4233
By default, the OpenAPI specification will be available at `http://localhost:<port>/swagger/v1/swagger.json`.
4334
4435
## Documentation
4536
46-
Swashbuckle also ships with [SwaggerUI](https://swagger.io/tools/swagger-ui/), tooling for a generated documentation page. This can be enabled by installing the `Swashbuckle.AspNetCore.SwaggerUI` NuGet package and adding the following to your `Startup` class:
37+
Swashbuckle also ships with [SwaggerUI](https://swagger.io/tools/swagger-ui/), tooling for a generated documentation page. This can be enabled by installing the `Swashbuckle.AspNetCore.SwaggerUI` NuGet package and adding the following to your `Program.cs` file:
4738
4839
```c#
49-
// Startup.cs
50-
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
51-
{
52-
app.UseSwaggerUI();
53-
}
40+
app.UseSwaggerUI();
5441
```
5542

5643
By default, SwaggerUI will be available at `http://localhost:<port>/swagger`.
57-

src/Examples/JsonApiDotNetCoreExample/Program.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Text.Json.Serialization;
22
using JsonApiDotNetCore.Configuration;
33
using JsonApiDotNetCore.Diagnostics;
4+
using JsonApiDotNetCore.OpenApi;
45
using JsonApiDotNetCoreExample.Data;
56
using Microsoft.AspNetCore.Authentication;
67
using Microsoft.EntityFrameworkCore;
@@ -53,6 +54,8 @@ static void ConfigureServices(WebApplicationBuilder builder)
5354
#endif
5455
});
5556

57+
IMvcCoreBuilder mvcCoreBuilder = builder.Services.AddMvcCore();
58+
5659
using (CodeTimingSessionManager.Current.Measure("AddJsonApi()"))
5760
{
5861
builder.Services.AddJsonApi<AppDbContext>(options =>
@@ -66,7 +69,12 @@ static void ConfigureServices(WebApplicationBuilder builder)
6669
options.IncludeExceptionStackTraceInErrors = true;
6770
options.IncludeRequestBodyInErrors = true;
6871
#endif
69-
}, discovery => discovery.AddCurrentAssembly());
72+
}, discovery => discovery.AddCurrentAssembly(), mvcBuilder: mvcCoreBuilder);
73+
}
74+
75+
using (CodeTimingSessionManager.Current.Measure("AddOpenApi()"))
76+
{
77+
builder.Services.AddOpenApi(mvcCoreBuilder);
7078
}
7179
}
7280

@@ -87,6 +95,9 @@ static void ConfigurePipeline(WebApplication webApplication)
8795
webApplication.UseJsonApi();
8896
}
8997

98+
webApplication.UseSwagger();
99+
webApplication.UseSwaggerUI();
100+
90101
webApplication.MapControllers();
91102
}
92103

src/JsonApiDotNetCore.OpenApi.Client/JsonApiClient.cs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -118,23 +118,25 @@ public override object ReadJson(JsonReader reader, Type objectType, object? exis
118118
public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
119119
{
120120
ArgumentGuard.NotNull(writer, nameof(writer));
121-
ArgumentGuard.NotNull(value, nameof(value));
122121
ArgumentGuard.NotNull(serializer, nameof(serializer));
123122

124-
if (_alwaysIncludedAttributesPerRequestDocumentInstance.ContainsKey(value))
123+
if (value != null)
125124
{
126-
AttributeNamesContainer attributeNamesContainer = _alwaysIncludedAttributesPerRequestDocumentInstance[value];
127-
serializer.ContractResolver = new JsonApiDocumentContractResolver(attributeNamesContainer);
128-
}
125+
if (_alwaysIncludedAttributesPerRequestDocumentInstance.ContainsKey(value))
126+
{
127+
AttributeNamesContainer attributeNamesContainer = _alwaysIncludedAttributesPerRequestDocumentInstance[value];
128+
serializer.ContractResolver = new JsonApiDocumentContractResolver(attributeNamesContainer);
129+
}
129130

130-
try
131-
{
132-
_isSerializing = true;
133-
serializer.Serialize(writer, value);
134-
}
135-
finally
136-
{
137-
_isSerializing = false;
131+
try
132+
{
133+
_isSerializing = true;
134+
serializer.Serialize(writer, value);
135+
}
136+
finally
137+
{
138+
_isSerializing = false;
139+
}
138140
}
139141
}
140142
}

src/JsonApiDotNetCore.OpenApi.Client/JsonApiDotNetCore.OpenApi.Client.csproj

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,26 @@
77

88
<PropertyGroup>
99
<VersionPrefix>$(JsonApiDotNetCoreVersionPrefix)</VersionPrefix>
10-
<PackageTags>jsonapidotnetcore;jsonapi;json:api;dotnet;asp.net;openapi;swagger;client;nswag</PackageTags>
10+
<PackageTags>jsonapidotnetcore;jsonapi;json:api;dotnet;asp.net;rest;web-api;openapi;swagger;client;nswag</PackageTags>
1111
<Description>Provides support for OpenAPI generated clients in sending partial POST/PATCH requests against JSON:API endpoints.</Description>
1212
<Authors>json-api-dotnet</Authors>
1313
<PackageProjectUrl>https://www.jsonapi.net/</PackageProjectUrl>
1414
<PackageLicenseExpression>MIT</PackageLicenseExpression>
1515
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
16+
<PackageReleaseNotes>See https://github.com/json-api-dotnet/JsonApiDotNetCore/releases.</PackageReleaseNotes>
17+
<PackageIcon>logo.png</PackageIcon>
1618
<PublishRepositoryUrl>true</PublishRepositoryUrl>
1719
<EmbedUntrackedSources>true</EmbedUntrackedSources>
1820
<DebugType>embedded</DebugType>
1921
</PropertyGroup>
2022

23+
<ItemGroup>
24+
<None Include="..\..\logo.png" Visible="false">
25+
<Pack>True</Pack>
26+
<PackagePath></PackagePath>
27+
</None>
28+
</ItemGroup>
29+
2130
<ItemGroup>
2231
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0">
2332
<PrivateAssets>all</PrivateAssets>

src/JsonApiDotNetCore.OpenApi/JsonApiDotNetCore.OpenApi.csproj

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,26 @@
77

88
<PropertyGroup>
99
<VersionPrefix>$(JsonApiDotNetCoreVersionPrefix)</VersionPrefix>
10-
<PackageTags>jsonapidotnetcore;jsonapi;json:api;dotnet;asp.net;openapi;swagger;swaggerui;swashbuckle</PackageTags>
10+
<PackageTags>jsonapidotnetcore;jsonapi;json:api;dotnet;asp.net;rest;web-api;openapi;swagger;swaggerui;swashbuckle</PackageTags>
1111
<Description>A Swashbuckle integration that enables you to describe a JsonApiDotNetCore API with an OpenAPI specification.</Description>
1212
<Authors>json-api-dotnet</Authors>
1313
<PackageProjectUrl>https://www.jsonapi.net/</PackageProjectUrl>
1414
<PackageLicenseExpression>MIT</PackageLicenseExpression>
1515
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
16+
<PackageReleaseNotes>See https://github.com/json-api-dotnet/JsonApiDotNetCore/releases.</PackageReleaseNotes>
17+
<PackageIcon>logo.png</PackageIcon>
1618
<PublishRepositoryUrl>true</PublishRepositoryUrl>
1719
<EmbedUntrackedSources>true</EmbedUntrackedSources>
1820
<DebugType>embedded</DebugType>
1921
</PropertyGroup>
2022

23+
<ItemGroup>
24+
<None Include="..\..\logo.png" Visible="false">
25+
<Pack>True</Pack>
26+
<PackagePath></PackagePath>
27+
</None>
28+
</ItemGroup>
29+
2130
<ItemGroup>
2231
<ProjectReference Include="..\JsonApiDotNetCore\JsonApiDotNetCore.csproj" />
2332
</ItemGroup>

src/JsonApiDotNetCore.OpenApi/JsonApiOperationIdSelector.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,12 @@ private static Type GetDocumentType(Type primaryResourceClrType, ApiDescription
109109

110110
private string ApplyTemplate(string operationIdTemplate, Type resourceClrType, ApiDescription endpoint)
111111
{
112-
string method = endpoint.HttpMethod!.ToLowerInvariant();
112+
if (endpoint.RelativePath == null || endpoint.HttpMethod == null)
113+
{
114+
throw new UnreachableCodeException();
115+
}
116+
117+
string method = endpoint.HttpMethod.ToLowerInvariant();
113118
string primaryResourceName = _formatter.FormatResourceName(resourceClrType).Singularize();
114119
string relationshipName = operationIdTemplate.Contains("[RelationshipName]") ? endpoint.RelativePath.Split("/").Last() : string.Empty;
115120

src/JsonApiDotNetCore.OpenApi/OpenApiEndpointConvention.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ private bool ShouldSuppressEndpoint(JsonApiEndpoint endpoint, Type controllerTyp
5252
return true;
5353
}
5454

55-
if (endpoint == JsonApiEndpoint.DeleteRelationship || endpoint == JsonApiEndpoint.PostRelationship)
55+
if (endpoint is JsonApiEndpoint.DeleteRelationship or JsonApiEndpoint.PostRelationship)
5656
{
5757
return !relationships.OfType<HasManyAttribute>().Any();
5858
}
@@ -75,8 +75,8 @@ private IReadOnlyCollection<RelationshipAttribute> GetRelationshipsOfPrimaryReso
7575

7676
private static bool IsSecondaryOrRelationshipEndpoint(JsonApiEndpoint endpoint)
7777
{
78-
return endpoint == JsonApiEndpoint.GetSecondary || endpoint == JsonApiEndpoint.GetRelationship || endpoint == JsonApiEndpoint.PostRelationship ||
79-
endpoint == JsonApiEndpoint.PatchRelationship || endpoint == JsonApiEndpoint.DeleteRelationship;
78+
return endpoint is JsonApiEndpoint.GetSecondary or JsonApiEndpoint.GetRelationship or JsonApiEndpoint.PostRelationship
79+
or JsonApiEndpoint.PatchRelationship or JsonApiEndpoint.DeleteRelationship;
8080
}
8181

8282
private void SetResponseMetadata(ActionModel action, JsonApiEndpoint endpoint)
@@ -160,7 +160,7 @@ private static void SetRequestMetadata(ActionModel action, JsonApiEndpoint endpo
160160

161161
private static bool RequiresRequestBody(JsonApiEndpoint endpoint)
162162
{
163-
return endpoint is JsonApiEndpoint.Post || endpoint is JsonApiEndpoint.Patch || endpoint is JsonApiEndpoint.PostRelationship ||
164-
endpoint is JsonApiEndpoint.PatchRelationship || endpoint is JsonApiEndpoint.DeleteRelationship;
163+
return endpoint is JsonApiEndpoint.Post or JsonApiEndpoint.Patch or JsonApiEndpoint.PostRelationship or JsonApiEndpoint.PatchRelationship
164+
or JsonApiEndpoint.DeleteRelationship;
165165
}
166166
}

test/OpenApiTests/LegacyOpenApiIntegration/LegacyOpenApiIntegrationTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public LegacyOpenApiIntegrationTests()
1919
public async Task Retrieved_document_matches_expected_document()
2020
{
2121
// Arrange
22-
string embeddedResourceName = $"{nameof(OpenApiTests)}.{nameof(LegacyOpenApiIntegration)}.swagger.json";
22+
const string embeddedResourceName = $"{nameof(OpenApiTests)}.{nameof(LegacyOpenApiIntegration)}.swagger.json";
2323
string expectedDocument = await LoadEmbeddedResourceAsync(embeddedResourceName);
2424
const string requestUrl = "swagger/v1/swagger.json";
2525

test/OpenApiTests/OpenApiTests.csproj

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,4 @@
1717
<ItemGroup>
1818
<EmbeddedResource Include="LegacyOpenApiIntegration\swagger.json" />
1919
</ItemGroup>
20-
21-
<!-- Fixes IntelliSense errors on openapi.json in Visual Studio 2019, which uses the schema for OpenAPI 3.1 by default. -->
22-
<ProjectExtensions>
23-
<VisualStudio>
24-
<UserProperties swagger_1json__JsonSchema="https://raw.githubusercontent.com/OAI/OpenAPI-Specification/main/schemas/v3.0/schema.json" />
25-
</VisualStudio>
26-
</ProjectExtensions>
2720
</Project>

0 commit comments

Comments
 (0)