From fe386789273a41f4873ca1de8a8400cdaadbc256 Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Sun, 27 Apr 2025 02:14:26 +0200
Subject: [PATCH 01/17] Increment version to 5.7.2 (used for pre-release builds
from ci)
---
Directory.Build.props | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Directory.Build.props b/Directory.Build.props
index 7fc6d42c5..1ef255f56 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -9,9 +9,9 @@
Recommended$(MSBuildThisFileDirectory)CodingGuidelines.ruleset$(MSBuildThisFileDirectory)tests.runsettings
- 5.7.1
+ 5.7.2pre
- 2
+ 3direct
From b21cf5cb688f5fab7908f46d4ec582adbb2e51da Mon Sep 17 00:00:00 2001
From: Bart Koelman <10324372+bkoelman@users.noreply.github.com>
Date: Tue, 6 May 2025 04:20:02 +0200
Subject: [PATCH 02/17] Various documentation enhancements (#1728)
* Document public OpenAPI members, remove unused IJsonApiClient
* Include OpenAPI types in API Browser, fix docfx logo, enable Google Analytics
* Add redirects for changed APIs (based on 404s from Google Search Console)
* Convert TOCs to yaml
* Fix caching during local build
* List example projects in documentation
* List key types on API index page
* Document advanced use cases
* Consolidate getting-started steps
* Add GitHub icon
* Fix broken Araxis logo
---
README.md | 19 +-
...ollers.Annotations.NoHttpPatchAttribute.md | 3 +
....Controllers.JsonApiCommandController-1.md | 3 +
...NetCore.Controllers.ModelStateViolation.md | 3 +
...tNetCore.Diagnostics.CascadingCodeTimer.md | 3 +
...ceIdInCreateResourceNotAllowedException.md | 3 +
...re.Errors.ResourceTypeMismatchException.md | 3 +
...tCore.Hooks.IResourceHookExecutorFacade.md | 3 +
...ooks.Internal.Discovery.IHooksDiscovery.md | 3 +
...nal.Execution.DiffableResourceHashSet-1.md | 3 +
...s.Internal.Execution.IResourceHashSet-1.md | 3 +
...Core.Hooks.Internal.ICreateHookExecutor.md | 3 +
...Core.Hooks.Internal.IUpdateHookExecutor.md | 3 +
...iDotNetCore.Middleware.JsonApiExtension.md | 3 +
...xpressions.CollectionNotEmptyExpression.md | 3 +
...Queries.Internal.IEvaluatedIncludeCache.md | 3 +
....Queries.Internal.Parsing.IncludeParser.md | 3 +
...tCore.Queries.Internal.Parsing.Keywords.md | 3 +
....Internal.Parsing.QueryExpressionParser.md | 3 +
...Parsing.QueryStringParameterScopeParser.md | 3 +
...Queries.Internal.Parsing.QueryTokenizer.md | 3 +
....Internal.QueryableBuilding.LambdaScope.md | 3 +
...l.QueryableBuilding.SelectClauseBuilder.md | 3 +
...al.QueryableBuilding.WhereClauseBuilder.md | 3 +
...ngs.IDefaultsQueryStringParameterReader.md | 3 +
...rnal.DefaultsQueryStringParameterReader.md | 3 +
...ternal.FilterQueryStringParameterReader.md | 3 +
...ernal.IncludeQueryStringParameterReader.md | 3 +
...al.PaginationQueryStringParameterReader.md | 3 +
...ourceDefinitionQueryableParameterReader.md | 3 +
...JsonApiDotNetCore.QueryStrings.Internal.md | 3 +
.../JsonApiDotNetCore.Resources.Internal.md | 3 +
...ore.Resources.ResourceHooksDefinition-1.md | 3 +
...tNetCore.Serialization.BaseDeserializer.md | 3 +
...DotNetCore.Serialization.BaseSerializer.md | 3 +
...Building.IIncludedResourceObjectBuilder.md | 3 +
...ization.Building.IResourceObjectBuilder.md | 3 +
....Building.ResourceObjectBuilderSettings.md | 3 +
...lization.Client.Internal.ManyResponse-1.md | 3 +
...ation.Client.Internal.RequestSerializer.md | 3 +
...otNetCore.Serialization.Client.Internal.md | 3 +
...Core.Serialization.IJsonApiDeserializer.md | 3 +
...DotNetCore.Serialization.IJsonApiWriter.md | 3 +
...Serialization.Objects.IResourceIdentity.md | 3 +
...Serialization.ResponseSerializerFactory.md | 3 +
...ApiDotNetCore.Services.IGetAllService-1.md | 3 +
...rvices.IRemoveFromRelationshipService-1.md | 3 +
...Core.Services.IResourceCommandService-1.md | 3 +
...etCore.Services.IResourceQueryService-1.md | 3 +
...tCore.Services.JsonApiResourceService-1.md | 3 +
docs/api/index.md | 96 +++++++++-
docs/build-dev.ps1 | 6 +-
docs/docfx.json | 46 ++---
docs/getting-started/faq.md | 179 +-----------------
docs/getting-started/index.md | 5 +
docs/getting-started/install.md | 27 +--
docs/getting-started/step-by-step.md | 137 +-------------
docs/getting-started/toc.md | 5 -
docs/home/assets/img/araxis-logo.png | Bin 0 -> 2502 bytes
docs/home/index.html | 13 +-
docs/internals/toc.md | 1 -
docs/internals/toc.yml | 2 +
docs/request-examples/README.md | 26 +--
docs/request-examples/index.md | 27 ++-
docs/request-examples/toc.md | 0
docs/template/public/main.css | 6 +
docs/template/public/main.js | 11 ++
docs/toc.yml | 13 +-
docs/usage/advanced/alternate-routes.md | 8 +
docs/usage/advanced/archiving.md | 14 ++
docs/usage/advanced/auth-scopes.md | 10 +
docs/usage/advanced/blobs.md | 9 +
docs/usage/advanced/composite-keys.md | 8 +
docs/usage/advanced/content-negotiation.md | 15 ++
docs/usage/advanced/eager-loading.md | 12 ++
docs/usage/advanced/error-handling.md | 13 ++
docs/usage/advanced/hosting-iis.md | 7 +
docs/usage/advanced/id-obfuscation.md | 16 ++
docs/usage/advanced/index.md | 19 ++
docs/usage/advanced/links.md | 19 ++
docs/usage/advanced/microservices.md | 22 +++
docs/usage/advanced/model-state.md | 14 ++
docs/usage/advanced/multi-tenancy.md | 21 ++
docs/usage/advanced/operations.md | 15 ++
docs/usage/advanced/query-string-functions.md | 23 +++
docs/usage/advanced/resource-injection.md | 11 ++
docs/usage/advanced/soft-deletion.md | 15 ++
docs/usage/advanced/state-machine.md | 11 ++
docs/usage/advanced/toc.yml | 38 ++++
docs/usage/caching.md | 6 +-
docs/usage/extensibility/toc.yml | 14 ++
docs/usage/faq.md | 176 +++++++++++++++++
docs/usage/reading/toc.yml | 10 +
docs/usage/resources/index.md | 7 +-
docs/usage/resources/inheritance.md | 2 +-
docs/usage/resources/toc.yml | 8 +
docs/usage/toc.md | 39 ----
docs/usage/toc.yml | 35 ++++
docs/usage/writing/toc.yml | 8 +
.../ApiException.cs | 14 ++
.../ApiResponse.cs | 14 ++
.../BlockedJsonInheritanceConverter.cs | 13 ++
.../IJsonApiClient.cs | 41 ----
.../NotifyPropertySet.cs | 3 +-
104 files changed, 971 insertions(+), 505 deletions(-)
create mode 100644 docs/api/JsonApiDotNetCore.Controllers.Annotations.NoHttpPatchAttribute.md
create mode 100644 docs/api/JsonApiDotNetCore.Controllers.JsonApiCommandController-1.md
create mode 100644 docs/api/JsonApiDotNetCore.Controllers.ModelStateViolation.md
create mode 100644 docs/api/JsonApiDotNetCore.Diagnostics.CascadingCodeTimer.md
create mode 100644 docs/api/JsonApiDotNetCore.Errors.ResourceIdInCreateResourceNotAllowedException.md
create mode 100644 docs/api/JsonApiDotNetCore.Errors.ResourceTypeMismatchException.md
create mode 100644 docs/api/JsonApiDotNetCore.Hooks.IResourceHookExecutorFacade.md
create mode 100644 docs/api/JsonApiDotNetCore.Hooks.Internal.Discovery.IHooksDiscovery.md
create mode 100644 docs/api/JsonApiDotNetCore.Hooks.Internal.Execution.DiffableResourceHashSet-1.md
create mode 100644 docs/api/JsonApiDotNetCore.Hooks.Internal.Execution.IResourceHashSet-1.md
create mode 100644 docs/api/JsonApiDotNetCore.Hooks.Internal.ICreateHookExecutor.md
create mode 100644 docs/api/JsonApiDotNetCore.Hooks.Internal.IUpdateHookExecutor.md
create mode 100644 docs/api/JsonApiDotNetCore.Middleware.JsonApiExtension.md
create mode 100644 docs/api/JsonApiDotNetCore.Queries.Expressions.CollectionNotEmptyExpression.md
create mode 100644 docs/api/JsonApiDotNetCore.Queries.Internal.IEvaluatedIncludeCache.md
create mode 100644 docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.IncludeParser.md
create mode 100644 docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.Keywords.md
create mode 100644 docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.QueryExpressionParser.md
create mode 100644 docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.QueryStringParameterScopeParser.md
create mode 100644 docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.QueryTokenizer.md
create mode 100644 docs/api/JsonApiDotNetCore.Queries.Internal.QueryableBuilding.LambdaScope.md
create mode 100644 docs/api/JsonApiDotNetCore.Queries.Internal.QueryableBuilding.SelectClauseBuilder.md
create mode 100644 docs/api/JsonApiDotNetCore.Queries.Internal.QueryableBuilding.WhereClauseBuilder.md
create mode 100644 docs/api/JsonApiDotNetCore.QueryStrings.IDefaultsQueryStringParameterReader.md
create mode 100644 docs/api/JsonApiDotNetCore.QueryStrings.Internal.DefaultsQueryStringParameterReader.md
create mode 100644 docs/api/JsonApiDotNetCore.QueryStrings.Internal.FilterQueryStringParameterReader.md
create mode 100644 docs/api/JsonApiDotNetCore.QueryStrings.Internal.IncludeQueryStringParameterReader.md
create mode 100644 docs/api/JsonApiDotNetCore.QueryStrings.Internal.PaginationQueryStringParameterReader.md
create mode 100644 docs/api/JsonApiDotNetCore.QueryStrings.Internal.ResourceDefinitionQueryableParameterReader.md
create mode 100644 docs/api/JsonApiDotNetCore.QueryStrings.Internal.md
create mode 100644 docs/api/JsonApiDotNetCore.Resources.Internal.md
create mode 100644 docs/api/JsonApiDotNetCore.Resources.ResourceHooksDefinition-1.md
create mode 100644 docs/api/JsonApiDotNetCore.Serialization.BaseDeserializer.md
create mode 100644 docs/api/JsonApiDotNetCore.Serialization.BaseSerializer.md
create mode 100644 docs/api/JsonApiDotNetCore.Serialization.Building.IIncludedResourceObjectBuilder.md
create mode 100644 docs/api/JsonApiDotNetCore.Serialization.Building.IResourceObjectBuilder.md
create mode 100644 docs/api/JsonApiDotNetCore.Serialization.Building.ResourceObjectBuilderSettings.md
create mode 100644 docs/api/JsonApiDotNetCore.Serialization.Client.Internal.ManyResponse-1.md
create mode 100644 docs/api/JsonApiDotNetCore.Serialization.Client.Internal.RequestSerializer.md
create mode 100644 docs/api/JsonApiDotNetCore.Serialization.Client.Internal.md
create mode 100644 docs/api/JsonApiDotNetCore.Serialization.IJsonApiDeserializer.md
create mode 100644 docs/api/JsonApiDotNetCore.Serialization.IJsonApiWriter.md
create mode 100644 docs/api/JsonApiDotNetCore.Serialization.Objects.IResourceIdentity.md
create mode 100644 docs/api/JsonApiDotNetCore.Serialization.ResponseSerializerFactory.md
create mode 100644 docs/api/JsonApiDotNetCore.Services.IGetAllService-1.md
create mode 100644 docs/api/JsonApiDotNetCore.Services.IRemoveFromRelationshipService-1.md
create mode 100644 docs/api/JsonApiDotNetCore.Services.IResourceCommandService-1.md
create mode 100644 docs/api/JsonApiDotNetCore.Services.IResourceQueryService-1.md
create mode 100644 docs/api/JsonApiDotNetCore.Services.JsonApiResourceService-1.md
create mode 100644 docs/getting-started/index.md
delete mode 100644 docs/getting-started/toc.md
create mode 100644 docs/home/assets/img/araxis-logo.png
delete mode 100644 docs/internals/toc.md
create mode 100644 docs/internals/toc.yml
delete mode 100644 docs/request-examples/toc.md
create mode 100644 docs/template/public/main.css
create mode 100644 docs/template/public/main.js
create mode 100644 docs/usage/advanced/alternate-routes.md
create mode 100644 docs/usage/advanced/archiving.md
create mode 100644 docs/usage/advanced/auth-scopes.md
create mode 100644 docs/usage/advanced/blobs.md
create mode 100644 docs/usage/advanced/composite-keys.md
create mode 100644 docs/usage/advanced/content-negotiation.md
create mode 100644 docs/usage/advanced/eager-loading.md
create mode 100644 docs/usage/advanced/error-handling.md
create mode 100644 docs/usage/advanced/hosting-iis.md
create mode 100644 docs/usage/advanced/id-obfuscation.md
create mode 100644 docs/usage/advanced/index.md
create mode 100644 docs/usage/advanced/links.md
create mode 100644 docs/usage/advanced/microservices.md
create mode 100644 docs/usage/advanced/model-state.md
create mode 100644 docs/usage/advanced/multi-tenancy.md
create mode 100644 docs/usage/advanced/operations.md
create mode 100644 docs/usage/advanced/query-string-functions.md
create mode 100644 docs/usage/advanced/resource-injection.md
create mode 100644 docs/usage/advanced/soft-deletion.md
create mode 100644 docs/usage/advanced/state-machine.md
create mode 100644 docs/usage/advanced/toc.yml
create mode 100644 docs/usage/extensibility/toc.yml
create mode 100644 docs/usage/faq.md
create mode 100644 docs/usage/reading/toc.yml
create mode 100644 docs/usage/resources/toc.yml
delete mode 100644 docs/usage/toc.md
create mode 100644 docs/usage/toc.yml
create mode 100644 docs/usage/writing/toc.yml
delete mode 100644 src/JsonApiDotNetCore.OpenApi.Client.NSwag/IJsonApiClient.cs
diff --git a/README.md b/README.md
index fb58acf05..8dd6a6ecf 100644
--- a/README.md
+++ b/README.md
@@ -20,16 +20,23 @@ The ultimate goal of this library is to eliminate as much boilerplate as possibl
The following steps describe how to create a JSON:API project.
+1. Create a new ASP.NET Core Web API project:
+
+ ```bash
+ dotnet new webapi --no-openapi --use-controllers --name ExampleJsonApi
+ cd ExampleJsonApi
+ ```
+
1. Install the JsonApiDotNetCore package, along with your preferred Entity Framework Core provider:
+
```bash
dotnet add package JsonApiDotNetCore
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
```
1. Declare your entities, annotated with JsonApiDotNetCore attributes:
- ```c#
- #nullable enable
+ ```c#
[Resource]
public class Person : Identifiable
{
@@ -40,6 +47,7 @@ The following steps describe how to create a JSON:API project.
```
1. Define your `DbContext`, seeding the database with sample data:
+
```c#
public class AppDbContext(DbContextOptions options) : DbContext(options)
{
@@ -70,6 +78,7 @@ The following steps describe how to create a JSON:API project.
```
1. Configure Entity Framework Core and JsonApiDotNetCore in `Program.cs`:
+
```c#
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext();
@@ -96,11 +105,13 @@ The following steps describe how to create a JSON:API project.
```
1. Start your API
+
```bash
dotnet run
```
1. Send a GET request to retrieve data:
+
```bash
GET http://localhost:5000/people?filter=equals(firstName,'John')&include=children HTTP/1.1
```
@@ -256,7 +267,7 @@ To build the code from this repository locally, run:
dotnet build
```
-Running tests locally requires access to a PostgreSQL database. If you have docker installed, this can started via:
+Running tests locally requires access to a PostgreSQL database. If you have docker installed, this can be started via:
```bash
pwsh run-docker-postgres.ps1
@@ -279,6 +290,6 @@ pwsh Build.ps1
We are very grateful to the sponsors below, who have provided us with a no-cost license for their tools.
-
+
Do you like this project? Consider to [sponsor](https://github.com/sponsors/json-api-dotnet), or just reward us by giving our repository a star.
diff --git a/docs/api/JsonApiDotNetCore.Controllers.Annotations.NoHttpPatchAttribute.md b/docs/api/JsonApiDotNetCore.Controllers.Annotations.NoHttpPatchAttribute.md
new file mode 100644
index 000000000..b63f67fae
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Controllers.Annotations.NoHttpPatchAttribute.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Resources.Annotations.ResourceAttribute.html#JsonApiDotNetCore_Resources_Annotations_ResourceAttribute_GenerateControllerEndpoints
+---
diff --git a/docs/api/JsonApiDotNetCore.Controllers.JsonApiCommandController-1.md b/docs/api/JsonApiDotNetCore.Controllers.JsonApiCommandController-1.md
new file mode 100644
index 000000000..5d980615f
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Controllers.JsonApiCommandController-1.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Controllers.JsonApiCommandController-2.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Controllers.ModelStateViolation.md b/docs/api/JsonApiDotNetCore.Controllers.ModelStateViolation.md
new file mode 100644
index 000000000..9414c98cc
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Controllers.ModelStateViolation.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Errors.InvalidModelStateException.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Diagnostics.CascadingCodeTimer.md b/docs/api/JsonApiDotNetCore.Diagnostics.CascadingCodeTimer.md
new file mode 100644
index 000000000..1b27f4c57
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Diagnostics.CascadingCodeTimer.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Diagnostics.ICodeTimer.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Errors.ResourceIdInCreateResourceNotAllowedException.md b/docs/api/JsonApiDotNetCore.Errors.ResourceIdInCreateResourceNotAllowedException.md
new file mode 100644
index 000000000..bd889e534
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Errors.ResourceIdInCreateResourceNotAllowedException.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Errors.ResourceAlreadyExistsException.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Errors.ResourceTypeMismatchException.md b/docs/api/JsonApiDotNetCore.Errors.ResourceTypeMismatchException.md
new file mode 100644
index 000000000..f840a3f3a
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Errors.ResourceTypeMismatchException.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Errors.InvalidRequestBodyException.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Hooks.IResourceHookExecutorFacade.md b/docs/api/JsonApiDotNetCore.Hooks.IResourceHookExecutorFacade.md
new file mode 100644
index 000000000..59094b11c
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Hooks.IResourceHookExecutorFacade.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Resources.IResourceDefinition-2.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Hooks.Internal.Discovery.IHooksDiscovery.md b/docs/api/JsonApiDotNetCore.Hooks.Internal.Discovery.IHooksDiscovery.md
new file mode 100644
index 000000000..59094b11c
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Hooks.Internal.Discovery.IHooksDiscovery.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Resources.IResourceDefinition-2.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Hooks.Internal.Execution.DiffableResourceHashSet-1.md b/docs/api/JsonApiDotNetCore.Hooks.Internal.Execution.DiffableResourceHashSet-1.md
new file mode 100644
index 000000000..4cf783422
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Hooks.Internal.Execution.DiffableResourceHashSet-1.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Resources.JsonApiResourceDefinition-2.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Hooks.Internal.Execution.IResourceHashSet-1.md b/docs/api/JsonApiDotNetCore.Hooks.Internal.Execution.IResourceHashSet-1.md
new file mode 100644
index 000000000..59094b11c
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Hooks.Internal.Execution.IResourceHashSet-1.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Resources.IResourceDefinition-2.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Hooks.Internal.ICreateHookExecutor.md b/docs/api/JsonApiDotNetCore.Hooks.Internal.ICreateHookExecutor.md
new file mode 100644
index 000000000..dacf9c60b
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Hooks.Internal.ICreateHookExecutor.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Resources.IResourceDefinition-2.html#JsonApiDotNetCore_Resources_IResourceDefinition_2_OnWritingAsync__0_JsonApiDotNetCore_Middleware_WriteOperationKind_System_Threading_CancellationToken_
+---
diff --git a/docs/api/JsonApiDotNetCore.Hooks.Internal.IUpdateHookExecutor.md b/docs/api/JsonApiDotNetCore.Hooks.Internal.IUpdateHookExecutor.md
new file mode 100644
index 000000000..dacf9c60b
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Hooks.Internal.IUpdateHookExecutor.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Resources.IResourceDefinition-2.html#JsonApiDotNetCore_Resources_IResourceDefinition_2_OnWritingAsync__0_JsonApiDotNetCore_Middleware_WriteOperationKind_System_Threading_CancellationToken_
+---
diff --git a/docs/api/JsonApiDotNetCore.Middleware.JsonApiExtension.md b/docs/api/JsonApiDotNetCore.Middleware.JsonApiExtension.md
new file mode 100644
index 000000000..5ce9d0e02
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Middleware.JsonApiExtension.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Middleware.JsonApiMediaTypeExtension.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Queries.Expressions.CollectionNotEmptyExpression.md b/docs/api/JsonApiDotNetCore.Queries.Expressions.CollectionNotEmptyExpression.md
new file mode 100644
index 000000000..05c7012a7
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Queries.Expressions.CollectionNotEmptyExpression.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Queries.Expressions.HasExpression.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Queries.Internal.IEvaluatedIncludeCache.md b/docs/api/JsonApiDotNetCore.Queries.Internal.IEvaluatedIncludeCache.md
new file mode 100644
index 000000000..d990b723a
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Queries.Internal.IEvaluatedIncludeCache.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Queries.IEvaluatedIncludeCache.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.IncludeParser.md b/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.IncludeParser.md
new file mode 100644
index 000000000..b7cc54796
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.IncludeParser.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Queries.Parsing.IncludeParser.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.Keywords.md b/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.Keywords.md
new file mode 100644
index 000000000..a1a604ffb
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.Keywords.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Queries.Parsing.Keywords.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.QueryExpressionParser.md b/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.QueryExpressionParser.md
new file mode 100644
index 000000000..d3574188c
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.QueryExpressionParser.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Queries.Parsing.QueryExpressionParser.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.QueryStringParameterScopeParser.md b/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.QueryStringParameterScopeParser.md
new file mode 100644
index 000000000..0403d40eb
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.QueryStringParameterScopeParser.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Queries.Parsing.QueryStringParameterScopeParser.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.QueryTokenizer.md b/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.QueryTokenizer.md
new file mode 100644
index 000000000..0cf46bdf5
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Queries.Internal.Parsing.QueryTokenizer.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Queries.Parsing.QueryTokenizer.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Queries.Internal.QueryableBuilding.LambdaScope.md b/docs/api/JsonApiDotNetCore.Queries.Internal.QueryableBuilding.LambdaScope.md
new file mode 100644
index 000000000..1884dc786
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Queries.Internal.QueryableBuilding.LambdaScope.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Queries.QueryableBuilding.LambdaScope.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Queries.Internal.QueryableBuilding.SelectClauseBuilder.md b/docs/api/JsonApiDotNetCore.Queries.Internal.QueryableBuilding.SelectClauseBuilder.md
new file mode 100644
index 000000000..005a6b211
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Queries.Internal.QueryableBuilding.SelectClauseBuilder.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Queries.QueryableBuilding.SelectClauseBuilder.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Queries.Internal.QueryableBuilding.WhereClauseBuilder.md b/docs/api/JsonApiDotNetCore.Queries.Internal.QueryableBuilding.WhereClauseBuilder.md
new file mode 100644
index 000000000..5ff3e97e5
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Queries.Internal.QueryableBuilding.WhereClauseBuilder.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Queries.QueryableBuilding.WhereClauseBuilder.html
+---
diff --git a/docs/api/JsonApiDotNetCore.QueryStrings.IDefaultsQueryStringParameterReader.md b/docs/api/JsonApiDotNetCore.QueryStrings.IDefaultsQueryStringParameterReader.md
new file mode 100644
index 000000000..d46a26681
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.QueryStrings.IDefaultsQueryStringParameterReader.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.QueryStrings.IQueryStringParameterReader.html
+---
diff --git a/docs/api/JsonApiDotNetCore.QueryStrings.Internal.DefaultsQueryStringParameterReader.md b/docs/api/JsonApiDotNetCore.QueryStrings.Internal.DefaultsQueryStringParameterReader.md
new file mode 100644
index 000000000..0c6da2ca5
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.QueryStrings.Internal.DefaultsQueryStringParameterReader.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.QueryStrings.QueryStringParameterReader.html
+---
diff --git a/docs/api/JsonApiDotNetCore.QueryStrings.Internal.FilterQueryStringParameterReader.md b/docs/api/JsonApiDotNetCore.QueryStrings.Internal.FilterQueryStringParameterReader.md
new file mode 100644
index 000000000..645687485
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.QueryStrings.Internal.FilterQueryStringParameterReader.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.QueryStrings.FilterQueryStringParameterReader.html
+---
diff --git a/docs/api/JsonApiDotNetCore.QueryStrings.Internal.IncludeQueryStringParameterReader.md b/docs/api/JsonApiDotNetCore.QueryStrings.Internal.IncludeQueryStringParameterReader.md
new file mode 100644
index 000000000..d8ceb2d5f
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.QueryStrings.Internal.IncludeQueryStringParameterReader.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.QueryStrings.IncludeQueryStringParameterReader.html
+---
diff --git a/docs/api/JsonApiDotNetCore.QueryStrings.Internal.PaginationQueryStringParameterReader.md b/docs/api/JsonApiDotNetCore.QueryStrings.Internal.PaginationQueryStringParameterReader.md
new file mode 100644
index 000000000..d0fc4348c
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.QueryStrings.Internal.PaginationQueryStringParameterReader.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.QueryStrings.PaginationQueryStringParameterReader.html
+---
diff --git a/docs/api/JsonApiDotNetCore.QueryStrings.Internal.ResourceDefinitionQueryableParameterReader.md b/docs/api/JsonApiDotNetCore.QueryStrings.Internal.ResourceDefinitionQueryableParameterReader.md
new file mode 100644
index 000000000..ef485e70a
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.QueryStrings.Internal.ResourceDefinitionQueryableParameterReader.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.QueryStrings.ResourceDefinitionQueryableParameterReader.html
+---
diff --git a/docs/api/JsonApiDotNetCore.QueryStrings.Internal.md b/docs/api/JsonApiDotNetCore.QueryStrings.Internal.md
new file mode 100644
index 000000000..9535aea47
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.QueryStrings.Internal.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.QueryStrings.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Resources.Internal.md b/docs/api/JsonApiDotNetCore.Resources.Internal.md
new file mode 100644
index 000000000..f547f0925
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Resources.Internal.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Resources.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Resources.ResourceHooksDefinition-1.md b/docs/api/JsonApiDotNetCore.Resources.ResourceHooksDefinition-1.md
new file mode 100644
index 000000000..4cf783422
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Resources.ResourceHooksDefinition-1.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Resources.JsonApiResourceDefinition-2.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Serialization.BaseDeserializer.md b/docs/api/JsonApiDotNetCore.Serialization.BaseDeserializer.md
new file mode 100644
index 000000000..e4bd9d0bf
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Serialization.BaseDeserializer.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Serialization.Request.Adapters.DocumentAdapter.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Serialization.BaseSerializer.md b/docs/api/JsonApiDotNetCore.Serialization.BaseSerializer.md
new file mode 100644
index 000000000..af24d07eb
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Serialization.BaseSerializer.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Serialization.Response.ResponseModelAdapter.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Serialization.Building.IIncludedResourceObjectBuilder.md b/docs/api/JsonApiDotNetCore.Serialization.Building.IIncludedResourceObjectBuilder.md
new file mode 100644
index 000000000..79a6ec638
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Serialization.Building.IIncludedResourceObjectBuilder.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Serialization.Response.ResponseModelAdapter.html#JsonApiDotNetCore_Serialization_Response_ResponseModelAdapter_ConvertResource_JsonApiDotNetCore_Resources_IIdentifiable_JsonApiDotNetCore_Configuration_ResourceType_JsonApiDotNetCore_Middleware_EndpointKind_
+---
diff --git a/docs/api/JsonApiDotNetCore.Serialization.Building.IResourceObjectBuilder.md b/docs/api/JsonApiDotNetCore.Serialization.Building.IResourceObjectBuilder.md
new file mode 100644
index 000000000..79a6ec638
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Serialization.Building.IResourceObjectBuilder.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Serialization.Response.ResponseModelAdapter.html#JsonApiDotNetCore_Serialization_Response_ResponseModelAdapter_ConvertResource_JsonApiDotNetCore_Resources_IIdentifiable_JsonApiDotNetCore_Configuration_ResourceType_JsonApiDotNetCore_Middleware_EndpointKind_
+---
diff --git a/docs/api/JsonApiDotNetCore.Serialization.Building.ResourceObjectBuilderSettings.md b/docs/api/JsonApiDotNetCore.Serialization.Building.ResourceObjectBuilderSettings.md
new file mode 100644
index 000000000..03cbfa162
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Serialization.Building.ResourceObjectBuilderSettings.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Configuration.JsonApiOptions.html#JsonApiDotNetCore_Configuration_JsonApiOptions_SerializerOptions
+---
diff --git a/docs/api/JsonApiDotNetCore.Serialization.Client.Internal.ManyResponse-1.md b/docs/api/JsonApiDotNetCore.Serialization.Client.Internal.ManyResponse-1.md
new file mode 100644
index 000000000..2b6744f22
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Serialization.Client.Internal.ManyResponse-1.md
@@ -0,0 +1,3 @@
+---
+redirect_url: ../usage/openapi-client.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Serialization.Client.Internal.RequestSerializer.md b/docs/api/JsonApiDotNetCore.Serialization.Client.Internal.RequestSerializer.md
new file mode 100644
index 000000000..2b6744f22
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Serialization.Client.Internal.RequestSerializer.md
@@ -0,0 +1,3 @@
+---
+redirect_url: ../usage/openapi-client.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Serialization.Client.Internal.md b/docs/api/JsonApiDotNetCore.Serialization.Client.Internal.md
new file mode 100644
index 000000000..2b6744f22
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Serialization.Client.Internal.md
@@ -0,0 +1,3 @@
+---
+redirect_url: ../usage/openapi-client.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Serialization.IJsonApiDeserializer.md b/docs/api/JsonApiDotNetCore.Serialization.IJsonApiDeserializer.md
new file mode 100644
index 000000000..767e0c94d
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Serialization.IJsonApiDeserializer.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Serialization.Request.Adapters.IDocumentAdapter.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Serialization.IJsonApiWriter.md b/docs/api/JsonApiDotNetCore.Serialization.IJsonApiWriter.md
new file mode 100644
index 000000000..b9bbf20b7
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Serialization.IJsonApiWriter.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Serialization.Response.IJsonApiWriter.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Serialization.Objects.IResourceIdentity.md b/docs/api/JsonApiDotNetCore.Serialization.Objects.IResourceIdentity.md
new file mode 100644
index 000000000..4a3f2ca61
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Serialization.Objects.IResourceIdentity.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Serialization.Objects.ResourceIdentity.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Serialization.ResponseSerializerFactory.md b/docs/api/JsonApiDotNetCore.Serialization.ResponseSerializerFactory.md
new file mode 100644
index 000000000..03cbfa162
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Serialization.ResponseSerializerFactory.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Configuration.JsonApiOptions.html#JsonApiDotNetCore_Configuration_JsonApiOptions_SerializerOptions
+---
diff --git a/docs/api/JsonApiDotNetCore.Services.IGetAllService-1.md b/docs/api/JsonApiDotNetCore.Services.IGetAllService-1.md
new file mode 100644
index 000000000..36fcd2e43
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Services.IGetAllService-1.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Services.IGetAllService-2.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Services.IRemoveFromRelationshipService-1.md b/docs/api/JsonApiDotNetCore.Services.IRemoveFromRelationshipService-1.md
new file mode 100644
index 000000000..5df240af1
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Services.IRemoveFromRelationshipService-1.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Services.IRemoveFromRelationshipService-2.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Services.IResourceCommandService-1.md b/docs/api/JsonApiDotNetCore.Services.IResourceCommandService-1.md
new file mode 100644
index 000000000..fedee0f01
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Services.IResourceCommandService-1.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Services.IResourceCommandService-2.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Services.IResourceQueryService-1.md b/docs/api/JsonApiDotNetCore.Services.IResourceQueryService-1.md
new file mode 100644
index 000000000..0801fc22f
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Services.IResourceQueryService-1.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Services.IResourceQueryService-2.html
+---
diff --git a/docs/api/JsonApiDotNetCore.Services.JsonApiResourceService-1.md b/docs/api/JsonApiDotNetCore.Services.JsonApiResourceService-1.md
new file mode 100644
index 000000000..5a2be335c
--- /dev/null
+++ b/docs/api/JsonApiDotNetCore.Services.JsonApiResourceService-1.md
@@ -0,0 +1,3 @@
+---
+redirect_url: JsonApiDotNetCore.Services.JsonApiResourceService-2.html
+---
diff --git a/docs/api/index.md b/docs/api/index.md
index 7eb109b9a..8cdc3c745 100644
--- a/docs/api/index.md
+++ b/docs/api/index.md
@@ -1,9 +1,93 @@
-# API
+# Public API surface
-This section documents the package API and is generated from the XML source comments.
+This topic documents the public API, which is generated from the triple-slash XML documentation comments in source code.
+Commonly used types are listed in the following sections.
-## Common APIs
+## Setup
-- [`JsonApiOptions`](JsonApiDotNetCore.Configuration.JsonApiOptions.yml)
-- [`IResourceGraph`](JsonApiDotNetCore.Configuration.IResourceGraph.yml)
-- [`JsonApiResourceDefinition`](JsonApiDotNetCore.Resources.JsonApiResourceDefinition-2.yml)
+- implements
+- implements
+ -
+ - implements
+ - and
+ -
+ -
+ -
+ -
+ -
+- , (OpenAPI)
+-
+- implements
+ -
+ -
+
+## Query strings
+
+- implements
+ - implements
+ - and
+ - implements
+ - implements
+ - implements
+ - implements
+ - implements
+ - implements
+ - implements
+ - implements
+ - implements
+ - implements
+-
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+- implements
+ - implements
+ - implements
+ - implements
+ - implements
+ - implements
+
+## Request pipeline
+
+- implements
+ -
+ -
+- implements
+ - implements
+ -
+ - implements
+ - implements
+ - implements
+ - implements
+ - implements
+ - implements
+-
+ - implements
+- implements
+- implements
+ - implements
+- implements
+ -
+ -
+
+## Serialization
+
+- implements
+ - implements
+ - implements
+ - implements
+- implements
+ - implements
+ - implements
+-
+-
+- implements
+
+## Error handling
+
+- implements
+ - implements
diff --git a/docs/build-dev.ps1 b/docs/build-dev.ps1
index 6345875fc..348233253 100644
--- a/docs/build-dev.ps1
+++ b/docs/build-dev.ps1
@@ -29,12 +29,14 @@ EnsureHttpServerIsInstalled
VerifySuccessExitCode
if (-Not $NoBuild -Or -Not (Test-Path -Path _site)) {
- Remove-Item _site -Recurse -ErrorAction Ignore
+ Remove-Item _site\* -Recurse -ErrorAction Ignore
dotnet build .. --configuration Release
VerifySuccessExitCode
Invoke-Expression ./generate-examples.ps1
+} else {
+ Remove-Item _site\* -Recurse -ErrorAction Ignore
}
dotnet tool restore
@@ -58,4 +60,4 @@ Write-Host "Web server started. Press Enter to close."
$key = [Console]::ReadKey()
Stop-Job -Id $webServerJob.Id
-Get-job | Remove-Job
+Get-job | Remove-Job -Force
diff --git a/docs/docfx.json b/docs/docfx.json
index 232d8768e..25a4aa943 100644
--- a/docs/docfx.json
+++ b/docs/docfx.json
@@ -1,4 +1,5 @@
{
+ "$schema": "https://raw.githubusercontent.com/dotnet/docfx/main/schemas/docfx.schema.json",
"metadata": [
{
"properties": {
@@ -8,30 +9,21 @@
{
"files": [
"**/JsonApiDotNetCore.csproj",
- "**/JsonApiDotNetCore.Annotations.csproj"
+ "**/JsonApiDotNetCore.Annotations.csproj",
+ "**/JsonApiDotNetCore.OpenApi.Swashbuckle.csproj",
+ "**/JsonApiDotNetCore.OpenApi.Client.NSwag.csproj",
+ "**/JsonApiDotNetCore.OpenApi.Client.Kiota"
],
"src": "../"
}
],
- "dest": "api",
- "disableGitFeatures": false
+ "output": "api"
}
],
"build": {
"content": [
{
- "files": [
- "api/**.yml",
- "api/index.md",
- "ext/openapi/index.md",
- "getting-started/**.md",
- "getting-started/**/toc.yml",
- "usage/**.md",
- "request-examples/**.md",
- "internals/**.md",
- "toc.yml",
- "*.md"
- ],
+ "files": "**.{md|yml}",
"exclude": [
"**/README.md"
]
@@ -44,25 +36,15 @@
]
}
],
- "overwrite": [
- {
- "exclude": [
- "obj/**",
- "_site/**"
- ]
- }
- ],
- "dest": "_site",
- "globalMetadataFiles": [],
- "fileMetadataFiles": [],
+ "output": "_site",
"template": [
"default",
- "modern"
+ "modern",
+ "template"
],
- "postProcessors": [],
- "noLangKeyword": false,
- "keepFileLink": false,
- "cleanupCacheHistory": false,
- "disableGitFeatures": false
+ "globalMetadata": {
+ "_appLogoPath": "styles/img/favicon.png",
+ "_googleAnalyticsTagId": "G-78GTGF1FM2"
+ }
}
}
diff --git a/docs/getting-started/faq.md b/docs/getting-started/faq.md
index 54b4e50d5..c36a09f99 100644
--- a/docs/getting-started/faq.md
+++ b/docs/getting-started/faq.md
@@ -1,176 +1,3 @@
-# Frequently Asked Questions
-
-#### Where can I find documentation and examples?
-While the [documentation](~/usage/resources/index.md) covers basic features and a few runnable example projects are available [here](https://github.com/json-api-dotnet/JsonApiDotNetCore/tree/master/src/Examples),
-many more advanced use cases are available as integration tests [here](https://github.com/json-api-dotnet/JsonApiDotNetCore/tree/master/test/JsonApiDotNetCoreTests/IntegrationTests), so be sure to check them out!
-
-#### Why don't you use the built-in OpenAPI support in ASP.NET Core?
-The structure of JSON:API request and response bodies differs significantly from the signature of JsonApiDotNetCore controllers.
-JsonApiDotNetCore provides OpenAPI support using [Swashbuckle](https://github.com/domaindrivendev/Swashbuckle.AspNetCore), a mature and feature-rich library that is highly extensible.
-The [OpenAPI support in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/openapi/overview) is still very young
-and doesn't provide the level of extensibility needed for JsonApiDotNetCore.
-
-#### What's available to implement a JSON:API client?
-It depends on the programming language used. There's an overwhelming list of client libraries at https://jsonapi.org/implementations/#client-libraries.
-
-The JSON object model inside JsonApiDotNetCore is tweaked for server-side handling (be tolerant at inputs and strict at outputs).
-While you technically *could* use our `JsonSerializer` converters from a .NET client application with some hacks, we don't recommend it.
-You'll need to build the resource graph on the client and rely on internal implementation details that are subject to change in future versions.
-
-In the long term, we'd like to solve this through OpenAPI, which enables the generation of a (statically typed) client library in various languages.
-
-#### How can I debug my API project?
-Due to auto-generated controllers, you may find it hard to determine where to put your breakpoints.
-In Visual Studio, controllers are accessible below **Solution Explorer > Project > Dependencies > Analyzers > JsonApiDotNetCore.SourceGenerators**.
-
-After turning on [Source Link](https://devblogs.microsoft.com/dotnet/improving-debug-time-productivity-with-source-link/#enabling-source-link) (which enables to download the JsonApiDotNetCore source code from GitHub), you can step into our source code and add breakpoints there too.
-
-Here are some key places in the execution pipeline to set a breakpoint:
-- `JsonApiRoutingConvention.Apply`: Controllers are registered here (executes once at startup)
-- `JsonApiMiddleware.InvokeAsync`: Content negotiation and `IJsonApiRequest` setup
-- `QueryStringReader.ReadAll`: Parses the query string parameters
-- `JsonApiReader.ReadAsync`: Parses the request body
-- `OperationsProcessor.ProcessAsync`: Entry point for handling atomic operations
-- `JsonApiResourceService`: Called by controllers, delegating to the repository layer
-- `EntityFrameworkCoreRepository.ApplyQueryLayer`: Builds the `IQueryable<>` that is offered to Entity Framework Core (which turns it into SQL)
-- `JsonApiWriter.WriteAsync`: Renders the response body
-- `ExceptionHandler.HandleException`: Interception point for thrown exceptions
-
-Aside from debugging, you can get more info by:
-- Including exception stack traces and incoming request bodies in error responses, as well as writing human-readable JSON:
-
- ```c#
- // Program.cs
- builder.Services.AddJsonApi(options =>
- {
- options.IncludeExceptionStackTraceInErrors = true;
- options.IncludeRequestBodyInErrors = true;
- options.SerializerOptions.WriteIndented = true;
- });
- ```
-- Turning on verbose logging and logging of executed SQL statements, by adding the following to your `appsettings.Development.json`:
-
- ```json
- {
- "Logging": {
- "LogLevel": {
- "Default": "Warning",
- "Microsoft.EntityFrameworkCore.Database.Command": "Information",
- "JsonApiDotNetCore": "Verbose"
- }
- }
- }
- ```
-
-#### What if my JSON:API resources do not exactly match the shape of my database tables?
-We often find users trying to write custom code to solve that. They usually get it wrong or incomplete, and it may not perform well.
-Or it simply fails because it cannot be translated to SQL.
-The good news is that there's an easier solution most of the time: configure Entity Framework Core mappings to do the work.
-
-For example, if your primary key column is named "CustomerId" instead of "Id":
-```c#
-builder.Entity().Property(x => x.Id).HasColumnName("CustomerId");
-```
-
-It certainly pays off to read up on these capabilities at [Creating and Configuring a Model](https://learn.microsoft.com/ef/core/modeling/).
-Another great resource is [Learn Entity Framework Core](https://www.learnentityframeworkcore.com/configuration).
-
-#### Can I share my resource models with .NET Framework projects?
-Yes, you can. Put your model classes in a separate project that only references [JsonApiDotNetCore.Annotations](https://www.nuget.org/packages/JsonApiDotNetCore.Annotations/).
-This package contains just the JSON:API attributes and targets NetStandard 1.0, which makes it flexible to consume.
-At startup, use [Auto-discovery](~/usage/resource-graph.md#auto-discovery) and point it to your shared project.
-
-#### What's the best place to put my custom business/validation logic?
-For basic input validation, use the attributes from [ASP.NET ModelState Validation](https://learn.microsoft.com/aspnet/core/mvc/models/validation?source=recommendations&view=aspnetcore-7.0#built-in-attributes) to get the best experience.
-JsonApiDotNetCore is aware of them and adjusts behavior accordingly. And it produces the best possible error responses.
-
-For non-trivial business rules that require custom code, the place to be is [Resource Definitions](~/usage/extensibility/resource-definitions.md).
-They provide a callback-based model where you can respond to everything going on.
-The great thing is that your callbacks are invoked for various endpoints.
-For example, the filter callback on Author executes at `GET /authors?filter=`, `GET /books/1/authors?filter=` and `GET /books?include=authors?filter[authors]=`.
-Likewise, the callbacks for changing relationships execute for POST/PATCH resource endpoints, as well as POST/PATCH/DELETE relationship endpoints.
-
-#### Can API users send multiple changes in a single request?
-Yes, just activate [atomic operations](~/usage/writing/bulk-batch-operations.md).
-It enables sending multiple changes in a batch request, which are executed in a database transaction.
-If something fails, all changes are rolled back. The error response indicates which operation failed.
-
-#### Is there any way to add `[Authorize(Roles = "...")]` to the generated controllers?
-Sure, this is possible. Simply add the attribute at the class level.
-See the docs on [Augmenting controllers](~/usage/extensibility/controllers.md#augmenting-controllers).
-
-#### How do I expose non-JSON:API endpoints?
-You can add your own controllers that do not derive from `(Base)JsonApiController` or `(Base)JsonApiOperationsController`.
-Whatever you do in those is completely ignored by JsonApiDotNetCore.
-This is useful if you want to add a few RPC-style endpoints or provide binary file uploads/downloads.
-
-A middle-ground approach is to add custom action methods to existing JSON:API controllers.
-While you can route them as you like, they must return JSON:API resources.
-And on error, a JSON:API error response is produced.
-This is useful if you want to stay in the JSON:API-compliant world, but need to expose something non-standard, for example: `GET /users/me`.
-
-#### How do I optimize for high scalability and prevent denial of service?
-Fortunately, JsonApiDotNetCore [scales pretty well](https://github.com/json-api-dotnet/PerformanceReports) under high load and/or large database tables.
-It never executes filtering, sorting, or pagination in-memory and tries pretty hard to produce the most efficient query possible.
-There are a few things to keep in mind, though:
-- Prevent users from executing slow queries by locking down [attribute capabilities](~/usage/resources/attributes.md#capabilities) and [relationship capabilities](~/usage/resources/relationships.md#capabilities).
- Ensure the right database indexes are in place for what you enable.
-- Prevent users from fetching lots of data by tweaking [maximum page size/number](~/usage/options.md#pagination) and [maximum include depth](~/usage/options.md#maximum-include-depth).
-- Avoid long-running transactions by tweaking `MaximumOperationsPerRequest` in options.
-- Tell your users to utilize [E-Tags](~/usage/caching.md) to reduce network traffic.
-- Not included in JsonApiDotNetCore: Apply general practices such as rate limiting, load balancing, authentication/authorization, blocking very large URLs/request bodies, etc.
-
-#### Can I offload requests to a background process?
-Yes, that's possible. Override controller methods to return `HTTP 202 Accepted`, with a `Location` HTTP header where users can retrieve the result.
-Your controller method needs to store the request state (URL, query string, and request body) in a queue, which your background process can read from.
-From within your background process job handler, reconstruct the request state, execute the appropriate `JsonApiResourceService` method and store the result.
-There's a basic example available at https://github.com/json-api-dotnet/JsonApiDotNetCore/pull/1144, which processes a captured query string.
-
-#### What if I want to use something other than Entity Framework Core?
-This basically means you'll need to implement data access yourself. There are two approaches for interception: at the resource service level and at the repository level.
-Either way, you can use the built-in query string and request body parsing, as well as routing, error handling, and rendering of responses.
-
-Here are some injectable request-scoped types to be aware of:
-- `IJsonApiRequest`: This contains routing information, such as whether a primary, secondary, or relationship endpoint is being accessed.
-- `ITargetedFields`: Lists the attributes and relationships from an incoming POST/PATCH resource request. Any fields missing there should not be stored (partial updates).
-- `IEnumerable`: Provides access to the parsed query string parameters.
-- `IEvaluatedIncludeCache`: This tells the response serializer which related resources to render.
-- `ISparseFieldSetCache`: This tells the response serializer which fields to render in the `attributes` and `relationships` objects.
-
-You may also want to inject the singletons `IJsonApiOptions` (which contains settings such as default page size) and `IResourceGraph` (the JSON:API model of resources, attributes and relationships).
-
-So, back to the topic of where to intercept. It helps to familiarize yourself with the [execution pipeline](~/internals/queries.md).
-Replacing at the service level is the simplest. But it means you'll need to read the parsed query string parameters and invoke
-all resource definition callbacks yourself. And you won't get change detection (HTTP 203 Not Modified).
-Take a look at [JsonApiResourceService](https://github.com/json-api-dotnet/JsonApiDotNetCore/blob/master/src/JsonApiDotNetCore/Services/JsonApiResourceService.cs) to see what you're missing out on.
-
-You'll get a lot more out of the box if replacing at the repository level instead. You don't need to apply options or analyze query strings.
-And most resource definition callbacks are handled.
-That's because the built-in resource service translates all JSON:API query aspects of the request into a database-agnostic data structure called `QueryLayer`.
-Now the hard part for you becomes reading that data structure and producing data access calls from that.
-If your data store provides a LINQ provider, you can probably reuse [QueryableBuilder](https://github.com/json-api-dotnet/JsonApiDotNetCore/blob/master/src/JsonApiDotNetCore/Queries/QueryableBuilding/QueryableBuilder.cs),
-which drives the translation into [System.Linq.Expressions](https://learn.microsoft.com/dotnet/csharp/programming-guide/concepts/expression-trees/).
-Note however, that it also produces calls to `.Include("")`, which is an Entity Framework Core-specific extension method, so you'll need to
-[prevent that from happening](https://github.com/json-api-dotnet/JsonApiDotNetCore/blob/master/src/JsonApiDotNetCore/Queries/QueryableBuilding/QueryLayerIncludeConverter.cs).
-
-The example [here](https://github.com/json-api-dotnet/JsonApiDotNetCore/blob/master/src/Examples/NoEntityFrameworkExample/Repositories/InMemoryResourceRepository.cs) compiles and executes
-the LINQ query against an in-memory list of resources.
-For [MongoDB](https://github.com/json-api-dotnet/JsonApiDotNetCore.MongoDb/blob/master/src/JsonApiDotNetCore.MongoDb/Repositories/MongoRepository.cs), we use the MongoDB LINQ provider.
-If there's no LINQ provider available, the example [here](https://github.com/json-api-dotnet/JsonApiDotNetCore/blob/master/src/Examples/DapperExample/Repositories/DapperRepository.cs) may be of help,
-which produces SQL and uses [Dapper](https://github.com/DapperLib/Dapper) for data access.
-
-> [!TIP]
-> [ExpressionTreeVisualizer](https://github.com/zspitz/ExpressionTreeVisualizer) is very helpful in trying to debug LINQ expression trees!
-
-#### I love JsonApiDotNetCore! How can I support the team?
-The best way to express your gratitude is by starring our repository.
-This increases our leverage when asking for bug fixes in dependent projects, such as the .NET runtime and Entity Framework Core.
-You can also [sponsor](https://github.com/sponsors/json-api-dotnet) our project.
-Of course, a simple thank-you message in our [Gitter channel](https://gitter.im/json-api-dotnet-core/Lobby) is appreciated too!
-
-If you'd like to do more: try things out, ask questions, create GitHub bug reports or feature requests, or upvote existing issues that are important to you.
-We welcome PRs, but keep in mind: The worst thing in the world is opening a PR that gets rejected after you've put a lot of effort into it.
-So for any non-trivial changes, please open an issue first to discuss your approach and ensure it fits the product vision.
-
-#### Is there anything else I should be aware of?
-See [Common Pitfalls](~/usage/common-pitfalls.md).
+---
+redirect_url: ../usage/faq.html
+---
diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md
new file mode 100644
index 000000000..0b309e46e
--- /dev/null
+++ b/docs/getting-started/index.md
@@ -0,0 +1,5 @@
+# Getting Started
+
+The easiest way to get started is to run the [example project](https://github.com/json-api-dotnet/JsonApiDotNetCore/tree/master/src/Examples/GettingStarted).
+
+Or create your first JsonApiDotNetCore project by following the steps described [here](https://github.com/json-api-dotnet/JsonApiDotNetCore/blob/master/README.md#getting-started).
diff --git a/docs/getting-started/install.md b/docs/getting-started/install.md
index bd210e0a7..b09e389c9 100644
--- a/docs/getting-started/install.md
+++ b/docs/getting-started/install.md
@@ -1,24 +1,3 @@
-# Installation
-
-Click [here](https://www.nuget.org/packages/JsonApiDotNetCore/) for the latest NuGet version.
-
-### CLI
-
-```
-dotnet add package JsonApiDotNetCore
-```
-
-### Visual Studio
-
-```powershell
-Install-Package JsonApiDotNetCore
-```
-
-### *.csproj
-
-```xml
-
-
-
-
-```
+---
+redirect_url: index.html
+---
diff --git a/docs/getting-started/step-by-step.md b/docs/getting-started/step-by-step.md
index 57090d2d0..b09e389c9 100644
--- a/docs/getting-started/step-by-step.md
+++ b/docs/getting-started/step-by-step.md
@@ -1,134 +1,3 @@
-# Step-By-Step Guide to a Running API
-
-The most basic use case leverages Entity Framework Core.
-The shortest path to a running API looks like:
-
-- Create a new API project
-- Install
-- Define models
-- Define the DbContext
-- Add services and middleware
-- Seed the database
-- Start the API
-
-This page will walk you through the **simplest** use case. More detailed examples can be found in the detailed usage subsections.
-
-### Create a new API project
-
-```
-mkdir MyApi
-cd MyApi
-dotnet new webapi
-```
-
-### Install
-
-```
-dotnet add package JsonApiDotNetCore
-
-- or -
-
-Install-Package JsonApiDotNetCore
-```
-
-### Define models
-
-Define your domain models such that they implement `IIdentifiable`.
-The easiest way to do this is to inherit from `Identifiable`.
-
-```c#
-#nullable enable
-
-[Resource]
-public class Person : Identifiable
-{
- [Attr]
- public string Name { get; set; } = null!;
-}
-```
-
-### Define the DbContext
-
-Nothing special here, just an ordinary `DbContext`.
-
-```
-public class AppDbContext : DbContext
-{
- public DbSet People => Set();
-
- public AppDbContext(DbContextOptions options)
- : base(options)
- {
- }
-}
-```
-
-### Add services and middleware
-
-Finally, register the services and middleware by adding them to your Program.cs:
-
-```c#
-WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
-
-// Add services to the container.
-
-// Add the Entity Framework Core DbContext like you normally would.
-builder.Services.AddDbContext(options =>
-{
- string connectionString = GetConnectionString();
-
- // Use whatever provider you want, this is just an example.
- options.UseNpgsql(connectionString);
-});
-
-// Add JsonApiDotNetCore services.
-builder.Services.AddJsonApi();
-
-WebApplication app = builder.Build();
-
-// Configure the HTTP request pipeline.
-
-app.UseRouting();
-
-// Add JsonApiDotNetCore middleware.
-app.UseJsonApi();
-
-app.MapControllers();
-
-app.Run();
-```
-
-### Seed the database
-
-One way to seed the database is from your Program.cs:
-
-```c#
-await CreateDatabaseAsync(app.Services);
-
-app.Run();
-
-static async Task CreateDatabaseAsync(IServiceProvider serviceProvider)
-{
- await using AsyncServiceScope scope = serviceProvider.CreateAsyncScope();
-
- var dbContext = scope.ServiceProvider.GetRequiredService();
- await dbContext.Database.EnsureCreatedAsync();
-
- if (!dbContext.People.Any())
- {
- dbContext.People.Add(new Person
- {
- Name = "John Doe"
- });
-
- await dbContext.SaveChangesAsync();
- }
-}
-```
-
-### Start the API
-
-```
-dotnet run
-curl http://localhost:5000/people
-```
+---
+redirect_url: index.html
+---
diff --git a/docs/getting-started/toc.md b/docs/getting-started/toc.md
deleted file mode 100644
index 12f943b7f..000000000
--- a/docs/getting-started/toc.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# [Installation](install.md)
-
-# [Step By Step](step-by-step.md)
-
-# [FAQ](faq.md)
diff --git a/docs/home/assets/img/araxis-logo.png b/docs/home/assets/img/araxis-logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..b25ed12ab84ac5839b693f0e99e4a2f8958b03c4
GIT binary patch
literal 2502
zcmdT`30G5D5{`{5qM$&l2-tEESu_a*j7Zo9iI7F4#n3DPBpWdhk`NNZZW}~Vr$Kg{
zMzDn_7zkj1K!VbUAPS1o$RYwNON4;n*da$TIxn`znfV7Z=e+ywt$VA!s`~1_I`7<%
zhy4un&GbPakO3Nn3IY3xT_4fA$ff{nweBVcjwQL0ZM{4V^xYE?074vvL$FMY
zqcai^i5^y8fDyo2v+ZEz>CPrcBLb1WUo`;9!|FJP!$LSX@OV5Z&l$>OQypNguC5M_
zP7Y2^5I_Txki_5+5+RI)onHZvlmrr+#^TVJ3`-3lfym@?Jgm4}8W|Byh=vo%WH^LK
za3(`wFfsu`AUne#WM^lx3mmrJDH=w!`s$uTi~hHNM#5Jb074uzCk`;Eqb6j{8WF&z
zQGh5kE2$bSUp`PUARE3o>;jE1If>{1v2r96N;a6!p>5JkTVDkG701I2Tdcr)&;KR`!PluN5E>e~b)l
zzSfzG)@sU)_|ea(=3#Kp=7rg)5_S8==7j!$XLn-7eUCid+}y;9t;gC!Co}B`?NxiS
z@_vspTAOij(}peHjv;G1{cem^8k14^fzU`kp3Hb)(pk%YVFRF#YG$tC{{<`jL$-THC=99y=9KyAeUX
zR8}F<*A9hAos*2O2Bl*LO#+eA%5JGNW+tj*0Kkww@P4qZdPk>Wc2Mz4s_y!qN)=7X
zkLTW>(pFGAF8Xywz3(xjaf9sUXHLdCw?2t;A-s8Y#1y;(kMT<+`U`4XZw){Bg)et{
z%Qw5b%t)%DKDE-0rTc3^a=alKW5&4Zi^rrECsNX2ibwo9O>P1;&X-m-fV!ef!i&EWv2)&zdS^4?=+Ip%Tv~i_vy%?#eR7|f+$h@BN
zC{e`v=YDGC0p5A>%9M|9pE=0Eb?2_Lt4)GluBkY^Lgn)vAxS5;P!|fg<3e7Kq*vZc
z0`ICiH$I6_kMKRqrW&hK3fYxI*oB)mqcKS<4V-u3V#C+j(@yr2&Tr$?(6LHyhW*fLL3?1NKQebhC5l6oOsHSZc7GkBO{`Qty}xTil;FF>#}@
z-;KBre`=BtRo_$W48l*=J^WBCa|0^-=Yqo>z5v^p9Gc}LfsFH{Ng~L-8{P-H^Gl6Xc(M$e`8_emd<8H97sJ)`FXYUVW|*3L808GbufN(46nc
z-JZ$l!$2}d#O6;iq1~#Z_bCH`lXd7}kvurFO>tTRFTzW2jml2Xo90`)
ziYe8`%5^Z&vkSw3gXHbtRR<7=Ful-z3Rr&aZ<@|IcC=u79WLy
zdy_8?n=6343qGX#_eEndnZ?+0qxLOWRSyb>|5fb$w6Z||JyNn&HIvhlSEH~4inPxX
z510UrFx+OBfbU^hivE0D%>k^U9{SRF#3fdB$#Any{IqdND%awN!534AboL4fj$Q}|
z0Xk-i?1TJnv&)cmF}nYZ>6_0A6+o^WrfmBjQA#c2f9hO!osH>Ay>e3DSk5+SrW@Z(
zjelSRE#5sYcnoXzBJ#?D(Bb;xmHe%B`rpB-KO~3W{{|n*Ou@|LNb%)e@tu#MV=!1umq61O
+
+