diff --git a/JsonApiDotnetCore.sln b/JsonApiDotnetCore.sln
index d046b23819..bad0e19743 100644
--- a/JsonApiDotnetCore.sln
+++ b/JsonApiDotnetCore.sln
@@ -45,7 +45,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceEntitySeparationExa
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ResourceEntitySeparationExampleTests", "test\ResourceEntitySeparationExampleTests\ResourceEntitySeparationExampleTests.csproj", "{6DFA30D7-1679-4333-9779-6FB678E48EF5}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GettingStarted", "src\Examples\GettingStarted\GettingStarted.csproj", "{9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GettingStarted", "src\Examples\GettingStarted\GettingStarted.csproj", "{DF9BFD82-D937-4907-B0B4-64670417115F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DiscoveryTests", "test\DiscoveryTests\DiscoveryTests.csproj", "{09C0C8D8-B721-4955-8889-55CB149C3B5C}"
EndProject
@@ -190,19 +190,7 @@ Global
{6DFA30D7-1679-4333-9779-6FB678E48EF5}.Release|x64.ActiveCfg = Release|Any CPU
{6DFA30D7-1679-4333-9779-6FB678E48EF5}.Release|x64.Build.0 = Release|Any CPU
{6DFA30D7-1679-4333-9779-6FB678E48EF5}.Release|x86.ActiveCfg = Release|Any CPU
- {6DFA30D7-1679-4333-9779-6FB678E48EF5}.Release|x86.Build.0 = Release|Any CPU
- {9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71}.Debug|x64.ActiveCfg = Debug|Any CPU
- {9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71}.Debug|x64.Build.0 = Debug|Any CPU
- {9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71}.Debug|x86.ActiveCfg = Debug|Any CPU
- {9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71}.Debug|x86.Build.0 = Debug|Any CPU
- {9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71}.Release|Any CPU.Build.0 = Release|Any CPU
- {9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71}.Release|x64.ActiveCfg = Release|Any CPU
- {9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71}.Release|x64.Build.0 = Release|Any CPU
- {9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71}.Release|x86.ActiveCfg = Release|Any CPU
- {9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71}.Release|x86.Build.0 = Release|Any CPU
+ {6DFA30D7-1679-4333-9779-6FB678E48EF5}.Release|x86.Build.0 = Release|Any CPU\
{09C0C8D8-B721-4955-8889-55CB149C3B5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{09C0C8D8-B721-4955-8889-55CB149C3B5C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{09C0C8D8-B721-4955-8889-55CB149C3B5C}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -233,7 +221,6 @@ Global
{9CD2C116-D133-4FE4-97DA-A9FEAFF045F1} = {24B15015-62E5-42E1-9BA0-ECE6BE7AA15F}
{F4097194-9415-418A-AB4E-315C5D5466AF} = {026FBC6C-AF76-4568-9B87-EC73457899FD}
{6DFA30D7-1679-4333-9779-6FB678E48EF5} = {24B15015-62E5-42E1-9BA0-ECE6BE7AA15F}
- {9B2A5AD7-0BF4-472E-A1B4-8BB623FDEB71} = {026FBC6C-AF76-4568-9B87-EC73457899FD}
{09C0C8D8-B721-4955-8889-55CB149C3B5C} = {24B15015-62E5-42E1-9BA0-ECE6BE7AA15F}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 0000000000..cb579d6eda
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,2 @@
+_site/
+*.manifest
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000000..9f51f25945
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,6 @@
+# Running
+
+```
+./generate.sh
+docfx ./docfx.json --serve
+```
\ No newline at end of file
diff --git a/docs/api/.gitignore b/docs/api/.gitignore
new file mode 100644
index 0000000000..da7c71b83a
--- /dev/null
+++ b/docs/api/.gitignore
@@ -0,0 +1,4 @@
+###############
+# temp file #
+###############
+*.yml
diff --git a/src/JsonApiDotNetCore/api/.manifest b/docs/api/.manifest
similarity index 78%
rename from src/JsonApiDotNetCore/api/.manifest
rename to docs/api/.manifest
index caadae227a..4f84cc2e02 100644
--- a/src/JsonApiDotNetCore/api/.manifest
+++ b/docs/api/.manifest
@@ -1,41 +1,36 @@
{
"JsonApiDotNetCore.Builders": "JsonApiDotNetCore.Builders.yml",
- "JsonApiDotNetCore.Builders.ResourceGraphBuilder": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
- "JsonApiDotNetCore.Builders.ResourceGraphBuilder.AddDbContext``1": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
- "JsonApiDotNetCore.Builders.ResourceGraphBuilder.AddResource``1(System.String)": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
- "JsonApiDotNetCore.Builders.ResourceGraphBuilder.AddResource``2(System.String)": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
- "JsonApiDotNetCore.Builders.ResourceGraphBuilder.Build": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
- "JsonApiDotNetCore.Builders.ResourceGraphBuilder.DocumentLinks": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
- "JsonApiDotNetCore.Builders.ResourceGraphBuilder.GetAttributes(System.Type)": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
- "JsonApiDotNetCore.Builders.ResourceGraphBuilder.GetRelationships(System.Type)": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
- "JsonApiDotNetCore.Builders.ResourceGraphBuilder.GetRelationshipType(JsonApiDotNetCore.Models.RelationshipAttribute,System.Reflection.PropertyInfo)": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
"JsonApiDotNetCore.Builders.DocumentBuilder": "JsonApiDotNetCore.Builders.DocumentBuilder.yml",
- "JsonApiDotNetCore.Builders.DocumentBuilder.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Services.IRequestMeta,JsonApiDotNetCore.Builders.IDocumentBuilderOptionsProvider)": "JsonApiDotNetCore.Builders.DocumentBuilder.yml",
+ "JsonApiDotNetCore.Builders.DocumentBuilder.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Services.IRequestMeta,JsonApiDotNetCore.Builders.IDocumentBuilderOptionsProvider,JsonApiDotNetCore.Services.IScopedServiceProvider)": "JsonApiDotNetCore.Builders.DocumentBuilder.yml",
"JsonApiDotNetCore.Builders.DocumentBuilder.Build(JsonApiDotNetCore.Models.IIdentifiable)": "JsonApiDotNetCore.Builders.DocumentBuilder.yml",
"JsonApiDotNetCore.Builders.DocumentBuilder.Build(System.Collections.Generic.IEnumerable{JsonApiDotNetCore.Models.IIdentifiable})": "JsonApiDotNetCore.Builders.DocumentBuilder.yml",
"JsonApiDotNetCore.Builders.DocumentBuilder.GetData(JsonApiDotNetCore.Internal.ContextEntity,JsonApiDotNetCore.Models.IIdentifiable)": "JsonApiDotNetCore.Builders.DocumentBuilder.yml",
+ "JsonApiDotNetCore.Builders.DocumentBuilder.GetData(JsonApiDotNetCore.Internal.ContextEntity,JsonApiDotNetCore.Models.IIdentifiable,JsonApiDotNetCore.Models.IResourceDefinition)": "JsonApiDotNetCore.Builders.DocumentBuilder.yml",
"JsonApiDotNetCore.Builders.DocumentBuilderOptions": "JsonApiDotNetCore.Builders.DocumentBuilderOptions.yml",
"JsonApiDotNetCore.Builders.DocumentBuilderOptions.#ctor(System.Boolean)": "JsonApiDotNetCore.Builders.DocumentBuilderOptions.yml",
"JsonApiDotNetCore.Builders.DocumentBuilderOptions.OmitNullValuedAttributes": "JsonApiDotNetCore.Builders.DocumentBuilderOptions.yml",
"JsonApiDotNetCore.Builders.DocumentBuilderOptionsProvider": "JsonApiDotNetCore.Builders.DocumentBuilderOptionsProvider.yml",
"JsonApiDotNetCore.Builders.DocumentBuilderOptionsProvider.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,Microsoft.AspNetCore.Http.IHttpContextAccessor)": "JsonApiDotNetCore.Builders.DocumentBuilderOptionsProvider.yml",
"JsonApiDotNetCore.Builders.DocumentBuilderOptionsProvider.GetDocumentBuilderOptions": "JsonApiDotNetCore.Builders.DocumentBuilderOptionsProvider.yml",
- "JsonApiDotNetCore.Builders.IResourceGraphBuilder": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
- "JsonApiDotNetCore.Builders.IResourceGraphBuilder.AddDbContext``1": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
- "JsonApiDotNetCore.Builders.IResourceGraphBuilder.AddResource``1(System.String)": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
- "JsonApiDotNetCore.Builders.IResourceGraphBuilder.AddResource``2(System.String)": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
- "JsonApiDotNetCore.Builders.IResourceGraphBuilder.Build": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
- "JsonApiDotNetCore.Builders.IResourceGraphBuilder.DocumentLinks": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
"JsonApiDotNetCore.Builders.IDocumentBuilder": "JsonApiDotNetCore.Builders.IDocumentBuilder.yml",
"JsonApiDotNetCore.Builders.IDocumentBuilder.Build(JsonApiDotNetCore.Models.IIdentifiable)": "JsonApiDotNetCore.Builders.IDocumentBuilder.yml",
"JsonApiDotNetCore.Builders.IDocumentBuilder.Build(System.Collections.Generic.IEnumerable{JsonApiDotNetCore.Models.IIdentifiable})": "JsonApiDotNetCore.Builders.IDocumentBuilder.yml",
"JsonApiDotNetCore.Builders.IDocumentBuilder.GetData(JsonApiDotNetCore.Internal.ContextEntity,JsonApiDotNetCore.Models.IIdentifiable)": "JsonApiDotNetCore.Builders.IDocumentBuilder.yml",
+ "JsonApiDotNetCore.Builders.IDocumentBuilder.GetData(JsonApiDotNetCore.Internal.ContextEntity,JsonApiDotNetCore.Models.IIdentifiable,JsonApiDotNetCore.Models.IResourceDefinition)": "JsonApiDotNetCore.Builders.IDocumentBuilder.yml",
"JsonApiDotNetCore.Builders.IDocumentBuilderOptionsProvider": "JsonApiDotNetCore.Builders.IDocumentBuilderOptionsProvider.yml",
"JsonApiDotNetCore.Builders.IDocumentBuilderOptionsProvider.GetDocumentBuilderOptions": "JsonApiDotNetCore.Builders.IDocumentBuilderOptionsProvider.yml",
"JsonApiDotNetCore.Builders.IMetaBuilder": "JsonApiDotNetCore.Builders.IMetaBuilder.yml",
"JsonApiDotNetCore.Builders.IMetaBuilder.Add(System.Collections.Generic.Dictionary{System.String,System.Object})": "JsonApiDotNetCore.Builders.IMetaBuilder.yml",
"JsonApiDotNetCore.Builders.IMetaBuilder.Add(System.String,System.Object)": "JsonApiDotNetCore.Builders.IMetaBuilder.yml",
"JsonApiDotNetCore.Builders.IMetaBuilder.Build": "JsonApiDotNetCore.Builders.IMetaBuilder.yml",
+ "JsonApiDotNetCore.Builders.IResourceGraphBuilder": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.IResourceGraphBuilder.AddDbContext``1": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.IResourceGraphBuilder.AddResource(System.Type,System.Type,System.String)": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.IResourceGraphBuilder.AddResource``1(System.String)": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.IResourceGraphBuilder.AddResource``2(System.String)": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.IResourceGraphBuilder.Build": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.IResourceGraphBuilder.DocumentLinks": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.IResourceGraphBuilder.UseNameFormatter(JsonApiDotNetCore.Graph.IResourceNameFormatter)": "JsonApiDotNetCore.Builders.IResourceGraphBuilder.yml",
"JsonApiDotNetCore.Builders.LinkBuilder": "JsonApiDotNetCore.Builders.LinkBuilder.yml",
"JsonApiDotNetCore.Builders.LinkBuilder.#ctor(JsonApiDotNetCore.Services.IJsonApiContext)": "JsonApiDotNetCore.Builders.LinkBuilder.yml",
"JsonApiDotNetCore.Builders.LinkBuilder.GetBasePath(Microsoft.AspNetCore.Http.HttpContext,System.String)": "JsonApiDotNetCore.Builders.LinkBuilder.yml",
@@ -46,13 +41,23 @@
"JsonApiDotNetCore.Builders.MetaBuilder.Add(System.Collections.Generic.Dictionary{System.String,System.Object})": "JsonApiDotNetCore.Builders.MetaBuilder.yml",
"JsonApiDotNetCore.Builders.MetaBuilder.Add(System.String,System.Object)": "JsonApiDotNetCore.Builders.MetaBuilder.yml",
"JsonApiDotNetCore.Builders.MetaBuilder.Build": "JsonApiDotNetCore.Builders.MetaBuilder.yml",
+ "JsonApiDotNetCore.Builders.ResourceGraphBuilder": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.ResourceGraphBuilder.AddDbContext``1": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.ResourceGraphBuilder.AddResource(System.Type,System.Type,System.String)": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.ResourceGraphBuilder.AddResource``1(System.String)": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.ResourceGraphBuilder.AddResource``2(System.String)": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.ResourceGraphBuilder.Build": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.ResourceGraphBuilder.DocumentLinks": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.ResourceGraphBuilder.GetAttributes(System.Type)": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.ResourceGraphBuilder.GetRelationships(System.Type)": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.ResourceGraphBuilder.GetRelationshipType(JsonApiDotNetCore.Models.RelationshipAttribute,System.Reflection.PropertyInfo)": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
+ "JsonApiDotNetCore.Builders.ResourceGraphBuilder.UseNameFormatter(JsonApiDotNetCore.Graph.IResourceNameFormatter)": "JsonApiDotNetCore.Builders.ResourceGraphBuilder.yml",
"JsonApiDotNetCore.Configuration": "JsonApiDotNetCore.Configuration.yml",
"JsonApiDotNetCore.Configuration.JsonApiOptions": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
"JsonApiDotNetCore.Configuration.JsonApiOptions.AllowClientGeneratedIds": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
"JsonApiDotNetCore.Configuration.JsonApiOptions.AllowCustomQueryParameters": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
"JsonApiDotNetCore.Configuration.JsonApiOptions.BuildResourceGraph(System.Action{JsonApiDotNetCore.Builders.IResourceGraphBuilder})": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
"JsonApiDotNetCore.Configuration.JsonApiOptions.BuildResourceGraph``1(System.Action{JsonApiDotNetCore.Builders.IResourceGraphBuilder})": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
- "JsonApiDotNetCore.Configuration.JsonApiOptions.ResourceGraph": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
"JsonApiDotNetCore.Configuration.JsonApiOptions.DefaultPageSize": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
"JsonApiDotNetCore.Configuration.JsonApiOptions.DisableErrorSource": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
"JsonApiDotNetCore.Configuration.JsonApiOptions.DisableErrorStackTraces": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
@@ -62,8 +67,12 @@
"JsonApiDotNetCore.Configuration.JsonApiOptions.JsonContractResolver": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
"JsonApiDotNetCore.Configuration.JsonApiOptions.Namespace": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
"JsonApiDotNetCore.Configuration.JsonApiOptions.NullAttributeResponseBehavior": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
+ "JsonApiDotNetCore.Configuration.JsonApiOptions.RelatedIdMapper": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
"JsonApiDotNetCore.Configuration.JsonApiOptions.RelativeLinks": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
+ "JsonApiDotNetCore.Configuration.JsonApiOptions.ResourceGraph": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
+ "JsonApiDotNetCore.Configuration.JsonApiOptions.ResourceNameFormatter": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
"JsonApiDotNetCore.Configuration.JsonApiOptions.SerializerSettings": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
+ "JsonApiDotNetCore.Configuration.JsonApiOptions.ValidateModelState": "JsonApiDotNetCore.Configuration.JsonApiOptions.yml",
"JsonApiDotNetCore.Configuration.NullAttributeResponseBehavior": "JsonApiDotNetCore.Configuration.NullAttributeResponseBehavior.yml",
"JsonApiDotNetCore.Configuration.NullAttributeResponseBehavior.#ctor(System.Boolean,System.Boolean)": "JsonApiDotNetCore.Configuration.NullAttributeResponseBehavior.yml",
"JsonApiDotNetCore.Configuration.NullAttributeResponseBehavior.AllowClientOverride": "JsonApiDotNetCore.Configuration.NullAttributeResponseBehavior.yml",
@@ -83,7 +92,7 @@
"JsonApiDotNetCore.Controllers.BaseJsonApiController`2.GetRelationshipAsync(`1,System.String)": "JsonApiDotNetCore.Controllers.BaseJsonApiController-2.yml",
"JsonApiDotNetCore.Controllers.BaseJsonApiController`2.GetRelationshipsAsync(`1,System.String)": "JsonApiDotNetCore.Controllers.BaseJsonApiController-2.yml",
"JsonApiDotNetCore.Controllers.BaseJsonApiController`2.PatchAsync(`1,`0)": "JsonApiDotNetCore.Controllers.BaseJsonApiController-2.yml",
- "JsonApiDotNetCore.Controllers.BaseJsonApiController`2.PatchRelationshipsAsync(`1,System.String,System.Collections.Generic.List{JsonApiDotNetCore.Models.DocumentData})": "JsonApiDotNetCore.Controllers.BaseJsonApiController-2.yml",
+ "JsonApiDotNetCore.Controllers.BaseJsonApiController`2.PatchRelationshipsAsync(`1,System.String,System.Collections.Generic.List{JsonApiDotNetCore.Models.ResourceObject})": "JsonApiDotNetCore.Controllers.BaseJsonApiController-2.yml",
"JsonApiDotNetCore.Controllers.BaseJsonApiController`2.PostAsync(`0)": "JsonApiDotNetCore.Controllers.BaseJsonApiController-2.yml",
"JsonApiDotNetCore.Controllers.DisableQueryAttribute": "JsonApiDotNetCore.Controllers.DisableQueryAttribute.yml",
"JsonApiDotNetCore.Controllers.DisableQueryAttribute.#ctor(JsonApiDotNetCore.Controllers.QueryParams)": "JsonApiDotNetCore.Controllers.DisableQueryAttribute.yml",
@@ -100,10 +109,11 @@
"JsonApiDotNetCore.Controllers.JsonApiCmdController`2.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Services.IResourceService{`0,`1})": "JsonApiDotNetCore.Controllers.JsonApiCmdController-2.yml",
"JsonApiDotNetCore.Controllers.JsonApiCmdController`2.DeleteAsync(`1)": "JsonApiDotNetCore.Controllers.JsonApiCmdController-2.yml",
"JsonApiDotNetCore.Controllers.JsonApiCmdController`2.PatchAsync(`1,`0)": "JsonApiDotNetCore.Controllers.JsonApiCmdController-2.yml",
- "JsonApiDotNetCore.Controllers.JsonApiCmdController`2.PatchRelationshipsAsync(`1,System.String,System.Collections.Generic.List{JsonApiDotNetCore.Models.DocumentData})": "JsonApiDotNetCore.Controllers.JsonApiCmdController-2.yml",
+ "JsonApiDotNetCore.Controllers.JsonApiCmdController`2.PatchRelationshipsAsync(`1,System.String,System.Collections.Generic.List{JsonApiDotNetCore.Models.ResourceObject})": "JsonApiDotNetCore.Controllers.JsonApiCmdController-2.yml",
"JsonApiDotNetCore.Controllers.JsonApiCmdController`2.PostAsync(`0)": "JsonApiDotNetCore.Controllers.JsonApiCmdController-2.yml",
"JsonApiDotNetCore.Controllers.JsonApiController`1": "JsonApiDotNetCore.Controllers.JsonApiController-1.yml",
"JsonApiDotNetCore.Controllers.JsonApiController`1.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Services.IGetAllService{`0,System.Int32},JsonApiDotNetCore.Services.IGetByIdService{`0,System.Int32},JsonApiDotNetCore.Services.IGetRelationshipService{`0,System.Int32},JsonApiDotNetCore.Services.IGetRelationshipsService{`0,System.Int32},JsonApiDotNetCore.Services.ICreateService{`0,System.Int32},JsonApiDotNetCore.Services.IUpdateService{`0,System.Int32},JsonApiDotNetCore.Services.IUpdateRelationshipService{`0,System.Int32},JsonApiDotNetCore.Services.IDeleteService{`0,System.Int32})": "JsonApiDotNetCore.Controllers.JsonApiController-1.yml",
+ "JsonApiDotNetCore.Controllers.JsonApiController`1.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Services.IResourceService{`0,System.Int32})": "JsonApiDotNetCore.Controllers.JsonApiController-1.yml",
"JsonApiDotNetCore.Controllers.JsonApiController`1.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Services.IResourceService{`0,System.Int32},Microsoft.Extensions.Logging.ILoggerFactory)": "JsonApiDotNetCore.Controllers.JsonApiController-1.yml",
"JsonApiDotNetCore.Controllers.JsonApiController`2": "JsonApiDotNetCore.Controllers.JsonApiController-2.yml",
"JsonApiDotNetCore.Controllers.JsonApiController`2.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Services.IGetAllService{`0,`1},JsonApiDotNetCore.Services.IGetByIdService{`0,`1},JsonApiDotNetCore.Services.IGetRelationshipService{`0,`1},JsonApiDotNetCore.Services.IGetRelationshipsService{`0,`1},JsonApiDotNetCore.Services.ICreateService{`0,`1},JsonApiDotNetCore.Services.IUpdateService{`0,`1},JsonApiDotNetCore.Services.IUpdateRelationshipService{`0,`1},JsonApiDotNetCore.Services.IDeleteService{`0,`1})": "JsonApiDotNetCore.Controllers.JsonApiController-2.yml",
@@ -115,13 +125,12 @@
"JsonApiDotNetCore.Controllers.JsonApiController`2.GetRelationshipAsync(`1,System.String)": "JsonApiDotNetCore.Controllers.JsonApiController-2.yml",
"JsonApiDotNetCore.Controllers.JsonApiController`2.GetRelationshipsAsync(`1,System.String)": "JsonApiDotNetCore.Controllers.JsonApiController-2.yml",
"JsonApiDotNetCore.Controllers.JsonApiController`2.PatchAsync(`1,`0)": "JsonApiDotNetCore.Controllers.JsonApiController-2.yml",
- "JsonApiDotNetCore.Controllers.JsonApiController`2.PatchRelationshipsAsync(`1,System.String,System.Collections.Generic.List{JsonApiDotNetCore.Models.DocumentData})": "JsonApiDotNetCore.Controllers.JsonApiController-2.yml",
+ "JsonApiDotNetCore.Controllers.JsonApiController`2.PatchRelationshipsAsync(`1,System.String,System.Collections.Generic.List{JsonApiDotNetCore.Models.ResourceObject})": "JsonApiDotNetCore.Controllers.JsonApiController-2.yml",
"JsonApiDotNetCore.Controllers.JsonApiController`2.PostAsync(`0)": "JsonApiDotNetCore.Controllers.JsonApiController-2.yml",
"JsonApiDotNetCore.Controllers.JsonApiControllerMixin": "JsonApiDotNetCore.Controllers.JsonApiControllerMixin.yml",
"JsonApiDotNetCore.Controllers.JsonApiControllerMixin.Error(JsonApiDotNetCore.Internal.Error)": "JsonApiDotNetCore.Controllers.JsonApiControllerMixin.yml",
"JsonApiDotNetCore.Controllers.JsonApiControllerMixin.Errors(JsonApiDotNetCore.Internal.ErrorCollection)": "JsonApiDotNetCore.Controllers.JsonApiControllerMixin.yml",
"JsonApiDotNetCore.Controllers.JsonApiControllerMixin.Forbidden": "JsonApiDotNetCore.Controllers.JsonApiControllerMixin.yml",
- "JsonApiDotNetCore.Controllers.JsonApiControllerMixin.UnprocessableEntity": "JsonApiDotNetCore.Controllers.JsonApiControllerMixin.yml",
"JsonApiDotNetCore.Controllers.JsonApiOperationsController": "JsonApiDotNetCore.Controllers.JsonApiOperationsController.yml",
"JsonApiDotNetCore.Controllers.JsonApiOperationsController.#ctor(JsonApiDotNetCore.Services.Operations.IOperationsProcessor)": "JsonApiDotNetCore.Controllers.JsonApiOperationsController.yml",
"JsonApiDotNetCore.Controllers.JsonApiOperationsController.PatchAsync(JsonApiDotNetCore.Models.Operations.OperationsDocument)": "JsonApiDotNetCore.Controllers.JsonApiOperationsController.yml",
@@ -153,12 +162,16 @@
"JsonApiDotNetCore.Data.DbContextResolver`1.GetContext": "JsonApiDotNetCore.Data.DbContextResolver-1.yml",
"JsonApiDotNetCore.Data.DbContextResolver`1.GetDbSet``1": "JsonApiDotNetCore.Data.DbContextResolver-1.yml",
"JsonApiDotNetCore.Data.DefaultEntityRepository`1": "JsonApiDotNetCore.Data.DefaultEntityRepository-1.yml",
- "JsonApiDotNetCore.Data.DefaultEntityRepository`1.#ctor(Microsoft.Extensions.Logging.ILoggerFactory,JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Data.IDbContextResolver)": "JsonApiDotNetCore.Data.DefaultEntityRepository-1.yml",
+ "JsonApiDotNetCore.Data.DefaultEntityRepository`1.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Data.IDbContextResolver,JsonApiDotNetCore.Models.ResourceDefinition{`0})": "JsonApiDotNetCore.Data.DefaultEntityRepository-1.yml",
+ "JsonApiDotNetCore.Data.DefaultEntityRepository`1.#ctor(Microsoft.Extensions.Logging.ILoggerFactory,JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Data.IDbContextResolver,JsonApiDotNetCore.Models.ResourceDefinition{`0})": "JsonApiDotNetCore.Data.DefaultEntityRepository-1.yml",
"JsonApiDotNetCore.Data.DefaultEntityRepository`2": "JsonApiDotNetCore.Data.DefaultEntityRepository-2.yml",
- "JsonApiDotNetCore.Data.DefaultEntityRepository`2.#ctor(Microsoft.Extensions.Logging.ILoggerFactory,JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Data.IDbContextResolver)": "JsonApiDotNetCore.Data.DefaultEntityRepository-2.yml",
+ "JsonApiDotNetCore.Data.DefaultEntityRepository`2.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Data.IDbContextResolver,JsonApiDotNetCore.Models.ResourceDefinition{`0})": "JsonApiDotNetCore.Data.DefaultEntityRepository-2.yml",
+ "JsonApiDotNetCore.Data.DefaultEntityRepository`2.#ctor(Microsoft.Extensions.Logging.ILoggerFactory,JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Data.IDbContextResolver,JsonApiDotNetCore.Models.ResourceDefinition{`0})": "JsonApiDotNetCore.Data.DefaultEntityRepository-2.yml",
+ "JsonApiDotNetCore.Data.DefaultEntityRepository`2.AttachRelationships(`0)": "JsonApiDotNetCore.Data.DefaultEntityRepository-2.yml",
"JsonApiDotNetCore.Data.DefaultEntityRepository`2.CountAsync(System.Linq.IQueryable{`0})": "JsonApiDotNetCore.Data.DefaultEntityRepository-2.yml",
"JsonApiDotNetCore.Data.DefaultEntityRepository`2.CreateAsync(`0)": "JsonApiDotNetCore.Data.DefaultEntityRepository-2.yml",
"JsonApiDotNetCore.Data.DefaultEntityRepository`2.DeleteAsync(`1)": "JsonApiDotNetCore.Data.DefaultEntityRepository-2.yml",
+ "JsonApiDotNetCore.Data.DefaultEntityRepository`2.DetachRelationshipPointers(`0)": "JsonApiDotNetCore.Data.DefaultEntityRepository-2.yml",
"JsonApiDotNetCore.Data.DefaultEntityRepository`2.Filter(System.Linq.IQueryable{`0},JsonApiDotNetCore.Internal.Query.FilterQuery)": "JsonApiDotNetCore.Data.DefaultEntityRepository-2.yml",
"JsonApiDotNetCore.Data.DefaultEntityRepository`2.FirstOrDefaultAsync(System.Linq.IQueryable{`0})": "JsonApiDotNetCore.Data.DefaultEntityRepository-2.yml",
"JsonApiDotNetCore.Data.DefaultEntityRepository`2.Get": "JsonApiDotNetCore.Data.DefaultEntityRepository-2.yml",
@@ -195,7 +208,10 @@
"JsonApiDotNetCore.Data.IEntityWriteRepository`2.UpdateRelationshipsAsync(System.Object,JsonApiDotNetCore.Models.RelationshipAttribute,System.Collections.Generic.IEnumerable{System.String})": "JsonApiDotNetCore.Data.IEntityWriteRepository-2.yml",
"JsonApiDotNetCore.Extensions": "JsonApiDotNetCore.Extensions.yml",
"JsonApiDotNetCore.Extensions.DbContextExtensions": "JsonApiDotNetCore.Extensions.DbContextExtensions.yml",
+ "JsonApiDotNetCore.Extensions.DbContextExtensions.EntityIsTracked(Microsoft.EntityFrameworkCore.DbContext,JsonApiDotNetCore.Models.IIdentifiable)": "JsonApiDotNetCore.Extensions.DbContextExtensions.yml",
+ "JsonApiDotNetCore.Extensions.DbContextExtensions.GetCurrentOrCreateTransactionAsync(Microsoft.EntityFrameworkCore.DbContext)": "JsonApiDotNetCore.Extensions.DbContextExtensions.yml",
"JsonApiDotNetCore.Extensions.DbContextExtensions.GetDbSet``1(Microsoft.EntityFrameworkCore.DbContext)": "JsonApiDotNetCore.Extensions.DbContextExtensions.yml",
+ "JsonApiDotNetCore.Extensions.DbContextExtensions.Set(Microsoft.EntityFrameworkCore.DbContext,System.Type)": "JsonApiDotNetCore.Extensions.DbContextExtensions.yml",
"JsonApiDotNetCore.Extensions.IApplicationBuilderExtensions": "JsonApiDotNetCore.Extensions.IApplicationBuilderExtensions.yml",
"JsonApiDotNetCore.Extensions.IApplicationBuilderExtensions.UseJsonApi(Microsoft.AspNetCore.Builder.IApplicationBuilder,System.Boolean)": "JsonApiDotNetCore.Extensions.IApplicationBuilderExtensions.yml",
"JsonApiDotNetCore.Extensions.IQueryableExtensions": "JsonApiDotNetCore.Extensions.IQueryableExtensions.yml",
@@ -212,13 +228,17 @@
"JsonApiDotNetCore.Extensions.IQueryableExtensions.ThenBy``1(System.Linq.IOrderedQueryable{``0},System.String)": "JsonApiDotNetCore.Extensions.IQueryableExtensions.yml",
"JsonApiDotNetCore.Extensions.IQueryableExtensions.ThenByDescending``1(System.Linq.IOrderedQueryable{``0},System.String)": "JsonApiDotNetCore.Extensions.IQueryableExtensions.yml",
"JsonApiDotNetCore.Extensions.IServiceCollectionExtensions": "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.yml",
- "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.AddJsonApi(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{JsonApiDotNetCore.Configuration.JsonApiOptions},Microsoft.Extensions.DependencyInjection.IMvcBuilder)": "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.yml",
+ "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.AddJsonApi(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{JsonApiDotNetCore.Configuration.JsonApiOptions},Microsoft.Extensions.DependencyInjection.IMvcCoreBuilder,System.Action{JsonApiDotNetCore.Graph.ServiceDiscoveryFacade})": "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.yml",
"JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.AddJsonApi``1(Microsoft.Extensions.DependencyInjection.IServiceCollection)": "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.yml",
"JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.AddJsonApi``1(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{JsonApiDotNetCore.Configuration.JsonApiOptions})": "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.yml",
- "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.AddJsonApi``1(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{JsonApiDotNetCore.Configuration.JsonApiOptions},Microsoft.Extensions.DependencyInjection.IMvcBuilder)": "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.yml",
+ "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.AddJsonApi``1(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{JsonApiDotNetCore.Configuration.JsonApiOptions},Microsoft.Extensions.DependencyInjection.IMvcCoreBuilder)": "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.yml",
"JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.AddJsonApiInternals(Microsoft.Extensions.DependencyInjection.IServiceCollection,JsonApiDotNetCore.Configuration.JsonApiOptions)": "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.yml",
"JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.AddJsonApiInternals``1(Microsoft.Extensions.DependencyInjection.IServiceCollection,JsonApiDotNetCore.Configuration.JsonApiOptions)": "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.yml",
+ "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.AddResourceService``1(Microsoft.Extensions.DependencyInjection.IServiceCollection)": "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.yml",
"JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.SerializeAsJsonApi(Microsoft.AspNetCore.Mvc.MvcOptions,JsonApiDotNetCore.Configuration.JsonApiOptions)": "JsonApiDotNetCore.Extensions.IServiceCollectionExtensions.yml",
+ "JsonApiDotNetCore.Extensions.ModelStateExtensions": "JsonApiDotNetCore.Extensions.ModelStateExtensions.yml",
+ "JsonApiDotNetCore.Extensions.ModelStateExtensions.ConvertToErrorCollection(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary)": "JsonApiDotNetCore.Extensions.ModelStateExtensions.yml",
+ "JsonApiDotNetCore.Extensions.ModelStateExtensions.ConvertToErrorCollection``1(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary,JsonApiDotNetCore.Internal.IResourceGraph)": "JsonApiDotNetCore.Extensions.ModelStateExtensions.yml",
"JsonApiDotNetCore.Extensions.StringExtensions": "JsonApiDotNetCore.Extensions.StringExtensions.yml",
"JsonApiDotNetCore.Extensions.StringExtensions.Dasherize(System.String)": "JsonApiDotNetCore.Extensions.StringExtensions.yml",
"JsonApiDotNetCore.Extensions.StringExtensions.ToProperCase(System.String)": "JsonApiDotNetCore.Extensions.StringExtensions.yml",
@@ -239,6 +259,26 @@
"JsonApiDotNetCore.Formatters.JsonApiWriter": "JsonApiDotNetCore.Formatters.JsonApiWriter.yml",
"JsonApiDotNetCore.Formatters.JsonApiWriter.#ctor(JsonApiDotNetCore.Serialization.IJsonApiSerializer,Microsoft.Extensions.Logging.ILoggerFactory)": "JsonApiDotNetCore.Formatters.JsonApiWriter.yml",
"JsonApiDotNetCore.Formatters.JsonApiWriter.WriteAsync(Microsoft.AspNetCore.Mvc.Formatters.OutputFormatterWriteContext)": "JsonApiDotNetCore.Formatters.JsonApiWriter.yml",
+ "JsonApiDotNetCore.Graph": "JsonApiDotNetCore.Graph.yml",
+ "JsonApiDotNetCore.Graph.DefaultRelatedIdMapper": "JsonApiDotNetCore.Graph.DefaultRelatedIdMapper.yml",
+ "JsonApiDotNetCore.Graph.DefaultRelatedIdMapper.GetRelatedIdPropertyName(System.String)": "JsonApiDotNetCore.Graph.DefaultRelatedIdMapper.yml",
+ "JsonApiDotNetCore.Graph.DefaultResourceNameFormatter": "JsonApiDotNetCore.Graph.DefaultResourceNameFormatter.yml",
+ "JsonApiDotNetCore.Graph.DefaultResourceNameFormatter.ApplyCasingConvention(System.String)": "JsonApiDotNetCore.Graph.DefaultResourceNameFormatter.yml",
+ "JsonApiDotNetCore.Graph.DefaultResourceNameFormatter.FormatPropertyName(System.Reflection.PropertyInfo)": "JsonApiDotNetCore.Graph.DefaultResourceNameFormatter.yml",
+ "JsonApiDotNetCore.Graph.DefaultResourceNameFormatter.FormatResourceName(System.Type)": "JsonApiDotNetCore.Graph.DefaultResourceNameFormatter.yml",
+ "JsonApiDotNetCore.Graph.IRelatedIdMapper": "JsonApiDotNetCore.Graph.IRelatedIdMapper.yml",
+ "JsonApiDotNetCore.Graph.IRelatedIdMapper.GetRelatedIdPropertyName(System.String)": "JsonApiDotNetCore.Graph.IRelatedIdMapper.yml",
+ "JsonApiDotNetCore.Graph.IResourceNameFormatter": "JsonApiDotNetCore.Graph.IResourceNameFormatter.yml",
+ "JsonApiDotNetCore.Graph.IResourceNameFormatter.ApplyCasingConvention(System.String)": "JsonApiDotNetCore.Graph.IResourceNameFormatter.yml",
+ "JsonApiDotNetCore.Graph.IResourceNameFormatter.FormatPropertyName(System.Reflection.PropertyInfo)": "JsonApiDotNetCore.Graph.IResourceNameFormatter.yml",
+ "JsonApiDotNetCore.Graph.IResourceNameFormatter.FormatResourceName(System.Type)": "JsonApiDotNetCore.Graph.IResourceNameFormatter.yml",
+ "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade": "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade.yml",
+ "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade.#ctor(Microsoft.Extensions.DependencyInjection.IServiceCollection,JsonApiDotNetCore.Builders.IResourceGraphBuilder)": "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade.yml",
+ "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade.AddAssembly(System.Reflection.Assembly)": "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade.yml",
+ "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade.AddCurrentAssembly": "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade.yml",
+ "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade.AddRepositories(System.Reflection.Assembly)": "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade.yml",
+ "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade.AddResources(System.Reflection.Assembly)": "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade.yml",
+ "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade.AddServices(System.Reflection.Assembly)": "JsonApiDotNetCore.Graph.ServiceDiscoveryFacade.yml",
"JsonApiDotNetCore.Internal": "JsonApiDotNetCore.Internal.yml",
"JsonApiDotNetCore.Internal.Constants": "JsonApiDotNetCore.Internal.Constants.yml",
"JsonApiDotNetCore.Internal.Constants.AcceptHeader": "JsonApiDotNetCore.Internal.Constants.yml",
@@ -250,23 +290,17 @@
"JsonApiDotNetCore.Internal.ContextEntity.IdentityType": "JsonApiDotNetCore.Internal.ContextEntity.yml",
"JsonApiDotNetCore.Internal.ContextEntity.Links": "JsonApiDotNetCore.Internal.ContextEntity.yml",
"JsonApiDotNetCore.Internal.ContextEntity.Relationships": "JsonApiDotNetCore.Internal.ContextEntity.yml",
- "JsonApiDotNetCore.Internal.ResourceGraph": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
- "JsonApiDotNetCore.Internal.ResourceGraph.#ctor": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
- "JsonApiDotNetCore.Internal.ResourceGraph.#ctor(System.Collections.Generic.List{JsonApiDotNetCore.Internal.ContextEntity},System.Boolean)": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
- "JsonApiDotNetCore.Internal.ResourceGraph.GetContextEntity(System.String)": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
- "JsonApiDotNetCore.Internal.ResourceGraph.GetContextEntity(System.Type)": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
- "JsonApiDotNetCore.Internal.ResourceGraph.GetRelationship``1(``0,System.String)": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
- "JsonApiDotNetCore.Internal.ResourceGraph.GetRelationshipName``1(System.String)": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
- "JsonApiDotNetCore.Internal.ResourceGraph.UsesDbContext": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
+ "JsonApiDotNetCore.Internal.ContextEntity.ResourceType": "JsonApiDotNetCore.Internal.ContextEntity.yml",
+ "JsonApiDotNetCore.Internal.ContextGraph": "JsonApiDotNetCore.Internal.ContextGraph.yml",
"JsonApiDotNetCore.Internal.DasherizedRoutingConvention": "JsonApiDotNetCore.Internal.DasherizedRoutingConvention.yml",
"JsonApiDotNetCore.Internal.DasherizedRoutingConvention.#ctor(System.String)": "JsonApiDotNetCore.Internal.DasherizedRoutingConvention.yml",
"JsonApiDotNetCore.Internal.DasherizedRoutingConvention.Apply(Microsoft.AspNetCore.Mvc.ApplicationModels.ApplicationModel)": "JsonApiDotNetCore.Internal.DasherizedRoutingConvention.yml",
"JsonApiDotNetCore.Internal.Error": "JsonApiDotNetCore.Internal.Error.yml",
"JsonApiDotNetCore.Internal.Error.#ctor": "JsonApiDotNetCore.Internal.Error.yml",
- "JsonApiDotNetCore.Internal.Error.#ctor(System.Int32,System.String,JsonApiDotNetCore.Internal.ErrorMeta,System.String)": "JsonApiDotNetCore.Internal.Error.yml",
- "JsonApiDotNetCore.Internal.Error.#ctor(System.Int32,System.String,System.String,JsonApiDotNetCore.Internal.ErrorMeta,System.String)": "JsonApiDotNetCore.Internal.Error.yml",
- "JsonApiDotNetCore.Internal.Error.#ctor(System.String,System.String,JsonApiDotNetCore.Internal.ErrorMeta,System.String)": "JsonApiDotNetCore.Internal.Error.yml",
- "JsonApiDotNetCore.Internal.Error.#ctor(System.String,System.String,System.String,JsonApiDotNetCore.Internal.ErrorMeta,System.String)": "JsonApiDotNetCore.Internal.Error.yml",
+ "JsonApiDotNetCore.Internal.Error.#ctor(System.Int32,System.String,JsonApiDotNetCore.Internal.ErrorMeta,System.Object)": "JsonApiDotNetCore.Internal.Error.yml",
+ "JsonApiDotNetCore.Internal.Error.#ctor(System.Int32,System.String,System.String,JsonApiDotNetCore.Internal.ErrorMeta,System.Object)": "JsonApiDotNetCore.Internal.Error.yml",
+ "JsonApiDotNetCore.Internal.Error.#ctor(System.String,System.String,JsonApiDotNetCore.Internal.ErrorMeta,System.Object)": "JsonApiDotNetCore.Internal.Error.yml",
+ "JsonApiDotNetCore.Internal.Error.#ctor(System.String,System.String,System.String,JsonApiDotNetCore.Internal.ErrorMeta,System.Object)": "JsonApiDotNetCore.Internal.Error.yml",
"JsonApiDotNetCore.Internal.Error.Detail": "JsonApiDotNetCore.Internal.Error.yml",
"JsonApiDotNetCore.Internal.Error.Meta": "JsonApiDotNetCore.Internal.Error.yml",
"JsonApiDotNetCore.Internal.Error.ShouldSerializeMeta": "JsonApiDotNetCore.Internal.Error.yml",
@@ -286,25 +320,24 @@
"JsonApiDotNetCore.Internal.Generics": "JsonApiDotNetCore.Internal.Generics.yml",
"JsonApiDotNetCore.Internal.Generics.GenericProcessor`1": "JsonApiDotNetCore.Internal.Generics.GenericProcessor-1.yml",
"JsonApiDotNetCore.Internal.Generics.GenericProcessor`1.#ctor(JsonApiDotNetCore.Data.IDbContextResolver)": "JsonApiDotNetCore.Internal.Generics.GenericProcessor-1.yml",
- "JsonApiDotNetCore.Internal.Generics.GenericProcessor`2": "JsonApiDotNetCore.Internal.Generics.GenericProcessor-2.yml",
- "JsonApiDotNetCore.Internal.Generics.GenericProcessor`2.#ctor(JsonApiDotNetCore.Data.IDbContextResolver)": "JsonApiDotNetCore.Internal.Generics.GenericProcessor-2.yml",
- "JsonApiDotNetCore.Internal.Generics.GenericProcessor`2.SetRelationships(System.Object,JsonApiDotNetCore.Models.RelationshipAttribute,System.Collections.Generic.IEnumerable{System.String})": "JsonApiDotNetCore.Internal.Generics.GenericProcessor-2.yml",
- "JsonApiDotNetCore.Internal.Generics.GenericProcessor`2.UpdateRelationshipsAsync(System.Object,JsonApiDotNetCore.Models.RelationshipAttribute,System.Collections.Generic.IEnumerable{System.String})": "JsonApiDotNetCore.Internal.Generics.GenericProcessor-2.yml",
+ "JsonApiDotNetCore.Internal.Generics.GenericProcessor`1.UpdateRelationshipsAsync(System.Object,JsonApiDotNetCore.Models.RelationshipAttribute,System.Collections.Generic.IEnumerable{System.String})": "JsonApiDotNetCore.Internal.Generics.GenericProcessor-1.yml",
"JsonApiDotNetCore.Internal.Generics.GenericProcessorFactory": "JsonApiDotNetCore.Internal.Generics.GenericProcessorFactory.yml",
"JsonApiDotNetCore.Internal.Generics.GenericProcessorFactory.#ctor(JsonApiDotNetCore.Services.IScopedServiceProvider)": "JsonApiDotNetCore.Internal.Generics.GenericProcessorFactory.yml",
"JsonApiDotNetCore.Internal.Generics.GenericProcessorFactory.GetProcessor``1(System.Type,System.Type)": "JsonApiDotNetCore.Internal.Generics.GenericProcessorFactory.yml",
"JsonApiDotNetCore.Internal.Generics.GenericProcessorFactory.GetProcessor``1(System.Type,System.Type,System.Type)": "JsonApiDotNetCore.Internal.Generics.GenericProcessorFactory.yml",
"JsonApiDotNetCore.Internal.Generics.IGenericProcessor": "JsonApiDotNetCore.Internal.Generics.IGenericProcessor.yml",
- "JsonApiDotNetCore.Internal.Generics.IGenericProcessor.SetRelationships(System.Object,JsonApiDotNetCore.Models.RelationshipAttribute,System.Collections.Generic.IEnumerable{System.String})": "JsonApiDotNetCore.Internal.Generics.IGenericProcessor.yml",
"JsonApiDotNetCore.Internal.Generics.IGenericProcessor.UpdateRelationshipsAsync(System.Object,JsonApiDotNetCore.Models.RelationshipAttribute,System.Collections.Generic.IEnumerable{System.String})": "JsonApiDotNetCore.Internal.Generics.IGenericProcessor.yml",
"JsonApiDotNetCore.Internal.Generics.IGenericProcessorFactory": "JsonApiDotNetCore.Internal.Generics.IGenericProcessorFactory.yml",
"JsonApiDotNetCore.Internal.Generics.IGenericProcessorFactory.GetProcessor``1(System.Type,System.Type)": "JsonApiDotNetCore.Internal.Generics.IGenericProcessorFactory.yml",
"JsonApiDotNetCore.Internal.Generics.IGenericProcessorFactory.GetProcessor``1(System.Type,System.Type,System.Type)": "JsonApiDotNetCore.Internal.Generics.IGenericProcessorFactory.yml",
+ "JsonApiDotNetCore.Internal.IContextGraph": "JsonApiDotNetCore.Internal.IContextGraph.yml",
"JsonApiDotNetCore.Internal.IResourceGraph": "JsonApiDotNetCore.Internal.IResourceGraph.yml",
"JsonApiDotNetCore.Internal.IResourceGraph.GetContextEntity(System.String)": "JsonApiDotNetCore.Internal.IResourceGraph.yml",
"JsonApiDotNetCore.Internal.IResourceGraph.GetContextEntity(System.Type)": "JsonApiDotNetCore.Internal.IResourceGraph.yml",
+ "JsonApiDotNetCore.Internal.IResourceGraph.GetPublicAttributeName``1(System.String)": "JsonApiDotNetCore.Internal.IResourceGraph.yml",
"JsonApiDotNetCore.Internal.IResourceGraph.GetRelationship``1(``0,System.String)": "JsonApiDotNetCore.Internal.IResourceGraph.yml",
"JsonApiDotNetCore.Internal.IResourceGraph.GetRelationshipName``1(System.String)": "JsonApiDotNetCore.Internal.IResourceGraph.yml",
+ "JsonApiDotNetCore.Internal.IResourceGraph.GetRelationshipValue``1(``0,JsonApiDotNetCore.Models.RelationshipAttribute)": "JsonApiDotNetCore.Internal.IResourceGraph.yml",
"JsonApiDotNetCore.Internal.IResourceGraph.UsesDbContext": "JsonApiDotNetCore.Internal.IResourceGraph.yml",
"JsonApiDotNetCore.Internal.JsonApiException": "JsonApiDotNetCore.Internal.JsonApiException.yml",
"JsonApiDotNetCore.Internal.JsonApiException.#ctor(JsonApiDotNetCore.Internal.Error)": "JsonApiDotNetCore.Internal.JsonApiException.yml",
@@ -323,6 +356,9 @@
"JsonApiDotNetCore.Internal.JsonApiRouteHandler.#ctor(Microsoft.AspNetCore.Mvc.Infrastructure.IActionInvokerFactory,Microsoft.AspNetCore.Mvc.Infrastructure.IActionSelector,Microsoft.AspNetCore.Mvc.Infrastructure.IActionContextAccessor)": "JsonApiDotNetCore.Internal.JsonApiRouteHandler.yml",
"JsonApiDotNetCore.Internal.JsonApiRouteHandler.GetVirtualPath(Microsoft.AspNetCore.Routing.VirtualPathContext)": "JsonApiDotNetCore.Internal.JsonApiRouteHandler.yml",
"JsonApiDotNetCore.Internal.JsonApiRouteHandler.RouteAsync(Microsoft.AspNetCore.Routing.RouteContext)": "JsonApiDotNetCore.Internal.JsonApiRouteHandler.yml",
+ "JsonApiDotNetCore.Internal.JsonApiSetupException": "JsonApiDotNetCore.Internal.JsonApiSetupException.yml",
+ "JsonApiDotNetCore.Internal.JsonApiSetupException.#ctor(System.String)": "JsonApiDotNetCore.Internal.JsonApiSetupException.yml",
+ "JsonApiDotNetCore.Internal.JsonApiSetupException.#ctor(System.String,System.Exception)": "JsonApiDotNetCore.Internal.JsonApiSetupException.yml",
"JsonApiDotNetCore.Internal.PageManager": "JsonApiDotNetCore.Internal.PageManager.yml",
"JsonApiDotNetCore.Internal.PageManager.CurrentPage": "JsonApiDotNetCore.Internal.PageManager.yml",
"JsonApiDotNetCore.Internal.PageManager.DefaultPageSize": "JsonApiDotNetCore.Internal.PageManager.yml",
@@ -343,9 +379,14 @@
"JsonApiDotNetCore.Internal.Query.FilterOperations.eq": "JsonApiDotNetCore.Internal.Query.FilterOperations.yml",
"JsonApiDotNetCore.Internal.Query.FilterOperations.ge": "JsonApiDotNetCore.Internal.Query.FilterOperations.yml",
"JsonApiDotNetCore.Internal.Query.FilterOperations.gt": "JsonApiDotNetCore.Internal.Query.FilterOperations.yml",
+ "JsonApiDotNetCore.Internal.Query.FilterOperations.in": "JsonApiDotNetCore.Internal.Query.FilterOperations.yml",
+ "JsonApiDotNetCore.Internal.Query.FilterOperations.isnotnull": "JsonApiDotNetCore.Internal.Query.FilterOperations.yml",
+ "JsonApiDotNetCore.Internal.Query.FilterOperations.isnull": "JsonApiDotNetCore.Internal.Query.FilterOperations.yml",
"JsonApiDotNetCore.Internal.Query.FilterOperations.le": "JsonApiDotNetCore.Internal.Query.FilterOperations.yml",
"JsonApiDotNetCore.Internal.Query.FilterOperations.like": "JsonApiDotNetCore.Internal.Query.FilterOperations.yml",
"JsonApiDotNetCore.Internal.Query.FilterOperations.lt": "JsonApiDotNetCore.Internal.Query.FilterOperations.yml",
+ "JsonApiDotNetCore.Internal.Query.FilterOperations.ne": "JsonApiDotNetCore.Internal.Query.FilterOperations.yml",
+ "JsonApiDotNetCore.Internal.Query.FilterOperations.nin": "JsonApiDotNetCore.Internal.Query.FilterOperations.yml",
"JsonApiDotNetCore.Internal.Query.FilterQuery": "JsonApiDotNetCore.Internal.Query.FilterQuery.yml",
"JsonApiDotNetCore.Internal.Query.FilterQuery.#ctor(System.String,System.String,System.String)": "JsonApiDotNetCore.Internal.Query.FilterQuery.yml",
"JsonApiDotNetCore.Internal.Query.FilterQuery.Attribute": "JsonApiDotNetCore.Internal.Query.FilterQuery.yml",
@@ -356,6 +397,17 @@
"JsonApiDotNetCore.Internal.Query.PageQuery": "JsonApiDotNetCore.Internal.Query.PageQuery.yml",
"JsonApiDotNetCore.Internal.Query.PageQuery.PageOffset": "JsonApiDotNetCore.Internal.Query.PageQuery.yml",
"JsonApiDotNetCore.Internal.Query.PageQuery.PageSize": "JsonApiDotNetCore.Internal.Query.PageQuery.yml",
+ "JsonApiDotNetCore.Internal.Query.QueryConstants": "JsonApiDotNetCore.Internal.Query.QueryConstants.yml",
+ "JsonApiDotNetCore.Internal.Query.QueryConstants.CLOSE_BRACKET": "JsonApiDotNetCore.Internal.Query.QueryConstants.yml",
+ "JsonApiDotNetCore.Internal.Query.QueryConstants.COLON": "JsonApiDotNetCore.Internal.Query.QueryConstants.yml",
+ "JsonApiDotNetCore.Internal.Query.QueryConstants.COLON_STR": "JsonApiDotNetCore.Internal.Query.QueryConstants.yml",
+ "JsonApiDotNetCore.Internal.Query.QueryConstants.COMMA": "JsonApiDotNetCore.Internal.Query.QueryConstants.yml",
+ "JsonApiDotNetCore.Internal.Query.QueryConstants.FIELDS": "JsonApiDotNetCore.Internal.Query.QueryConstants.yml",
+ "JsonApiDotNetCore.Internal.Query.QueryConstants.FILTER": "JsonApiDotNetCore.Internal.Query.QueryConstants.yml",
+ "JsonApiDotNetCore.Internal.Query.QueryConstants.INCLUDE": "JsonApiDotNetCore.Internal.Query.QueryConstants.yml",
+ "JsonApiDotNetCore.Internal.Query.QueryConstants.OPEN_BRACKET": "JsonApiDotNetCore.Internal.Query.QueryConstants.yml",
+ "JsonApiDotNetCore.Internal.Query.QueryConstants.PAGE": "JsonApiDotNetCore.Internal.Query.QueryConstants.yml",
+ "JsonApiDotNetCore.Internal.Query.QueryConstants.SORT": "JsonApiDotNetCore.Internal.Query.QueryConstants.yml",
"JsonApiDotNetCore.Internal.Query.QuerySet": "JsonApiDotNetCore.Internal.Query.QuerySet.yml",
"JsonApiDotNetCore.Internal.Query.QuerySet.Fields": "JsonApiDotNetCore.Internal.Query.QuerySet.yml",
"JsonApiDotNetCore.Internal.Query.QuerySet.Filters": "JsonApiDotNetCore.Internal.Query.QuerySet.yml",
@@ -375,7 +427,19 @@
"JsonApiDotNetCore.Internal.Query.SortQuery.#ctor(JsonApiDotNetCore.Internal.Query.SortDirection,JsonApiDotNetCore.Models.AttrAttribute)": "JsonApiDotNetCore.Internal.Query.SortQuery.yml",
"JsonApiDotNetCore.Internal.Query.SortQuery.Direction": "JsonApiDotNetCore.Internal.Query.SortQuery.yml",
"JsonApiDotNetCore.Internal.Query.SortQuery.SortedAttribute": "JsonApiDotNetCore.Internal.Query.SortQuery.yml",
+ "JsonApiDotNetCore.Internal.ResourceGraph": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
+ "JsonApiDotNetCore.Internal.ResourceGraph.#ctor": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
+ "JsonApiDotNetCore.Internal.ResourceGraph.#ctor(System.Collections.Generic.List{JsonApiDotNetCore.Internal.ContextEntity},System.Boolean)": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
+ "JsonApiDotNetCore.Internal.ResourceGraph.GetContextEntity(System.String)": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
+ "JsonApiDotNetCore.Internal.ResourceGraph.GetContextEntity(System.Type)": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
+ "JsonApiDotNetCore.Internal.ResourceGraph.GetPublicAttributeName``1(System.String)": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
+ "JsonApiDotNetCore.Internal.ResourceGraph.GetRelationship``1(``0,System.String)": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
+ "JsonApiDotNetCore.Internal.ResourceGraph.GetRelationshipName``1(System.String)": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
+ "JsonApiDotNetCore.Internal.ResourceGraph.GetRelationshipValue``1(``0,JsonApiDotNetCore.Models.RelationshipAttribute)": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
+ "JsonApiDotNetCore.Internal.ResourceGraph.UsesDbContext": "JsonApiDotNetCore.Internal.ResourceGraph.yml",
"JsonApiDotNetCore.Internal.TypeHelper": "JsonApiDotNetCore.Internal.TypeHelper.yml",
+ "JsonApiDotNetCore.Internal.TypeHelper.ConvertCollection(System.Collections.Generic.IEnumerable{System.Object},System.Type)": "JsonApiDotNetCore.Internal.TypeHelper.yml",
+ "JsonApiDotNetCore.Internal.TypeHelper.ConvertListType(System.Collections.Generic.IEnumerable{System.String},System.Type)": "JsonApiDotNetCore.Internal.TypeHelper.yml",
"JsonApiDotNetCore.Internal.TypeHelper.ConvertType(System.Object,System.Type)": "JsonApiDotNetCore.Internal.TypeHelper.yml",
"JsonApiDotNetCore.Internal.TypeHelper.ConvertType``1(System.Object)": "JsonApiDotNetCore.Internal.TypeHelper.yml",
"JsonApiDotNetCore.Middleware": "JsonApiDotNetCore.Middleware.yml",
@@ -384,10 +448,15 @@
"JsonApiDotNetCore.Middleware.JsonApiExceptionFilter.OnException(Microsoft.AspNetCore.Mvc.Filters.ExceptionContext)": "JsonApiDotNetCore.Middleware.JsonApiExceptionFilter.yml",
"JsonApiDotNetCore.Middleware.RequestMiddleware": "JsonApiDotNetCore.Middleware.RequestMiddleware.yml",
"JsonApiDotNetCore.Middleware.RequestMiddleware.#ctor(Microsoft.AspNetCore.Http.RequestDelegate)": "JsonApiDotNetCore.Middleware.RequestMiddleware.yml",
- "JsonApiDotNetCore.Middleware.RequestMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext)": "JsonApiDotNetCore.Middleware.RequestMiddleware.yml",
+ "JsonApiDotNetCore.Middleware.RequestMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext,JsonApiDotNetCore.Services.IJsonApiContext)": "JsonApiDotNetCore.Middleware.RequestMiddleware.yml",
+ "JsonApiDotNetCore.Middleware.TypeMatchFilter": "JsonApiDotNetCore.Middleware.TypeMatchFilter.yml",
+ "JsonApiDotNetCore.Middleware.TypeMatchFilter.#ctor(JsonApiDotNetCore.Services.IJsonApiContext)": "JsonApiDotNetCore.Middleware.TypeMatchFilter.yml",
+ "JsonApiDotNetCore.Middleware.TypeMatchFilter.OnActionExecuted(Microsoft.AspNetCore.Mvc.Filters.ActionExecutedContext)": "JsonApiDotNetCore.Middleware.TypeMatchFilter.yml",
+ "JsonApiDotNetCore.Middleware.TypeMatchFilter.OnActionExecuting(Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext)": "JsonApiDotNetCore.Middleware.TypeMatchFilter.yml",
"JsonApiDotNetCore.Models": "JsonApiDotNetCore.Models.yml",
"JsonApiDotNetCore.Models.AttrAttribute": "JsonApiDotNetCore.Models.AttrAttribute.yml",
"JsonApiDotNetCore.Models.AttrAttribute.#ctor(System.String,System.Boolean,System.Boolean,System.Boolean)": "JsonApiDotNetCore.Models.AttrAttribute.yml",
+ "JsonApiDotNetCore.Models.AttrAttribute.#ctor(System.String,System.String,System.Boolean)": "JsonApiDotNetCore.Models.AttrAttribute.yml",
"JsonApiDotNetCore.Models.AttrAttribute.GetValue(System.Object)": "JsonApiDotNetCore.Models.AttrAttribute.yml",
"JsonApiDotNetCore.Models.AttrAttribute.InternalAttributeName": "JsonApiDotNetCore.Models.AttrAttribute.yml",
"JsonApiDotNetCore.Models.AttrAttribute.Is(System.String)": "JsonApiDotNetCore.Models.AttrAttribute.yml",
@@ -402,19 +471,31 @@
"JsonApiDotNetCore.Models.DocumentBase.Included": "JsonApiDotNetCore.Models.DocumentBase.yml",
"JsonApiDotNetCore.Models.DocumentBase.Links": "JsonApiDotNetCore.Models.DocumentBase.yml",
"JsonApiDotNetCore.Models.DocumentBase.Meta": "JsonApiDotNetCore.Models.DocumentBase.yml",
- "JsonApiDotNetCore.Models.DocumentData": "JsonApiDotNetCore.Models.DocumentData.yml",
"JsonApiDotNetCore.Models.Documents": "JsonApiDotNetCore.Models.Documents.yml",
"JsonApiDotNetCore.Models.Documents.Data": "JsonApiDotNetCore.Models.Documents.yml",
"JsonApiDotNetCore.Models.HasManyAttribute": "JsonApiDotNetCore.Models.HasManyAttribute.yml",
- "JsonApiDotNetCore.Models.HasManyAttribute.#ctor(System.String,JsonApiDotNetCore.Models.Link)": "JsonApiDotNetCore.Models.HasManyAttribute.yml",
+ "JsonApiDotNetCore.Models.HasManyAttribute.#ctor(System.String,JsonApiDotNetCore.Models.Link,System.Boolean)": "JsonApiDotNetCore.Models.HasManyAttribute.yml",
"JsonApiDotNetCore.Models.HasManyAttribute.SetValue(System.Object,System.Object)": "JsonApiDotNetCore.Models.HasManyAttribute.yml",
+ "JsonApiDotNetCore.Models.HasManyThroughAttribute": "JsonApiDotNetCore.Models.HasManyThroughAttribute.yml",
+ "JsonApiDotNetCore.Models.HasManyThroughAttribute.#ctor(System.String,JsonApiDotNetCore.Models.Link,System.Boolean)": "JsonApiDotNetCore.Models.HasManyThroughAttribute.yml",
+ "JsonApiDotNetCore.Models.HasManyThroughAttribute.#ctor(System.String,System.String,JsonApiDotNetCore.Models.Link,System.Boolean)": "JsonApiDotNetCore.Models.HasManyThroughAttribute.yml",
+ "JsonApiDotNetCore.Models.HasManyThroughAttribute.InternalThroughName": "JsonApiDotNetCore.Models.HasManyThroughAttribute.yml",
+ "JsonApiDotNetCore.Models.HasManyThroughAttribute.LeftIdProperty": "JsonApiDotNetCore.Models.HasManyThroughAttribute.yml",
+ "JsonApiDotNetCore.Models.HasManyThroughAttribute.LeftProperty": "JsonApiDotNetCore.Models.HasManyThroughAttribute.yml",
+ "JsonApiDotNetCore.Models.HasManyThroughAttribute.RelationshipPath": "JsonApiDotNetCore.Models.HasManyThroughAttribute.yml",
+ "JsonApiDotNetCore.Models.HasManyThroughAttribute.RightIdProperty": "JsonApiDotNetCore.Models.HasManyThroughAttribute.yml",
+ "JsonApiDotNetCore.Models.HasManyThroughAttribute.RightProperty": "JsonApiDotNetCore.Models.HasManyThroughAttribute.yml",
+ "JsonApiDotNetCore.Models.HasManyThroughAttribute.ThroughProperty": "JsonApiDotNetCore.Models.HasManyThroughAttribute.yml",
+ "JsonApiDotNetCore.Models.HasManyThroughAttribute.ThroughType": "JsonApiDotNetCore.Models.HasManyThroughAttribute.yml",
"JsonApiDotNetCore.Models.HasOneAttribute": "JsonApiDotNetCore.Models.HasOneAttribute.yml",
- "JsonApiDotNetCore.Models.HasOneAttribute.#ctor(System.String,JsonApiDotNetCore.Models.Link)": "JsonApiDotNetCore.Models.HasOneAttribute.yml",
+ "JsonApiDotNetCore.Models.HasOneAttribute.#ctor(System.String,JsonApiDotNetCore.Models.Link,System.Boolean,System.String)": "JsonApiDotNetCore.Models.HasOneAttribute.yml",
+ "JsonApiDotNetCore.Models.HasOneAttribute.IdentifiablePropertyName": "JsonApiDotNetCore.Models.HasOneAttribute.yml",
"JsonApiDotNetCore.Models.HasOneAttribute.SetValue(System.Object,System.Object)": "JsonApiDotNetCore.Models.HasOneAttribute.yml",
"JsonApiDotNetCore.Models.Identifiable": "JsonApiDotNetCore.Models.Identifiable.yml",
"JsonApiDotNetCore.Models.Identifiable`1": "JsonApiDotNetCore.Models.Identifiable-1.yml",
"JsonApiDotNetCore.Models.Identifiable`1.GetConcreteId(System.String)": "JsonApiDotNetCore.Models.Identifiable-1.yml",
"JsonApiDotNetCore.Models.Identifiable`1.GetStringId(System.Object)": "JsonApiDotNetCore.Models.Identifiable-1.yml",
+ "JsonApiDotNetCore.Models.Identifiable`1.GetTypedId(System.String)": "JsonApiDotNetCore.Models.Identifiable-1.yml",
"JsonApiDotNetCore.Models.Identifiable`1.Id": "JsonApiDotNetCore.Models.Identifiable-1.yml",
"JsonApiDotNetCore.Models.Identifiable`1.StringId": "JsonApiDotNetCore.Models.Identifiable-1.yml",
"JsonApiDotNetCore.Models.IHasMeta": "JsonApiDotNetCore.Models.IHasMeta.yml",
@@ -423,6 +504,11 @@
"JsonApiDotNetCore.Models.IIdentifiable.StringId": "JsonApiDotNetCore.Models.IIdentifiable.yml",
"JsonApiDotNetCore.Models.IIdentifiable`1": "JsonApiDotNetCore.Models.IIdentifiable-1.yml",
"JsonApiDotNetCore.Models.IIdentifiable`1.Id": "JsonApiDotNetCore.Models.IIdentifiable-1.yml",
+ "JsonApiDotNetCore.Models.IResourceDefinition": "JsonApiDotNetCore.Models.IResourceDefinition.yml",
+ "JsonApiDotNetCore.Models.IResourceDefinition.GetOutputAttrs(System.Object)": "JsonApiDotNetCore.Models.IResourceDefinition.yml",
+ "JsonApiDotNetCore.Models.IResourceMapper": "JsonApiDotNetCore.Models.IResourceMapper.yml",
+ "JsonApiDotNetCore.Models.IResourceMapper.Map``1(System.Object)": "JsonApiDotNetCore.Models.IResourceMapper.yml",
+ "JsonApiDotNetCore.Models.IResourceMapper.Map``2(``0)": "JsonApiDotNetCore.Models.IResourceMapper.yml",
"JsonApiDotNetCore.Models.JsonApiExtension": "JsonApiDotNetCore.Models.JsonApiExtension.yml",
"JsonApiDotNetCore.Models.JsonApiExtension.Operations": "JsonApiDotNetCore.Models.JsonApiExtension.yml",
"JsonApiDotNetCore.Models.Link": "JsonApiDotNetCore.Models.Link.yml",
@@ -465,16 +551,21 @@
"JsonApiDotNetCore.Models.Operations.ResourceReference": "JsonApiDotNetCore.Models.Operations.ResourceReference.yml",
"JsonApiDotNetCore.Models.Operations.ResourceReference.Relationship": "JsonApiDotNetCore.Models.Operations.ResourceReference.yml",
"JsonApiDotNetCore.Models.RelationshipAttribute": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
- "JsonApiDotNetCore.Models.RelationshipAttribute.#ctor(System.String,JsonApiDotNetCore.Models.Link)": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
+ "JsonApiDotNetCore.Models.RelationshipAttribute.#ctor(System.String,JsonApiDotNetCore.Models.Link,System.Boolean)": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
+ "JsonApiDotNetCore.Models.RelationshipAttribute.CanInclude": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
"JsonApiDotNetCore.Models.RelationshipAttribute.DocumentLinks": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
"JsonApiDotNetCore.Models.RelationshipAttribute.Equals(System.Object)": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
+ "JsonApiDotNetCore.Models.RelationshipAttribute.GetValue(System.Object)": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
"JsonApiDotNetCore.Models.RelationshipAttribute.InternalRelationshipName": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
"JsonApiDotNetCore.Models.RelationshipAttribute.Is(System.String)": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
"JsonApiDotNetCore.Models.RelationshipAttribute.IsHasMany": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
"JsonApiDotNetCore.Models.RelationshipAttribute.IsHasOne": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
"JsonApiDotNetCore.Models.RelationshipAttribute.PublicRelationshipName": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
+ "JsonApiDotNetCore.Models.RelationshipAttribute.RelationshipPath": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
"JsonApiDotNetCore.Models.RelationshipAttribute.SetValue(System.Object,System.Object)": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
"JsonApiDotNetCore.Models.RelationshipAttribute.ToString": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
+ "JsonApiDotNetCore.Models.RelationshipAttribute.TryGetHasMany(JsonApiDotNetCore.Models.HasManyAttribute@)": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
+ "JsonApiDotNetCore.Models.RelationshipAttribute.TryGetHasOne(JsonApiDotNetCore.Models.HasOneAttribute@)": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
"JsonApiDotNetCore.Models.RelationshipAttribute.Type": "JsonApiDotNetCore.Models.RelationshipAttribute.yml",
"JsonApiDotNetCore.Models.RelationshipData": "JsonApiDotNetCore.Models.RelationshipData.yml",
"JsonApiDotNetCore.Models.RelationshipData.ExposedData": "JsonApiDotNetCore.Models.RelationshipData.yml",
@@ -485,7 +576,19 @@
"JsonApiDotNetCore.Models.ResourceAttribute": "JsonApiDotNetCore.Models.ResourceAttribute.yml",
"JsonApiDotNetCore.Models.ResourceAttribute.#ctor(System.String)": "JsonApiDotNetCore.Models.ResourceAttribute.yml",
"JsonApiDotNetCore.Models.ResourceAttribute.ResourceName": "JsonApiDotNetCore.Models.ResourceAttribute.yml",
+ "JsonApiDotNetCore.Models.ResourceDefinition`1": "JsonApiDotNetCore.Models.ResourceDefinition-1.yml",
+ "JsonApiDotNetCore.Models.ResourceDefinition`1.#ctor": "JsonApiDotNetCore.Models.ResourceDefinition-1.yml",
+ "JsonApiDotNetCore.Models.ResourceDefinition`1.GetDefaultSortOrder": "JsonApiDotNetCore.Models.ResourceDefinition-1.yml",
+ "JsonApiDotNetCore.Models.ResourceDefinition`1.GetOutputAttrs(System.Object)": "JsonApiDotNetCore.Models.ResourceDefinition-1.yml",
+ "JsonApiDotNetCore.Models.ResourceDefinition`1.GetQueryFilters": "JsonApiDotNetCore.Models.ResourceDefinition-1.yml",
+ "JsonApiDotNetCore.Models.ResourceDefinition`1.OutputAttrs": "JsonApiDotNetCore.Models.ResourceDefinition-1.yml",
+ "JsonApiDotNetCore.Models.ResourceDefinition`1.OutputAttrs(`0)": "JsonApiDotNetCore.Models.ResourceDefinition-1.yml",
+ "JsonApiDotNetCore.Models.ResourceDefinition`1.PropertySortOrder": "JsonApiDotNetCore.Models.ResourceDefinition-1.PropertySortOrder.yml",
+ "JsonApiDotNetCore.Models.ResourceDefinition`1.QueryFilters": "JsonApiDotNetCore.Models.ResourceDefinition-1.QueryFilters.yml",
+ "JsonApiDotNetCore.Models.ResourceDefinition`1.Remove(System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.Collections.Generic.List{JsonApiDotNetCore.Models.AttrAttribute})": "JsonApiDotNetCore.Models.ResourceDefinition-1.yml",
"JsonApiDotNetCore.Models.ResourceIdentifierObject": "JsonApiDotNetCore.Models.ResourceIdentifierObject.yml",
+ "JsonApiDotNetCore.Models.ResourceIdentifierObject.#ctor": "JsonApiDotNetCore.Models.ResourceIdentifierObject.yml",
+ "JsonApiDotNetCore.Models.ResourceIdentifierObject.#ctor(System.String,System.String)": "JsonApiDotNetCore.Models.ResourceIdentifierObject.yml",
"JsonApiDotNetCore.Models.ResourceIdentifierObject.Id": "JsonApiDotNetCore.Models.ResourceIdentifierObject.yml",
"JsonApiDotNetCore.Models.ResourceIdentifierObject.LocalId": "JsonApiDotNetCore.Models.ResourceIdentifierObject.yml",
"JsonApiDotNetCore.Models.ResourceIdentifierObject.Type": "JsonApiDotNetCore.Models.ResourceIdentifierObject.yml",
@@ -503,6 +606,13 @@
"JsonApiDotNetCore.Models.RootLinks.ShouldSerializeNext": "JsonApiDotNetCore.Models.RootLinks.yml",
"JsonApiDotNetCore.Models.RootLinks.ShouldSerializePrev": "JsonApiDotNetCore.Models.RootLinks.yml",
"JsonApiDotNetCore.Models.RootLinks.ShouldSerializeSelf": "JsonApiDotNetCore.Models.RootLinks.yml",
+ "JsonApiDotNetCore.Request": "JsonApiDotNetCore.Request.yml",
+ "JsonApiDotNetCore.Request.HasManyRelationshipPointers": "JsonApiDotNetCore.Request.HasManyRelationshipPointers.yml",
+ "JsonApiDotNetCore.Request.HasManyRelationshipPointers.Add(JsonApiDotNetCore.Models.RelationshipAttribute,System.Collections.IList)": "JsonApiDotNetCore.Request.HasManyRelationshipPointers.yml",
+ "JsonApiDotNetCore.Request.HasManyRelationshipPointers.Get": "JsonApiDotNetCore.Request.HasManyRelationshipPointers.yml",
+ "JsonApiDotNetCore.Request.HasOneRelationshipPointers": "JsonApiDotNetCore.Request.HasOneRelationshipPointers.yml",
+ "JsonApiDotNetCore.Request.HasOneRelationshipPointers.Add(JsonApiDotNetCore.Models.RelationshipAttribute,JsonApiDotNetCore.Models.IIdentifiable)": "JsonApiDotNetCore.Request.HasOneRelationshipPointers.yml",
+ "JsonApiDotNetCore.Request.HasOneRelationshipPointers.Get": "JsonApiDotNetCore.Request.HasOneRelationshipPointers.yml",
"JsonApiDotNetCore.Serialization": "JsonApiDotNetCore.Serialization.yml",
"JsonApiDotNetCore.Serialization.DasherizedResolver": "JsonApiDotNetCore.Serialization.DasherizedResolver.yml",
"JsonApiDotNetCore.Serialization.DasherizedResolver.CreateProperty(System.Reflection.MemberInfo,Newtonsoft.Json.MemberSerialization)": "JsonApiDotNetCore.Serialization.DasherizedResolver.yml",
@@ -511,16 +621,17 @@
"JsonApiDotNetCore.Serialization.IJsonApiDeSerializer.Deserialize``1(System.String)": "JsonApiDotNetCore.Serialization.IJsonApiDeSerializer.yml",
"JsonApiDotNetCore.Serialization.IJsonApiDeSerializer.DeserializeList``1(System.String)": "JsonApiDotNetCore.Serialization.IJsonApiDeSerializer.yml",
"JsonApiDotNetCore.Serialization.IJsonApiDeSerializer.DeserializeRelationship(System.String)": "JsonApiDotNetCore.Serialization.IJsonApiDeSerializer.yml",
- "JsonApiDotNetCore.Serialization.IJsonApiDeSerializer.DocumentToObject(JsonApiDotNetCore.Models.DocumentData)": "JsonApiDotNetCore.Serialization.IJsonApiDeSerializer.yml",
+ "JsonApiDotNetCore.Serialization.IJsonApiDeSerializer.DocumentToObject(JsonApiDotNetCore.Models.ResourceObject,System.Collections.Generic.List{JsonApiDotNetCore.Models.ResourceObject})": "JsonApiDotNetCore.Serialization.IJsonApiDeSerializer.yml",
"JsonApiDotNetCore.Serialization.IJsonApiSerializer": "JsonApiDotNetCore.Serialization.IJsonApiSerializer.yml",
"JsonApiDotNetCore.Serialization.IJsonApiSerializer.Serialize(System.Object)": "JsonApiDotNetCore.Serialization.IJsonApiSerializer.yml",
"JsonApiDotNetCore.Serialization.JsonApiDeSerializer": "JsonApiDotNetCore.Serialization.JsonApiDeSerializer.yml",
+ "JsonApiDotNetCore.Serialization.JsonApiDeSerializer.#ctor(JsonApiDotNetCore.Services.IJsonApiContext)": "JsonApiDotNetCore.Serialization.JsonApiDeSerializer.yml",
"JsonApiDotNetCore.Serialization.JsonApiDeSerializer.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Internal.Generics.IGenericProcessorFactory)": "JsonApiDotNetCore.Serialization.JsonApiDeSerializer.yml",
"JsonApiDotNetCore.Serialization.JsonApiDeSerializer.Deserialize(System.String)": "JsonApiDotNetCore.Serialization.JsonApiDeSerializer.yml",
"JsonApiDotNetCore.Serialization.JsonApiDeSerializer.Deserialize``1(System.String)": "JsonApiDotNetCore.Serialization.JsonApiDeSerializer.yml",
"JsonApiDotNetCore.Serialization.JsonApiDeSerializer.DeserializeList``1(System.String)": "JsonApiDotNetCore.Serialization.JsonApiDeSerializer.yml",
"JsonApiDotNetCore.Serialization.JsonApiDeSerializer.DeserializeRelationship(System.String)": "JsonApiDotNetCore.Serialization.JsonApiDeSerializer.yml",
- "JsonApiDotNetCore.Serialization.JsonApiDeSerializer.DocumentToObject(JsonApiDotNetCore.Models.DocumentData)": "JsonApiDotNetCore.Serialization.JsonApiDeSerializer.yml",
+ "JsonApiDotNetCore.Serialization.JsonApiDeSerializer.DocumentToObject(JsonApiDotNetCore.Models.ResourceObject,System.Collections.Generic.List{JsonApiDotNetCore.Models.ResourceObject})": "JsonApiDotNetCore.Serialization.JsonApiDeSerializer.yml",
"JsonApiDotNetCore.Serialization.JsonApiSerializer": "JsonApiDotNetCore.Serialization.JsonApiSerializer.yml",
"JsonApiDotNetCore.Serialization.JsonApiSerializer.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Builders.IDocumentBuilder)": "JsonApiDotNetCore.Serialization.JsonApiSerializer.yml",
"JsonApiDotNetCore.Serialization.JsonApiSerializer.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Builders.IDocumentBuilder,Microsoft.Extensions.Logging.ILoggerFactory)": "JsonApiDotNetCore.Serialization.JsonApiSerializer.yml",
@@ -534,14 +645,20 @@
"JsonApiDotNetCore.Services.EntityResourceService`1.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Data.IEntityRepository{`0},Microsoft.Extensions.Logging.ILoggerFactory)": "JsonApiDotNetCore.Services.EntityResourceService-1.yml",
"JsonApiDotNetCore.Services.EntityResourceService`2": "JsonApiDotNetCore.Services.EntityResourceService-2.yml",
"JsonApiDotNetCore.Services.EntityResourceService`2.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Data.IEntityRepository{`0,`1},Microsoft.Extensions.Logging.ILoggerFactory)": "JsonApiDotNetCore.Services.EntityResourceService-2.yml",
- "JsonApiDotNetCore.Services.EntityResourceService`2.CreateAsync(`0)": "JsonApiDotNetCore.Services.EntityResourceService-2.yml",
- "JsonApiDotNetCore.Services.EntityResourceService`2.DeleteAsync(`1)": "JsonApiDotNetCore.Services.EntityResourceService-2.yml",
- "JsonApiDotNetCore.Services.EntityResourceService`2.GetAsync": "JsonApiDotNetCore.Services.EntityResourceService-2.yml",
- "JsonApiDotNetCore.Services.EntityResourceService`2.GetAsync(`1)": "JsonApiDotNetCore.Services.EntityResourceService-2.yml",
- "JsonApiDotNetCore.Services.EntityResourceService`2.GetRelationshipAsync(`1,System.String)": "JsonApiDotNetCore.Services.EntityResourceService-2.yml",
- "JsonApiDotNetCore.Services.EntityResourceService`2.GetRelationshipsAsync(`1,System.String)": "JsonApiDotNetCore.Services.EntityResourceService-2.yml",
- "JsonApiDotNetCore.Services.EntityResourceService`2.UpdateAsync(`1,`0)": "JsonApiDotNetCore.Services.EntityResourceService-2.yml",
- "JsonApiDotNetCore.Services.EntityResourceService`2.UpdateRelationshipsAsync(`1,System.String,System.Collections.Generic.List{JsonApiDotNetCore.Models.DocumentData})": "JsonApiDotNetCore.Services.EntityResourceService-2.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Data.IEntityRepository{`1,`2},Microsoft.Extensions.Logging.ILoggerFactory)": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,JsonApiDotNetCore.Data.IEntityRepository{`1,`2},Microsoft.Extensions.Logging.ILoggerFactory,JsonApiDotNetCore.Models.IResourceMapper)": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3.ApplyPageQueryAsync(System.Linq.IQueryable{`1})": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3.ApplySortAndFilterQuery(System.Linq.IQueryable{`1})": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3.CreateAsync(`0)": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3.DeleteAsync(`2)": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3.GetAsync": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3.GetAsync(`2)": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3.GetRelationshipAsync(`2,System.String)": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3.GetRelationshipsAsync(`2,System.String)": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3.IncludeRelationships(System.Linq.IQueryable{`1},System.Collections.Generic.List{System.String})": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3.UpdateAsync(`2,`0)": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
+ "JsonApiDotNetCore.Services.EntityResourceService`3.UpdateRelationshipsAsync(`2,System.String,System.Collections.Generic.List{JsonApiDotNetCore.Models.ResourceObject})": "JsonApiDotNetCore.Services.EntityResourceService-3.yml",
"JsonApiDotNetCore.Services.IControllerContext": "JsonApiDotNetCore.Services.IControllerContext.yml",
"JsonApiDotNetCore.Services.IControllerContext.ControllerType": "JsonApiDotNetCore.Services.IControllerContext.yml",
"JsonApiDotNetCore.Services.IControllerContext.GetControllerAttribute``1": "JsonApiDotNetCore.Services.IControllerContext.yml",
@@ -564,30 +681,36 @@
"JsonApiDotNetCore.Services.IGetRelationshipsService`1": "JsonApiDotNetCore.Services.IGetRelationshipsService-1.yml",
"JsonApiDotNetCore.Services.IGetRelationshipsService`2": "JsonApiDotNetCore.Services.IGetRelationshipsService-2.yml",
"JsonApiDotNetCore.Services.IGetRelationshipsService`2.GetRelationshipsAsync(`1,System.String)": "JsonApiDotNetCore.Services.IGetRelationshipsService-2.yml",
+ "JsonApiDotNetCore.Services.IJsonApiApplication": "JsonApiDotNetCore.Services.IJsonApiApplication.yml",
+ "JsonApiDotNetCore.Services.IJsonApiApplication.Options": "JsonApiDotNetCore.Services.IJsonApiApplication.yml",
+ "JsonApiDotNetCore.Services.IJsonApiApplication.ResourceGraph": "JsonApiDotNetCore.Services.IJsonApiApplication.yml",
"JsonApiDotNetCore.Services.IJsonApiContext": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
"JsonApiDotNetCore.Services.IJsonApiContext.ApplyContext``1(System.Object)": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.AttributesToUpdate": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.BasePath": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.ResourceGraph": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.ControllerType": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.DocumentMeta": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
+ "JsonApiDotNetCore.Services.IJsonApiContext.BeginOperation": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
"JsonApiDotNetCore.Services.IJsonApiContext.GenericProcessorFactory": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
"JsonApiDotNetCore.Services.IJsonApiContext.GetControllerAttribute``1": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.IncludedRelationships": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.IsBulkOperationRequest": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.IsRelationshipData": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.IsRelationshipPath": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
"JsonApiDotNetCore.Services.IJsonApiContext.MetaBuilder": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.Options": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.PageManager": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.QuerySet": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.RelationshipsToUpdate": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
- "JsonApiDotNetCore.Services.IJsonApiContext.RequestEntity": "JsonApiDotNetCore.Services.IJsonApiContext.yml",
+ "JsonApiDotNetCore.Services.IJsonApiRequest": "JsonApiDotNetCore.Services.IJsonApiRequest.yml",
+ "JsonApiDotNetCore.Services.IJsonApiRequest.BasePath": "JsonApiDotNetCore.Services.IJsonApiRequest.yml",
+ "JsonApiDotNetCore.Services.IJsonApiRequest.ControllerType": "JsonApiDotNetCore.Services.IJsonApiRequest.yml",
+ "JsonApiDotNetCore.Services.IJsonApiRequest.DocumentMeta": "JsonApiDotNetCore.Services.IJsonApiRequest.yml",
+ "JsonApiDotNetCore.Services.IJsonApiRequest.HasManyRelationshipPointers": "JsonApiDotNetCore.Services.IJsonApiRequest.yml",
+ "JsonApiDotNetCore.Services.IJsonApiRequest.HasOneRelationshipPointers": "JsonApiDotNetCore.Services.IJsonApiRequest.yml",
+ "JsonApiDotNetCore.Services.IJsonApiRequest.IsBulkOperationRequest": "JsonApiDotNetCore.Services.IJsonApiRequest.yml",
+ "JsonApiDotNetCore.Services.IJsonApiRequest.IsRelationshipData": "JsonApiDotNetCore.Services.IJsonApiRequest.yml",
+ "JsonApiDotNetCore.Services.IJsonApiRequest.IsRelationshipPath": "JsonApiDotNetCore.Services.IJsonApiRequest.yml",
+ "JsonApiDotNetCore.Services.IJsonApiRequest.RequestEntity": "JsonApiDotNetCore.Services.IJsonApiRequest.yml",
"JsonApiDotNetCore.Services.IQueryAccessor": "JsonApiDotNetCore.Services.IQueryAccessor.yml",
"JsonApiDotNetCore.Services.IQueryAccessor.GetRequired``1(System.String)": "JsonApiDotNetCore.Services.IQueryAccessor.yml",
"JsonApiDotNetCore.Services.IQueryAccessor.TryGetValue``1(System.String,``0@)": "JsonApiDotNetCore.Services.IQueryAccessor.yml",
+ "JsonApiDotNetCore.Services.IQueryComposer": "JsonApiDotNetCore.Services.IQueryComposer.yml",
+ "JsonApiDotNetCore.Services.IQueryComposer.Compose(JsonApiDotNetCore.Services.IJsonApiContext)": "JsonApiDotNetCore.Services.IQueryComposer.yml",
"JsonApiDotNetCore.Services.IQueryParser": "JsonApiDotNetCore.Services.IQueryParser.yml",
"JsonApiDotNetCore.Services.IQueryParser.Parse(Microsoft.AspNetCore.Http.IQueryCollection)": "JsonApiDotNetCore.Services.IQueryParser.yml",
+ "JsonApiDotNetCore.Services.IQueryRequest": "JsonApiDotNetCore.Services.IQueryRequest.yml",
+ "JsonApiDotNetCore.Services.IQueryRequest.IncludedRelationships": "JsonApiDotNetCore.Services.IQueryRequest.yml",
+ "JsonApiDotNetCore.Services.IQueryRequest.PageManager": "JsonApiDotNetCore.Services.IQueryRequest.yml",
+ "JsonApiDotNetCore.Services.IQueryRequest.QuerySet": "JsonApiDotNetCore.Services.IQueryRequest.yml",
"JsonApiDotNetCore.Services.IRequestMeta": "JsonApiDotNetCore.Services.IRequestMeta.yml",
"JsonApiDotNetCore.Services.IRequestMeta.GetMeta": "JsonApiDotNetCore.Services.IRequestMeta.yml",
"JsonApiDotNetCore.Services.IResourceCmdService`1": "JsonApiDotNetCore.Services.IResourceCmdService-1.yml",
@@ -599,7 +722,10 @@
"JsonApiDotNetCore.Services.IScopedServiceProvider": "JsonApiDotNetCore.Services.IScopedServiceProvider.yml",
"JsonApiDotNetCore.Services.IUpdateRelationshipService`1": "JsonApiDotNetCore.Services.IUpdateRelationshipService-1.yml",
"JsonApiDotNetCore.Services.IUpdateRelationshipService`2": "JsonApiDotNetCore.Services.IUpdateRelationshipService-2.yml",
- "JsonApiDotNetCore.Services.IUpdateRelationshipService`2.UpdateRelationshipsAsync(`1,System.String,System.Collections.Generic.List{JsonApiDotNetCore.Models.DocumentData})": "JsonApiDotNetCore.Services.IUpdateRelationshipService-2.yml",
+ "JsonApiDotNetCore.Services.IUpdateRelationshipService`2.UpdateRelationshipsAsync(`1,System.String,System.Collections.Generic.List{JsonApiDotNetCore.Models.ResourceObject})": "JsonApiDotNetCore.Services.IUpdateRelationshipService-2.yml",
+ "JsonApiDotNetCore.Services.IUpdateRequest": "JsonApiDotNetCore.Services.IUpdateRequest.yml",
+ "JsonApiDotNetCore.Services.IUpdateRequest.AttributesToUpdate": "JsonApiDotNetCore.Services.IUpdateRequest.yml",
+ "JsonApiDotNetCore.Services.IUpdateRequest.RelationshipsToUpdate": "JsonApiDotNetCore.Services.IUpdateRequest.yml",
"JsonApiDotNetCore.Services.IUpdateService`1": "JsonApiDotNetCore.Services.IUpdateService-1.yml",
"JsonApiDotNetCore.Services.IUpdateService`2": "JsonApiDotNetCore.Services.IUpdateService-2.yml",
"JsonApiDotNetCore.Services.IUpdateService`2.UpdateAsync(`1,`0)": "JsonApiDotNetCore.Services.IUpdateService-2.yml",
@@ -608,11 +734,13 @@
"JsonApiDotNetCore.Services.JsonApiContext.ApplyContext``1(System.Object)": "JsonApiDotNetCore.Services.JsonApiContext.yml",
"JsonApiDotNetCore.Services.JsonApiContext.AttributesToUpdate": "JsonApiDotNetCore.Services.JsonApiContext.yml",
"JsonApiDotNetCore.Services.JsonApiContext.BasePath": "JsonApiDotNetCore.Services.JsonApiContext.yml",
- "JsonApiDotNetCore.Services.JsonApiContext.ResourceGraph": "JsonApiDotNetCore.Services.JsonApiContext.yml",
+ "JsonApiDotNetCore.Services.JsonApiContext.BeginOperation": "JsonApiDotNetCore.Services.JsonApiContext.yml",
"JsonApiDotNetCore.Services.JsonApiContext.ControllerType": "JsonApiDotNetCore.Services.JsonApiContext.yml",
"JsonApiDotNetCore.Services.JsonApiContext.DocumentMeta": "JsonApiDotNetCore.Services.JsonApiContext.yml",
"JsonApiDotNetCore.Services.JsonApiContext.GenericProcessorFactory": "JsonApiDotNetCore.Services.JsonApiContext.yml",
"JsonApiDotNetCore.Services.JsonApiContext.GetControllerAttribute``1": "JsonApiDotNetCore.Services.JsonApiContext.yml",
+ "JsonApiDotNetCore.Services.JsonApiContext.HasManyRelationshipPointers": "JsonApiDotNetCore.Services.JsonApiContext.yml",
+ "JsonApiDotNetCore.Services.JsonApiContext.HasOneRelationshipPointers": "JsonApiDotNetCore.Services.JsonApiContext.yml",
"JsonApiDotNetCore.Services.JsonApiContext.IncludedRelationships": "JsonApiDotNetCore.Services.JsonApiContext.yml",
"JsonApiDotNetCore.Services.JsonApiContext.IsBulkOperationRequest": "JsonApiDotNetCore.Services.JsonApiContext.yml",
"JsonApiDotNetCore.Services.JsonApiContext.IsRelationshipData": "JsonApiDotNetCore.Services.JsonApiContext.yml",
@@ -623,6 +751,7 @@
"JsonApiDotNetCore.Services.JsonApiContext.QuerySet": "JsonApiDotNetCore.Services.JsonApiContext.yml",
"JsonApiDotNetCore.Services.JsonApiContext.RelationshipsToUpdate": "JsonApiDotNetCore.Services.JsonApiContext.yml",
"JsonApiDotNetCore.Services.JsonApiContext.RequestEntity": "JsonApiDotNetCore.Services.JsonApiContext.yml",
+ "JsonApiDotNetCore.Services.JsonApiContext.ResourceGraph": "JsonApiDotNetCore.Services.JsonApiContext.yml",
"JsonApiDotNetCore.Services.Operations": "JsonApiDotNetCore.Services.Operations.yml",
"JsonApiDotNetCore.Services.Operations.IOperationProcessorResolver": "JsonApiDotNetCore.Services.Operations.IOperationProcessorResolver.yml",
"JsonApiDotNetCore.Services.Operations.IOperationProcessorResolver.LocateCreateService(JsonApiDotNetCore.Models.Operations.Operation)": "JsonApiDotNetCore.Services.Operations.IOperationProcessorResolver.yml",
@@ -640,7 +769,7 @@
"JsonApiDotNetCore.Services.Operations.OperationProcessorResolver.LocateRemoveService(JsonApiDotNetCore.Models.Operations.Operation)": "JsonApiDotNetCore.Services.Operations.OperationProcessorResolver.yml",
"JsonApiDotNetCore.Services.Operations.OperationProcessorResolver.LocateUpdateService(JsonApiDotNetCore.Models.Operations.Operation)": "JsonApiDotNetCore.Services.Operations.OperationProcessorResolver.yml",
"JsonApiDotNetCore.Services.Operations.OperationsProcessor": "JsonApiDotNetCore.Services.Operations.OperationsProcessor.yml",
- "JsonApiDotNetCore.Services.Operations.OperationsProcessor.#ctor(JsonApiDotNetCore.Services.Operations.IOperationProcessorResolver,JsonApiDotNetCore.Data.IDbContextResolver)": "JsonApiDotNetCore.Services.Operations.OperationsProcessor.yml",
+ "JsonApiDotNetCore.Services.Operations.OperationsProcessor.#ctor(JsonApiDotNetCore.Services.Operations.IOperationProcessorResolver,JsonApiDotNetCore.Data.IDbContextResolver,JsonApiDotNetCore.Services.IJsonApiContext)": "JsonApiDotNetCore.Services.Operations.OperationsProcessor.yml",
"JsonApiDotNetCore.Services.Operations.OperationsProcessor.ProcessAsync(System.Collections.Generic.List{JsonApiDotNetCore.Models.Operations.Operation})": "JsonApiDotNetCore.Services.Operations.OperationsProcessor.yml",
"JsonApiDotNetCore.Services.Operations.Processors": "JsonApiDotNetCore.Services.Operations.Processors.yml",
"JsonApiDotNetCore.Services.Operations.Processors.CreateOpProcessor`1": "JsonApiDotNetCore.Services.Operations.Processors.CreateOpProcessor-1.yml",
@@ -675,6 +804,8 @@
"JsonApiDotNetCore.Services.QueryAccessor.#ctor(JsonApiDotNetCore.Services.IJsonApiContext,Microsoft.Extensions.Logging.ILogger{JsonApiDotNetCore.Services.QueryAccessor})": "JsonApiDotNetCore.Services.QueryAccessor.yml",
"JsonApiDotNetCore.Services.QueryAccessor.GetRequired``1(System.String)": "JsonApiDotNetCore.Services.QueryAccessor.yml",
"JsonApiDotNetCore.Services.QueryAccessor.TryGetValue``1(System.String,``0@)": "JsonApiDotNetCore.Services.QueryAccessor.yml",
+ "JsonApiDotNetCore.Services.QueryComposer": "JsonApiDotNetCore.Services.QueryComposer.yml",
+ "JsonApiDotNetCore.Services.QueryComposer.Compose(JsonApiDotNetCore.Services.IJsonApiContext)": "JsonApiDotNetCore.Services.QueryComposer.yml",
"JsonApiDotNetCore.Services.QueryParser": "JsonApiDotNetCore.Services.QueryParser.yml",
"JsonApiDotNetCore.Services.QueryParser.#ctor(JsonApiDotNetCore.Services.IControllerContext,JsonApiDotNetCore.Configuration.JsonApiOptions)": "JsonApiDotNetCore.Services.QueryParser.yml",
"JsonApiDotNetCore.Services.QueryParser.GetAttribute(System.String)": "JsonApiDotNetCore.Services.QueryParser.yml",
diff --git a/src/JsonApiDotNetCore/api/index.md b/docs/api/index.md
similarity index 100%
rename from src/JsonApiDotNetCore/api/index.md
rename to docs/api/index.md
diff --git a/src/JsonApiDotNetCore/docfx.json b/docs/docfx.json
similarity index 80%
rename from src/JsonApiDotNetCore/docfx.json
rename to docs/docfx.json
index 5c46dcbd88..ccc9762111 100644
--- a/src/JsonApiDotNetCore/docfx.json
+++ b/docs/docfx.json
@@ -3,8 +3,8 @@
{
"src": [
{
- "files": [ "**.csproj" ],
- "src": "C:\\Users\\jnance\\dev\\json-api-dotnet-core\\src\\JsonApiDotNetCore"
+ "files": [ "**/JsonApiDotNetCore.csproj" ],
+ "src": "../"
}
],
"dest": "api",
@@ -21,8 +21,10 @@
},
{
"files": [
- "articles/**.md",
- "articles/**/toc.yml",
+ "getting-started/**.md",
+ "getting-started/**/toc.yml",
+ "usage/**.md",
+ "request-examples/**.md",
"toc.yml",
"*.md"
]
diff --git a/docs/generate.sh b/docs/generate.sh
new file mode 100755
index 0000000000..15b368732d
--- /dev/null
+++ b/docs/generate.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+# generates ./request-examples documents
+
+function cleanup() {
+ kill -9 $(lsof -ti tcp:5001) &2>/dev/null
+}
+
+cleanup
+dotnet run -p ../src/Examples/GettingStarted/GettingStarted.csproj &
+app_pid=$!
+echo "Started app with PID $app_pid"
+
+rm -rf ./request-examples/*.json
+rm -rf ./request-examples/*.temp
+
+{ # try
+ sleep 10
+
+ echo "sleep over"
+
+ for path in ./request-examples/*.sh; do
+ op_name=$(basename "$path" .sh)
+ file="./request-examples/$op_name-Response.json"
+ temp_file="./request-examples/$op_name-Response.temp"
+
+ # 1. execute bash script
+ # 2. redirect stdout to a temp file, this will be the JSON output
+ # 3. redirect stderr to JSON file, this will be the curl verbose output
+ # we grab the last line, trim the prefix, add some newlines and the push
+ # it to the top of the JSON file
+ bash $path \
+ 1> >(jq . > $temp_file) \
+ 2> >(grep "HTTP" | tail -n 1 | cut -c 3- | awk '{ printf "%s\n\n",$0 }' > "./request-examples/$op_name-Response.json")
+
+ # append the actual JSON to the file
+ cat $temp_file >> $file
+ rm $temp_file
+ done
+}
+
+# docfx metadata
+
+cleanup
diff --git a/docs/generators/index.md b/docs/generators/index.md
new file mode 100644
index 0000000000..130d3d3636
--- /dev/null
+++ b/docs/generators/index.md
@@ -0,0 +1,9 @@
+## Installing
+
+...
+
+## Creating a project template
+
+```
+dotnet new jadnc
+```
\ No newline at end of file
diff --git a/docs/getting-started/install.md b/docs/getting-started/install.md
new file mode 100644
index 0000000000..6f3b614b9e
--- /dev/null
+++ b/docs/getting-started/install.md
@@ -0,0 +1,34 @@
+# Installation
+
+Click [here](https://www.nuget.org/packages/JsonApiDotnetCore/) for the latest NuGet version.
+
+```
+dotnet add package JsonApiDotnetCore
+```
+
+```powershell
+Install-Package JsonApiDotnetCore
+```
+
+```xml
+
+
+
+
+```
+
+## Pre-Release Packages
+
+Occasionally we will release experimental features as pre-release packages on our
+MyGet feed. You can download these by adding [the pacakge feed](https://www.myget.org/feed/Details/research-institute) to your nuget configuration.
+
+These releases are deployed from the `develop` branch directly.
+
+```xml
+
+
+
+
+
+
+```
\ No newline at end of file
diff --git a/docs/getting-started/step-by-step.md b/docs/getting-started/step-by-step.md
new file mode 100644
index 0000000000..f42e5dcafd
--- /dev/null
+++ b/docs/getting-started/step-by-step.md
@@ -0,0 +1,136 @@
+# Step-By-Step Guide to a Running API
+
+The most basic use case leverages Entity Framework.
+The shortest path to a running API looks like:
+
+- Create a new web app
+- Install
+- Define models
+- Define the DbContext
+- Define controllers
+- Add Middleware and Services
+- Seed the database
+- Start the app
+
+This page will walk you through the **simplest** use case. More detailed examples can be found in the detailed usage subsections.
+
+### Create A New Web App
+
+```
+mkdir MyApp
+cd MyApp
+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 `Identifiable`
+
+```c#
+public class Person : Identifiable
+{
+ [Attr("name")]
+ public string Name { get; set; }
+}
+```
+
+### Define DbContext
+
+Nothing special here, just an ordinary `DbContext`
+
+```
+public class AppDbContext : DbContext
+{
+ public AppDbContext(DbContextOptions options)
+ : base(options) { }
+
+ public DbSet People { get; set; }
+}
+```
+
+### Define Controllers
+
+You need to create controllers that inherit from `JsonApiController` or `JsonApiController`
+where `TEntity` is the model that inherits from `Identifiable`
+
+```c#
+public class PeopleController : JsonApiController
+{
+ public PeopleController(
+ IJsonApiContext jsonApiContext,
+ IResourceService resourceService,
+ ILoggerFactory loggerFactory)
+ : base(jsonApiContext, resourceService, loggerFactory)
+ { }
+}
+```
+
+### Middleware and Services
+
+Finally, add the services by adding the following to your Startup.ConfigureServices:
+
+```c#
+public IServiceProvider ConfigureServices(IServiceCollection services)
+{
+ // add the db context like you normally would
+ services.AddDbContext(options =>
+ { // use whatever provider you want, this is just an example
+ options.UseNpgsql(GetDbConnectionString());
+ }, ServiceLifetime.Transient);
+
+ // add jsonapi dotnet core
+ services.AddJsonApi();
+ // ...
+}
+```
+
+Add the middleware to the Startup.Configure method. Note that under the hood,
+this will call `app.UseMvc()` so there is no need to add that as well.
+
+```c#
+public void Configure(IApplicationBuilder app)
+{
+ app.UseJsonApi();
+}
+```
+
+### Seeding the Database
+
+One way to seed the database is in your Configure method:
+
+```c#
+public void Configure(
+ IApplicationBuilder app,
+ AppDbContext context)
+{
+ context.Database.EnsureCreated();
+ if(context.People.Any() == false)
+ {
+ context.People.Add(new Person {
+ Name = "John Doe"
+ });
+ context.SaveChanges();
+ }
+ // ...
+ app.UseJsonApi();
+}
+```
+
+### Start the App
+
+```
+dotnet run
+curl http://localhost:5000/people
+```
+
diff --git a/docs/getting-started/toc.yml b/docs/getting-started/toc.yml
new file mode 100644
index 0000000000..4a2a008591
--- /dev/null
+++ b/docs/getting-started/toc.yml
@@ -0,0 +1,5 @@
+- name: Installation
+ href: install.md
+
+- name: Step By Step
+ href: step-by-step.md
\ No newline at end of file
diff --git a/docs/index.md b/docs/index.md
new file mode 100644
index 0000000000..15ba7f65a4
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,24 @@
+# JSON API .Net Core
+
+A [{ json:api }](https://jsonapi.org) web application framework for .Net Core.
+
+## Objectives
+
+### 1. Eliminate Boilerplate
+
+The goal of this package is to facility the development of json:api applications that leverage the full range
+of features provided by the specification.
+
+Eliminate CRUD boilerplate and provide the following features across all your resource endpoints:
+
+- Relationship inclusion and navigation
+- Filtering
+- Sorting
+- Pagination
+- Sparse field selection
+- Checkout the [example requests](request-examples) to see the kind of features you will get out of the box
+
+### 2. Extensibility
+
+This library relies heavily on an open-generic-based dependency injection model which allows for easy per-resource customization.
+
diff --git a/docs/request-examples/.gitignore b/docs/request-examples/.gitignore
new file mode 100644
index 0000000000..361a80caba
--- /dev/null
+++ b/docs/request-examples/.gitignore
@@ -0,0 +1,2 @@
+*.json
+*.temp
\ No newline at end of file
diff --git a/docs/request-examples/000-CREATE_Person.sh b/docs/request-examples/000-CREATE_Person.sh
new file mode 100755
index 0000000000..bc5847f293
--- /dev/null
+++ b/docs/request-examples/000-CREATE_Person.sh
@@ -0,0 +1,11 @@
+curl -vs http://localhost:5001/api/people \
+ -H "Accept: application/vnd.api+json" \
+ -H "Content-Type: application/vnd.api+json" \
+ -d '{
+ "data": {
+ "type": "people",
+ "attributes": {
+ "name": "Alice"
+ }
+ }
+ }'
\ No newline at end of file
diff --git a/docs/request-examples/001-CREATE_Article.sh b/docs/request-examples/001-CREATE_Article.sh
new file mode 100755
index 0000000000..361915e177
--- /dev/null
+++ b/docs/request-examples/001-CREATE_Article.sh
@@ -0,0 +1,19 @@
+curl -vs http://localhost:5001/api/articles \
+ -H "Accept: application/vnd.api+json" \
+ -H "Content-Type: application/vnd.api+json" \
+ -d '{
+ "data": {
+ "type": "articles",
+ "attributes": {
+ "title": "Moby"
+ },
+ "relationships": {
+ "author": {
+ "data": {
+ "type": "people",
+ "id": "1"
+ }
+ }
+ }
+ }
+ }'
\ No newline at end of file
diff --git a/docs/request-examples/002-GET_Articles.sh b/docs/request-examples/002-GET_Articles.sh
new file mode 100755
index 0000000000..722677a748
--- /dev/null
+++ b/docs/request-examples/002-GET_Articles.sh
@@ -0,0 +1,2 @@
+curl -vs http://localhost:5001/api/articles \
+ -H "Accept: application/vnd.api+json"
\ No newline at end of file
diff --git a/docs/request-examples/003-GET_Article.sh b/docs/request-examples/003-GET_Article.sh
new file mode 100755
index 0000000000..5da8265236
--- /dev/null
+++ b/docs/request-examples/003-GET_Article.sh
@@ -0,0 +1,2 @@
+curl -vs http://localhost:5001/api/articles/1 \
+ -H "Accept: application/vnd.api+json"
\ No newline at end of file
diff --git a/docs/request-examples/004-GET_Articles_With_Authors.sh b/docs/request-examples/004-GET_Articles_With_Authors.sh
new file mode 100755
index 0000000000..8ad3021292
--- /dev/null
+++ b/docs/request-examples/004-GET_Articles_With_Authors.sh
@@ -0,0 +1,2 @@
+curl -vs http://localhost:5001/api/articles?include=author \
+ -H "Accept: application/vnd.api+json"
\ No newline at end of file
diff --git a/docs/request-examples/005-PATCH_Article.sh b/docs/request-examples/005-PATCH_Article.sh
new file mode 100755
index 0000000000..f4d222d0e0
--- /dev/null
+++ b/docs/request-examples/005-PATCH_Article.sh
@@ -0,0 +1,12 @@
+curl -vs http://localhost:5001/api/people/1 \
+ -H "Accept: application/vnd.api+json" \
+ -H "Content-Type: application/vnd.api+json" \
+ -X PATCH \
+ -d '{
+ "data": {
+ "type": "people",
+ "attributes": {
+ "name": "Bob"
+ }
+ }
+ }'
\ No newline at end of file
diff --git a/docs/request-examples/006-DELETE_Article.sh b/docs/request-examples/006-DELETE_Article.sh
new file mode 100755
index 0000000000..8d25a49418
--- /dev/null
+++ b/docs/request-examples/006-DELETE_Article.sh
@@ -0,0 +1,3 @@
+curl -vs http://localhost:5001/api/articles/1 \
+ -H "Accept: application/vnd.api+json" \
+ -X DELETE
\ No newline at end of file
diff --git a/docs/request-examples/007-__SEED__.sh b/docs/request-examples/007-__SEED__.sh
new file mode 100755
index 0000000000..185da440e8
--- /dev/null
+++ b/docs/request-examples/007-__SEED__.sh
@@ -0,0 +1,31 @@
+curl -vs http://localhost:5001/api/people \
+ -H "Accept: application/vnd.api+json" \
+ -H "Content-Type: application/vnd.api+json" \
+ -d '{
+ "data": {
+ "type": "people",
+ "attributes": {
+ "name": "Alice"
+ }
+ }
+ }'
+
+curl -vs http://localhost:5001/api/articles \
+ -H "Accept: application/vnd.api+json" \
+ -H "Content-Type: application/vnd.api+json" \
+ -d '{
+ "data": {
+ "type": "articles",
+ "attributes": {
+ "title": "Moby"
+ },
+ "relationships": {
+ "author": {
+ "data": {
+ "type": "people",
+ "id": "2"
+ }
+ }
+ }
+ }
+ }'
\ No newline at end of file
diff --git a/docs/request-examples/008-GET_Articles_With_Filter_Eq.sh b/docs/request-examples/008-GET_Articles_With_Filter_Eq.sh
new file mode 100755
index 0000000000..6616e4bf08
--- /dev/null
+++ b/docs/request-examples/008-GET_Articles_With_Filter_Eq.sh
@@ -0,0 +1,2 @@
+curl -vs http://localhost:5001/api/articles?filter%5Btitle%5D=Moby \
+ -H "Accept: application/vnd.api+json"
diff --git a/docs/request-examples/009-GET_Articles_With_Filter_Like.sh b/docs/request-examples/009-GET_Articles_With_Filter_Like.sh
new file mode 100755
index 0000000000..7ba25f0fb3
--- /dev/null
+++ b/docs/request-examples/009-GET_Articles_With_Filter_Like.sh
@@ -0,0 +1,2 @@
+curl -vs http://localhost:5001/api/people?filter%5Bname%5D=like:Al \
+ -H "Accept: application/vnd.api+json"
\ No newline at end of file
diff --git a/docs/request-examples/README.md b/docs/request-examples/README.md
new file mode 100644
index 0000000000..39111b3579
--- /dev/null
+++ b/docs/request-examples/README.md
@@ -0,0 +1,20 @@
+# Request Examples
+
+To update these requests:
+
+1. Add a bash (.sh) file prefixed by a number that is used to determine the order the scripts are executed. The bash script should execute a request and output the response. Example:
+```
+curl -vs http://localhost:5001/api/articles \
+ -H "Accept: application/vnd.api+json"
+```
+
+2. Add the example to `index.md`. Example:
+```
+## Get Article with Author
+
+[!code-sh[GET Request](004-GET_Articles_With_Authors.sh)]
+[!code-json[GET Response](004-GET_Articles_With_Authors-Response.json)]
+```
+
+3. Run `./generate.sh`
+4. Verify the results by running `docfx --serve`
diff --git a/docs/request-examples/index.md b/docs/request-examples/index.md
new file mode 100644
index 0000000000..7c41aefe13
--- /dev/null
+++ b/docs/request-examples/index.md
@@ -0,0 +1,63 @@
+# Examples
+
+These requests have been generated against the "GettingStarted" application and are updated on every deployment.
+
+All of these requests have been created using out-of-the-box features.
+
+## Simple CRUD
+
+### Create
+
+[!code-sh[CREATE](000-CREATE_Person.sh)]
+[!code-json[CREATE](000-CREATE_Person-Response.json)]
+
+### Create with Relationship
+
+[!code-sh[CREATE](001-CREATE_Article.sh)]
+[!code-json[CREATE](001-CREATE_Article-Response.json)]
+
+
+### Get All
+
+[!code-sh[GET Request](002-GET_Articles.sh)]
+[!code-json[GET Response](002-GET_Articles-Response.json)]
+
+### Get By Id
+
+[!code-sh[GET Request](003-GET_Article.sh)]
+[!code-json[GET Response](003-GET_Article-Response.json)]
+
+### Get with Relationship
+
+[!code-sh[GET Request](004-GET_Articles_With_Authors.sh)]
+[!code-json[GET Response](004-GET_Articles_With_Authors-Response.json)]
+
+### Update
+
+[!code-sh[PATCH Request](005-PATCH_Article.sh)]
+[!code-json[PATCH Response](005-PATCH_Article-Response.json)]
+
+### Delete
+
+[!code-sh[DELETE Request](006-DELETE_Article.sh)]
+[!code-json[DELETE Response](006-DELETE_Article-Response.json)]
+
+## Filters
+
+_Note that cURL requires URLs to be escaped._
+
+### Equality
+
+[!code-sh[GET Request](008-GET_Articles_With_Filter_Eq.sh)]
+[!code-json[GET Response](008-GET_Articles_With_Filter_Eq-Response.json)]
+
+### Like
+
+[!code-sh[GET Request](009-GET_Articles_With_Filter_Like.sh)]
+[!code-json[GET Response](009-GET_Articles_With_Filter_Like-Response.json)]
+
+## Sorting
+
+# See Also
+
+- Customizing QuerySet
diff --git a/docs/request-examples/toc.yml b/docs/request-examples/toc.yml
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/docs/toc.yml b/docs/toc.yml
new file mode 100644
index 0000000000..fcf7f6f466
--- /dev/null
+++ b/docs/toc.yml
@@ -0,0 +1,13 @@
+- name: Getting Started
+ href: getting-started/
+
+- name: Usage
+ href: usage/
+
+- name: API
+ href: api/
+ homepage: api/index.md
+
+- name: Request Examples
+ href: request-examples/
+ homepage: request-examples/index.md
\ No newline at end of file
diff --git a/docs/usage/errors.md b/docs/usage/errors.md
new file mode 100644
index 0000000000..da88e93668
--- /dev/null
+++ b/docs/usage/errors.md
@@ -0,0 +1,67 @@
+# Errors
+
+By default, errors will only contain the properties defined by the `Error` class.
+However, you can create your own by inheriting from Error and either throwing it in a `JsonApiException` or returning the error from your controller.
+
+```c#
+public class CustomError : Error
+{
+ public CustomError(int status, string title, string detail, string myProp)
+ : base(status, title, detail)
+ {
+ MyCustomProperty = myProp;
+ }
+
+ public string MyCustomProperty { get; set; }
+}
+```
+
+If you throw a `JsonApiException` that is unhandled, the middleware will properly serialize it and return it as a json:api error.
+
+```c#
+public void MyMethod()
+{
+ var error = new CustomError(507, "title", "detail", "custom");
+ throw new JsonApiException(error);
+}
+```
+
+You can use the `IActionResult Error(Error error)` method to return a single error message, or you can use the `IActionResult Errors(ErrorCollection errors)` method to return a collection of errors from your controller.
+
+```c#
+[HttpPost]
+public override async Task PostAsync([FromBody] MyEntity entity)
+{
+ if(_db.IsFull)
+ return Error(new CustomError("507", "Database is full.", "Theres no more room.", "Sorry."));
+
+ if(model.Validations.IsValid == false)
+ return Errors(model.Validations.GetErrors());
+}
+```
+
+## Example: Including Links
+
+This example demonstrates one way you can include links with your error payloads.
+
+This example assumes that there is a support documentation site that provides additional information based on the HTTP Status Code.
+
+```c#
+public class LinkableError : Error
+{
+ public LinkableError(int status, string title)
+ : base(status, title)
+ { }
+
+ public ErrorLink Links => "https://example.com/errors/" + Status;
+}
+
+var error = new LinkableError(401, "You're not allowed to do that.");
+throw new JsonApiException(error);
+```
+
+
+
+
+
+
diff --git a/docs/usage/extensibility/controllers.md b/docs/usage/extensibility/controllers.md
new file mode 100644
index 0000000000..3870e408f4
--- /dev/null
+++ b/docs/usage/extensibility/controllers.md
@@ -0,0 +1,108 @@
+# Controllers
+
+You need to create controllers that inherit from `JsonApiController`
+
+```c#
+public class ArticlesController : JsonApiController
+{
+ public ArticlesController(
+ IJsonApiContext jsonApiContext,
+ IResourceService resourceService,
+ ILoggerFactory loggerFactory)
+ : base(jsonApiContext, resourceService, loggerFactory)
+ { }
+}
+```
+
+## Non-Integer Type Keys
+
+If your model is using a type other than int for the primary key, you must explicitly declare it in the controller and service generic type definitions.
+
+```c#
+public class ArticlesController : JsonApiController
+//---------------------- ^^^^
+{
+ public ArticlesController(
+ IJsonApiContext jsonApiContext,
+ IResourceService resourceService,
+ //--------------------- ^^^^
+
+ ILoggerFactory loggerFactory)
+ : base(jsonApiContext, resourceService, loggerFactory)
+ { }
+}
+```
+
+## Resource Access Control
+
+It is often desirable to limit what methods are exposed on your controller. The first way, you can do this is to simply inherit from `BaseJsonApiController` and explicitly declare what methods are available.
+
+In this example, if a client attempts to do anything other than GET a resource, an HTTP 404 Not Found response will be returned since no other methods are exposed.
+
+This approach is ok, but introduces some boilerplate that can easily be avoided.
+
+```c#
+public class ArticlesController : BaseJsonApiController
+{
+ public ArticlesController(
+ IJsonApiContext jsonApiContext,
+ IResourceService resourceService)
+ : base(jsonApiContext, resourceService)
+ { }
+
+ [HttpGet]
+ public override async Task GetAsync()
+ => await base.GetAsync();
+
+ [HttpGet("{id}")]
+ public override async Task GetAsync(TId id)
+ => await base.GetAsync(id);
+}
+```
+
+## Using ActionFilterAttributes
+
+The next option is to use the ActionFilterAttributes that ship with the library. The available attributes are:
+
+- `NoHttpPost`: disallow POST requests
+- `NoHttpPatch`: disallow PATCH requests
+- `NoHttpDelete`: disallow DELETE requests
+- `HttpReadOnly`: all of the above
+
+Not only does this reduce boilerplate, but it also provides a more meaningful HTTP response code.
+An attempt to use one blacklisted methods will result in a HTTP 405 Method Not Allowed response.
+
+```c#
+[HttpReadOnly]
+public class ArticlesController : BaseJsonApiController
+{
+ public ArticlesController(
+ IJsonApiContext jsonApiContext,
+ IResourceService resourceService)
+ : base(jsonApiContext, resourceService)
+ { }
+}
+```
+
+## Implicit Access By Service Injection
+
+Finally, you can control the allowed methods by supplying only the available service implementations. In some cases, resources may be an aggregation of entities or a view on top of the underlying entities. In these cases, there may not be a writable IResourceService implementation. In these cases, simply inject the implementation that is available.
+
+As with the ActionFilterAttributes, if a service implementation is not available to service a request, HTTP 405 Method Not Allowed will be returned.
+
+For more information about resource injection, see the next section titled Resource Services.
+
+```c#
+public class ReportsController : BaseJsonApiController
+{
+ public ReportsController(
+ IJsonApiContext jsonApiContext,
+ IGetAllService getAll)
+ : base(jsonApiContext, getAll: getAll)
+ { }
+
+ [HttpGet]
+ public override async Task GetAsync()
+ => await base.GetAsync();
+}
+```
\ No newline at end of file
diff --git a/docs/usage/extensibility/custom-query-formats.md b/docs/usage/extensibility/custom-query-formats.md
new file mode 100644
index 0000000000..39e9026572
--- /dev/null
+++ b/docs/usage/extensibility/custom-query-formats.md
@@ -0,0 +1,9 @@
+# Custom Query Formats
+
+For information on the default query parameter formats, see the documentation for each query method.
+
+In order to customize the query formats, you need to implement the `IQueryParser` interface and inject it.
+
+```c#
+services.AddScoped();
+```
\ No newline at end of file
diff --git a/docs/usage/extensibility/layer-overview.md b/docs/usage/extensibility/layer-overview.md
new file mode 100644
index 0000000000..fe19477183
--- /dev/null
+++ b/docs/usage/extensibility/layer-overview.md
@@ -0,0 +1,56 @@
+# Layer Overview
+
+By default, data retrieval is distributed across 3 layers:
+
+```
+JsonApiController (required)
+
+└── EntityResourceService: IResourceService
+
+ └── DefaultEntityRepository: IEntityRepository
+```
+
+Customization can be done at any of these layers. However, it is recommended that you make your customizations at the service or the repository layer when possible to keep the controllers free of unnecessary logic.
+You can use the following as a general rule of thumb for where to put business logic:
+
+- `Controller`: simple validation logic that should result in the return of specific HTTP status codes such as model validation
+- `IResourceService`: advanced BL and replacement of data access mechanisms
+- `IEntityRepository`: custom logic that builds on the EF APIs, such as Authorization of data
+
+## Replacing Services
+
+**Note:** If you are using auto-discovery, services will be automatically registered for you.
+
+Replacing services is done on a per resource basis and can be done through simple DI in your Startup.cs file.
+
+In v3.0.0 we introduced an extenion method that you should use to
+register services. This method handles some of the common issues
+users have had with service registration.
+
+```c#
+// Startup.cs
+public IServiceProvider ConfigureServices(IServiceCollection services)
+{
+ // custom service
+ services.AddResourceService();
+
+ // custom repository
+ services.AddScoped();
+}
+```
+
+Prior to v3.0.0 you could do it like so:
+
+```c#
+// Startup.cs
+public IServiceProvider ConfigureServices(IServiceCollection services)
+{
+ // custom service
+ services.AddScoped, FooService>();
+
+ // custom repository
+ services.AddScoped, FooService>();
+
+ // ...
+}
+```
\ No newline at end of file
diff --git a/docs/usage/extensibility/middleware.md b/docs/usage/extensibility/middleware.md
new file mode 100644
index 0000000000..65e5cedda1
--- /dev/null
+++ b/docs/usage/extensibility/middleware.md
@@ -0,0 +1,12 @@
+# Middleware
+Add the following to your Startup.ConfigureServices method. Replace AppDbContext with your DbContext.
+
+```c3
+services.AddJsonApi();
+```
+
+Add the middleware to the Startup.Configure method. Note that under the hood, this will call app.UseMvc() so there is no need to add that as well.
+
+```c3
+app.UseJsonApi();
+```
\ No newline at end of file
diff --git a/docs/usage/extensibility/repositories.md b/docs/usage/extensibility/repositories.md
new file mode 100644
index 0000000000..bd94820159
--- /dev/null
+++ b/docs/usage/extensibility/repositories.md
@@ -0,0 +1,99 @@
+# Entity Repositories
+
+If you want to use EF, but need additional data access logic (such as authorization), you can implement custom methods for accessing the data by creating an implementation of IEntityRepository. If you only need minor changes you can override the methods defined in DefaultEntityRepository.
+
+The repository should then be add to the service collection in Startup.cs.
+
+```c#
+public IServiceProvider ConfigureServices(IServiceCollection services)
+{
+ services.AddScoped, AuthorizedArticleRepository>();
+ // ...
+}
+```
+
+A sample implementation that performs data authorization might look like this.
+
+All of the methods in the DefaultEntityRepository will use the Get() method to get the DbSet so this is a good method to apply scoped filters such as user or tenant authorization.
+
+```c#
+public class AuthorizedArticleRepository
+ : DefaultEntityRepository
+{
+ private readonly IAuthenticationService _authenticationService;
+
+ public AuthorizedArticleRepository(
+ ILoggerFactory loggerFactory,
+ IJsonApiContext jsonApiContext,
+ IDbContextResolver contextResolver,
+ IAuthenticationService authenticationService)
+ : base(loggerFactory, jsonApiContext, contextResolver)
+ {
+ _authenticationService = authenticationService;
+ }
+
+ public override IQueryable Get()
+ => base.Get()
+ .Where(e =>
+ e.UserId == _authenticationService.UserId
+ );
+}
+```
+
+## Multiple DbContexts
+
+If you need to use multiple EF DbContext, first add each DbContext to the ContextGraphBuilder.
+
+Then, create an implementation of IDbContextResolver for each context.
+
+Register each of the new IDbContextResolver implementations in the Startup.
+
+You can then create a general repository for each context and inject it per resource type. This example shows a single DbContextARepository for all entities that are members of DbContextA.
+
+Then inject the repository for the correct entity, in this case Foo is a member of DbContextA.
+
+```c#
+// Startup.cs
+services.AddJsonApi(options => {
+ options.BuildContextGraph((builder) =>
+ {
+ // Add both contexts using the builder
+ builder.AddDbContext();
+ builder.AddDbContext();
+ });
+}, mvcBuilder);
+
+
+public class DbContextAResolver : IDbContextResolver
+{
+ private readonly DbContextA _context;
+
+ public DbContextAResolver(DbContextA context)
+ {
+ _context = context;
+ }
+
+ public DbContext GetContext() => _context;
+}
+
+
+// Startup.cs
+services.AddScoped();
+services.AddScoped();
+
+
+public class DbContextARepository
+: DefaultEntityRepository where TEntity : class, IIdentifiable
+{
+ public DbContextARepository(
+ ILoggerFactory loggerFactory,
+ IJsonApiContext jsonApiContext,
+ DbContextAResolver contextResolver)
+ : base(loggerFactory, jsonApiContext, contextResolver)
+ { }
+}
+
+
+// Startup.cs
+services.AddScoped, DbContextARepository>();
+```
\ No newline at end of file
diff --git a/docs/usage/extensibility/services.md b/docs/usage/extensibility/services.md
new file mode 100644
index 0000000000..81685a6f36
--- /dev/null
+++ b/docs/usage/extensibility/services.md
@@ -0,0 +1,159 @@
+# Resource Services
+
+The `IResourceService` acts as a service layer between the controller and the data access layer.
+This allows you to customize it however you want and not be dependent upon Entity Framework.
+This is also a good place to implement custom business logic.
+
+## Supplementing Default Behavior
+If you don't need to alter the actual persistence mechanism, you can inherit from the EntityResourceService and override the existing methods.
+In simple cases, you can also just wrap the base implementation with your custom logic.
+
+A simple example would be to send notifications when an entity gets created.
+
+```c#
+public class TodoItemService : EntityResourceService
+{
+ private readonly INotificationService _notificationService;
+
+ public TodoItemService(
+ IJsonApiContext jsonApiContext,
+ IEntityRepository repository,
+ ILoggerFactory loggerFactory,
+ INotificationService notificationService)
+ : base(jsonApiContext, repository, loggerFactory)
+ {
+ _notificationService = notificationService;
+ }
+
+ public override async Task CreateAsync(TEntity entity)
+ {
+ // call the base implementation which uses Entity Framework
+ var newEntity = await base.CreateAsync(entity);
+
+ // custom code
+ _notificationService.Notify($"Entity created: { newEntity.Id }");
+
+ // don't forget to return the new entity
+ return newEntity;
+ }
+}
+```
+
+## Not Using Entity Framework?
+
+As previously discussed, this library uses Entity Framework by default.
+If you'd like to use another ORM that does not implement `IQueryable`, you can use a custom `IResourceService` implementation.
+
+```c#
+// Startup.cs
+public void ConfigureServices(IServiceCollection services)
+{
+ // add the service override for MyModel
+ services.AddScoped, MyModelService>();
+
+ // add your own DAO
+ services.AddScoped();
+ // ...
+}
+
+// MyModelService.cs
+public class MyModelService : IResourceService
+{
+ private readonly IMyModelDao _dao;
+
+ public MyModelService(IMyModelDao dao)
+ {
+ _dao = dao;
+ }
+
+ public Task> GetAsync()
+ {
+ return await _dao.GetModelAsync();
+ }
+
+ // ...
+}
+```
+
+## Limited Requirements
+
+In some cases it may be necessary to only expose a few methods on the resource. For this reason, we have created a hierarchy of service interfaces that can be used to get the exact implementation you require.
+
+This interface hierarchy is defined by this tree structure.
+
+```
+IResourceService
+|
+├── IResourceQueryService
+| |
+│ ├── IGetAllService
+│ │ GET /
+| |
+│ ├── IGetByIdService
+| | GET /{id}
+| |
+│ ├── IGetRelationshipService
+| | GET /{id}/{relationship}
+| |
+│ └── IGetRelationshipsService
+| GET /{id}/relationships/{relationship}
+|
+└── IResourceCmdService
+ |
+ ├── ICreateService
+ | POST /
+ |
+ ├── IDeleteService
+ | DELETE /{id}
+ |
+ ├── IUpdateService
+ | PATCH /{id}
+ |
+ └── IUpdateRelationshipService
+ PATCH /{id}/relationships/{relationship}
+```
+
+In order to take advantage of these interfaces you first need to inject the service for each implemented interface.
+
+```c#
+public class ArticleService : ICreateService, IDeleteService
+{
+ // ...
+}
+
+public class Startup
+{
+ public IServiceProvider ConfigureServices(IServiceCollection services)
+ {
+ services.AddScoped, ArticleService>();
+ services.AddScoped, ArticleService>();
+ }
+}
+```
+
+Other dependency injection frameworks such as Autofac can be used to simplify this syntax.
+
+```c#
+builder.RegisterType().AsImplementedInterfaces();
+```
+
+Then in the controller, you should inherit the base controller and pass the services into the named, optional base parameters:
+
+```c#
+public class ArticlesController : BaseJsonApiController
+{
+ public ArticlesController(
+ IJsonApiContext jsonApiContext,
+ ICreateService create,
+ IDeleteService delete
+ ) : base(jsonApiContext, create: create, delete: delete) { }
+
+ [HttpPost]
+ public override async Task PostAsync([FromBody] Article entity)
+ => await base.PostAsync(entity);
+
+ [HttpDelete("{id}")]
+ public override async TaskDeleteAsync(int id)
+ => await base.DeleteAsync(id);
+}
+```
\ No newline at end of file
diff --git a/docs/usage/filtering.md b/docs/usage/filtering.md
new file mode 100644
index 0000000000..74f264d54b
--- /dev/null
+++ b/docs/usage/filtering.md
@@ -0,0 +1,70 @@
+# Filtering
+
+Resources can be filtered by attributes using the `filter` query parameter.
+By default, all attributes are filterable.
+The filtering strategy we have selected, uses the following form.
+
+```
+?filter[attribute]=value
+```
+
+For operations other than equality, the query can be prefixed with an operation identifier.
+Examples can be found in the table below.
+
+| Operation | Prefix | Example |
+|-------------------------------|---------------|------------------------------------------|
+| Equals | `eq` | `?filter[attribute]=eq:value` |
+| Not Equals | `ne` | `?filter[attribute]=ne:value` |
+| Less Than | `lt` | `?filter[attribute]=lt:10` |
+| Greater Than | `gt` | `?filter[attribute]=gt:10` |
+| Less Than Or Equal To | `le` | `?filter[attribute]=le:10` |
+| Greater Than Or Equal To | `ge` | `?filter[attribute]=ge:10` |
+| Like (string comparison) | `like` | `?filter[attribute]=like:value` |
+| In Set | `in` | `?filter[attribute]=in:value1,value2` |
+| Not In Set | `nin` | `?filter[attribute]=nin:value1,value2` |
+| Is Null | `isnull` | `?filter[attribute]=isnull:` |
+| Is Not Null | `isnotnull` | `?filter[attribute]=isnotnull:` |
+
+Filters can be combined and will be applied using an AND operator.
+The following are equivalent query forms to get articles whose ordinal values are between 1-100.
+
+```http
+GET /api/articles?filter[ordinal]=gt:1,lt:100 HTTP/1.1
+Accept: application/vnd.api+json
+```
+```http
+GET /api/articles?filter[ordinal]=gt:1&filter[ordinal]=lt:100 HTTP/1.1
+Accept: application/vnd.api+json
+```
+
+## Custom Filters
+
+There are two ways you can add custom filters:
+
+1. Creating a `ResourceDefinition` as [described previously](~/usage/resources/resource-definitions.html#custom-query-filters)
+2. Overriding the `DefaultEntityRepository` shown below
+
+```c#
+public class AuthorRepository : DefaultEntityRepository
+{
+ public AuthorRepository(
+ AppDbContext context,
+ ILoggerFactory loggerFactory,
+ IJsonApiContext jsonApiContext)
+ : base(context, loggerFactory, jsonApiContext)
+ { }
+
+ public override IQueryable Filter(
+ IQueryable authors,
+ FilterQuery filterQuery)
+ // if the filter key is "query" (filter[query]),
+ // find Authors with matching first or last names
+ // for all other filter keys, use the base method
+ => filter.Attribute.Is("query")
+ ? authors.Where(a =>
+ a.First.Contains(filter.Value)
+ || a.Last.Contains(filter.Value))
+ : base.Filter(authors, filter);
+}
+```
+
diff --git a/docs/usage/including-relationships.md b/docs/usage/including-relationships.md
new file mode 100644
index 0000000000..e407a3262b
--- /dev/null
+++ b/docs/usage/including-relationships.md
@@ -0,0 +1,55 @@
+# Including Relationships
+
+JADNC supports [request include params](http://jsonapi.org/format/#fetching-includes) out of the box,
+for side loading related resources.
+
+```http
+GET /articles/1?include=comments HTTP/1.1
+Accept: application/vnd.api+json
+
+{
+ "data": {
+ "type": "articles",
+ "id": "1",
+ "attributes": {
+ "title": "JSON API paints my bikeshed!"
+ },
+ "relationships": {
+ "comments": {
+ "links": {
+ "self": "http://example.com/articles/1/relationships/comments",
+ "related": "http://example.com/articles/1/comments"
+ },
+ "data": [
+ { "type": "comments", "id": "5" },
+ { "type": "comments", "id": "12" }
+ ]
+ }
+ }
+ },
+ "included": [
+ {
+ "type": "comments",
+ "id": "5",
+ "attributes": {
+ "body": "First!"
+ }
+ },
+ {
+ "type": "comments",
+ "id": "12",
+ "attributes": {
+ "body": "I like XML better"
+ }
+ }
+ ]
+}
+```
+
+## Deeply Nested Inclusions
+
+_since v3.0.0_
+
+JsonApiDotNetCore also supports deeply nested inclusions.
+This allows you to include data across relationships by using a period delimited
+relationship path such as comments.author.
\ No newline at end of file
diff --git a/docs/usage/index.md b/docs/usage/index.md
new file mode 100644
index 0000000000..fc56ab5147
--- /dev/null
+++ b/docs/usage/index.md
@@ -0,0 +1 @@
+# Usage
\ No newline at end of file
diff --git a/docs/usage/meta.md b/docs/usage/meta.md
new file mode 100644
index 0000000000..2a582b59cd
--- /dev/null
+++ b/docs/usage/meta.md
@@ -0,0 +1,52 @@
+# Metadata
+
+Non-standard metadata can be added to your API responses in 2 ways. Resource and Request meta. In the event of a key collision, the Request Meta will take precendence.
+
+## Resource Meta
+
+Resource Meta is metadata defined on the resource itself by implementing the `IHasMeta` interface.
+
+```c#
+public class Person : Identifiable, IHasMeta
+{
+ public Dictionary GetMeta(IJsonApiContext context)
+ => new Dictionary {
+ { "copyright", "Copyright 2018 Example Corp." },
+ { "authors", new string[] { "Jared Nance" } }
+ };
+}
+```
+
+## Request Meta
+
+Request Meta can be added by injecting a service that implements `IRequestMeta`.
+This is useful if you need access to other injected services to build the meta object.
+
+```c#
+public class RequestMetaService : IRequestMeta
+{
+ public RequestMetaService(/*...other dependencies here */) {
+ // ...
+ }
+
+ public Dictionary GetMeta(IJsonApiContext context)
+ => return new Dictionary {
+ { "copyright", "Copyright 2018 Example Corp." },
+ { "authors", new string[] { "Jared Nance" } }
+ };
+}
+```
+
+```json
+{
+ "meta": {
+ "copyright": "Copyright 2015 Example Corp.",
+ "authors": [
+ "Jared Nance"
+ ]
+ },
+ "data": {
+ // ...
+ }
+}
+```
diff --git a/docs/usage/options.md b/docs/usage/options.md
new file mode 100644
index 0000000000..e6e62c3f34
--- /dev/null
+++ b/docs/usage/options.md
@@ -0,0 +1,83 @@
+# Global Options
+
+Configuration can be applied when adding the services to the DI container.
+
+```c#
+public IServiceProvider ConfigureServices(IServiceCollection services) {
+ services.AddJsonApi(options => {
+ // configure the options here
+ });
+}
+```
+
+## Client Generated Ids
+
+By default, the server will respond with a 403 Forbidden HTTP Status Code if a POST request is received with a client generated id.
+
+However, this can be allowed by setting the AllowClientGeneratedIds flag in the options
+
+```c#
+services.AddJsonApi(options => {
+ options.AllowClientGeneratedIds = true;
+});
+```
+
+## Pagination
+
+If you would like pagination implemented for all resources, you can specify a default page size.
+
+You can also include the total number of records in each request. Note that when using this feature, it does add some query overhead since we have to also request the total number of records.
+
+```c#
+services.AddJsonApi(options => {
+ options.DefaultPageSize = 10;
+});
+```
+
+## Relative Links
+
+All links are absolute by default. However, you can configure relative links.
+
+```c#
+services.AddJsonApi(options => {
+ options.RelativeLinks = true;
+});
+```
+
+```json
+{
+ "type": "articles",
+ "id": "4309",
+ "relationships": {
+ "author": {
+ "links": {
+ "self": "/api/v1/articles/4309/relationships/author",
+ "related": "/api/v1/articles/4309/author"
+ }
+ }
+ }
+}
+```
+
+## Custom Query Parameters
+
+If you would like to use custom query params (parameters not reserved by the json:api specification), you can set AllowCustomQueryParameters = true. The default behavior is to return an HTTP 400 Bad Request for unknown query parameters.
+
+```c#
+services.AddJsonApi(options => {
+ options.AllowCustomQueryParameters = true;
+});
+```
+
+## Custom Serializer Settings
+
+We use Newtonsoft.Json for all serialization needs.
+If you want to change the default serializer settings, you can:
+
+```c#
+options.SerializerSettings = new JsonSerializerSettings()
+{
+ NullValueHandling = NullValueHandling.Ignore,
+ ContractResolver = new DasherizedResolver()
+}
+```
diff --git a/docs/usage/pagination.md b/docs/usage/pagination.md
new file mode 100644
index 0000000000..56c3255eed
--- /dev/null
+++ b/docs/usage/pagination.md
@@ -0,0 +1,12 @@
+# Pagination
+
+Resources can be paginated. This query would fetch the second page of 10 articles (articles 11 - 21).
+
+```http
+GET /articles?page[size]=10&page[number]=2 HTTP/1.1
+Accept: application/vnd.api+json
+```
+
+## Configuring Default Behavior
+
+You can configure the global default behavior as [described previously](~/usage/options.html#pagination).
diff --git a/docs/usage/resource-graph.md b/docs/usage/resource-graph.md
new file mode 100644
index 0000000000..694f53d90f
--- /dev/null
+++ b/docs/usage/resource-graph.md
@@ -0,0 +1,88 @@
+# The Resource Graph
+
+_NOTE: prior to 3.0.0 this was called the `ContextGraph`_
+
+The `ResourceGraph` is a map of all the json:api resources and their relationships that your API serves.
+
+It is built at app startup and available as a singleton through Dependency Injection.
+
+## Constructing The Graph
+
+There are three ways the resource graph can be created:
+
+1. Auto-discovery
+2. Specifying an entire DbContext
+3. Manually specifying each resource
+
+### Auto-Discovery
+
+Auto-discovery refers to process of reflecting on an assembly and
+detecting all of the json:api resources and services.
+
+The following command will build the context graph using all `IIdentifiable`
+implementations. It also injects service layer overrides which we will
+cover in a later section. You can enable auto-discovery for the
+current assembly by adding the following to your `Startup` class.
+
+```c#
+// Startup.cs
+public void ConfigureServices(IServiceCollection services)
+{
+ services.AddJsonApi(
+ options => { /* ... */ },
+ mvcBuilder,
+ discovery => discovery.AddCurrentAssembly());
+}
+```
+
+### Entity Framework DbContext
+
+If you are using Entity Framework Core as your ORM, you can add an entire `DbContext` with one line.
+
+```c#
+// Startup.cs
+public void ConfigureServices(IServiceCollection services)
+{
+ services.AddJsonApi();
+}
+```
+
+### Manual Specification
+
+You can also manually construct the graph.
+
+```c#
+// Startup.cs
+public void ConfigureServices(IServiceCollection services)
+{
+ var mvcBuilder = services.AddMvc();
+
+ services.AddJsonApi(options => {
+ options.BuildResourceGraph((builder) => {
+ builder.AddResource();
+ });
+ }, mvcBuilder);
+}
+```
+
+### Public Resource Type Name
+
+The public resource type name for is determined by the following criteria (in order of priority):
+
+1. The model is decorated with a `ResourceAttribute`
+```c#
+[Resource("my-models")]
+public class MyModel : Identifiable { /* ... */ }
+```
+
+2. The `DbSet` is decorated with a `ResourceAttribute`. Note that this only applies if the graph was created from the DbContext (i.e. `services.AddJsonApi()`)
+```c#
+[Resource("my-models")]
+public DbSet MyModel { get; set; }
+```
+
+3. The configured naming convention (by default this is kebab-case).
+```c#
+// this will be registered as "my-models"
+public class MyModel : Identifiable { /* ... */ }
+```
diff --git a/docs/usage/resources/attributes.md b/docs/usage/resources/attributes.md
new file mode 100644
index 0000000000..8f86624254
--- /dev/null
+++ b/docs/usage/resources/attributes.md
@@ -0,0 +1,99 @@
+# Attributes
+
+If you want an attribute on your model to be publicly available, add the `AttrAttribute`.
+
+```c#
+public class Person : Identifiable
+{
+ [Attr]
+ public string FirstName { get; set; }
+}
+```
+
+## Public name
+
+There are two ways the public attribute name is determined:
+1. By convention, specified by @JsonApiDotNetCore.Configuration.JsonApiOptions#JsonApiDotNetCore_Configuration_JsonApiOptions_ResourceNameFormatter
+```c#
+options.ResourceNameFormatter = new DefaultResourceNameFormatter();
+```
+
+2. Individually using the attribute's constructor
+```c#
+public class Person : Identifiable
+{
+ [Attr("first-name")]
+ public string FirstName { get; set; }
+}
+```
+
+## Immutability
+
+Attributes can be marked as immutable which will prevent `PATCH` requests from updating them.
+
+```c#
+public class Person : Identifiable
+{
+ [Attr(immutable: true)]
+ public string FirstName { get; set; }
+}
+```
+
+## Filter|Sort-ability
+
+All attributes are filterable and sortable by default.
+You can disable this by setting `IsFiterable` and `IsSortable` to `false `.
+Requests to filter or sort these attributes will receive an HTTP 400 response.
+
+```c#
+public class Person : Identifiable
+{
+ [Attr(isFilterable: false, isSortable: false)]
+ public string FirstName { get; set; }
+}
+```
+
+## Complex Attributes
+
+Models may contain complex attributes.
+Serialization of these types is done by Newtonsoft.Json,
+so you should use their APIs to specify serialization formats.
+You can also use global options to specify the `JsonSerializer` that gets used.
+
+```c#
+public class Foo : Identifiable
+{
+ [Attr]
+ public Bar Bar { get; set; }
+}
+
+public class Bar
+{
+ [JsonProperty("compound-member")]
+ public string CompoundMember { get; set; }
+}
+```
+
+If you need your complex attributes persisted as a
+JSON string in your database, but you need access to it as a concrete type, you can define two members on your resource.
+The first member is the concrete type that you will directly interact with in your application. We can use the `NotMapped` attribute to prevent Entity Framework from mapping it to the database. The second is the raw JSON property that will be persisted to the database. How you use these members should determine which one is responsible for serialization. In this example, we only serialize and deserialize at the time of persistence
+and retrieval.
+
+```c#
+public class Foo : Identifiable
+{
+ [Attr, NotMapped]
+ public Bar Bar { get; set; }
+
+ public string BarJson
+ {
+ get => (Bar == null)
+ ? "{}"
+ : JsonConvert.SerializeObject(Bar);
+
+ set => Bar = string.IsNullOrWhiteSpace(value)
+ ? null
+ : JsonConvert.DeserializeObject(value);
+ };
+}
+```
\ No newline at end of file
diff --git a/docs/usage/resources/discovery.md b/docs/usage/resources/discovery.md
new file mode 100644
index 0000000000..0596d53fe5
--- /dev/null
+++ b/docs/usage/resources/discovery.md
@@ -0,0 +1 @@
+# Auto-Discovery
\ No newline at end of file
diff --git a/docs/usage/resources/index.md b/docs/usage/resources/index.md
new file mode 100644
index 0000000000..e8dece398a
--- /dev/null
+++ b/docs/usage/resources/index.md
@@ -0,0 +1,45 @@
+# Resources
+
+At a minimum, resources must implement `IIdentifiable` where `TId` is the type of the primary key. The easiest way to do this is to inherit `Identifiable`.
+
+```c#
+public class Person : Identifiable
+{ }
+```
+
+You can use the non-generic `Identifiable` if your primary key is an integer.
+
+```c#
+public class Person : Identifiable
+{ }
+
+// is the same as
+
+public class Person : Identifiable
+{ }
+```
+
+If you need to hang annotations or attributes on the `Id` property,
+you can override the virtual property.
+
+```c#
+public class Person : Identifiable
+{
+ [Key]
+ [Column("person_id")]
+ public override int Id { get; set; }
+}
+```
+
+If your resource must inherit from another class,
+you can always implement the interface yourself.
+In this example, `ApplicationUser` inherits `IdentityUser`
+which already contains an Id property of type string.
+
+```c#
+public class ApplicationUser : IdentityUser, IIdentifiable
+{
+ [NotMapped]
+ public string StringId { get => Id; set => Id = value; }
+}
+```
\ No newline at end of file
diff --git a/docs/usage/resources/relationships.md b/docs/usage/resources/relationships.md
new file mode 100644
index 0000000000..beb5ae6444
--- /dev/null
+++ b/docs/usage/resources/relationships.md
@@ -0,0 +1,56 @@
+# Relationships
+
+In order for navigation properties to be identified in the model,
+they should be labeled with the appropriate attribute (either `HasOne`, `HasMany` or `HasManyThrough`).
+
+## HasOne
+
+Dependent relationships should contain a property in the form `{RelationshipName}Id`.
+For example, a TodoItem may have an Owner and so the Id attribute should be OwnerId.
+
+```c#
+public class TodoItem : Identifiable
+{
+ [Attr("description")]
+ public string Description { get; set; }
+
+ [HasOne("owner")]
+ public virtual Person Owner { get; set; }
+ public int OwnerId { get; set; }
+}
+```
+
+The convention used used to locate the foreign key property (e.g. `OwnerId`) can be changed on
+the @JsonApiDotNetCore.Configuration.JsonApiOptions#JsonApiDotNetCore_Configuration_JsonApiOptions_RelatedIdMapper
+
+## HasMany
+
+```c#
+public class Person : Identifiable
+{
+ [Attr("first-name")]
+ public string FirstName { get; set; }
+
+ [HasMany("todo-items")]
+ public virtual List TodoItems { get; set; }
+}
+```
+
+## HasManyThrough
+
+Currently EntityFrameworkCore [does not support](https://github.com/aspnet/EntityFrameworkCore/issues/1368) Many-to-Many relationships without a join entity.
+For this reason, we have decided to fill this gap by allowing applications to declare a relationships as `HasManyThrough`.
+JsonApiDotNetCore will expose this attribute to the client the same way as any other `HasMany` attribute.
+However, under the covers it will use the join type and EntityFramework's APIs to get and set the relationship.
+
+```c#
+public class Article : Identifiable
+{
+ [NotMapped] // ← tells EF to ignore this property
+ [HasManyThrough(nameof(ArticleTags))] // ← tells JADNC to use this as an alias to ArticleTags.Tags
+ public List Tags { get; set; }
+
+ // this is the EF join relationship
+ public List ArticleTags { get; set; }
+}
+```
\ No newline at end of file
diff --git a/docs/usage/resources/resource-definitions.md b/docs/usage/resources/resource-definitions.md
new file mode 100644
index 0000000000..d1e5db5f2e
--- /dev/null
+++ b/docs/usage/resources/resource-definitions.md
@@ -0,0 +1,131 @@
+# Resource Definitions
+
+In order to improve the developer experience, we have introduced a type that makes
+common modifications to the default API behavior easier. `ResourceDefinition` was first introduced in v2.3.4.
+
+## Runtime Attribute Filtering
+
+_since v2.3.4_
+
+There are some cases where you want attributes excluded from your resource response.
+For example, you may accept some form data that shouldn't be exposed after creation.
+This kind of data may get hashed in the database and should never be exposed to the client.
+
+Using the techniques described below, you can achieve the following reques/response behavior:
+
+```http
+POST /users HTTP/1.1
+Content-Type: application/vnd.api+json
+Accept: application/vnd.api+json
+
+{
+ "data": {
+ "type": "users",
+ "attributes": {
+ "account-number": "1234567890",
+ "name": "John Doe"
+ }
+ }
+}
+```
+
+```http
+HTTP/1.1 201 Created
+Location: http://example.com/users/1
+Content-Type: application/vnd.api+json
+
+{
+ "data": {
+ "type": "users",
+ "id": "1",
+ "attributes": {
+ "name": "John Doe"
+ }
+ }
+}
+```
+
+### Single Attribute
+
+```c#
+public class ModelResource : ResourceDefinition
+{
+ protected override List OutputAttrs()
+ => Remove(m => m.AccountNumber);
+}
+```
+
+### Multiple Attributes
+
+```c#
+public class ModelResource : ResourceDefinition
+{
+ protected override List OutputAttrs()
+ => Remove(m => new { m.AccountNumber, m.Password });
+}
+```
+
+### Derived ResourceDefinitions
+
+If you want to inherit from a different `ResourceDefinition`, these attributes can be composed like so:
+
+```c#
+public class BaseResource : ResourceDefinition
+{
+ protected override List OutputAttrs()
+ => Remove(m => m.TenantId);
+}
+
+public class AccountResource : ResourceDefinition
+{
+ protected override List OutputAttrs()
+ => Remove(m => m.AccountNumber, from: base.OutputAttrs());
+}
+```
+
+## Default Sort
+
+_since v3.0.0_
+
+You can define the default sort behavior if no `sort` query is provided.
+
+```c#
+public class AccountResource : ResourceDefinition
+{
+ protected override PropertySortOrder GetDefaultSortOrder()
+ => new PropertySortOrder {
+ (t => t.Prop, SortDirection.Ascending),
+ (t => t.Prop2, SortDirection.Descending),
+ };
+}
+```
+
+## Custom Query Filters
+
+_since v3.0.0_
+
+You can define additional query parameters and the query that should be used.
+If the key is present in a filter request, the supplied query will be used rather than the default behavior.
+
+```c#
+public class ItemResource : ResourceDefinition-
+{
+ // handles queries like: ?filter[was-active-on]=2018-10-15T01:25:52Z
+ public override QueryFilters GetQueryFilters()
+ => new QueryFilters {
+ { "was-active-on", (items, value) => DateTime.TryParse(value, out dateValue)
+ ? items.Where(i => i.Expired == null || dateValue < i.Expired)
+ : throw new JsonApiException(400, $"'{value}' is not a valid date.")
+ }
+ };
+}
+```
+
+## Using ResourceDefinitions Prior to v3
+
+Prior to the introduction of auto-discovery, you needed to register the
+`ResourceDefinition` on the container yourself:
+
+```c#
+services.AddScoped, ItemResource>();
+```
\ No newline at end of file
diff --git a/docs/usage/routing.md b/docs/usage/routing.md
new file mode 100644
index 0000000000..d11b45ac43
--- /dev/null
+++ b/docs/usage/routing.md
@@ -0,0 +1,57 @@
+# Routing
+
+By default the library will configure routes for each controller.
+Based on the recommendations outlined in the JSONAPI spec, routes are hyphenated.
+
+```http
+GET /api/compound-models HTTP/1.1
+Accept: application/vnd.api+json
+```
+
+## Namespacing and Versioning URLs
+
+You can add a namespace to the URL by specifying it in ConfigureServices
+
+```c#
+public IServiceProvider ConfigureServices(IServiceCollection services) {
+ services.AddJsonApi(
+ opt => opt.Namespace = "api/v1");
+}
+```
+
+## Disable Convention
+
+You can disable the dasherized convention and specify your own template by using the `DisableRoutingConvention` Attribute.
+
+```c#
+[Route("[controller]")]
+[DisableRoutingConvention]
+public class CamelCasedModelsController : JsonApiController {
+ public CamelCasedModelsController(
+ IJsonApiContext jsonApiContext,
+ IResourceService resourceService)
+ : base(jsonApiContext, resourceService)
+ { }
+}
+```
+
+It is important to note that your routes must still end with the model name in the same format as the resource name. This is so that we can build accurate resource links in the json:api document. For example, if you define a resource as MyModels the controller route must match.
+
+```c#
+public IServiceProvider ConfigureServices(IServiceCollection services) {
+ services.AddJsonApi(options => {
+ options.BuildContextGraph((builder) => {
+ builder.AddResource("myModels"); // camelCased
+ });
+ });
+}
+
+// controller definition
+[Route("api/myModels"), DisableRoutingConvention]
+public class MyModelsController : JsonApiController {
+ //...
+}
+```
+
+See [this](~/usage/resource-graph.html#public-resource-type-name) for
+more information on how the resource name is determined.
\ No newline at end of file
diff --git a/docs/usage/sorting.md b/docs/usage/sorting.md
new file mode 100644
index 0000000000..e8d5c83bae
--- /dev/null
+++ b/docs/usage/sorting.md
@@ -0,0 +1,24 @@
+# Sorting
+
+Resources can be sorted by an attribute.
+The default sort order is ascending.
+To sort descending, prepend the sort key with a minus (-) sign.
+
+## Ascending
+
+```http
+GET /api/articles?sort=author HTTP/1.1
+Accept: application/vnd.api+json
+```
+
+## Descending
+
+```http
+GET /api/articles?sort=-author HTTP/1.1
+Accept: application/vnd.api+json
+```
+
+## Default Sort
+
+See the topic on [Resource Definitions](~/usage/resources/resource-definitions)
+for defining the default sort behavior.
diff --git a/docs/usage/sparse-field-selection.md b/docs/usage/sparse-field-selection.md
new file mode 100644
index 0000000000..04a0ecd146
--- /dev/null
+++ b/docs/usage/sparse-field-selection.md
@@ -0,0 +1,8 @@
+# Sparse Field Selection
+
+We currently support top-level field selection. What this means is you can restrict which fields are returned by a query using the fields query parameter, but this does not yet apply to included relationships.
+
+```http
+GET /articles?fields[articles]=title,body HTTP/1.1
+Accept: application/vnd.api+json
+```
\ No newline at end of file
diff --git a/docs/usage/toc.md b/docs/usage/toc.md
new file mode 100644
index 0000000000..0e03d73662
--- /dev/null
+++ b/docs/usage/toc.md
@@ -0,0 +1,23 @@
+# [Resources](resources/index.md)
+## [Attributes](resources/attributes.md)
+## [Relationships](resources/relationships.md)
+## [Resource Definitions](resources/resource-definitions.md)
+
+# [Resource Graph](resource-graph.md)
+# [Metadata](meta.md)
+# [Filtering](filtering.md)
+# [Options](options.md)
+# [Errors](errors.md)
+# [Including Relationships](including-relationships.md)
+# [Pagination](pagination.md)
+# [Routing](routing.md)
+# [Sorting](sorting.md)
+# [Sparse Field Selection](sparse-field-selection.md)
+
+# Extensibility
+## [Layer Overview](extensibility/layer-overview.md)
+## [Controllers](extensibility/controllers.md)
+## [Services](extensibility/services.md)
+## [Repositories](extensibility/repositories.md)
+## [Middleware](extensibility/middleware.md)
+## [Custom Query Formats](extensibility/custom-query-formats.md)
\ No newline at end of file
diff --git a/src/JsonApiDotNetCore/Configuration/JsonApiOptions.cs b/src/JsonApiDotNetCore/Configuration/JsonApiOptions.cs
index 80dfdfa572..2a37256496 100644
--- a/src/JsonApiDotNetCore/Configuration/JsonApiOptions.cs
+++ b/src/JsonApiDotNetCore/Configuration/JsonApiOptions.cs
@@ -12,8 +12,7 @@
namespace JsonApiDotNetCore.Configuration
{
///
- /// Global options.
- /// https://json-api-dotnet.github.io/#/global-options
+ /// Global options
///
public class JsonApiOptions
{
diff --git a/src/JsonApiDotNetCore/Internal/ResourceGraph.cs b/src/JsonApiDotNetCore/Internal/ResourceGraph.cs
index 1d517cfd16..9c1d421437 100644
--- a/src/JsonApiDotNetCore/Internal/ResourceGraph.cs
+++ b/src/JsonApiDotNetCore/Internal/ResourceGraph.cs
@@ -67,7 +67,7 @@ public interface IResourceGraph
///
/// Get the public attribute name for a type based on the internal attribute name.
///
- /// The internal attribute name for a .
+ /// The internal attribute name for a .
string GetPublicAttributeName(string internalAttributeName);
///
@@ -103,18 +103,18 @@ internal ResourceGraph(List entities, bool usesDbContext, List
+ ///
public bool UsesDbContext { get; }
- /// inheritdoc>
+ ///
public ContextEntity GetContextEntity(string entityName)
=> Entities.SingleOrDefault(e => string.Equals(e.EntityName, entityName, StringComparison.OrdinalIgnoreCase));
- /// inheritdoc>
+ ///
public ContextEntity GetContextEntity(Type entityType)
=> Entities.SingleOrDefault(e => e.EntityType == entityType);
- /// inheritdoc>
+ ///
public object GetRelationship(TParent entity, string relationshipName)
{
var parentEntityType = entity.GetType();
@@ -152,7 +152,7 @@ private IEnumerable GetHasManyThrough(IIdentifiable parent, HasMa
}
}
- /// inheritdoc>
+ ///
public string GetRelationshipName(string relationshipName)
{
var entityType = typeof(TParent);
diff --git a/src/JsonApiDotNetCore/Models/HasManyAttribute.cs b/src/JsonApiDotNetCore/Models/HasManyAttribute.cs
index 11479819f4..7dc4c9ae65 100644
--- a/src/JsonApiDotNetCore/Models/HasManyAttribute.cs
+++ b/src/JsonApiDotNetCore/Models/HasManyAttribute.cs
@@ -18,7 +18,7 @@ public class HasManyAttribute : RelationshipAttribute
/// public class Author : Identifiable
/// {
/// [HasMany("articles"]
- /// public virtual List Articles { get; set; }
+ /// public virtual List<Articl> Articles { get; set; }
/// }
///
///
diff --git a/src/JsonApiDotNetCore/Models/Identifiable.cs b/src/JsonApiDotNetCore/Models/Identifiable.cs
index 038544a89c..663786de93 100644
--- a/src/JsonApiDotNetCore/Models/Identifiable.cs
+++ b/src/JsonApiDotNetCore/Models/Identifiable.cs
@@ -22,7 +22,7 @@ public class Identifiable : IIdentifiable
/// from `typeof(T)` to a string and the setter vice versa.
///
/// To override this behavior, you can either implement the
- /// interface directly or override
+ /// interface directly or override
/// `GetStringId` and `GetTypedId` methods.
///
[NotMapped]
diff --git a/src/JsonApiDotNetCore/Models/RelationshipAttribute.cs b/src/JsonApiDotNetCore/Models/RelationshipAttribute.cs
index a93bcbc868..facb7780d9 100644
--- a/src/JsonApiDotNetCore/Models/RelationshipAttribute.cs
+++ b/src/JsonApiDotNetCore/Models/RelationshipAttribute.cs
@@ -83,9 +83,9 @@ public virtual bool Is(string publicRelationshipName)
///
/// The internal navigation property path to the related entity.
- ///
+ ///
///
- /// In all cases except the HasManyThrough relationships, this will just be the .
+ /// In all cases except the HasManyThrough relationships, this will just be the .
///
public virtual string RelationshipPath => InternalRelationshipName;
}
diff --git a/src/JsonApiDotNetCore/Models/ResourceDefinition.cs b/src/JsonApiDotNetCore/Models/ResourceDefinition.cs
index 2ce960e875..cb4894ce27 100644
--- a/src/JsonApiDotNetCore/Models/ResourceDefinition.cs
+++ b/src/JsonApiDotNetCore/Models/ResourceDefinition.cs
@@ -125,11 +125,13 @@ private List GetOutputAttrs()
/// instead of the default query behavior. A common use-case for this
/// is including related resources and filtering on them.
///
+ ///
///
/// A set of custom queries that will be applied instead of the default
/// queries for the given key. Null will be returned if default behavior
/// is desired.
///
+ ///
///
///
/// protected override QueryFilters GetQueryFilters() => {
@@ -159,7 +161,7 @@ private List GetOutputAttrs()
/// This is an alias type intended to simplify the implementation's
/// method signature.
/// See for usage details.
- ///
+ ///
public class QueryFilters : Dictionary, string, IQueryable>> { }
///
@@ -205,7 +207,7 @@ public class QueryFilters : Dictionary, string, IQuer
/// This is an alias type intended to simplify the implementation's
/// method signature.
/// See for usage details.
- ///
+ ///
public class PropertySortOrder : List<(Expression>, SortDirection)> { }
}
}
diff --git a/src/JsonApiDotNetCore/articles/intro.md b/src/JsonApiDotNetCore/articles/intro.md
deleted file mode 100644
index c0478cedea..0000000000
--- a/src/JsonApiDotNetCore/articles/intro.md
+++ /dev/null
@@ -1 +0,0 @@
-# Add your introductions here!
diff --git a/src/JsonApiDotNetCore/articles/toc.yml b/src/JsonApiDotNetCore/articles/toc.yml
deleted file mode 100644
index ff89ef1fe0..0000000000
--- a/src/JsonApiDotNetCore/articles/toc.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-- name: Introduction
- href: intro.md
diff --git a/src/JsonApiDotNetCore/toc.yml b/src/JsonApiDotNetCore/toc.yml
deleted file mode 100644
index 59f8010471..0000000000
--- a/src/JsonApiDotNetCore/toc.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-- name: Articles
- href: articles/
-- name: Api Documentation
- href: api/
- homepage: api/index.md