diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index c1d943c0d0..4b173d25f2 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -17,7 +17,7 @@
"rollForward": false
},
"dotnet-reportgenerator-globaltool": {
- "version": "5.4.4",
+ "version": "5.4.5",
"commands": [
"reportgenerator"
],
@@ -29,6 +29,13 @@
"docfx"
],
"rollForward": false
+ },
+ "microsoft.openapi.kiota": {
+ "version": "1.25.1",
+ "commands": [
+ "kiota"
+ ],
+ "rollForward": false
}
}
}
\ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000..0c78db34f3
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,5 @@
+# When running OpenAPI tests, these committed files are downloaded and written to disk (so we'll know when something changes).
+# On Windows, these text files are auto-converted to crlf on git fetch, while the written downloaded files use lf line endings.
+# Therefore, running the tests on Windows creates local changes. Staging them auto-converts back to crlf, which undoes the changes.
+# To avoid this annoyance, the next line opts out of the auto-conversion and forces line endings to lf.
+**/GeneratedSwagger/**/*.json text eol=lf
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 37878e5e4a..7ee1333bd6 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -72,14 +72,14 @@ jobs:
$versionSuffix = $segments.Length -eq 1 ? '' : $segments[1..$($segments.Length - 1)] -join '-'
[xml]$xml = Get-Content Directory.Build.props
- $configuredVersionPrefix = $xml.Project.PropertyGroup.JsonApiDotNetCoreVersionPrefix | Select-Object -First 1
+ $configuredVersionPrefix = $xml.Project.PropertyGroup.VersionPrefix | Select-Object -First 1
if ($configuredVersionPrefix -ne $versionPrefix) {
Write-Error "Version prefix from git release tag '$versionPrefix' does not match version prefix '$configuredVersionPrefix' stored in Directory.Build.props."
# To recover from this:
# - Delete the GitHub release
# - Run: git push --delete origin the-invalid-tag-name
- # - Adjust JsonApiDotNetCoreVersionPrefix in Directory.Build.props, commit and push
+ # - Adjust VersionPrefix in Directory.Build.props, commit and push
# - Recreate the GitHub release
}
}
@@ -284,4 +284,4 @@ jobs:
NUGET_ORG_API_KEY: ${{ secrets.NUGET_ORG_API_KEY }}
shell: pwsh
run: |
- dotnet nuget push "$env:GITHUB_WORKSPACE/packages/*.nupkg" --api-key "$env:NUGET_ORG_API_KEY" --source 'nuget.org'
+ dotnet nuget push "$env:GITHUB_WORKSPACE/packages/*.nupkg" --api-key "$env:NUGET_ORG_API_KEY" --source 'nuget.org' --skip-duplicate
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index d3d4db6142..508d210158 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -35,6 +35,9 @@ jobs:
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
+ - name: Restore .NET tools
+ run: |
+ dotnet tool restore
- name: Autobuild
uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
diff --git a/Build.ps1 b/Build.ps1
index 0b2bbb40f1..6c6ff9c13a 100644
--- a/Build.ps1
+++ b/Build.ps1
@@ -1,5 +1,3 @@
-$versionSuffix="pre"
-
function VerifySuccessExitCode {
if ($LastExitCode -ne 0) {
throw "Command failed with exit code $LastExitCode."
@@ -16,7 +14,7 @@ Remove-Item -Recurse -Force * -Include coverage.cobertura.xml
dotnet tool restore
VerifySuccessExitCode
-dotnet build --configuration Release /p:VersionSuffix=$versionSuffix
+dotnet build --configuration Release
VerifySuccessExitCode
dotnet test --no-build --configuration Release --verbosity quiet --collect:"XPlat Code Coverage"
@@ -25,5 +23,5 @@ VerifySuccessExitCode
dotnet reportgenerator -reports:**\coverage.cobertura.xml -targetdir:artifacts\coverage -filefilters:-*.g.cs
VerifySuccessExitCode
-dotnet pack --no-build --configuration Release --output artifacts/packages /p:VersionSuffix=$versionSuffix
+dotnet pack --no-build --configuration Release --output artifacts/packages
VerifySuccessExitCode
diff --git a/CSharpGuidelinesAnalyzer.config b/CSharpGuidelinesAnalyzer.config
index 89b568e155..6d5453159a 100644
--- a/CSharpGuidelinesAnalyzer.config
+++ b/CSharpGuidelinesAnalyzer.config
@@ -1,5 +1,5 @@
-
+
diff --git a/Directory.Build.props b/Directory.Build.props
index 7adc228bff..8fb62a916f 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -9,7 +9,9 @@
Recommended
$(MSBuildThisFileDirectory)CodingGuidelines.ruleset
$(MSBuildThisFileDirectory)tests.runsettings
- 5.6.1
+ 5.6.1
+ pre
+ 1
direct
$(NoWarn);NETSDK1215
diff --git a/JsonApiDotNetCore.sln b/JsonApiDotNetCore.sln
index c555610364..793c01950d 100644
--- a/JsonApiDotNetCore.sln
+++ b/JsonApiDotNetCore.sln
@@ -62,6 +62,24 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DapperExample", "src\Exampl
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DapperTests", "test\DapperTests\DapperTests.csproj", "{80E322F5-5F5D-4670-A30F-02D33C2C7900}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JsonApiDotNetCore.OpenApi.Swashbuckle", "src\JsonApiDotNetCore.OpenApi.Swashbuckle\JsonApiDotNetCore.OpenApi.Swashbuckle.csproj", "{71287D6F-6C3B-44B4-9FCA-E78FE3F02289}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenApiTests", "test\OpenApiTests\OpenApiTests.csproj", "{B693DE14-BB28-496F-AB39-B4E674ABCA80}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JsonApiDotNetCore.OpenApi.Client.NSwag", "src\JsonApiDotNetCore.OpenApi.Client.NSwag\JsonApiDotNetCore.OpenApi.Client.NSwag.csproj", "{5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenApiNSwagClientExample", "src\Examples\OpenApiNSwagClientExample\OpenApiNSwagClientExample.csproj", "{7FC5DFA3-6F66-4FD8-820D-81E93856F252}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenApiNSwagClientTests", "test\OpenApiNSwagClientTests\OpenApiNSwagClientTests.csproj", "{77F98215-3085-422E-B99D-4C404C2114CF}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenApiNSwagEndToEndTests", "test\OpenApiNSwagEndToEndTests\OpenApiNSwagEndToEndTests.csproj", "{3BA4F9B9-3D90-44B5-B09C-28D98E0B4225}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JsonApiDotNetCore.OpenApi.Client.Kiota", "src\JsonApiDotNetCore.OpenApi.Client.Kiota\JsonApiDotNetCore.OpenApi.Client.Kiota.csproj", "{617FCA5D-A2DE-4083-B373-ADCA9901059F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenApiKiotaClientExample", "src\Examples\OpenApiKiotaClientExample\OpenApiKiotaClientExample.csproj", "{39DEAFE8-AE29-48E5-A67D-73776D70FC82}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenApiKiotaEndToEndTests", "test\OpenApiKiotaEndToEndTests\OpenApiKiotaEndToEndTests.csproj", "{FD86C676-3D80-4971-8D8C-B0729B2251F6}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -312,6 +330,114 @@ Global
{80E322F5-5F5D-4670-A30F-02D33C2C7900}.Release|x64.Build.0 = Release|Any CPU
{80E322F5-5F5D-4670-A30F-02D33C2C7900}.Release|x86.ActiveCfg = Release|Any CPU
{80E322F5-5F5D-4670-A30F-02D33C2C7900}.Release|x86.Build.0 = Release|Any CPU
+ {71287D6F-6C3B-44B4-9FCA-E78FE3F02289}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {71287D6F-6C3B-44B4-9FCA-E78FE3F02289}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {71287D6F-6C3B-44B4-9FCA-E78FE3F02289}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {71287D6F-6C3B-44B4-9FCA-E78FE3F02289}.Debug|x64.Build.0 = Debug|Any CPU
+ {71287D6F-6C3B-44B4-9FCA-E78FE3F02289}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {71287D6F-6C3B-44B4-9FCA-E78FE3F02289}.Debug|x86.Build.0 = Debug|Any CPU
+ {71287D6F-6C3B-44B4-9FCA-E78FE3F02289}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {71287D6F-6C3B-44B4-9FCA-E78FE3F02289}.Release|Any CPU.Build.0 = Release|Any CPU
+ {71287D6F-6C3B-44B4-9FCA-E78FE3F02289}.Release|x64.ActiveCfg = Release|Any CPU
+ {71287D6F-6C3B-44B4-9FCA-E78FE3F02289}.Release|x64.Build.0 = Release|Any CPU
+ {71287D6F-6C3B-44B4-9FCA-E78FE3F02289}.Release|x86.ActiveCfg = Release|Any CPU
+ {71287D6F-6C3B-44B4-9FCA-E78FE3F02289}.Release|x86.Build.0 = Release|Any CPU
+ {B693DE14-BB28-496F-AB39-B4E674ABCA80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B693DE14-BB28-496F-AB39-B4E674ABCA80}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B693DE14-BB28-496F-AB39-B4E674ABCA80}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B693DE14-BB28-496F-AB39-B4E674ABCA80}.Debug|x64.Build.0 = Debug|Any CPU
+ {B693DE14-BB28-496F-AB39-B4E674ABCA80}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B693DE14-BB28-496F-AB39-B4E674ABCA80}.Debug|x86.Build.0 = Debug|Any CPU
+ {B693DE14-BB28-496F-AB39-B4E674ABCA80}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B693DE14-BB28-496F-AB39-B4E674ABCA80}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B693DE14-BB28-496F-AB39-B4E674ABCA80}.Release|x64.ActiveCfg = Release|Any CPU
+ {B693DE14-BB28-496F-AB39-B4E674ABCA80}.Release|x64.Build.0 = Release|Any CPU
+ {B693DE14-BB28-496F-AB39-B4E674ABCA80}.Release|x86.ActiveCfg = Release|Any CPU
+ {B693DE14-BB28-496F-AB39-B4E674ABCA80}.Release|x86.Build.0 = Release|Any CPU
+ {5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}.Debug|x64.Build.0 = Debug|Any CPU
+ {5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}.Debug|x86.Build.0 = Debug|Any CPU
+ {5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}.Release|x64.ActiveCfg = Release|Any CPU
+ {5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}.Release|x64.Build.0 = Release|Any CPU
+ {5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}.Release|x86.ActiveCfg = Release|Any CPU
+ {5ADAA902-5A75-4ECB-B4B4-03291D63CE9C}.Release|x86.Build.0 = Release|Any CPU
+ {7FC5DFA3-6F66-4FD8-820D-81E93856F252}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7FC5DFA3-6F66-4FD8-820D-81E93856F252}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7FC5DFA3-6F66-4FD8-820D-81E93856F252}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7FC5DFA3-6F66-4FD8-820D-81E93856F252}.Debug|x64.Build.0 = Debug|Any CPU
+ {7FC5DFA3-6F66-4FD8-820D-81E93856F252}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7FC5DFA3-6F66-4FD8-820D-81E93856F252}.Debug|x86.Build.0 = Debug|Any CPU
+ {7FC5DFA3-6F66-4FD8-820D-81E93856F252}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7FC5DFA3-6F66-4FD8-820D-81E93856F252}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7FC5DFA3-6F66-4FD8-820D-81E93856F252}.Release|x64.ActiveCfg = Release|Any CPU
+ {7FC5DFA3-6F66-4FD8-820D-81E93856F252}.Release|x64.Build.0 = Release|Any CPU
+ {7FC5DFA3-6F66-4FD8-820D-81E93856F252}.Release|x86.ActiveCfg = Release|Any CPU
+ {7FC5DFA3-6F66-4FD8-820D-81E93856F252}.Release|x86.Build.0 = Release|Any CPU
+ {77F98215-3085-422E-B99D-4C404C2114CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {77F98215-3085-422E-B99D-4C404C2114CF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {77F98215-3085-422E-B99D-4C404C2114CF}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {77F98215-3085-422E-B99D-4C404C2114CF}.Debug|x64.Build.0 = Debug|Any CPU
+ {77F98215-3085-422E-B99D-4C404C2114CF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {77F98215-3085-422E-B99D-4C404C2114CF}.Debug|x86.Build.0 = Debug|Any CPU
+ {77F98215-3085-422E-B99D-4C404C2114CF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {77F98215-3085-422E-B99D-4C404C2114CF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {77F98215-3085-422E-B99D-4C404C2114CF}.Release|x64.ActiveCfg = Release|Any CPU
+ {77F98215-3085-422E-B99D-4C404C2114CF}.Release|x64.Build.0 = Release|Any CPU
+ {77F98215-3085-422E-B99D-4C404C2114CF}.Release|x86.ActiveCfg = Release|Any CPU
+ {77F98215-3085-422E-B99D-4C404C2114CF}.Release|x86.Build.0 = Release|Any CPU
+ {3BA4F9B9-3D90-44B5-B09C-28D98E0B4225}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3BA4F9B9-3D90-44B5-B09C-28D98E0B4225}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3BA4F9B9-3D90-44B5-B09C-28D98E0B4225}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3BA4F9B9-3D90-44B5-B09C-28D98E0B4225}.Debug|x64.Build.0 = Debug|Any CPU
+ {3BA4F9B9-3D90-44B5-B09C-28D98E0B4225}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3BA4F9B9-3D90-44B5-B09C-28D98E0B4225}.Debug|x86.Build.0 = Debug|Any CPU
+ {3BA4F9B9-3D90-44B5-B09C-28D98E0B4225}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3BA4F9B9-3D90-44B5-B09C-28D98E0B4225}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3BA4F9B9-3D90-44B5-B09C-28D98E0B4225}.Release|x64.ActiveCfg = Release|Any CPU
+ {3BA4F9B9-3D90-44B5-B09C-28D98E0B4225}.Release|x64.Build.0 = Release|Any CPU
+ {3BA4F9B9-3D90-44B5-B09C-28D98E0B4225}.Release|x86.ActiveCfg = Release|Any CPU
+ {3BA4F9B9-3D90-44B5-B09C-28D98E0B4225}.Release|x86.Build.0 = Release|Any CPU
+ {617FCA5D-A2DE-4083-B373-ADCA9901059F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {617FCA5D-A2DE-4083-B373-ADCA9901059F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {617FCA5D-A2DE-4083-B373-ADCA9901059F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {617FCA5D-A2DE-4083-B373-ADCA9901059F}.Debug|x64.Build.0 = Debug|Any CPU
+ {617FCA5D-A2DE-4083-B373-ADCA9901059F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {617FCA5D-A2DE-4083-B373-ADCA9901059F}.Debug|x86.Build.0 = Debug|Any CPU
+ {617FCA5D-A2DE-4083-B373-ADCA9901059F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {617FCA5D-A2DE-4083-B373-ADCA9901059F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {617FCA5D-A2DE-4083-B373-ADCA9901059F}.Release|x64.ActiveCfg = Release|Any CPU
+ {617FCA5D-A2DE-4083-B373-ADCA9901059F}.Release|x64.Build.0 = Release|Any CPU
+ {617FCA5D-A2DE-4083-B373-ADCA9901059F}.Release|x86.ActiveCfg = Release|Any CPU
+ {617FCA5D-A2DE-4083-B373-ADCA9901059F}.Release|x86.Build.0 = Release|Any CPU
+ {39DEAFE8-AE29-48E5-A67D-73776D70FC82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {39DEAFE8-AE29-48E5-A67D-73776D70FC82}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {39DEAFE8-AE29-48E5-A67D-73776D70FC82}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {39DEAFE8-AE29-48E5-A67D-73776D70FC82}.Debug|x64.Build.0 = Debug|Any CPU
+ {39DEAFE8-AE29-48E5-A67D-73776D70FC82}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {39DEAFE8-AE29-48E5-A67D-73776D70FC82}.Debug|x86.Build.0 = Debug|Any CPU
+ {39DEAFE8-AE29-48E5-A67D-73776D70FC82}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {39DEAFE8-AE29-48E5-A67D-73776D70FC82}.Release|Any CPU.Build.0 = Release|Any CPU
+ {39DEAFE8-AE29-48E5-A67D-73776D70FC82}.Release|x64.ActiveCfg = Release|Any CPU
+ {39DEAFE8-AE29-48E5-A67D-73776D70FC82}.Release|x64.Build.0 = Release|Any CPU
+ {39DEAFE8-AE29-48E5-A67D-73776D70FC82}.Release|x86.ActiveCfg = Release|Any CPU
+ {39DEAFE8-AE29-48E5-A67D-73776D70FC82}.Release|x86.Build.0 = Release|Any CPU
+ {FD86C676-3D80-4971-8D8C-B0729B2251F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FD86C676-3D80-4971-8D8C-B0729B2251F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FD86C676-3D80-4971-8D8C-B0729B2251F6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FD86C676-3D80-4971-8D8C-B0729B2251F6}.Debug|x64.Build.0 = Debug|Any CPU
+ {FD86C676-3D80-4971-8D8C-B0729B2251F6}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FD86C676-3D80-4971-8D8C-B0729B2251F6}.Debug|x86.Build.0 = Debug|Any CPU
+ {FD86C676-3D80-4971-8D8C-B0729B2251F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FD86C676-3D80-4971-8D8C-B0729B2251F6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FD86C676-3D80-4971-8D8C-B0729B2251F6}.Release|x64.ActiveCfg = Release|Any CPU
+ {FD86C676-3D80-4971-8D8C-B0729B2251F6}.Release|x64.Build.0 = Release|Any CPU
+ {FD86C676-3D80-4971-8D8C-B0729B2251F6}.Release|x86.ActiveCfg = Release|Any CPU
+ {FD86C676-3D80-4971-8D8C-B0729B2251F6}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -337,6 +463,15 @@ Global
{24B0C12F-38CD-4245-8785-87BEFAD55B00} = {24B15015-62E5-42E1-9BA0-ECE6BE7AA15F}
{C1774117-5073-4DF8-B5BE-BF7B538BD1C2} = {026FBC6C-AF76-4568-9B87-EC73457899FD}
{80E322F5-5F5D-4670-A30F-02D33C2C7900} = {24B15015-62E5-42E1-9BA0-ECE6BE7AA15F}
+ {71287D6F-6C3B-44B4-9FCA-E78FE3F02289} = {7A2B7ADD-ECB5-4D00-AA6A-D45BD11C97CF}
+ {B693DE14-BB28-496F-AB39-B4E674ABCA80} = {24B15015-62E5-42E1-9BA0-ECE6BE7AA15F}
+ {5ADAA902-5A75-4ECB-B4B4-03291D63CE9C} = {7A2B7ADD-ECB5-4D00-AA6A-D45BD11C97CF}
+ {7FC5DFA3-6F66-4FD8-820D-81E93856F252} = {026FBC6C-AF76-4568-9B87-EC73457899FD}
+ {77F98215-3085-422E-B99D-4C404C2114CF} = {24B15015-62E5-42E1-9BA0-ECE6BE7AA15F}
+ {3BA4F9B9-3D90-44B5-B09C-28D98E0B4225} = {24B15015-62E5-42E1-9BA0-ECE6BE7AA15F}
+ {617FCA5D-A2DE-4083-B373-ADCA9901059F} = {7A2B7ADD-ECB5-4D00-AA6A-D45BD11C97CF}
+ {39DEAFE8-AE29-48E5-A67D-73776D70FC82} = {026FBC6C-AF76-4568-9B87-EC73457899FD}
+ {FD86C676-3D80-4971-8D8C-B0729B2251F6} = {24B15015-62E5-42E1-9BA0-ECE6BE7AA15F}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {A2421882-8F0A-4905-928F-B550B192F9A4}
diff --git a/JsonApiDotNetCore.sln.DotSettings b/JsonApiDotNetCore.sln.DotSettings
index 0d088ac740..6c29a58aef 100644
--- a/JsonApiDotNetCore.sln.DotSettings
+++ b/JsonApiDotNetCore.sln.DotSettings
@@ -3,7 +3,10 @@
2000
3000
False
+ True
83FF097C-C8C6-477B-9FAB-DF99B84978B5/f:ReadOnlySet.cs
+ swagger.g.json
+ swagger.json
SOLUTION
True
True
@@ -661,6 +664,7 @@ $left$ = $right$;
True
True
True
+ True
True
True
True
diff --git a/README.md b/README.md
index f73d1d85d6..d01f0b2dc7 100644
--- a/README.md
+++ b/README.md
@@ -89,8 +89,6 @@ See also our [versioning policy](./VERSIONING_POLICY.md).
| | | 9 | 9 |
| master | Preview | 8 | 8, 9 |
| | | 9 | 9 |
-| openapi | Experimental | 8 | 8, 9 |
-| | | 9 | 9 |
## Contributing
diff --git a/docs/docfx.json b/docs/docfx.json
index da0c58cac8..232d8768eb 100644
--- a/docs/docfx.json
+++ b/docs/docfx.json
@@ -23,6 +23,7 @@
"files": [
"api/**.yml",
"api/index.md",
+ "ext/openapi/index.md",
"getting-started/**.md",
"getting-started/**/toc.yml",
"usage/**.md",
diff --git a/docs/ext/openapi/index.md b/docs/ext/openapi/index.md
new file mode 100644
index 0000000000..20aad7b305
--- /dev/null
+++ b/docs/ext/openapi/index.md
@@ -0,0 +1,127 @@
+# JSON:API Extension for OpenAPI
+
+This extension facilitates using OpenAPI client generators targeting JSON:API documents.
+
+In JSON:API, a resource object contains the `type` member, which defines the structure of nested [attributes](https://jsonapi.org/format/#document-resource-object-attributes) and [relationships](https://jsonapi.org/format/#document-resource-object-relationships) objects.
+While OpenAPI supports such constraints using `allOf` inheritance with a discriminator property for the `data` member,
+it provides no way to express that the discriminator recursively applies to nested objects.
+
+This extension addresses that limitation by defining additional discriminator properties to guide code generation tools.
+
+## URI
+
+This extension has the URI `https://www.jsonapi.net/ext/openapi`.
+Because code generators often choke on the double quotes in `Accept` and `Content-Type` HTTP header values, a relaxed form is also permitted: `openapi`.
+
+For example, the following `Content-Type` header:
+
+```http
+Content-Type: application/vnd.api+json; ext="https://www.jsonapi.net/ext/openapi"
+```
+
+is equivalent to:
+
+```http
+Content-Type: application/vnd.api+json; ext=openapi
+```
+
+To avoid the need for double quotes when multiple extensions are used, the following relaxed form can be used:
+
+```http
+Content-Type: application/vnd.api+json; ext=openapi; ext=atomic
+```
+
+> [!NOTE]
+> The [base specification](https://jsonapi.org/format/#media-type-parameter-rules) *forbids* the use of multiple `ext` parameters
+> and *requires* that each extension name must be a URI.
+> This extension relaxes both constraints for practical reasons, to workaround bugs in client generators that produce broken code otherwise.
+
+## Namespace
+
+This extension uses the namespace `openapi`.
+
+> [!NOTE]
+> JSON:API extensions can only introduce new document members using a reserved namespace as a prefix.
+
+## Document Structure
+
+A document that supports this extension MAY include any of the top-level members allowed by the base specification,
+including any members defined in the [Atomic Operations extension](https://jsonapi.org/ext/atomic/).
+
+### Resource Objects
+
+In addition to the members allowed by the base specification, the following member MAY be included
+in [attributes](https://jsonapi.org/format/#document-resource-object-attributes) and [relationships](https://jsonapi.org/format/#document-resource-object-relationships) objects:
+
+* `openapi:discriminator` - A string that MUST be identical to the `type` member in the containing [resource object](https://jsonapi.org/format/#document-resource-objects).
+
+Here's how an article (i.e. a resource of type "articles") might appear in a document:
+
+```json
+{
+ "data": {
+ "type": "articles",
+ "id": "1",
+ "attributes": {
+ "openapi:discriminator": "articles",
+ "title": "Rails is Omakase"
+ },
+ "relationships": {
+ "openapi:discriminator": "articles",
+ "author": {
+ "data": { "type": "people", "id": "9" }
+ }
+ }
+ }
+}
+```
+
+### Atomic Operations
+
+In addition to the members allowed by the [Atomic Operations extension](https://jsonapi.org/ext/atomic/),
+the following member MAY be included in elements of an `atomic:operations` array:
+
+* `openapi:discriminator` - A free-format string to facilitate generation of client code.
+
+For example:
+
+```http
+POST /operations HTTP/1.1
+Host: example.org
+Content-Type: application/vnd.api+json; ext="https://www.jsonapi.net/ext/openapi https://jsonapi.org/ext/atomic"
+Accept: application/vnd.api+json; ext="https://www.jsonapi.net/ext/openapi https://jsonapi.org/ext/atomic"
+
+{
+ "atomic:operations": [{
+ "openapi:discriminator": "add-article",
+ "op": "add",
+ "data": {
+ "type": "articles",
+ "attributes": {
+ "openapi:discriminator": "articles",
+ "title": "JSON API paints my bikeshed!"
+ }
+ }
+ }]
+}
+```
+
+## Processing
+
+A server MAY ignore the `openapi:discriminator` member in [attributes](https://jsonapi.org/format/#document-resource-object-attributes) and [relationships](https://jsonapi.org/format/#document-resource-object-relationships) objects from incoming requests.
+A server SHOULD ignore the `openapi:discriminator` member in elements of an `atomic:operations` array.
+
+A server MUST include the `openapi:discriminator` member in [attributes](https://jsonapi.org/format/#document-resource-object-attributes) and [relationships](https://jsonapi.org/format/#document-resource-object-relationships) objects in outgoing responses.
+The member value MUST be the same as the `type` member value of the containing resource object.
+
+A client MAY include the `openapi:discriminator` member in [attributes](https://jsonapi.org/format/#document-resource-object-attributes) and [relationships](https://jsonapi.org/format/#document-resource-object-relationships) objects in outgoing requests.
+The member value MUST be the same as the `type` member value of the containing resource object.
+
+A client MAY include the `openapi:discriminator` member in elements of an `atomic:operations` array.
+
+### Processing Errors
+
+A server SHOULD validate that the value of the `openapi:discriminator` member in
+[attributes](https://jsonapi.org/format/#document-resource-object-attributes) and [relationships](https://jsonapi.org/format/#document-resource-object-relationships) objects
+is identical to the `type` member in the containing resource object. When validation fails, the server MUST respond with a `409 Conflict`
+and SHOULD include a document with a top-level `errors` member that contains an error object.
diff --git a/docs/usage/openapi-client.md b/docs/usage/openapi-client.md
new file mode 100644
index 0000000000..1c449aa981
--- /dev/null
+++ b/docs/usage/openapi-client.md
@@ -0,0 +1,356 @@
+> [!WARNING]
+> OpenAPI support for JSON:API is currently experimental. The API and the structure of the OpenAPI document may change in future versions.
+
+# OpenAPI clients
+
+After [enabling OpenAPI](~/usage/openapi.md), you can generate a typed JSON:API client for your API in various programming languages.
+
+> [!NOTE]
+> If you prefer a generic JSON:API client instead of a typed one, choose from the existing
+> [client libraries](https://jsonapi.org/implementations/#client-libraries).
+
+The following code generators are supported, though you may try others as well:
+- [NSwag](https://github.com/RicoSuter/NSwag) (v14.1 or higher): Produces clients for C# (requires `Newtonsoft.Json`) and TypeScript
+- [Kiota](https://learn.microsoft.com/en-us/openapi/kiota/overview): Produces clients for C#, Go, Java, PHP, Python, Ruby, Swift and TypeScript
+
+# [NSwag](#tab/nswag)
+
+For C# clients, we provide an additional package that provides workarounds for bugs in NSwag and enables using partial POST/PATCH requests.
+
+To add it to your project, run the following command:
+```
+dotnet add package JsonApiDotNetCore.OpenApi.Client.NSwag
+```
+
+# [Kiota](#tab/kiota)
+
+For C# clients, we provide an additional package that provides workarounds for bugs in Kiota, as well as MSBuild integration.
+
+To add it to your project, run the following command:
+```
+dotnet add package JsonApiDotNetCore.OpenApi.Client.Kiota
+```
+
+---
+
+## Getting started
+
+To generate your C# client, follow the steps below.
+
+# [NSwag](#tab/nswag)
+
+### Visual Studio
+
+The easiest way to get started is by using the built-in capabilities of Visual Studio.
+The following steps describe how to generate and use a JSON:API client in C#, combined with our NuGet package.
+
+1. In **Solution Explorer**, right-click your client project, select **Add** > **Service Reference** and choose **OpenAPI**.
+
+1. On the next page, specify the OpenAPI URL to your JSON:API server, for example: `http://localhost:14140/swagger/v1/swagger.json`.
+ Specify `ExampleApiClient` as the class name, optionally provide a namespace and click **Finish**.
+ Visual Studio now downloads your swagger.json and updates your project file.
+ This adds a pre-build step that generates the client code.
+
+ > [!TIP]
+ > To later re-download swagger.json and regenerate the client code,
+ > right-click **Dependencies** > **Manage Connected Services** and click the **Refresh** icon.
+
+1. Run package update now, which fixes incompatibilities and bugs from older versions.
+
+1. Add our client package to your project:
+
+ ```
+ dotnet add package JsonApiDotNetCore.OpenApi.Client.NSwag
+ ```
+
+1. Add code that calls one of your JSON:API endpoints.
+
+ ```c#
+ using var httpClient = new HttpClient();
+ var apiClient = new ExampleApiClient(httpClient);
+
+ var getResponse = await apiClient.GetPersonCollectionAsync(new Dictionary
+ {
+ ["filter"] = "has(assignedTodoItems)",
+ ["sort"] = "-lastName",
+ ["page[size]"] = "5"
+ });
+
+ foreach (var person in getResponse.Data)
+ {
+ Console.WriteLine($"Found person {person.Id}: {person.Attributes!.DisplayName}");
+ }
+ ```
+
+1. Extend the demo code to send a partial PATCH request with the help of our package:
+
+ ```c#
+ var updatePersonRequest = new UpdatePersonRequestDocument
+ {
+ Data = new DataInUpdatePersonRequest
+ {
+ Id = "1",
+ // Using TrackChangesFor to send "firstName: null" instead of omitting it.
+ Attributes = new TrackChangesFor(_apiClient)
+ {
+ Initializer =
+ {
+ FirstName = null,
+ LastName = "Doe"
+ }
+ }.Initializer
+ }
+ };
+
+ await ApiResponse.TranslateAsync(async () =>
+ await _apiClient.PatchPersonAsync(updatePersonRequest.Data.Id, updatePersonRequest));
+
+ // The sent request looks like this:
+ // {
+ // "data": {
+ // "type": "people",
+ // "id": "1",
+ // "attributes": {
+ // "firstName": null,
+ // "lastName": "Doe"
+ // }
+ // }
+ // }
+ ```
+
+> [!TIP]
+> The [example project](https://github.com/json-api-dotnet/JsonApiDotNetCore/tree/master/src/Examples/OpenApiNSwagClientExample) contains an enhanced version
+> that uses `IHttpClientFactory` for [scalability](https://learn.microsoft.com/en-us/dotnet/core/extensions/httpclient-factory) and
+> [resiliency](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests#use-polly-based-handlers) and logs the HTTP requests and responses.
+> Additionally, the example shows how to write the swagger.json file to disk when building the server, which is imported from the client project.
+> This keeps the server and client automatically in sync, which is handy when both are in the same solution.
+
+### Other IDEs
+
+The following section shows what to add to your client project file directly:
+
+```xml
+
+
+
+
+
+
+
+
+ http://localhost:14140/swagger/v1/swagger.json
+ ExampleApiClient
+ %(ClassName).cs
+
+
+```
+
+From here, continue from step 3 in the list of steps for Visual Studio.
+
+# [Kiota](#tab/kiota)
+
+To generate your C# client, first add the Kiota tool to your solution:
+
+```
+dotnet tool install microsoft.openapi.kiota
+```
+
+After adding the `JsonApiDotNetCore.OpenApi.Client.Kiota` package to your project, add a `KiotaReference` element
+to your project file to import your OpenAPI file. For example:
+
+```xml
+
+
+
+ $(MSBuildProjectName).GeneratedCode
+ ExampleApiClient
+ ./GeneratedCode
+ $(JsonApiExtraArguments)
+
+
+
+```
+
+> [!NOTE]
+> The `ExtraArguments` parameter is required for compatibility with JSON:API.
+
+Next, build your project. It runs the kiota command-line tool, which generates files in the `GeneratedCode` subdirectory.
+
+> [!CAUTION]
+> If you're not using ``, at least make sure you're passing the `--backing-store` switch to the command-line tool,
+> which is needed for JSON:API partial POST/PATCH requests to work correctly.
+
+Kiota is pretty young and therefore still rough around the edges. At the time of writing, there are various bugs, for which we have workarounds
+in place. For a full example, see the [example project](https://github.com/json-api-dotnet/JsonApiDotNetCore/tree/master/src/Examples/OpenApiKiotaClientExample).
+
+---
+
+## Configuration
+
+Various switches enable you to tweak the client generation to your needs. See the section below for an overview.
+
+# [NSwag](#tab/nswag)
+
+The `OpenApiReference` element can be customized using various [NSwag-specific MSBuild properties](https://github.com/RicoSuter/NSwag/blob/7d6df3af95081f3f0ed6dee04be8d27faa86f91a/src/NSwag.ApiDescription.Client/NSwag.ApiDescription.Client.props).
+See [the source code](https://github.com/RicoSuter/NSwag/blob/master/src/NSwag.Commands/Commands/CodeGeneration/OpenApiToCSharpClientCommand.cs) for their meaning.
+The `JsonApiDotNetCore.OpenApi.Client.NSwag` package sets various of these for optimal JSON:API support.
+
+> [!NOTE]
+> Earlier versions of NSwag required the use of `` to specify command-line switches directly.
+> This is no longer recommended and may conflict with the new MSBuild properties.
+
+For example, the following section puts the generated code in a namespace, makes the client class internal and generates an interface (handy when writing tests):
+
+```xml
+
+ ExampleProject.GeneratedCode
+ internal
+ true
+
+```
+
+# [Kiota](#tab/kiota)
+
+The available command-line switches for Kiota are described [here](https://learn.microsoft.com/en-us/openapi/kiota/using#client-generation).
+
+At the time of writing, Kiota provides [no official integration](https://github.com/microsoft/kiota/issues/3005) with MSBuild.
+Our [example project](https://github.com/json-api-dotnet/JsonApiDotNetCore/tree/master/src/Examples/OpenApiKiotaClientExample) takes a stab at it,
+which seems to work. If you're an MSBuild expert, please help out!
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+---
+
+## Headers and caching
+
+The use of HTTP headers varies per client generator. To use [ETags for caching](~/usage/caching.md), see the notes below.
+
+# [NSwag](#tab/nswag)
+
+To gain access to HTTP response headers, add the following in a `PropertyGroup` or directly in the `OpenApiReference`:
+
+```
+true
+```
+
+This enables the following code, which is explained below:
+
+```c#
+var getResponse = await ApiResponse.TranslateAsync(() => apiClient.GetPersonCollectionAsync());
+string eTag = getResponse.Headers["ETag"].Single();
+Console.WriteLine($"Retrieved {getResponse.Result?.Data.Count ?? 0} people.");
+
+// wait some time...
+
+getResponse = await ApiResponse.TranslateAsync(() => apiClient.GetPersonCollectionAsync(if_None_Match: eTag));
+
+if (getResponse is { StatusCode: (int)HttpStatusCode.NotModified, Result: null })
+{
+ Console.WriteLine("The HTTP response hasn't changed, so no response body was returned.");
+}
+```
+
+The response of the first API call contains both data and an ETag header, which is a fingerprint of the response.
+That ETag gets passed to the second API call. This enables the server to detect if something changed, which optimizes
+network usage: no data is sent back, unless is has changed.
+If you only want to ask whether data has changed without fetching it, use a HEAD request instead.
+
+# [Kiota](#tab/kiota)
+
+Use `HeadersInspectionHandlerOption` to gain access to HTTP response headers. For example:
+
+```c#
+var headerInspector = new HeadersInspectionHandlerOption
+{
+ InspectResponseHeaders = true
+};
+
+var responseDocument = await apiClient.Api.People.GetAsync(configuration => configuration.Options.Add(headerInspector));
+
+string eTag = headerInspector.ResponseHeaders["ETag"].Single();
+```
+
+Due to a [bug in Kiota](https://github.com/microsoft/kiota/issues/4190), a try/catch block is needed additionally to make this work.
+
+For a full example, see the [example project](https://github.com/json-api-dotnet/JsonApiDotNetCore/tree/master/src/Examples/OpenApiKiotaClientExample).
+
+---
+
+## Atomic operations
+
+# [NSwag](#tab/nswag)
+
+[Atomic operations](~/usage/writing/bulk-batch-operations.md) are fully supported.
+The [example project](https://github.com/json-api-dotnet/JsonApiDotNetCore/tree/master/src/Examples/OpenApiNSwagClientExample)
+demonstrates how to use them. It uses local IDs to:
+- Create a new tag
+- Create a new person
+- Update the person to clear an attribute (using `TrackChangesFor`)
+- Create a new todo-item, tagged with the new tag, and owned by the new person
+- Assign the todo-item to the created person
+
+# [Kiota](#tab/kiota)
+
+[Atomic operations](~/usage/writing/bulk-batch-operations.md) are fully supported.
+See the [example project](https://github.com/json-api-dotnet/JsonApiDotNetCore/tree/master/src/Examples/OpenApiKiotaClientExample)
+demonstrates how to use them. It uses local IDs to:
+- Create a new tag
+- Create a new person
+- Update the person to clear an attribute (using built-in backing-store)
+- Create a new todo-item, tagged with the new tag, and owned by the new person
+- Assign the todo-item to the created person
+
+---
+
+## Known limitations
+
+# [NSwag](#tab/nswag)
+
+| Limitation | Workaround | Links |
+| --- | --- | --- |
+| Partial POST/PATCH sends incorrect request | Use `TrackChangesFor` from `JsonApiDotNetCore.OpenApi.Client.NSwag` package | |
+| Exception thrown on successful HTTP status | Use `TranslateAsync` from `JsonApiDotNetCore.OpenApi.Client.NSwag` package | https://github.com/RicoSuter/NSwag/issues/2499 |
+| No `Accept` header sent when only error responses define `Content-Type` | `JsonApiDotNetCore.OpenApi.Swashbuckle` package contains workaround | |
+| Schema type not always inferred with `allOf` | `JsonApiDotNetCore.OpenApi.Swashbuckle` package contains workaround | |
+| Generated code for JSON:API extensions does not compile | `JsonApiDotNetCore.OpenApi.Swashbuckle` package contains workaround | |
+| A project can't contain both JSON:API clients and regular OpenAPI clients | Use separate projects | |
+
+# [Kiota](#tab/kiota)
+
+| Limitation | Workaround | Links |
+| --- | --- | --- |
+| Properties are always nullable | - | https://github.com/microsoft/kiota/issues/3911 |
+| JSON:API query strings are inaccessible | Use `SetQueryStringHttpMessageHandler.CreateScope` from `JsonApiDotNetCore.OpenApi.Client.Kiota` package | https://github.com/microsoft/kiota/issues/3800 |
+| Properties set to `null` are sent twice | - | https://github.com/microsoft/kiota-dotnet/issues/535 |
+| HTTP 304 (Not Modified) is not properly recognized | Catch `ApiException` and inspect the response status code | https://github.com/microsoft/kiota/issues/4190, https://github.com/microsoft/kiota-dotnet/issues/531 |
+| Generator warns about unsupported formats | Use `JsonApiDotNetCore.OpenApi.Client.Kiota` package | https://github.com/microsoft/kiota/issues/4227 |
+| `Stream` response for HEAD request | - | https://github.com/microsoft/kiota/issues/4245 |
+| Unhelpful exception messages | - | https://github.com/microsoft/kiota/issues/4349 |
+| Discriminator properties aren't being set automatically | - | https://github.com/microsoft/kiota/issues/4618 |
+| Discriminator mappings must be repeated in every derived type used in responses | `JsonApiDotNetCore.OpenApi.Swashbuckle` package contains workaround | https://github.com/microsoft/kiota/issues/2432 |
+| `x-abstract` in `openapi.json` is ignored | - | |
+| No MSBuild / IDE support | Use `KiotaReference` from `JsonApiDotNetCore.OpenApi.Client.Kiota` package | https://github.com/microsoft/kiota/issues/3005 |
+| Incorrect nullability in API methods | Use `KiotaReference` from `JsonApiDotNetCore.OpenApi.Client.Kiota` package | https://github.com/microsoft/kiota/issues/3944 |
+| Generated code for JSON:API extensions does not compile | `JsonApiDotNetCore.OpenApi.Swashbuckle` package contains workaround | |
+| Properties are always sent in alphabetic order | - | https://github.com/microsoft/kiota/issues/4680 |
+
+---
diff --git a/docs/usage/openapi-documentation.md b/docs/usage/openapi-documentation.md
new file mode 100644
index 0000000000..6737bd6404
--- /dev/null
+++ b/docs/usage/openapi-documentation.md
@@ -0,0 +1,48 @@
+> [!WARNING]
+> OpenAPI support for JSON:API is currently experimental. The API and the structure of the OpenAPI document may change in future versions.
+
+# OpenAPI documentation
+
+After [enabling OpenAPI](~/usage/openapi.md), you can expose a documentation website with SwaggerUI, Redoc and/or Scalar.
+
+## SwaggerUI
+
+[SwaggerUI](https://swagger.io/tools/swagger-ui/) enables to visualize and interact with the JSON:API endpoints through a web page.
+While it conveniently provides the ability to execute requests, it doesn't show properties of derived types when component schema inheritance is used.
+
+SwaggerUI can be enabled by installing the `Swashbuckle.AspNetCore.SwaggerUI` NuGet package and adding the following to your `Program.cs` file:
+
+```c#
+app.UseSwaggerUI();
+```
+
+Then run your app and open `/swagger` in your browser.
+
+## Redoc
+
+[Redoc](https://github.com/Redocly/redoc) is another popular tool that generates a documentation website from an OpenAPI document.
+It lists the endpoints and their schemas, but doesn't provide the ability to execute requests.
+However, this tool most accurately reflects properties when component schema inheritance is used; choosing a different "type" from the
+dropdown box dynamically adapts the list of schema properties.
+
+The `Swashbuckle.AspNetCore.ReDoc` NuGet package provides integration with Swashbuckle.
+After installing the package, add the following to your `Program.cs` file:
+
+```c#
+app.UseReDoc();
+```
+
+Next, run your app and navigate to `/api-docs` to view the documentation.
+
+## Scalar
+
+[Scalar](https://scalar.com/) is a modern documentation website generator, which includes the ability to execute requests.
+It shows component schemas in a low-level way (not collapsing `allOf` nodes), but does a poor job in handling component schema inheritance.
+
+After installing the `Scalar.AspNetCore` NuGet package, add the following to your `Program.cs` to make it use the OpenAPI document produced by Swashbuckle:
+
+```c#
+app.MapScalarApiReference(options => options.OpenApiRoutePattern = "/swagger/{documentName}/swagger.json");
+```
+
+Then run your app and navigate to `/scalar/v1` to view the documentation.
diff --git a/docs/usage/openapi.md b/docs/usage/openapi.md
new file mode 100644
index 0000000000..e49f120a14
--- /dev/null
+++ b/docs/usage/openapi.md
@@ -0,0 +1,87 @@
+> [!WARNING]
+> OpenAPI support for JSON:API is currently experimental. The API and the structure of the OpenAPI document may change in future versions.
+
+# OpenAPI
+
+Exposing an [OpenAPI document](https://swagger.io/specification/) for your JSON:API endpoints enables to provide a
+[documentation website](https://swagger.io/tools/swagger-ui/) and to generate typed
+[client libraries](https://openapi-generator.tech/docs/generators/) in various languages.
+
+The [JsonApiDotNetCore.OpenApi.Swashbuckle](https://github.com/json-api-dotnet/JsonApiDotNetCore/pkgs/nuget/JsonApiDotNetCore.OpenApi.Swashbuckle) NuGet package
+provides OpenAPI support for JSON:API by integrating with [Swashbuckle](https://github.com/domaindrivendev/Swashbuckle.AspNetCore).
+
+## Getting started
+
+1. Install the `JsonApiDotNetCore.OpenApi.Swashbuckle` NuGet package:
+
+ ```
+ dotnet add package JsonApiDotNetCore.OpenApi.Swashbuckle
+ ```
+
+ > [!NOTE]
+ > Because this package is still experimental, it's not yet available on NuGet.
+ > Use the steps [here](https://github.com/json-api-dotnet/JsonApiDotNetCore?tab=readme-ov-file#trying-out-the-latest-build) to install.
+
+2. Add the JSON:API support to your `Program.cs` file.
+
+ ```c#
+ builder.Services.AddJsonApi();
+
+ // Configure Swashbuckle for JSON:API.
+ builder.Services.AddOpenApiForJsonApi();
+
+ var app = builder.Build();
+
+ app.UseRouting();
+ app.UseJsonApi();
+
+ // Add the Swashbuckle middleware.
+ app.UseSwagger();
+ ```
+
+By default, the OpenAPI document will be available at `http://localhost:/swagger/v1/swagger.json`.
+
+### Customizing the Route Template
+
+Because Swashbuckle doesn't properly implement the ASP.NET Options pattern, you must *not* use its
+[documented way](https://github.com/domaindrivendev/Swashbuckle.AspNetCore?tab=readme-ov-file#change-the-path-for-swagger-json-endpoints)
+to change the route template:
+
+```c#
+// DO NOT USE THIS! INCOMPATIBLE WITH JSON:API!
+app.UseSwagger(options => options.RouteTemplate = "api-docs/{documentName}/swagger.yaml");
+```
+
+Instead, always call `UseSwagger()` *without parameters*. To change the route template, use the code below:
+
+```c#
+builder.Services.Configure(options => options.RouteTemplate = "/api-docs/{documentName}/swagger.yaml");
+```
+
+If you want to inject dependencies to set the route template, use:
+
+```c#
+builder.Services.AddOptions().Configure((options, serviceProvider) =>
+{
+ var webHostEnvironment = serviceProvider.GetRequiredService();
+ string appName = webHostEnvironment.ApplicationName;
+ options.RouteTemplate = $"/api-docs/{{documentName}}/{appName}-swagger.yaml";
+});
+```
+
+## Triple-slash comments
+
+Documentation for JSON:API endpoints is provided out of the box, which shows in SwaggerUI and through IDE IntelliSense in auto-generated clients.
+To also get documentation for your resource classes and their properties, add the following to your project file.
+The `NoWarn` line is optional, which suppresses build warnings for undocumented types and members.
+
+```xml
+
+ True
+ $(NoWarn);1591
+
+```
+
+You can combine this with the documentation that Swagger itself supports, by enabling it as described
+[here](https://github.com/domaindrivendev/Swashbuckle.AspNetCore#include-descriptions-from-xml-comments).
+This adds documentation for additional types, such as triple-slash comments on enums used in your resource models.
diff --git a/docs/usage/toc.md b/docs/usage/toc.md
index 61d3da8de0..bdeb0e4958 100644
--- a/docs/usage/toc.md
+++ b/docs/usage/toc.md
@@ -25,6 +25,10 @@
# [Caching](caching.md)
# [Common Pitfalls](common-pitfalls.md)
+# [OpenAPI](openapi.md)
+## [Documentation](openapi-documentation.md)
+## [Clients](openapi-client.md)
+
# Extensibility
## [Layer Overview](extensibility/layer-overview.md)
## [Resource Definitions](extensibility/resource-definitions.md)
diff --git a/nuget.config b/nuget.config
new file mode 100644
index 0000000000..16164967c6
--- /dev/null
+++ b/nuget.config
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/package-versions.props b/package-versions.props
index e7c32c98fa..8b528ff324 100644
--- a/package-versions.props
+++ b/package-versions.props
@@ -4,18 +4,28 @@
4.1.0
0.4.1
2.14.1
+ 8.0.0
+ 13.0.3
0.14.*
+ 1.0.*
35.6.*
- 4.12.*
+ 4.13.*
6.0.*
2.1.*
7.2.*
2.4.*
2.0.*
+ 1.*
+ 9.0.*
+ 9.0.*
+ 14.3.*
+ 13.0.*
+ 2.1.*
+ 8.*-*
9.0.*
- 17.12.*
+ 17.13.*
2.9.*
2.8.*
diff --git a/src/Examples/JsonApiDotNetCoreExample/GeneratedSwagger/JsonApiDotNetCoreExample.json b/src/Examples/JsonApiDotNetCoreExample/GeneratedSwagger/JsonApiDotNetCoreExample.json
new file mode 100644
index 0000000000..4863000598
--- /dev/null
+++ b/src/Examples/JsonApiDotNetCoreExample/GeneratedSwagger/JsonApiDotNetCoreExample.json
@@ -0,0 +1,8583 @@
+{
+ "openapi": "3.0.4",
+ "info": {
+ "title": "JsonApiDotNetCoreExample",
+ "version": "1.0"
+ },
+ "servers": [
+ {
+ "url": "https://localhost:44340"
+ }
+ ],
+ "paths": {
+ "/api/operations": {
+ "post": {
+ "tags": [
+ "operations"
+ ],
+ "summary": "Performs multiple mutations in a linear and atomic manner.",
+ "operationId": "postOperations",
+ "requestBody": {
+ "description": "An array of mutation operations. For syntax, see the [Atomic Operations documentation](https://jsonapi.org/ext/atomic/).",
+ "content": {
+ "application/vnd.api+json; ext=atomic; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/operationsRequestDocument"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "All operations were successfully applied, which resulted in additional changes.",
+ "content": {
+ "application/vnd.api+json; ext=atomic; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/operationsResponseDocument"
+ }
+ }
+ }
+ },
+ "204": {
+ "description": "All operations were successfully applied, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=atomic; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "An operation is not accessible or a client-generated ID is used.",
+ "content": {
+ "application/vnd.api+json; ext=atomic; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "A resource or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=atomic; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=atomic; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=atomic; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/people": {
+ "get": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Retrieves a collection of people.",
+ "operationId": "getPersonCollection",
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found people, or an empty array if none were found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/personCollectionResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Retrieves a collection of people without returning them.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headPersonCollection",
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Creates a new person.",
+ "operationId": "postPerson",
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The attributes and relationships of the person to create.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/createPersonRequestDocument"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "The person was successfully created, which resulted in additional changes. The newly created person is returned.",
+ "headers": {
+ "Location": {
+ "description": "The URL at which the newly created person can be retrieved.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uri"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/primaryPersonResponseDocument"
+ }
+ }
+ }
+ },
+ "204": {
+ "description": "The person was successfully created, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The query string is invalid or the request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Client-generated IDs cannot be used at this endpoint.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "A related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/people/{id}": {
+ "get": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Retrieves an individual person by its identifier.",
+ "operationId": "getPerson",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found person.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/primaryPersonResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The person does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Retrieves an individual person by its identifier without returning it.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headPerson",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The person does not exist."
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Updates an existing person.",
+ "operationId": "patchPerson",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person to update.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The attributes and relationships of the person to update. Omitted fields are left unchanged.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/updatePersonRequestDocument"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "The person was successfully updated, which resulted in additional changes. The updated person is returned.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/primaryPersonResponseDocument"
+ }
+ }
+ }
+ },
+ "204": {
+ "description": "The person was successfully updated, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The query string is invalid or the request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The person or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "A resource type or identifier in the request body is incompatible.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Deletes an existing person by its identifier.",
+ "operationId": "deletePerson",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person to delete.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "The person was successfully deleted."
+ },
+ "404": {
+ "description": "The person does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/people/{id}/assignedTodoItems": {
+ "get": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Retrieves the related todoItems of an individual person's assignedTodoItems relationship.",
+ "operationId": "getPersonAssignedTodoItems",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person whose related todoItems to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found todoItems, or an empty array if none were found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/todoItemCollectionResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The person does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Retrieves the related todoItems of an individual person's assignedTodoItems relationship without returning them.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headPersonAssignedTodoItems",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person whose related todoItems to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The person does not exist."
+ }
+ }
+ }
+ },
+ "/api/people/{id}/relationships/assignedTodoItems": {
+ "get": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Retrieves the related todoItem identities of an individual person's assignedTodoItems relationship.",
+ "operationId": "getPersonAssignedTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person whose related todoItem identities to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found todoItem identities, or an empty array if none were found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/todoItemIdentifierCollectionResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The person does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Retrieves the related todoItem identities of an individual person's assignedTodoItems relationship without returning them.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headPersonAssignedTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person whose related todoItem identities to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The person does not exist."
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Adds existing todoItems to the assignedTodoItems relationship of an individual person.",
+ "operationId": "postPersonAssignedTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person to add todoItems to.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identities of the todoItems to add to the assignedTodoItems relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The todoItems were successfully added, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The person or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Assigns existing todoItems to the assignedTodoItems relationship of an individual person.",
+ "operationId": "patchPersonAssignedTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person whose assignedTodoItems relationship to assign.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identities of the todoItems to assign to the assignedTodoItems relationship, or an empty array to clear the relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The assignedTodoItems relationship was successfully updated, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The person or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Removes existing todoItems from the assignedTodoItems relationship of an individual person.",
+ "operationId": "deletePersonAssignedTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person to remove todoItems from.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identities of the todoItems to remove from the assignedTodoItems relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The todoItems were successfully removed, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The person or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/people/{id}/ownedTodoItems": {
+ "get": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Retrieves the related todoItems of an individual person's ownedTodoItems relationship.",
+ "operationId": "getPersonOwnedTodoItems",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person whose related todoItems to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found todoItems, or an empty array if none were found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/todoItemCollectionResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The person does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Retrieves the related todoItems of an individual person's ownedTodoItems relationship without returning them.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headPersonOwnedTodoItems",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person whose related todoItems to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The person does not exist."
+ }
+ }
+ }
+ },
+ "/api/people/{id}/relationships/ownedTodoItems": {
+ "get": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Retrieves the related todoItem identities of an individual person's ownedTodoItems relationship.",
+ "operationId": "getPersonOwnedTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person whose related todoItem identities to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found todoItem identities, or an empty array if none were found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/todoItemIdentifierCollectionResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The person does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Retrieves the related todoItem identities of an individual person's ownedTodoItems relationship without returning them.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headPersonOwnedTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person whose related todoItem identities to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The person does not exist."
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Adds existing todoItems to the ownedTodoItems relationship of an individual person.",
+ "operationId": "postPersonOwnedTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person to add todoItems to.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identities of the todoItems to add to the ownedTodoItems relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The todoItems were successfully added, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The person or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Assigns existing todoItems to the ownedTodoItems relationship of an individual person.",
+ "operationId": "patchPersonOwnedTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person whose ownedTodoItems relationship to assign.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identities of the todoItems to assign to the ownedTodoItems relationship, or an empty array to clear the relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The ownedTodoItems relationship was successfully updated, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The person or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "people"
+ ],
+ "summary": "Removes existing todoItems from the ownedTodoItems relationship of an individual person.",
+ "operationId": "deletePersonOwnedTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the person to remove todoItems from.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identities of the todoItems to remove from the ownedTodoItems relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The todoItems were successfully removed, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The person or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/tags": {
+ "get": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Retrieves a collection of tags.",
+ "operationId": "getTagCollection",
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found tags, or an empty array if none were found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/tagCollectionResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Retrieves a collection of tags without returning them.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headTagCollection",
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Creates a new tag.",
+ "operationId": "postTag",
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The attributes and relationships of the tag to create.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/createTagRequestDocument"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "The tag was successfully created, which resulted in additional changes. The newly created tag is returned.",
+ "headers": {
+ "Location": {
+ "description": "The URL at which the newly created tag can be retrieved.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uri"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/primaryTagResponseDocument"
+ }
+ }
+ }
+ },
+ "204": {
+ "description": "The tag was successfully created, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The query string is invalid or the request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Client-generated IDs cannot be used at this endpoint.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "A related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/tags/{id}": {
+ "get": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Retrieves an individual tag by its identifier.",
+ "operationId": "getTag",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the tag to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found tag.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/primaryTagResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The tag does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Retrieves an individual tag by its identifier without returning it.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headTag",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the tag to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The tag does not exist."
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Updates an existing tag.",
+ "operationId": "patchTag",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the tag to update.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The attributes and relationships of the tag to update. Omitted fields are left unchanged.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/updateTagRequestDocument"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "The tag was successfully updated, which resulted in additional changes. The updated tag is returned.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/primaryTagResponseDocument"
+ }
+ }
+ }
+ },
+ "204": {
+ "description": "The tag was successfully updated, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The query string is invalid or the request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The tag or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "A resource type or identifier in the request body is incompatible.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Deletes an existing tag by its identifier.",
+ "operationId": "deleteTag",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the tag to delete.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "The tag was successfully deleted."
+ },
+ "404": {
+ "description": "The tag does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/tags/{id}/todoItems": {
+ "get": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Retrieves the related todoItems of an individual tag's todoItems relationship.",
+ "operationId": "getTagTodoItems",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the tag whose related todoItems to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found todoItems, or an empty array if none were found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/todoItemCollectionResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The tag does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Retrieves the related todoItems of an individual tag's todoItems relationship without returning them.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headTagTodoItems",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the tag whose related todoItems to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The tag does not exist."
+ }
+ }
+ }
+ },
+ "/api/tags/{id}/relationships/todoItems": {
+ "get": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Retrieves the related todoItem identities of an individual tag's todoItems relationship.",
+ "operationId": "getTagTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the tag whose related todoItem identities to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found todoItem identities, or an empty array if none were found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/todoItemIdentifierCollectionResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The tag does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Retrieves the related todoItem identities of an individual tag's todoItems relationship without returning them.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headTagTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the tag whose related todoItem identities to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The tag does not exist."
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Adds existing todoItems to the todoItems relationship of an individual tag.",
+ "operationId": "postTagTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the tag to add todoItems to.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identities of the todoItems to add to the todoItems relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The todoItems were successfully added, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The tag or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Assigns existing todoItems to the todoItems relationship of an individual tag.",
+ "operationId": "patchTagTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the tag whose todoItems relationship to assign.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identities of the todoItems to assign to the todoItems relationship, or an empty array to clear the relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The todoItems relationship was successfully updated, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The tag or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "tags"
+ ],
+ "summary": "Removes existing todoItems from the todoItems relationship of an individual tag.",
+ "operationId": "deleteTagTodoItemsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the tag to remove todoItems from.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identities of the todoItems to remove from the todoItems relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The todoItems were successfully removed, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The tag or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/todoItems": {
+ "get": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves a collection of todoItems.",
+ "operationId": "getTodoItemCollection",
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found todoItems, or an empty array if none were found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/todoItemCollectionResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves a collection of todoItems without returning them.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headTodoItemCollection",
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Creates a new todoItem.",
+ "operationId": "postTodoItem",
+ "parameters": [
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The attributes and relationships of the todoItem to create.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/createTodoItemRequestDocument"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "201": {
+ "description": "The todoItem was successfully created, which resulted in additional changes. The newly created todoItem is returned.",
+ "headers": {
+ "Location": {
+ "description": "The URL at which the newly created todoItem can be retrieved.",
+ "required": true,
+ "schema": {
+ "type": "string",
+ "format": "uri"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/primaryTodoItemResponseDocument"
+ }
+ }
+ }
+ },
+ "204": {
+ "description": "The todoItem was successfully created, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The query string is invalid or the request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Client-generated IDs cannot be used at this endpoint.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "A related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/todoItems/{id}": {
+ "get": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves an individual todoItem by its identifier.",
+ "operationId": "getTodoItem",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found todoItem.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/primaryTodoItemResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The todoItem does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves an individual todoItem by its identifier without returning it.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headTodoItem",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The todoItem does not exist."
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Updates an existing todoItem.",
+ "operationId": "patchTodoItem",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem to update.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The attributes and relationships of the todoItem to update. Omitted fields are left unchanged.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/updateTodoItemRequestDocument"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "200": {
+ "description": "The todoItem was successfully updated, which resulted in additional changes. The updated todoItem is returned.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/primaryTodoItemResponseDocument"
+ }
+ }
+ }
+ },
+ "204": {
+ "description": "The todoItem was successfully updated, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The query string is invalid or the request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The todoItem or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "A resource type or identifier in the request body is incompatible.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Deletes an existing todoItem by its identifier.",
+ "operationId": "deleteTodoItem",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem to delete.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "responses": {
+ "204": {
+ "description": "The todoItem was successfully deleted."
+ },
+ "404": {
+ "description": "The todoItem does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/todoItems/{id}/assignee": {
+ "get": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves the related person of an individual todoItem's assignee relationship.",
+ "operationId": "getTodoItemAssignee",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose related person to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found person, or `null` if it was not found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/nullableSecondaryPersonResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The todoItem does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves the related person of an individual todoItem's assignee relationship without returning it.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headTodoItemAssignee",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose related person to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The todoItem does not exist."
+ }
+ }
+ }
+ },
+ "/api/todoItems/{id}/relationships/assignee": {
+ "get": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves the related person identity of an individual todoItem's assignee relationship.",
+ "operationId": "getTodoItemAssigneeRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose related person identity to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found person identity, or `null` if it was not found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/nullablePersonIdentifierResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The todoItem does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves the related person identity of an individual todoItem's assignee relationship without returning it.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headTodoItemAssigneeRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose related person identity to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The todoItem does not exist."
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Clears or assigns an existing person to the assignee relationship of an individual todoItem.",
+ "operationId": "patchTodoItemAssigneeRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose assignee relationship to assign or clear.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identity of the person to assign to the assignee relationship, or `null` to clear the relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/nullableToOnePersonInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The assignee relationship was successfully updated, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The todoItem or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/todoItems/{id}/owner": {
+ "get": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves the related person of an individual todoItem's owner relationship.",
+ "operationId": "getTodoItemOwner",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose related person to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found person, or `null` if it was not found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/secondaryPersonResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The todoItem does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves the related person of an individual todoItem's owner relationship without returning it.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headTodoItemOwner",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose related person to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The todoItem does not exist."
+ }
+ }
+ }
+ },
+ "/api/todoItems/{id}/relationships/owner": {
+ "get": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves the related person identity of an individual todoItem's owner relationship.",
+ "operationId": "getTodoItemOwnerRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose related person identity to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found person identity, or `null` if it was not found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/personIdentifierResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The todoItem does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves the related person identity of an individual todoItem's owner relationship without returning it.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headTodoItemOwnerRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose related person identity to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The todoItem does not exist."
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Assigns an existing person to the owner relationship of an individual todoItem.",
+ "operationId": "patchTodoItemOwnerRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose owner relationship to assign.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identity of the person to assign to the owner relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toOnePersonInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The owner relationship was successfully updated, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The todoItem or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/api/todoItems/{id}/tags": {
+ "get": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves the related tags of an individual todoItem's tags relationship.",
+ "operationId": "getTodoItemTags",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose related tags to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found tags, or an empty array if none were found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/tagCollectionResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The todoItem does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves the related tags of an individual todoItem's tags relationship without returning them.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headTodoItemTags",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose related tags to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The todoItem does not exist."
+ }
+ }
+ }
+ },
+ "/api/todoItems/{id}/relationships/tags": {
+ "get": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves the related tag identities of an individual todoItem's tags relationship.",
+ "operationId": "getTodoItemTagsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose related tag identities to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Successfully returns the found tag identities, or an empty array if none were found.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ },
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/tagIdentifierCollectionResponseDocument"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The todoItem does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "head": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Retrieves the related tag identities of an individual todoItem's tags relationship without returning them.",
+ "description": "Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.",
+ "operationId": "headTodoItemTagsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose related tag identities to retrieve.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ },
+ {
+ "name": "query",
+ "in": "query",
+ "description": "For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string",
+ "nullable": true
+ },
+ "example": ""
+ }
+ },
+ {
+ "name": "If-None-Match",
+ "in": "header",
+ "description": "A list of ETags, resulting in HTTP status 304 without a body, if one of them matches the current fingerprint.",
+ "schema": {
+ "type": "string"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "The operation completed successfully.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ "Content-Length": {
+ "description": "Size of the HTTP response body, in bytes.",
+ "required": true,
+ "schema": {
+ "type": "integer",
+ "format": "int64"
+ }
+ }
+ }
+ },
+ "304": {
+ "description": "The fingerprint of the HTTP response matches one of the ETags from the incoming If-None-Match header.",
+ "headers": {
+ "ETag": {
+ "description": "A fingerprint of the HTTP response, which can be used in an If-None-Match header to only fetch changes.",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "The query string is invalid."
+ },
+ "404": {
+ "description": "The todoItem does not exist."
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Adds existing tags to the tags relationship of an individual todoItem.",
+ "operationId": "postTodoItemTagsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem to add tags to.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identities of the tags to add to the tags relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTagInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The tags were successfully added, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The todoItem or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Assigns existing tags to the tags relationship of an individual todoItem.",
+ "operationId": "patchTodoItemTagsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem whose tags relationship to assign.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identities of the tags to assign to the tags relationship, or an empty array to clear the relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTagInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The tags relationship was successfully updated, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The todoItem or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "todoItems"
+ ],
+ "summary": "Removes existing tags from the tags relationship of an individual todoItem.",
+ "operationId": "deleteTodoItemTagsRelationship",
+ "parameters": [
+ {
+ "name": "id",
+ "in": "path",
+ "description": "The identifier of the todoItem to remove tags from.",
+ "required": true,
+ "schema": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ }
+ }
+ ],
+ "requestBody": {
+ "description": "The identities of the tags to remove from the tags relationship.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTagInRequest"
+ }
+ ]
+ }
+ }
+ },
+ "required": true
+ },
+ "responses": {
+ "204": {
+ "description": "The tags were successfully removed, which did not result in additional changes."
+ },
+ "400": {
+ "description": "The request body is missing or malformed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "The todoItem or a related resource does not exist.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "409": {
+ "description": "The request body contains conflicting information or another resource with the same ID already exists.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ },
+ "422": {
+ "description": "Validation of the request body failed.",
+ "content": {
+ "application/vnd.api+json; ext=openapi": {
+ "schema": {
+ "$ref": "#/components/schemas/errorResponseDocument"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components": {
+ "schemas": {
+ "addOperationCode": {
+ "enum": [
+ "add"
+ ],
+ "type": "string"
+ },
+ "addToPersonAssignedTodoItemsRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/addOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personAssignedTodoItemsRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/todoItemIdentifierInRequest"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "addToPersonOwnedTodoItemsRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/addOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personOwnedTodoItemsRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/todoItemIdentifierInRequest"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "addToTagTodoItemsRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/addOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/tagTodoItemsRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/todoItemIdentifierInRequest"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "addToTodoItemTagsRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/addOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemTagsRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/tagIdentifierInRequest"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "atomicOperation": {
+ "required": [
+ "openapi:discriminator"
+ ],
+ "type": "object",
+ "properties": {
+ "openapi:discriminator": {
+ "type": "string"
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false,
+ "discriminator": {
+ "propertyName": "openapi:discriminator",
+ "mapping": {
+ "addPerson": "#/components/schemas/createPersonOperation",
+ "addTag": "#/components/schemas/createTagOperation",
+ "addToPersonAssignedTodoItems": "#/components/schemas/addToPersonAssignedTodoItemsRelationshipOperation",
+ "addToPersonOwnedTodoItems": "#/components/schemas/addToPersonOwnedTodoItemsRelationshipOperation",
+ "addToTagTodoItems": "#/components/schemas/addToTagTodoItemsRelationshipOperation",
+ "addToTodoItemTags": "#/components/schemas/addToTodoItemTagsRelationshipOperation",
+ "addTodoItem": "#/components/schemas/createTodoItemOperation",
+ "removeFromPersonAssignedTodoItems": "#/components/schemas/removeFromPersonAssignedTodoItemsRelationshipOperation",
+ "removeFromPersonOwnedTodoItems": "#/components/schemas/removeFromPersonOwnedTodoItemsRelationshipOperation",
+ "removeFromTagTodoItems": "#/components/schemas/removeFromTagTodoItemsRelationshipOperation",
+ "removeFromTodoItemTags": "#/components/schemas/removeFromTodoItemTagsRelationshipOperation",
+ "removePerson": "#/components/schemas/deletePersonOperation",
+ "removeTag": "#/components/schemas/deleteTagOperation",
+ "removeTodoItem": "#/components/schemas/deleteTodoItemOperation",
+ "updatePerson": "#/components/schemas/updatePersonOperation",
+ "updatePersonAssignedTodoItems": "#/components/schemas/updatePersonAssignedTodoItemsRelationshipOperation",
+ "updatePersonOwnedTodoItems": "#/components/schemas/updatePersonOwnedTodoItemsRelationshipOperation",
+ "updateTag": "#/components/schemas/updateTagOperation",
+ "updateTagTodoItems": "#/components/schemas/updateTagTodoItemsRelationshipOperation",
+ "updateTodoItem": "#/components/schemas/updateTodoItemOperation",
+ "updateTodoItemAssignee": "#/components/schemas/updateTodoItemAssigneeRelationshipOperation",
+ "updateTodoItemOwner": "#/components/schemas/updateTodoItemOwnerRelationshipOperation",
+ "updateTodoItemTags": "#/components/schemas/updateTodoItemTagsRelationshipOperation"
+ }
+ },
+ "x-abstract": true
+ },
+ "atomicResult": {
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceInResponse"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "attributesInCreatePersonRequest": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInCreateRequest"
+ },
+ {
+ "required": [
+ "lastName"
+ ],
+ "type": "object",
+ "properties": {
+ "firstName": {
+ "type": "string",
+ "nullable": true
+ },
+ "lastName": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "attributesInCreateRequest": {
+ "required": [
+ "openapi:discriminator"
+ ],
+ "type": "object",
+ "properties": {
+ "openapi:discriminator": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceType"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false,
+ "discriminator": {
+ "propertyName": "openapi:discriminator",
+ "mapping": {
+ "people": "#/components/schemas/attributesInCreatePersonRequest",
+ "tags": "#/components/schemas/attributesInCreateTagRequest",
+ "todoItems": "#/components/schemas/attributesInCreateTodoItemRequest"
+ }
+ },
+ "x-abstract": true
+ },
+ "attributesInCreateTagRequest": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInCreateRequest"
+ },
+ {
+ "required": [
+ "name"
+ ],
+ "type": "object",
+ "properties": {
+ "name": {
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "attributesInCreateTodoItemRequest": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInCreateRequest"
+ },
+ {
+ "required": [
+ "description",
+ "priority"
+ ],
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "priority": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemPriority"
+ }
+ ]
+ },
+ "durationInHours": {
+ "type": "integer",
+ "format": "int64",
+ "nullable": true
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "attributesInPersonResponse": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInResponse"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "firstName": {
+ "type": "string",
+ "nullable": true
+ },
+ "lastName": {
+ "type": "string"
+ },
+ "displayName": {
+ "type": "string",
+ "readOnly": true
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "attributesInResponse": {
+ "required": [
+ "openapi:discriminator"
+ ],
+ "type": "object",
+ "properties": {
+ "openapi:discriminator": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceType"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false,
+ "discriminator": {
+ "propertyName": "openapi:discriminator",
+ "mapping": {
+ "people": "#/components/schemas/attributesInPersonResponse",
+ "tags": "#/components/schemas/attributesInTagResponse",
+ "todoItems": "#/components/schemas/attributesInTodoItemResponse"
+ }
+ },
+ "x-abstract": true
+ },
+ "attributesInTagResponse": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInResponse"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "name": {
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "attributesInTodoItemResponse": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInResponse"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "priority": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemPriority"
+ }
+ ]
+ },
+ "durationInHours": {
+ "type": "integer",
+ "format": "int64",
+ "nullable": true
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "modifiedAt": {
+ "type": "string",
+ "format": "date-time",
+ "nullable": true
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "attributesInUpdatePersonRequest": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInUpdateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "firstName": {
+ "type": "string",
+ "nullable": true
+ },
+ "lastName": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "attributesInUpdateRequest": {
+ "required": [
+ "openapi:discriminator"
+ ],
+ "type": "object",
+ "properties": {
+ "openapi:discriminator": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceType"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false,
+ "discriminator": {
+ "propertyName": "openapi:discriminator",
+ "mapping": {
+ "people": "#/components/schemas/attributesInUpdatePersonRequest",
+ "tags": "#/components/schemas/attributesInUpdateTagRequest",
+ "todoItems": "#/components/schemas/attributesInUpdateTodoItemRequest"
+ }
+ },
+ "x-abstract": true
+ },
+ "attributesInUpdateTagRequest": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInUpdateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "name": {
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "attributesInUpdateTodoItemRequest": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInUpdateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string"
+ },
+ "priority": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemPriority"
+ }
+ ]
+ },
+ "durationInHours": {
+ "type": "integer",
+ "format": "int64",
+ "nullable": true
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "createPersonOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/addOperationCode"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInCreatePersonRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "createPersonRequestDocument": {
+ "required": [
+ "data"
+ ],
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInCreatePersonRequest"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "createTagOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/addOperationCode"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInCreateTagRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "createTagRequestDocument": {
+ "required": [
+ "data"
+ ],
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInCreateTagRequest"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "createTodoItemOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/addOperationCode"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInCreateTodoItemRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "createTodoItemRequestDocument": {
+ "required": [
+ "data"
+ ],
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInCreateTodoItemRequest"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "dataInCreatePersonRequest": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceInCreateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "attributes": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInCreatePersonRequest"
+ }
+ ]
+ },
+ "relationships": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInCreatePersonRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "dataInCreateTagRequest": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceInCreateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "attributes": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInCreateTagRequest"
+ }
+ ]
+ },
+ "relationships": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInCreateTagRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "dataInCreateTodoItemRequest": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceInCreateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "attributes": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInCreateTodoItemRequest"
+ }
+ ]
+ },
+ "relationships": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInCreateTodoItemRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "dataInPersonResponse": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceInResponse"
+ },
+ {
+ "required": [
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "attributes": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInPersonResponse"
+ }
+ ]
+ },
+ "relationships": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInPersonResponse"
+ }
+ ]
+ },
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceLinks"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "dataInTagResponse": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceInResponse"
+ },
+ {
+ "required": [
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "attributes": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInTagResponse"
+ }
+ ]
+ },
+ "relationships": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInTagResponse"
+ }
+ ]
+ },
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceLinks"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "dataInTodoItemResponse": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceInResponse"
+ },
+ {
+ "required": [
+ "id"
+ ],
+ "type": "object",
+ "properties": {
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "attributes": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInTodoItemResponse"
+ }
+ ]
+ },
+ "relationships": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInTodoItemResponse"
+ }
+ ]
+ },
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceLinks"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "dataInUpdatePersonRequest": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceInUpdateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "attributes": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInUpdatePersonRequest"
+ }
+ ]
+ },
+ "relationships": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInUpdatePersonRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "dataInUpdateTagRequest": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceInUpdateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "attributes": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInUpdateTagRequest"
+ }
+ ]
+ },
+ "relationships": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInUpdateTagRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "dataInUpdateTodoItemRequest": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceInUpdateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "attributes": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/attributesInUpdateTodoItemRequest"
+ }
+ ]
+ },
+ "relationships": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInUpdateTodoItemRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "deletePersonOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/removeOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personIdentifierInRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "deleteTagOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/removeOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/tagIdentifierInRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "deleteTodoItemOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/removeOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemIdentifierInRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "errorLinks": {
+ "type": "object",
+ "properties": {
+ "about": {
+ "type": "string",
+ "nullable": true
+ },
+ "type": {
+ "type": "string",
+ "nullable": true
+ }
+ },
+ "additionalProperties": false
+ },
+ "errorObject": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "nullable": true
+ },
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/errorLinks"
+ }
+ ],
+ "nullable": true
+ },
+ "status": {
+ "type": "string"
+ },
+ "code": {
+ "type": "string",
+ "nullable": true
+ },
+ "title": {
+ "type": "string",
+ "nullable": true
+ },
+ "detail": {
+ "type": "string",
+ "nullable": true
+ },
+ "source": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/errorSource"
+ }
+ ],
+ "nullable": true
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "errorResponseDocument": {
+ "required": [
+ "errors",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/errorTopLevelLinks"
+ }
+ ]
+ },
+ "errors": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/errorObject"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "errorSource": {
+ "type": "object",
+ "properties": {
+ "pointer": {
+ "type": "string",
+ "nullable": true
+ },
+ "parameter": {
+ "type": "string",
+ "nullable": true
+ },
+ "header": {
+ "type": "string",
+ "nullable": true
+ }
+ },
+ "additionalProperties": false
+ },
+ "errorTopLevelLinks": {
+ "type": "object",
+ "properties": {
+ "self": {
+ "type": "string"
+ },
+ "describedby": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "identifierInRequest": {
+ "required": [
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceType"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false,
+ "discriminator": {
+ "propertyName": "type",
+ "mapping": {
+ "people": "#/components/schemas/personIdentifierInRequest",
+ "tags": "#/components/schemas/tagIdentifierInRequest",
+ "todoItems": "#/components/schemas/todoItemIdentifierInRequest"
+ }
+ },
+ "x-abstract": true
+ },
+ "meta": {
+ "type": "object",
+ "additionalProperties": {
+ "nullable": true
+ }
+ },
+ "nullablePersonIdentifierResponseDocument": {
+ "required": [
+ "data",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceIdentifierTopLevelLinks"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personIdentifierInResponse"
+ }
+ ],
+ "nullable": true
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "nullableSecondaryPersonResponseDocument": {
+ "required": [
+ "data",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceTopLevelLinks"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInPersonResponse"
+ }
+ ],
+ "nullable": true
+ },
+ "included": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/resourceInResponse"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "nullableToOnePersonInRequest": {
+ "required": [
+ "data"
+ ],
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personIdentifierInRequest"
+ }
+ ],
+ "nullable": true
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "nullableToOnePersonInResponse": {
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipLinks"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personIdentifierInResponse"
+ }
+ ],
+ "nullable": true
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "operationsRequestDocument": {
+ "required": [
+ "atomic:operations"
+ ],
+ "type": "object",
+ "properties": {
+ "atomic:operations": {
+ "minItems": 1,
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/atomicOperation"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "operationsResponseDocument": {
+ "required": [
+ "atomic:results",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceTopLevelLinks"
+ }
+ ]
+ },
+ "atomic:results": {
+ "minItems": 1,
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/atomicResult"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "personAssignedTodoItemsRelationshipIdentifier": {
+ "required": [
+ "relationship",
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personResourceType"
+ }
+ ]
+ },
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "relationship": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personAssignedTodoItemsRelationshipName"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "personAssignedTodoItemsRelationshipName": {
+ "enum": [
+ "assignedTodoItems"
+ ],
+ "type": "string"
+ },
+ "personCollectionResponseDocument": {
+ "required": [
+ "data",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceCollectionTopLevelLinks"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/dataInPersonResponse"
+ }
+ },
+ "included": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/resourceInResponse"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "personIdentifierInRequest": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/identifierInRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "personIdentifierInResponse": {
+ "required": [
+ "id",
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personResourceType"
+ }
+ ]
+ },
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "personIdentifierResponseDocument": {
+ "required": [
+ "data",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceIdentifierTopLevelLinks"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personIdentifierInResponse"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "personOwnedTodoItemsRelationshipIdentifier": {
+ "required": [
+ "relationship",
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personResourceType"
+ }
+ ]
+ },
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "relationship": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personOwnedTodoItemsRelationshipName"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "personOwnedTodoItemsRelationshipName": {
+ "enum": [
+ "ownedTodoItems"
+ ],
+ "type": "string"
+ },
+ "personResourceType": {
+ "enum": [
+ "people"
+ ],
+ "type": "string"
+ },
+ "primaryPersonResponseDocument": {
+ "required": [
+ "data",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceTopLevelLinks"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInPersonResponse"
+ }
+ ]
+ },
+ "included": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/resourceInResponse"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "primaryTagResponseDocument": {
+ "required": [
+ "data",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceTopLevelLinks"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInTagResponse"
+ }
+ ]
+ },
+ "included": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/resourceInResponse"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "primaryTodoItemResponseDocument": {
+ "required": [
+ "data",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceTopLevelLinks"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInTodoItemResponse"
+ }
+ ]
+ },
+ "included": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/resourceInResponse"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "relationshipLinks": {
+ "type": "object",
+ "properties": {
+ "self": {
+ "type": "string"
+ },
+ "related": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "relationshipsInCreatePersonRequest": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInCreateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "ownedTodoItems": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ },
+ "assignedTodoItems": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "relationshipsInCreateRequest": {
+ "required": [
+ "openapi:discriminator"
+ ],
+ "type": "object",
+ "properties": {
+ "openapi:discriminator": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceType"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false,
+ "discriminator": {
+ "propertyName": "openapi:discriminator",
+ "mapping": {
+ "people": "#/components/schemas/relationshipsInCreatePersonRequest",
+ "tags": "#/components/schemas/relationshipsInCreateTagRequest",
+ "todoItems": "#/components/schemas/relationshipsInCreateTodoItemRequest"
+ }
+ },
+ "x-abstract": true
+ },
+ "relationshipsInCreateTagRequest": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInCreateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "todoItems": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "relationshipsInCreateTodoItemRequest": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInCreateRequest"
+ },
+ {
+ "required": [
+ "owner"
+ ],
+ "type": "object",
+ "properties": {
+ "owner": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toOnePersonInRequest"
+ }
+ ]
+ },
+ "assignee": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/nullableToOnePersonInRequest"
+ }
+ ]
+ },
+ "tags": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTagInRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "relationshipsInPersonResponse": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInResponse"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "ownedTodoItems": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInResponse"
+ }
+ ]
+ },
+ "assignedTodoItems": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInResponse"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "relationshipsInResponse": {
+ "required": [
+ "openapi:discriminator"
+ ],
+ "type": "object",
+ "properties": {
+ "openapi:discriminator": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceType"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false,
+ "discriminator": {
+ "propertyName": "openapi:discriminator",
+ "mapping": {
+ "people": "#/components/schemas/relationshipsInPersonResponse",
+ "tags": "#/components/schemas/relationshipsInTagResponse",
+ "todoItems": "#/components/schemas/relationshipsInTodoItemResponse"
+ }
+ },
+ "x-abstract": true
+ },
+ "relationshipsInTagResponse": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInResponse"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "todoItems": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInResponse"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "relationshipsInTodoItemResponse": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInResponse"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "owner": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toOnePersonInResponse"
+ }
+ ]
+ },
+ "assignee": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/nullableToOnePersonInResponse"
+ }
+ ]
+ },
+ "tags": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTagInResponse"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "relationshipsInUpdatePersonRequest": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInUpdateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "ownedTodoItems": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ },
+ "assignedTodoItems": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "relationshipsInUpdateRequest": {
+ "required": [
+ "openapi:discriminator"
+ ],
+ "type": "object",
+ "properties": {
+ "openapi:discriminator": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceType"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false,
+ "discriminator": {
+ "propertyName": "openapi:discriminator",
+ "mapping": {
+ "people": "#/components/schemas/relationshipsInUpdatePersonRequest",
+ "tags": "#/components/schemas/relationshipsInUpdateTagRequest",
+ "todoItems": "#/components/schemas/relationshipsInUpdateTodoItemRequest"
+ }
+ },
+ "x-abstract": true
+ },
+ "relationshipsInUpdateTagRequest": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInUpdateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "todoItems": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTodoItemInRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "relationshipsInUpdateTodoItemRequest": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipsInUpdateRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "owner": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toOnePersonInRequest"
+ }
+ ]
+ },
+ "assignee": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/nullableToOnePersonInRequest"
+ }
+ ]
+ },
+ "tags": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/toManyTagInRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "removeFromPersonAssignedTodoItemsRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/removeOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personAssignedTodoItemsRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/todoItemIdentifierInRequest"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "removeFromPersonOwnedTodoItemsRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/removeOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personOwnedTodoItemsRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/todoItemIdentifierInRequest"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "removeFromTagTodoItemsRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/removeOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/tagTodoItemsRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/todoItemIdentifierInRequest"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "removeFromTodoItemTagsRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/removeOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemTagsRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/tagIdentifierInRequest"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "removeOperationCode": {
+ "enum": [
+ "remove"
+ ],
+ "type": "string"
+ },
+ "resourceCollectionTopLevelLinks": {
+ "type": "object",
+ "properties": {
+ "self": {
+ "type": "string"
+ },
+ "describedby": {
+ "type": "string"
+ },
+ "first": {
+ "type": "string"
+ },
+ "last": {
+ "type": "string"
+ },
+ "prev": {
+ "type": "string"
+ },
+ "next": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "resourceIdentifierCollectionTopLevelLinks": {
+ "type": "object",
+ "properties": {
+ "self": {
+ "type": "string"
+ },
+ "related": {
+ "type": "string"
+ },
+ "describedby": {
+ "type": "string"
+ },
+ "first": {
+ "type": "string"
+ },
+ "last": {
+ "type": "string"
+ },
+ "prev": {
+ "type": "string"
+ },
+ "next": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "resourceIdentifierTopLevelLinks": {
+ "type": "object",
+ "properties": {
+ "self": {
+ "type": "string"
+ },
+ "related": {
+ "type": "string"
+ },
+ "describedby": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "resourceInCreateRequest": {
+ "required": [
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceType"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false,
+ "discriminator": {
+ "propertyName": "type",
+ "mapping": {
+ "people": "#/components/schemas/dataInCreatePersonRequest",
+ "tags": "#/components/schemas/dataInCreateTagRequest",
+ "todoItems": "#/components/schemas/dataInCreateTodoItemRequest"
+ }
+ },
+ "x-abstract": true
+ },
+ "resourceInResponse": {
+ "required": [
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceType"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false,
+ "discriminator": {
+ "propertyName": "type",
+ "mapping": {
+ "people": "#/components/schemas/dataInPersonResponse",
+ "tags": "#/components/schemas/dataInTagResponse",
+ "todoItems": "#/components/schemas/dataInTodoItemResponse"
+ }
+ },
+ "x-abstract": true
+ },
+ "resourceInUpdateRequest": {
+ "required": [
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceType"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false,
+ "discriminator": {
+ "propertyName": "type",
+ "mapping": {
+ "people": "#/components/schemas/dataInUpdatePersonRequest",
+ "tags": "#/components/schemas/dataInUpdateTagRequest",
+ "todoItems": "#/components/schemas/dataInUpdateTodoItemRequest"
+ }
+ },
+ "x-abstract": true
+ },
+ "resourceLinks": {
+ "type": "object",
+ "properties": {
+ "self": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "resourceTopLevelLinks": {
+ "type": "object",
+ "properties": {
+ "self": {
+ "type": "string"
+ },
+ "describedby": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ "resourceType": {
+ "enum": [
+ "people",
+ "tags",
+ "todoItems"
+ ],
+ "type": "string"
+ },
+ "secondaryPersonResponseDocument": {
+ "required": [
+ "data",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceTopLevelLinks"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInPersonResponse"
+ }
+ ]
+ },
+ "included": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/resourceInResponse"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "tagCollectionResponseDocument": {
+ "required": [
+ "data",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceCollectionTopLevelLinks"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/dataInTagResponse"
+ }
+ },
+ "included": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/resourceInResponse"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "tagIdentifierCollectionResponseDocument": {
+ "required": [
+ "data",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceIdentifierCollectionTopLevelLinks"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/tagIdentifierInResponse"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "tagIdentifierInRequest": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/identifierInRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "tagIdentifierInResponse": {
+ "required": [
+ "id",
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/tagResourceType"
+ }
+ ]
+ },
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "tagResourceType": {
+ "enum": [
+ "tags"
+ ],
+ "type": "string"
+ },
+ "tagTodoItemsRelationshipIdentifier": {
+ "required": [
+ "relationship",
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/tagResourceType"
+ }
+ ]
+ },
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "relationship": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/tagTodoItemsRelationshipName"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "tagTodoItemsRelationshipName": {
+ "enum": [
+ "todoItems"
+ ],
+ "type": "string"
+ },
+ "toManyTagInRequest": {
+ "required": [
+ "data"
+ ],
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/tagIdentifierInRequest"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "toManyTagInResponse": {
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipLinks"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/tagIdentifierInResponse"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "toManyTodoItemInRequest": {
+ "required": [
+ "data"
+ ],
+ "type": "object",
+ "properties": {
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/todoItemIdentifierInRequest"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "toManyTodoItemInResponse": {
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipLinks"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/todoItemIdentifierInResponse"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "toOnePersonInRequest": {
+ "required": [
+ "data"
+ ],
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personIdentifierInRequest"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "toOnePersonInResponse": {
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/relationshipLinks"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personIdentifierInResponse"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "todoItemAssigneeRelationshipIdentifier": {
+ "required": [
+ "relationship",
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemResourceType"
+ }
+ ]
+ },
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "relationship": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemAssigneeRelationshipName"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "todoItemAssigneeRelationshipName": {
+ "enum": [
+ "assignee"
+ ],
+ "type": "string"
+ },
+ "todoItemCollectionResponseDocument": {
+ "required": [
+ "data",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceCollectionTopLevelLinks"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/dataInTodoItemResponse"
+ }
+ },
+ "included": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/resourceInResponse"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "todoItemIdentifierCollectionResponseDocument": {
+ "required": [
+ "data",
+ "links"
+ ],
+ "type": "object",
+ "properties": {
+ "links": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/resourceIdentifierCollectionTopLevelLinks"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/todoItemIdentifierInResponse"
+ }
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "todoItemIdentifierInRequest": {
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/identifierInRequest"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "todoItemIdentifierInResponse": {
+ "required": [
+ "id",
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemResourceType"
+ }
+ ]
+ },
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "todoItemOwnerRelationshipIdentifier": {
+ "required": [
+ "relationship",
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemResourceType"
+ }
+ ]
+ },
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "relationship": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemOwnerRelationshipName"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "todoItemOwnerRelationshipName": {
+ "enum": [
+ "owner"
+ ],
+ "type": "string"
+ },
+ "todoItemPriority": {
+ "enum": [
+ "High",
+ "Medium",
+ "Low"
+ ],
+ "type": "string"
+ },
+ "todoItemResourceType": {
+ "enum": [
+ "todoItems"
+ ],
+ "type": "string"
+ },
+ "todoItemTagsRelationshipIdentifier": {
+ "required": [
+ "relationship",
+ "type"
+ ],
+ "type": "object",
+ "properties": {
+ "type": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemResourceType"
+ }
+ ]
+ },
+ "id": {
+ "minLength": 1,
+ "type": "string",
+ "format": "int64"
+ },
+ "lid": {
+ "minLength": 1,
+ "type": "string"
+ },
+ "relationship": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemTagsRelationshipName"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "todoItemTagsRelationshipName": {
+ "enum": [
+ "tags"
+ ],
+ "type": "string"
+ },
+ "updateOperationCode": {
+ "enum": [
+ "update"
+ ],
+ "type": "string"
+ },
+ "updatePersonAssignedTodoItemsRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/updateOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personAssignedTodoItemsRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/todoItemIdentifierInRequest"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "updatePersonOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/updateOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personIdentifierInRequest"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInUpdatePersonRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "updatePersonOwnedTodoItemsRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/updateOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personOwnedTodoItemsRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/todoItemIdentifierInRequest"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "updatePersonRequestDocument": {
+ "required": [
+ "data"
+ ],
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInUpdatePersonRequest"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "updateTagOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/updateOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/tagIdentifierInRequest"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInUpdateTagRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "updateTagRequestDocument": {
+ "required": [
+ "data"
+ ],
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInUpdateTagRequest"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "updateTagTodoItemsRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/updateOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/tagTodoItemsRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/todoItemIdentifierInRequest"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "updateTodoItemAssigneeRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/updateOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemAssigneeRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personIdentifierInRequest"
+ }
+ ],
+ "nullable": true
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "updateTodoItemOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/updateOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemIdentifierInRequest"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInUpdateTodoItemRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "updateTodoItemOwnerRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/updateOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemOwnerRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/personIdentifierInRequest"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ },
+ "updateTodoItemRequestDocument": {
+ "required": [
+ "data"
+ ],
+ "type": "object",
+ "properties": {
+ "data": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/dataInUpdateTodoItemRequest"
+ }
+ ]
+ },
+ "meta": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/meta"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "updateTodoItemTagsRelationshipOperation": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/atomicOperation"
+ },
+ {
+ "required": [
+ "data",
+ "op",
+ "ref"
+ ],
+ "type": "object",
+ "properties": {
+ "op": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/updateOperationCode"
+ }
+ ]
+ },
+ "ref": {
+ "allOf": [
+ {
+ "$ref": "#/components/schemas/todoItemTagsRelationshipIdentifier"
+ }
+ ]
+ },
+ "data": {
+ "type": "array",
+ "items": {
+ "$ref": "#/components/schemas/tagIdentifierInRequest"
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ ],
+ "additionalProperties": false
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Examples/JsonApiDotNetCoreExample/JsonApiDotNetCoreExample.csproj b/src/Examples/JsonApiDotNetCoreExample/JsonApiDotNetCoreExample.csproj
index 3edc993428..768a2de827 100644
--- a/src/Examples/JsonApiDotNetCoreExample/JsonApiDotNetCoreExample.csproj
+++ b/src/Examples/JsonApiDotNetCoreExample/JsonApiDotNetCoreExample.csproj
@@ -1,6 +1,8 @@
net9.0;net8.0
+ true
+ GeneratedSwagger
@@ -9,10 +11,15 @@
+
+
+
+
+
diff --git a/src/Examples/JsonApiDotNetCoreExample/Program.cs b/src/Examples/JsonApiDotNetCoreExample/Program.cs
index 2cfa1e640d..d2677ea781 100644
--- a/src/Examples/JsonApiDotNetCoreExample/Program.cs
+++ b/src/Examples/JsonApiDotNetCoreExample/Program.cs
@@ -3,17 +3,22 @@
using System.Text.Json.Serialization;
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Diagnostics;
+using JsonApiDotNetCore.OpenApi.Swashbuckle;
using JsonApiDotNetCoreExample;
using JsonApiDotNetCoreExample.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.DependencyInjection.Extensions;
+using Scalar.AspNetCore;
[assembly: ExcludeFromCodeCoverage]
WebApplication app = CreateWebApplication(args);
-await CreateDatabaseAsync(app.Services);
+if (!IsGeneratingOpenApiDocumentAtBuildTime())
+{
+ await CreateDatabaseAsync(app.Services);
+}
await app.RunAsync();
@@ -71,6 +76,13 @@ static void ConfigureServices(WebApplicationBuilder builder)
#endif
}, discovery => discovery.AddCurrentAssembly());
}
+
+ using (CodeTimingSessionManager.Current.Measure("AddOpenApiForJsonApi()"))
+ {
+#pragma warning disable JADNC_OA_001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
+ builder.Services.AddOpenApiForJsonApi(options => options.DocumentFilter());
+#pragma warning restore JADNC_OA_001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
+ }
}
[Conditional("DEBUG")]
@@ -92,9 +104,19 @@ static void ConfigurePipeline(WebApplication app)
app.UseJsonApi();
}
+ app.UseSwagger();
+ app.UseSwaggerUI();
+ app.UseReDoc();
+ app.MapScalarApiReference(options => options.OpenApiRoutePattern = "/swagger/{documentName}/swagger.json");
+
app.MapControllers();
}
+static bool IsGeneratingOpenApiDocumentAtBuildTime()
+{
+ return Environment.GetCommandLineArgs().Any(argument => argument.Contains("GetDocument.Insider"));
+}
+
static async Task CreateDatabaseAsync(IServiceProvider serviceProvider)
{
await using AsyncServiceScope scope = serviceProvider.CreateAsyncScope();
diff --git a/src/Examples/JsonApiDotNetCoreExample/Properties/launchSettings.json b/src/Examples/JsonApiDotNetCoreExample/Properties/launchSettings.json
index 54646922e1..82b89e1843 100644
--- a/src/Examples/JsonApiDotNetCoreExample/Properties/launchSettings.json
+++ b/src/Examples/JsonApiDotNetCoreExample/Properties/launchSettings.json
@@ -12,7 +12,7 @@
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
- "launchUrl": "api/todoItems?include=owner,assignee,tags&filter=equals(priority,'High')",
+ "launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
@@ -20,7 +20,7 @@
"Kestrel": {
"commandName": "Project",
"launchBrowser": true,
- "launchUrl": "api/todoItems?include=owner,assignee,tags&filter=equals(priority,'High')",
+ "launchUrl": "swagger",
"applicationUrl": "https://localhost:44340;http://localhost:14140",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
diff --git a/src/Examples/JsonApiDotNetCoreExample/SetOpenApiServerAtBuildTimeFilter.cs b/src/Examples/JsonApiDotNetCoreExample/SetOpenApiServerAtBuildTimeFilter.cs
new file mode 100644
index 0000000000..894c0d0966
--- /dev/null
+++ b/src/Examples/JsonApiDotNetCoreExample/SetOpenApiServerAtBuildTimeFilter.cs
@@ -0,0 +1,25 @@
+using JetBrains.Annotations;
+using Microsoft.OpenApi.Models;
+using Swashbuckle.AspNetCore.SwaggerGen;
+
+namespace JsonApiDotNetCoreExample;
+
+///
+/// This is normally not needed. It ensures the server URL is added to the OpenAPI file during build.
+///
+[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
+internal sealed class SetOpenApiServerAtBuildTimeFilter(IHttpContextAccessor httpContextAccessor) : IDocumentFilter
+{
+ private readonly IHttpContextAccessor _httpContextAccessor = httpContextAccessor;
+
+ public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
+ {
+ if (_httpContextAccessor.HttpContext == null)
+ {
+ swaggerDoc.Servers.Add(new OpenApiServer
+ {
+ Url = "https://localhost:44340"
+ });
+ }
+ }
+}
diff --git a/src/Examples/OpenApiKiotaClientExample/ColoredConsoleLogHttpMessageHandler.cs b/src/Examples/OpenApiKiotaClientExample/ColoredConsoleLogHttpMessageHandler.cs
new file mode 100644
index 0000000000..e13aff5a4d
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/ColoredConsoleLogHttpMessageHandler.cs
@@ -0,0 +1,67 @@
+using JetBrains.Annotations;
+
+namespace OpenApiKiotaClientExample;
+
+///
+/// Writes incoming and outgoing HTTP messages to the console.
+///
+internal sealed class ColoredConsoleLogHttpMessageHandler : DelegatingHandler
+{
+ protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
+ {
+#if DEBUG
+ await LogRequestAsync(request, cancellationToken);
+#endif
+
+ HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
+
+#if DEBUG
+ await LogResponseAsync(response, cancellationToken);
+#endif
+
+ return response;
+ }
+
+ [UsedImplicitly]
+ private static async Task LogRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken)
+ {
+ using var _ = new ConsoleColorScope(ConsoleColor.Green);
+
+ Console.WriteLine($"--> {request}");
+ string? requestBody = request.Content != null ? await request.Content.ReadAsStringAsync(cancellationToken) : null;
+
+ if (!string.IsNullOrEmpty(requestBody))
+ {
+ Console.WriteLine();
+ Console.WriteLine(requestBody);
+ }
+ }
+
+ [UsedImplicitly]
+ private static async Task LogResponseAsync(HttpResponseMessage response, CancellationToken cancellationToken)
+ {
+ using var _ = new ConsoleColorScope(ConsoleColor.Cyan);
+
+ Console.WriteLine($"<-- {response}");
+ string responseBody = await response.Content.ReadAsStringAsync(cancellationToken);
+
+ if (!string.IsNullOrEmpty(responseBody))
+ {
+ Console.WriteLine();
+ Console.WriteLine(responseBody);
+ }
+ }
+
+ private sealed class ConsoleColorScope : IDisposable
+ {
+ public ConsoleColorScope(ConsoleColor foregroundColor)
+ {
+ Console.ForegroundColor = foregroundColor;
+ }
+
+ public void Dispose()
+ {
+ Console.ResetColor();
+ }
+ }
+}
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/ApiRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/ApiRequestBuilder.cs
new file mode 100644
index 0000000000..3d0f7361e7
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/ApiRequestBuilder.cs
@@ -0,0 +1,66 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Api.Operations;
+using OpenApiKiotaClientExample.GeneratedCode.Api.People;
+using OpenApiKiotaClientExample.GeneratedCode.Api.Tags;
+using OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api
+{
+ ///
+ /// Builds and executes requests for operations under \api
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class ApiRequestBuilder : BaseRequestBuilder
+ {
+ /// The operations property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.Operations.OperationsRequestBuilder Operations
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.Operations.OperationsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The people property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.People.PeopleRequestBuilder People
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.People.PeopleRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The tags property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.TagsRequestBuilder Tags
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.TagsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The todoItems property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.TodoItemsRequestBuilder TodoItems
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.TodoItemsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public ApiRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public ApiRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api", rawUrl)
+ {
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Operations/OperationsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Operations/OperationsRequestBuilder.cs
new file mode 100644
index 0000000000..96f21c5a24
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Operations/OperationsRequestBuilder.cs
@@ -0,0 +1,94 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.Operations
+{
+ ///
+ /// Builds and executes requests for operations under \api\operations
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class OperationsRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public OperationsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/operations", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public OperationsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/operations", rawUrl)
+ {
+ }
+
+ ///
+ /// Performs multiple mutations in a linear and atomic manner.
+ ///
+ /// A
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 403 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PostAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.OperationsRequestDocument body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPostRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "403", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.OperationsResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Performs multiple mutations in a linear and atomic manner.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPostRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.OperationsRequestDocument body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.POST, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=atomic;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=atomic;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.Operations.OperationsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.Operations.OperationsRequestBuilder(rawUrl, RequestAdapter);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/AssignedTodoItems/AssignedTodoItemsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/AssignedTodoItems/AssignedTodoItemsRequestBuilder.cs
new file mode 100644
index 0000000000..7bcc782af9
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/AssignedTodoItems/AssignedTodoItemsRequestBuilder.cs
@@ -0,0 +1,128 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.AssignedTodoItems
+{
+ ///
+ /// Builds and executes requests for operations under \api\people\{id}\assignedTodoItems
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AssignedTodoItemsRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public AssignedTodoItemsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people/{id}/assignedTodoItems{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public AssignedTodoItemsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people/{id}/assignedTodoItems{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves the related todoItems of an individual person's assignedTodoItems relationship.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.TodoItemCollectionResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related todoItems of an individual person's assignedTodoItems relationship.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.AssignedTodoItems.AssignedTodoItemsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.AssignedTodoItems.AssignedTodoItemsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related todoItems of an individual person's assignedTodoItems relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AssignedTodoItemsRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AssignedTodoItemsRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/OwnedTodoItems/OwnedTodoItemsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/OwnedTodoItems/OwnedTodoItemsRequestBuilder.cs
new file mode 100644
index 0000000000..2981e5fa65
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/OwnedTodoItems/OwnedTodoItemsRequestBuilder.cs
@@ -0,0 +1,128 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.OwnedTodoItems
+{
+ ///
+ /// Builds and executes requests for operations under \api\people\{id}\ownedTodoItems
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class OwnedTodoItemsRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public OwnedTodoItemsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people/{id}/ownedTodoItems{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public OwnedTodoItemsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people/{id}/ownedTodoItems{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves the related todoItems of an individual person's ownedTodoItems relationship.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.TodoItemCollectionResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related todoItems of an individual person's ownedTodoItems relationship.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.OwnedTodoItems.OwnedTodoItemsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.OwnedTodoItems.OwnedTodoItemsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related todoItems of an individual person's ownedTodoItems relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class OwnedTodoItemsRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class OwnedTodoItemsRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/PeopleItemRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/PeopleItemRequestBuilder.cs
new file mode 100644
index 0000000000..567ed904c8
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/PeopleItemRequestBuilder.cs
@@ -0,0 +1,230 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.AssignedTodoItems;
+using OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.OwnedTodoItems;
+using OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.People.Item
+{
+ ///
+ /// Builds and executes requests for operations under \api\people\{id}
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class PeopleItemRequestBuilder : BaseRequestBuilder
+ {
+ /// The assignedTodoItems property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.AssignedTodoItems.AssignedTodoItemsRequestBuilder AssignedTodoItems
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.AssignedTodoItems.AssignedTodoItemsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The ownedTodoItems property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.OwnedTodoItems.OwnedTodoItemsRequestBuilder OwnedTodoItems
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.OwnedTodoItems.OwnedTodoItemsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The relationships property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.RelationshipsRequestBuilder Relationships
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.RelationshipsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public PeopleItemRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people/{id}{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public PeopleItemRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people/{id}{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Deletes an existing person by its identifier.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 404 status code
+ public async Task DeleteAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToDeleteRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves an individual person by its identifier.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.PrimaryPersonResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Updates an existing person.
+ ///
+ /// A
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PatchAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.UpdatePersonRequestDocument body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPatchRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.PrimaryPersonResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Deletes an existing person by its identifier.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToDeleteRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.DELETE, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Retrieves an individual person by its identifier.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Updates an existing person.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPatchRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.UpdatePersonRequestDocument body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.PATCH, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.PeopleItemRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.PeopleItemRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves an individual person by its identifier.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class PeopleItemRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class PeopleItemRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Updates an existing person.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class PeopleItemRequestBuilderPatchQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/Relationships/AssignedTodoItems/AssignedTodoItemsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/Relationships/AssignedTodoItems/AssignedTodoItemsRequestBuilder.cs
new file mode 100644
index 0000000000..14c018d51f
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/Relationships/AssignedTodoItems/AssignedTodoItemsRequestBuilder.cs
@@ -0,0 +1,248 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.AssignedTodoItems
+{
+ ///
+ /// Builds and executes requests for operations under \api\people\{id}\relationships\assignedTodoItems
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AssignedTodoItemsRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public AssignedTodoItemsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people/{id}/relationships/assignedTodoItems{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public AssignedTodoItemsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people/{id}/relationships/assignedTodoItems{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Removes existing todoItems from the assignedTodoItems relationship of an individual person.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task DeleteAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToDeleteRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related todoItem identities of an individual person's assignedTodoItems relationship.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.TodoItemIdentifierCollectionResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Assigns existing todoItems to the assignedTodoItems relationship of an individual person.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PatchAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPatchRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Adds existing todoItems to the assignedTodoItems relationship of an individual person.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PostAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPostRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Removes existing todoItems from the assignedTodoItems relationship of an individual person.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToDeleteRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.DELETE, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Retrieves the related todoItem identities of an individual person's assignedTodoItems relationship.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Assigns existing todoItems to the assignedTodoItems relationship of an individual person.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPatchRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.PATCH, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Adds existing todoItems to the assignedTodoItems relationship of an individual person.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPostRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.POST, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.AssignedTodoItems.AssignedTodoItemsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.AssignedTodoItems.AssignedTodoItemsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related todoItem identities of an individual person's assignedTodoItems relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AssignedTodoItemsRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AssignedTodoItemsRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/Relationships/OwnedTodoItems/OwnedTodoItemsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/Relationships/OwnedTodoItems/OwnedTodoItemsRequestBuilder.cs
new file mode 100644
index 0000000000..9f27d97c3b
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/Relationships/OwnedTodoItems/OwnedTodoItemsRequestBuilder.cs
@@ -0,0 +1,248 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.OwnedTodoItems
+{
+ ///
+ /// Builds and executes requests for operations under \api\people\{id}\relationships\ownedTodoItems
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class OwnedTodoItemsRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public OwnedTodoItemsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people/{id}/relationships/ownedTodoItems{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public OwnedTodoItemsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people/{id}/relationships/ownedTodoItems{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Removes existing todoItems from the ownedTodoItems relationship of an individual person.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task DeleteAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToDeleteRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related todoItem identities of an individual person's ownedTodoItems relationship.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.TodoItemIdentifierCollectionResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Assigns existing todoItems to the ownedTodoItems relationship of an individual person.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PatchAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPatchRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Adds existing todoItems to the ownedTodoItems relationship of an individual person.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PostAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPostRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Removes existing todoItems from the ownedTodoItems relationship of an individual person.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToDeleteRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.DELETE, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Retrieves the related todoItem identities of an individual person's ownedTodoItems relationship.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Assigns existing todoItems to the ownedTodoItems relationship of an individual person.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPatchRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.PATCH, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Adds existing todoItems to the ownedTodoItems relationship of an individual person.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPostRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.POST, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.OwnedTodoItems.OwnedTodoItemsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.OwnedTodoItems.OwnedTodoItemsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related todoItem identities of an individual person's ownedTodoItems relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class OwnedTodoItemsRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class OwnedTodoItemsRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/Relationships/RelationshipsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/Relationships/RelationshipsRequestBuilder.cs
new file mode 100644
index 0000000000..2c9e9beafe
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/Item/Relationships/RelationshipsRequestBuilder.cs
@@ -0,0 +1,52 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.AssignedTodoItems;
+using OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.OwnedTodoItems;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships
+{
+ ///
+ /// Builds and executes requests for operations under \api\people\{id}\relationships
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class RelationshipsRequestBuilder : BaseRequestBuilder
+ {
+ /// The assignedTodoItems property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.AssignedTodoItems.AssignedTodoItemsRequestBuilder AssignedTodoItems
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.AssignedTodoItems.AssignedTodoItemsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The ownedTodoItems property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.OwnedTodoItems.OwnedTodoItemsRequestBuilder OwnedTodoItems
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.Relationships.OwnedTodoItems.OwnedTodoItemsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public RelationshipsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people/{id}/relationships", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public RelationshipsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people/{id}/relationships", rawUrl)
+ {
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/PeopleRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/PeopleRequestBuilder.cs
new file mode 100644
index 0000000000..3a36d323c4
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/People/PeopleRequestBuilder.cs
@@ -0,0 +1,194 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Api.People.Item;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.People
+{
+ ///
+ /// Builds and executes requests for operations under \api\people
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class PeopleRequestBuilder : BaseRequestBuilder
+ {
+ /// Gets an item from the OpenApiKiotaClientExample.GeneratedCode.api.people.item collection
+ /// The identifier of the person to retrieve.
+ /// A
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.PeopleItemRequestBuilder this[string position]
+ {
+ get
+ {
+ var urlTplParams = new Dictionary(PathParameters);
+ urlTplParams.Add("id", position);
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.People.Item.PeopleItemRequestBuilder(urlTplParams, RequestAdapter);
+ }
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public PeopleRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public PeopleRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/people{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves a collection of people.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.PersonCollectionResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Creates a new person.
+ ///
+ /// A
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 403 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PostAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.CreatePersonRequestDocument body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPostRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "403", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.PrimaryPersonResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves a collection of people.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Creates a new person.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPostRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.CreatePersonRequestDocument body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.POST, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.People.PeopleRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.People.PeopleRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves a collection of people.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class PeopleRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class PeopleRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Creates a new person.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class PeopleRequestBuilderPostQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/Item/Relationships/RelationshipsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/Item/Relationships/RelationshipsRequestBuilder.cs
new file mode 100644
index 0000000000..ecf2f5cc86
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/Item/Relationships/RelationshipsRequestBuilder.cs
@@ -0,0 +1,45 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.Relationships.TodoItems;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.Relationships
+{
+ ///
+ /// Builds and executes requests for operations under \api\tags\{id}\relationships
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class RelationshipsRequestBuilder : BaseRequestBuilder
+ {
+ /// The todoItems property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.Relationships.TodoItems.TodoItemsRequestBuilder TodoItems
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.Relationships.TodoItems.TodoItemsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public RelationshipsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/tags/{id}/relationships", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public RelationshipsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/tags/{id}/relationships", rawUrl)
+ {
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/Item/Relationships/TodoItems/TodoItemsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/Item/Relationships/TodoItems/TodoItemsRequestBuilder.cs
new file mode 100644
index 0000000000..6020933f3d
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/Item/Relationships/TodoItems/TodoItemsRequestBuilder.cs
@@ -0,0 +1,248 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.Relationships.TodoItems
+{
+ ///
+ /// Builds and executes requests for operations under \api\tags\{id}\relationships\todoItems
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public TodoItemsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/tags/{id}/relationships/todoItems{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public TodoItemsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/tags/{id}/relationships/todoItems{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Removes existing todoItems from the todoItems relationship of an individual tag.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task DeleteAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToDeleteRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related todoItem identities of an individual tag's todoItems relationship.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.TodoItemIdentifierCollectionResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Assigns existing todoItems to the todoItems relationship of an individual tag.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PatchAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPatchRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Adds existing todoItems to the todoItems relationship of an individual tag.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PostAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPostRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Removes existing todoItems from the todoItems relationship of an individual tag.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToDeleteRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.DELETE, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Retrieves the related todoItem identities of an individual tag's todoItems relationship.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Assigns existing todoItems to the todoItems relationship of an individual tag.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPatchRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.PATCH, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Adds existing todoItems to the todoItems relationship of an individual tag.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPostRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTodoItemInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.POST, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.Relationships.TodoItems.TodoItemsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.Relationships.TodoItems.TodoItemsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related todoItem identities of an individual tag's todoItems relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/Item/TagsItemRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/Item/TagsItemRequestBuilder.cs
new file mode 100644
index 0000000000..5321238e2b
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/Item/TagsItemRequestBuilder.cs
@@ -0,0 +1,223 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.Relationships;
+using OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.TodoItems;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item
+{
+ ///
+ /// Builds and executes requests for operations under \api\tags\{id}
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsItemRequestBuilder : BaseRequestBuilder
+ {
+ /// The relationships property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.Relationships.RelationshipsRequestBuilder Relationships
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.Relationships.RelationshipsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The todoItems property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.TodoItems.TodoItemsRequestBuilder TodoItems
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.TodoItems.TodoItemsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public TagsItemRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/tags/{id}{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public TagsItemRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/tags/{id}{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Deletes an existing tag by its identifier.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 404 status code
+ public async Task DeleteAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToDeleteRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves an individual tag by its identifier.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.PrimaryTagResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Updates an existing tag.
+ ///
+ /// A
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PatchAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.UpdateTagRequestDocument body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPatchRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.PrimaryTagResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Deletes an existing tag by its identifier.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToDeleteRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.DELETE, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Retrieves an individual tag by its identifier.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Updates an existing tag.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPatchRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.UpdateTagRequestDocument body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.PATCH, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.TagsItemRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.TagsItemRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves an individual tag by its identifier.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsItemRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsItemRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Updates an existing tag.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsItemRequestBuilderPatchQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/Item/TodoItems/TodoItemsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/Item/TodoItems/TodoItemsRequestBuilder.cs
new file mode 100644
index 0000000000..c5c673d844
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/Item/TodoItems/TodoItemsRequestBuilder.cs
@@ -0,0 +1,128 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.TodoItems
+{
+ ///
+ /// Builds and executes requests for operations under \api\tags\{id}\todoItems
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public TodoItemsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/tags/{id}/todoItems{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public TodoItemsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/tags/{id}/todoItems{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves the related todoItems of an individual tag's todoItems relationship.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.TodoItemCollectionResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related todoItems of an individual tag's todoItems relationship.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.TodoItems.TodoItemsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.TodoItems.TodoItemsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related todoItems of an individual tag's todoItems relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/TagsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/TagsRequestBuilder.cs
new file mode 100644
index 0000000000..ccc88d242c
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/Tags/TagsRequestBuilder.cs
@@ -0,0 +1,194 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.Tags
+{
+ ///
+ /// Builds and executes requests for operations under \api\tags
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsRequestBuilder : BaseRequestBuilder
+ {
+ /// Gets an item from the OpenApiKiotaClientExample.GeneratedCode.api.tags.item collection
+ /// The identifier of the tag to retrieve.
+ /// A
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.TagsItemRequestBuilder this[string position]
+ {
+ get
+ {
+ var urlTplParams = new Dictionary(PathParameters);
+ urlTplParams.Add("id", position);
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.Item.TagsItemRequestBuilder(urlTplParams, RequestAdapter);
+ }
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public TagsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/tags{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public TagsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/tags{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves a collection of tags.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.TagCollectionResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Creates a new tag.
+ ///
+ /// A
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 403 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PostAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.CreateTagRequestDocument body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPostRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "403", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.PrimaryTagResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves a collection of tags.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Creates a new tag.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPostRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.CreateTagRequestDocument body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.POST, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.TagsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.Tags.TagsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves a collection of tags.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Creates a new tag.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsRequestBuilderPostQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Assignee/AssigneeRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Assignee/AssigneeRequestBuilder.cs
new file mode 100644
index 0000000000..10601bcef3
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Assignee/AssigneeRequestBuilder.cs
@@ -0,0 +1,128 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Assignee
+{
+ ///
+ /// Builds and executes requests for operations under \api\todoItems\{id}\assignee
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AssigneeRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public AssigneeRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/assignee{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public AssigneeRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/assignee{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves the related person of an individual todoItem's assignee relationship.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.NullableSecondaryPersonResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related person of an individual todoItem's assignee relationship.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Assignee.AssigneeRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Assignee.AssigneeRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related person of an individual todoItem's assignee relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AssigneeRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AssigneeRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Owner/OwnerRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Owner/OwnerRequestBuilder.cs
new file mode 100644
index 0000000000..8fe72c9e38
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Owner/OwnerRequestBuilder.cs
@@ -0,0 +1,128 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Owner
+{
+ ///
+ /// Builds and executes requests for operations under \api\todoItems\{id}\owner
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class OwnerRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public OwnerRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/owner{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public OwnerRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/owner{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves the related person of an individual todoItem's owner relationship.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.SecondaryPersonResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related person of an individual todoItem's owner relationship.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Owner.OwnerRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Owner.OwnerRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related person of an individual todoItem's owner relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class OwnerRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class OwnerRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Relationships/Assignee/AssigneeRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Relationships/Assignee/AssigneeRequestBuilder.cs
new file mode 100644
index 0000000000..5d775fbf73
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Relationships/Assignee/AssigneeRequestBuilder.cs
@@ -0,0 +1,168 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Assignee
+{
+ ///
+ /// Builds and executes requests for operations under \api\todoItems\{id}\relationships\assignee
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AssigneeRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public AssigneeRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/relationships/assignee{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public AssigneeRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/relationships/assignee{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves the related person identity of an individual todoItem's assignee relationship.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.NullablePersonIdentifierResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Clears or assigns an existing person to the assignee relationship of an individual todoItem.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PatchAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.NullableToOnePersonInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPatchRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related person identity of an individual todoItem's assignee relationship.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Clears or assigns an existing person to the assignee relationship of an individual todoItem.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPatchRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.NullableToOnePersonInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.PATCH, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Assignee.AssigneeRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Assignee.AssigneeRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related person identity of an individual todoItem's assignee relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AssigneeRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AssigneeRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Relationships/Owner/OwnerRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Relationships/Owner/OwnerRequestBuilder.cs
new file mode 100644
index 0000000000..abe58c712f
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Relationships/Owner/OwnerRequestBuilder.cs
@@ -0,0 +1,168 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Owner
+{
+ ///
+ /// Builds and executes requests for operations under \api\todoItems\{id}\relationships\owner
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class OwnerRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public OwnerRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/relationships/owner{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public OwnerRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/relationships/owner{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves the related person identity of an individual todoItem's owner relationship.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.PersonIdentifierResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Assigns an existing person to the owner relationship of an individual todoItem.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PatchAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToOnePersonInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPatchRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related person identity of an individual todoItem's owner relationship.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Assigns an existing person to the owner relationship of an individual todoItem.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPatchRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToOnePersonInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.PATCH, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Owner.OwnerRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Owner.OwnerRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related person identity of an individual todoItem's owner relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class OwnerRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class OwnerRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Relationships/RelationshipsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Relationships/RelationshipsRequestBuilder.cs
new file mode 100644
index 0000000000..0737f8ce56
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Relationships/RelationshipsRequestBuilder.cs
@@ -0,0 +1,59 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Assignee;
+using OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Owner;
+using OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Tags;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships
+{
+ ///
+ /// Builds and executes requests for operations under \api\todoItems\{id}\relationships
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class RelationshipsRequestBuilder : BaseRequestBuilder
+ {
+ /// The assignee property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Assignee.AssigneeRequestBuilder Assignee
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Assignee.AssigneeRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The owner property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Owner.OwnerRequestBuilder Owner
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Owner.OwnerRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The tags property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Tags.TagsRequestBuilder Tags
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Tags.TagsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public RelationshipsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/relationships", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public RelationshipsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/relationships", rawUrl)
+ {
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Relationships/Tags/TagsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Relationships/Tags/TagsRequestBuilder.cs
new file mode 100644
index 0000000000..0dc145b7f0
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Relationships/Tags/TagsRequestBuilder.cs
@@ -0,0 +1,248 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Tags
+{
+ ///
+ /// Builds and executes requests for operations under \api\todoItems\{id}\relationships\tags
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public TagsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/relationships/tags{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public TagsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/relationships/tags{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Removes existing tags from the tags relationship of an individual todoItem.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task DeleteAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTagInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToDeleteRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related tag identities of an individual todoItem's tags relationship.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.TagIdentifierCollectionResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Assigns existing tags to the tags relationship of an individual todoItem.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PatchAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTagInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPatchRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Adds existing tags to the tags relationship of an individual todoItem.
+ ///
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PostAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTagInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPostRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Removes existing tags from the tags relationship of an individual todoItem.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToDeleteRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTagInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.DELETE, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Retrieves the related tag identities of an individual todoItem's tags relationship.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Assigns existing tags to the tags relationship of an individual todoItem.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPatchRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTagInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.PATCH, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Adds existing tags to the tags relationship of an individual todoItem.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPostRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.ToManyTagInRequest body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.POST, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Tags.TagsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.Tags.TagsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related tag identities of an individual todoItem's tags relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Tags/TagsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Tags/TagsRequestBuilder.cs
new file mode 100644
index 0000000000..bddab801c4
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/Tags/TagsRequestBuilder.cs
@@ -0,0 +1,128 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Tags
+{
+ ///
+ /// Builds and executes requests for operations under \api\todoItems\{id}\tags
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public TagsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/tags{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public TagsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}/tags{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves the related tags of an individual todoItem's tags relationship.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.TagCollectionResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related tags of an individual todoItem's tags relationship.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Tags.TagsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Tags.TagsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related tags of an individual todoItem's tags relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TagsRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/TodoItemsItemRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/TodoItemsItemRequestBuilder.cs
new file mode 100644
index 0000000000..2383afe1a0
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/Item/TodoItemsItemRequestBuilder.cs
@@ -0,0 +1,237 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Assignee;
+using OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Owner;
+using OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships;
+using OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Tags;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item
+{
+ ///
+ /// Builds and executes requests for operations under \api\todoItems\{id}
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsItemRequestBuilder : BaseRequestBuilder
+ {
+ /// The assignee property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Assignee.AssigneeRequestBuilder Assignee
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Assignee.AssigneeRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The owner property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Owner.OwnerRequestBuilder Owner
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Owner.OwnerRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The relationships property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.RelationshipsRequestBuilder Relationships
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Relationships.RelationshipsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The tags property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Tags.TagsRequestBuilder Tags
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.Tags.TagsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public TodoItemsItemRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public TodoItemsItemRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems/{id}{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Deletes an existing todoItem by its identifier.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 404 status code
+ public async Task DeleteAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToDeleteRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves an individual todoItem by its identifier.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.PrimaryTodoItemResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Updates an existing todoItem.
+ ///
+ /// A
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PatchAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.UpdateTodoItemRequestDocument body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPatchRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.PrimaryTodoItemResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Deletes an existing todoItem by its identifier.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToDeleteRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.DELETE, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Retrieves an individual todoItem by its identifier.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Updates an existing todoItem.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPatchRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.UpdateTodoItemRequestDocument body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.PATCH, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.TodoItemsItemRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.TodoItemsItemRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves an individual todoItem by its identifier.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsItemRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsItemRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Updates an existing todoItem.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsItemRequestBuilderPatchQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/TodoItemsRequestBuilder.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/TodoItemsRequestBuilder.cs
new file mode 100644
index 0000000000..bc3feeaf22
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/Api/TodoItems/TodoItemsRequestBuilder.cs
@@ -0,0 +1,194 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions;
+using OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item;
+using OpenApiKiotaClientExample.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems
+{
+ ///
+ /// Builds and executes requests for operations under \api\todoItems
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsRequestBuilder : BaseRequestBuilder
+ {
+ /// Gets an item from the OpenApiKiotaClientExample.GeneratedCode.api.todoItems.item collection
+ /// The identifier of the todoItem to retrieve.
+ /// A
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.TodoItemsItemRequestBuilder this[string position]
+ {
+ get
+ {
+ var urlTplParams = new Dictionary(PathParameters);
+ urlTplParams.Add("id", position);
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.Item.TodoItemsItemRequestBuilder(urlTplParams, RequestAdapter);
+ }
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public TodoItemsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems{?query*}", pathParameters)
+ {
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The raw URL to use for the request builder.
+ /// The request adapter to use to execute the requests.
+ public TodoItemsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/api/todoItems{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves a collection of todoItems.
+ ///
+ /// A
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ public async Task GetAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToGetRequestInformation(requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.TodoItemCollectionResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public async Task HeadAsync(Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ var requestInfo = ToHeadRequestInformation(requestConfiguration);
+ await RequestAdapter.SendNoContentAsync(requestInfo, default, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Creates a new todoItem.
+ ///
+ /// A
+ /// The request body
+ /// Cancellation token to use when cancelling requests
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ /// When receiving a 400 status code
+ /// When receiving a 403 status code
+ /// When receiving a 404 status code
+ /// When receiving a 409 status code
+ /// When receiving a 422 status code
+ public async Task PostAsync(global::OpenApiKiotaClientExample.GeneratedCode.Models.CreateTodoItemRequestDocument body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPostRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "403", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaClientExample.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaClientExample.GeneratedCode.Models.PrimaryTodoItemResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves a collection of todoItems.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToGetRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.GET, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ return requestInfo;
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ /// A
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToHeadRequestInformation(Action>? requestConfiguration = default)
+ {
+ var requestInfo = new RequestInformation(Method.HEAD, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ return requestInfo;
+ }
+
+ ///
+ /// Creates a new todoItem.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPostRequestInformation(global::OpenApiKiotaClientExample.GeneratedCode.Models.CreateTodoItemRequestDocument body, Action>? requestConfiguration = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = new RequestInformation(Method.POST, UrlTemplate, PathParameters);
+ requestInfo.Configure(requestConfiguration);
+ requestInfo.Headers.TryAdd("Accept", "application/vnd.api+json;ext=openapi");
+ requestInfo.SetContentFromParsable(RequestAdapter, "application/vnd.api+json;ext=openapi", body);
+ return requestInfo;
+ }
+
+ ///
+ /// Returns a request builder with the provided arbitrary URL. Using this method means any other path or query parameters are ignored.
+ ///
+ /// A
+ /// The raw URL to use for the request builder.
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.TodoItemsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaClientExample.GeneratedCode.Api.TodoItems.TodoItemsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves a collection of todoItems.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsRequestBuilderGetQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Compare the returned ETag HTTP header with an earlier one to determine if the response has changed since it was fetched.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsRequestBuilderHeadQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+
+ ///
+ /// Creates a new todoItem.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class TodoItemsRequestBuilderPostQueryParameters
+ {
+ /// For syntax, see the documentation for the [`include`](https://www.jsonapi.net/usage/reading/including-relationships.html)/[`filter`](https://www.jsonapi.net/usage/reading/filtering.html)/[`sort`](https://www.jsonapi.net/usage/reading/sorting.html)/[`page`](https://www.jsonapi.net/usage/reading/pagination.html)/[`fields`](https://www.jsonapi.net/usage/reading/sparse-fieldset-selection.html) query string parameters.
+ [QueryParameter("query")]
+ public string? Query { get; set; }
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/src/Examples/OpenApiKiotaClientExample/GeneratedCode/ExampleApiClient.cs b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/ExampleApiClient.cs
new file mode 100644
index 0000000000..15ea897045
--- /dev/null
+++ b/src/Examples/OpenApiKiotaClientExample/GeneratedCode/ExampleApiClient.cs
@@ -0,0 +1,54 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Store;
+using Microsoft.Kiota.Abstractions;
+using Microsoft.Kiota.Serialization.Form;
+using Microsoft.Kiota.Serialization.Json;
+using Microsoft.Kiota.Serialization.Multipart;
+using Microsoft.Kiota.Serialization.Text;
+using OpenApiKiotaClientExample.GeneratedCode.Api;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System;
+namespace OpenApiKiotaClientExample.GeneratedCode
+{
+ ///
+ /// The main entry point of the SDK, exposes the configuration and the fluent API.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class ExampleApiClient : BaseRequestBuilder
+ {
+ /// The api property
+ public global::OpenApiKiotaClientExample.GeneratedCode.Api.ApiRequestBuilder Api
+ {
+ get => new global::OpenApiKiotaClientExample.GeneratedCode.Api.ApiRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// The backing store to use for the models.
+ /// The request adapter to use to execute the requests.
+ public ExampleApiClient(IRequestAdapter requestAdapter, IBackingStoreFactory backingStore = default) : base(requestAdapter, "{+baseurl}", new Dictionary())
+ {
+ ApiClientBuilder.RegisterDefaultSerializer();
+ ApiClientBuilder.RegisterDefaultSerializer();
+ ApiClientBuilder.RegisterDefaultSerializer();
+ ApiClientBuilder.RegisterDefaultSerializer