diff --git a/src/JsonApiDotNetCore.OpenApi.Swashbuckle/Annotations/HideResourceIdTypeInOpenApiAttribute.cs b/src/JsonApiDotNetCore.OpenApi.Swashbuckle/Annotations/HideResourceIdTypeInOpenApiAttribute.cs
new file mode 100644
index 0000000000..34ad22ffd1
--- /dev/null
+++ b/src/JsonApiDotNetCore.OpenApi.Swashbuckle/Annotations/HideResourceIdTypeInOpenApiAttribute.cs
@@ -0,0 +1,15 @@
+namespace JsonApiDotNetCore.OpenApi.Swashbuckle.Annotations;
+
+///
+/// Hides the underlying resource ID type in OpenAPI documents.
+///
+///
+/// For example, when used on a resource type that implements ]]>, excludes the format property on the ID
+/// schema. As a result, the ID type is displayed as string instead of
+///
+/// string($int64)
+///
+/// in SwaggerUI.
+///
+[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct)]
+public sealed class HideResourceIdTypeInOpenApiAttribute : Attribute;
diff --git a/src/JsonApiDotNetCore.OpenApi.Swashbuckle/SchemaGenerators/Components/ResourceIdSchemaGenerator.cs b/src/JsonApiDotNetCore.OpenApi.Swashbuckle/SchemaGenerators/Components/ResourceIdSchemaGenerator.cs
index 21bc5020ed..f361db8183 100644
--- a/src/JsonApiDotNetCore.OpenApi.Swashbuckle/SchemaGenerators/Components/ResourceIdSchemaGenerator.cs
+++ b/src/JsonApiDotNetCore.OpenApi.Swashbuckle/SchemaGenerators/Components/ResourceIdSchemaGenerator.cs
@@ -1,4 +1,7 @@
+using System.Reflection;
using JsonApiDotNetCore.Configuration;
+using JsonApiDotNetCore.Middleware;
+using JsonApiDotNetCore.OpenApi.Swashbuckle.Annotations;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
@@ -7,32 +10,48 @@ namespace JsonApiDotNetCore.OpenApi.Swashbuckle.SchemaGenerators.Components;
internal sealed class ResourceIdSchemaGenerator
{
private readonly SchemaGenerator _defaultSchemaGenerator;
+ private readonly IControllerResourceMapping _controllerResourceMapping;
- public ResourceIdSchemaGenerator(SchemaGenerator defaultSchemaGenerator)
+ public ResourceIdSchemaGenerator(SchemaGenerator defaultSchemaGenerator, IControllerResourceMapping controllerResourceMapping)
{
ArgumentNullException.ThrowIfNull(defaultSchemaGenerator);
+ ArgumentNullException.ThrowIfNull(controllerResourceMapping);
_defaultSchemaGenerator = defaultSchemaGenerator;
+ _controllerResourceMapping = controllerResourceMapping;
}
- public OpenApiSchema GenerateSchema(ResourceType resourceType, SchemaRepository schemaRepository)
+ public OpenApiSchema GenerateSchema(ParameterInfo parameter, SchemaRepository schemaRepository)
{
- ArgumentNullException.ThrowIfNull(resourceType);
+ ArgumentNullException.ThrowIfNull(parameter);
+ ArgumentNullException.ThrowIfNull(schemaRepository);
+
+ Type? controllerType = parameter.Member.ReflectedType;
+ ConsistencyGuard.ThrowIf(controllerType == null);
+
+ ResourceType? resourceType = _controllerResourceMapping.GetResourceTypeForController(controllerType);
+ ConsistencyGuard.ThrowIf(resourceType == null);
- return GenerateSchema(resourceType.IdentityClrType, schemaRepository);
+ return GenerateSchema(resourceType, schemaRepository);
}
- public OpenApiSchema GenerateSchema(Type resourceIdClrType, SchemaRepository schemaRepository)
+ public OpenApiSchema GenerateSchema(ResourceType resourceType, SchemaRepository schemaRepository)
{
- ArgumentNullException.ThrowIfNull(resourceIdClrType);
+ ArgumentNullException.ThrowIfNull(resourceType);
ArgumentNullException.ThrowIfNull(schemaRepository);
- OpenApiSchema idSchema = _defaultSchemaGenerator.GenerateSchema(resourceIdClrType, schemaRepository);
+ OpenApiSchema idSchema = _defaultSchemaGenerator.GenerateSchema(resourceType.IdentityClrType, schemaRepository);
ConsistencyGuard.ThrowIf(idSchema.Reference != null);
idSchema.Type = "string";
- if (resourceIdClrType != typeof(string))
+ var hideIdTypeAttribute = resourceType.ClrType.GetCustomAttribute();
+
+ if (hideIdTypeAttribute != null)
+ {
+ idSchema.Format = null;
+ }
+ else if (resourceType.IdentityClrType != typeof(string))
{
// When using string IDs, it's discouraged (but possible) to use an empty string as primary key value, because
// some things won't work: get-by-id, update and delete resource are impossible, and rendered links are unusable.
diff --git a/src/JsonApiDotNetCore.OpenApi.Swashbuckle/SchemaGenerators/JsonApiSchemaGenerator.cs b/src/JsonApiDotNetCore.OpenApi.Swashbuckle/SchemaGenerators/JsonApiSchemaGenerator.cs
index c7d50572c3..b8e1d9f053 100644
--- a/src/JsonApiDotNetCore.OpenApi.Swashbuckle/SchemaGenerators/JsonApiSchemaGenerator.cs
+++ b/src/JsonApiDotNetCore.OpenApi.Swashbuckle/SchemaGenerators/JsonApiSchemaGenerator.cs
@@ -34,7 +34,7 @@ public OpenApiSchema GenerateSchema(Type schemaType, SchemaRepository schemaRepo
if (parameterInfo is { Name: "id" } && IsJsonApiParameter(parameterInfo))
{
- return _resourceIdSchemaGenerator.GenerateSchema(schemaType, schemaRepository);
+ return _resourceIdSchemaGenerator.GenerateSchema(parameterInfo, schemaRepository);
}
DocumentSchemaGenerator? schemaGenerator = GetDocumentSchemaGenerator(schemaType);
diff --git a/src/JsonApiDotNetCore/Configuration/ResourceGraphBuilder.cs b/src/JsonApiDotNetCore/Configuration/ResourceGraphBuilder.cs
index 8ab2120d92..95365ed6a9 100644
--- a/src/JsonApiDotNetCore/Configuration/ResourceGraphBuilder.cs
+++ b/src/JsonApiDotNetCore/Configuration/ResourceGraphBuilder.cs
@@ -167,6 +167,32 @@ private static bool IsImplicitManyToManyJoinEntity(IEntityType entityType)
return entityType is { IsPropertyBag: true, HasSharedClrType: true };
}
+ ///
+ /// Removes a JSON:API resource.
+ ///
+ ///
+ /// The resource CLR type.
+ ///
+ public ResourceGraphBuilder Remove()
+ where TResource : class, IIdentifiable
+ {
+ return Remove(typeof(TResource));
+ }
+
+ ///
+ /// Removes a JSON:API resource.
+ ///
+ ///
+ /// The resource CLR type.
+ ///
+ public ResourceGraphBuilder Remove(Type resourceClrType)
+ {
+ ArgumentNullException.ThrowIfNull(resourceClrType);
+
+ _resourceTypesByClrType.Remove(resourceClrType);
+ return this;
+ }
+
///
/// Adds a JSON:API resource.
///
diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/BankAccountsController.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/BankAccountsController.cs
index b34fe3a321..6b8b8e7f45 100644
--- a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/BankAccountsController.cs
+++ b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/BankAccountsController.cs
@@ -5,5 +5,5 @@
namespace JsonApiDotNetCoreTests.IntegrationTests.IdObfuscation;
public sealed class BankAccountsController(
- IJsonApiOptions options, IResourceGraph resourceGraph, ILoggerFactory loggerFactory, IResourceService resourceService)
+ IJsonApiOptions options, IResourceGraph resourceGraph, ILoggerFactory loggerFactory, IResourceService resourceService)
: ObfuscatedIdentifiableController(options, resourceGraph, loggerFactory, resourceService);
diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/DebitCardsController.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/DebitCardsController.cs
index 7fb26d5708..a72e689ab0 100644
--- a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/DebitCardsController.cs
+++ b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/DebitCardsController.cs
@@ -5,5 +5,5 @@
namespace JsonApiDotNetCoreTests.IntegrationTests.IdObfuscation;
public sealed class DebitCardsController(
- IJsonApiOptions options, IResourceGraph resourceGraph, ILoggerFactory loggerFactory, IResourceService resourceService)
+ IJsonApiOptions options, IResourceGraph resourceGraph, ILoggerFactory loggerFactory, IResourceService resourceService)
: ObfuscatedIdentifiableController(options, resourceGraph, loggerFactory, resourceService);
diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/HexadecimalCodec.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/HexadecimalCodec.cs
index a3feb15b9e..0cdc851308 100644
--- a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/HexadecimalCodec.cs
+++ b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/HexadecimalCodec.cs
@@ -8,7 +8,15 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.IdObfuscation;
internal sealed class HexadecimalCodec
{
- public int Decode(string? value)
+ // This implementation is deliberately simple for demonstration purposes.
+ // Consider using something more robust, such as https://github.com/sqids/sqids-dotnet.
+ public static HexadecimalCodec Instance { get; } = new();
+
+ private HexadecimalCodec()
+ {
+ }
+
+ public long Decode(string? value)
{
if (value == null)
{
@@ -25,7 +33,7 @@ public int Decode(string? value)
}
string stringValue = FromHexString(value[1..]);
- return int.Parse(stringValue);
+ return long.Parse(stringValue, CultureInfo.InvariantCulture);
}
private static string FromHexString(string hexString)
@@ -35,7 +43,7 @@ private static string FromHexString(string hexString)
for (int index = 0; index < hexString.Length; index += 2)
{
string hexChar = hexString.Substring(index, 2);
- byte bt = byte.Parse(hexChar, NumberStyles.HexNumber);
+ byte bt = byte.Parse(hexChar, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
bytes.Add(bt);
}
@@ -43,14 +51,14 @@ private static string FromHexString(string hexString)
return new string(chars);
}
- public string? Encode(int value)
+ public string? Encode(long value)
{
if (value == 0)
{
return null;
}
- string stringValue = value.ToString();
+ string stringValue = value.ToString(CultureInfo.InvariantCulture);
return $"x{ToHexString(stringValue)}";
}
@@ -60,7 +68,7 @@ private static string ToHexString(string value)
foreach (byte bt in Encoding.ASCII.GetBytes(value))
{
- builder.Append(bt.ToString("X2"));
+ builder.Append(bt.ToString("X2", CultureInfo.InvariantCulture));
}
return builder.ToString();
diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/IdObfuscationTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/IdObfuscationTests.cs
index e5383f3f7d..31646baefc 100644
--- a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/IdObfuscationTests.cs
+++ b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/IdObfuscationTests.cs
@@ -1,23 +1,57 @@
using System.Net;
using FluentAssertions;
+using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Serialization.Objects;
using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.DependencyInjection;
using TestBuildingBlocks;
using Xunit;
namespace JsonApiDotNetCoreTests.IntegrationTests.IdObfuscation;
-public sealed class IdObfuscationTests : IClassFixture, ObfuscationDbContext>>
+public sealed class IdObfuscationTests : IClassFixture>
{
- private readonly IntegrationTestContext, ObfuscationDbContext> _testContext;
+ private readonly IntegrationTestContext _testContext;
private readonly ObfuscationFakers _fakers = new();
- public IdObfuscationTests(IntegrationTestContext, ObfuscationDbContext> testContext)
+ public IdObfuscationTests(IntegrationTestContext testContext)
{
_testContext = testContext;
testContext.UseController();
testContext.UseController();
+ testContext.UseController();
+
+ var options = (JsonApiOptions)testContext.Factory.Services.GetRequiredService();
+ options.UseRelativeLinks = true;
+ }
+
+ [Fact]
+ public void Encodes_resource_ID()
+ {
+ // Arrange
+ BankAccount account = _fakers.BankAccount.GenerateOne();
+ account.Id = 123;
+
+ // Act
+ string? stringId = HexadecimalCodec.Instance.Encode(account.Id);
+
+ // Assert
+ stringId.Should().Be(account.StringId);
+ }
+
+ [Fact]
+ public void Decodes_resource_ID()
+ {
+ // Arrange
+ BankAccount account = _fakers.BankAccount.GenerateOne();
+ account.Id = 123;
+
+ // Act
+ long id = HexadecimalCodec.Instance.Decode(account.StringId);
+
+ // Assert
+ id.Should().Be(account.Id);
}
[Fact]
@@ -41,8 +75,16 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
// Assert
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
- responseDocument.Data.ManyValue.Should().HaveCount(1);
- responseDocument.Data.ManyValue[0].Id.Should().Be(accounts[1].StringId);
+ responseDocument.Links.Should().NotBeNull();
+ responseDocument.Links.Self.Should().Be(route);
+ responseDocument.Links.First.Should().Be($"/bankAccounts?filter=equals(id,%27{accounts[1].StringId}%27)");
+
+ responseDocument.Data.ManyValue.Should().ContainSingle().Which.With(resource =>
+ {
+ resource.Id.Should().Be(accounts[1].StringId);
+ resource.Links.Should().NotBeNull();
+ resource.Links.Self.Should().Be($"/bankAccounts/{accounts[1].StringId}");
+ });
}
[Fact]
@@ -81,8 +123,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
await dbContext.SaveChangesAsync();
});
- var codec = new HexadecimalCodec();
- string route = $"/bankAccounts?filter=any(id,'{accounts[1].StringId}','{codec.Encode(Unknown.TypedId.Int32)}')";
+ string route = $"/bankAccounts?filter=any(id,'{accounts[1].StringId}','{HexadecimalCodec.Instance.Encode(Unknown.TypedId.Int64)}')";
// Act
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecuteGetAsync(route);
@@ -90,8 +131,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
// Assert
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
- responseDocument.Data.ManyValue.Should().HaveCount(1);
- responseDocument.Data.ManyValue[0].Id.Should().Be(accounts[1].StringId);
+ responseDocument.Data.ManyValue.Should().ContainSingle().Which.Id.Should().Be(accounts[1].StringId);
}
[Fact]
@@ -135,8 +175,12 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
// Assert
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
+ responseDocument.Links.Should().NotBeNull();
+ responseDocument.Links.Self.Should().Be(route);
+
responseDocument.Data.SingleValue.Should().NotBeNull();
responseDocument.Data.SingleValue.Id.Should().Be(card.StringId);
+ responseDocument.Data.SingleValue.Links.RefShould().NotBeNull().And.Subject.Self.Should().Be(route);
}
[Fact]
@@ -160,9 +204,25 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
// Assert
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
+ responseDocument.Links.Should().NotBeNull();
+ responseDocument.Links.Self.Should().Be(route);
+ responseDocument.Links.First.Should().Be(route);
+
responseDocument.Data.ManyValue.Should().HaveCount(2);
- responseDocument.Data.ManyValue[0].Id.Should().Be(account.Cards[0].StringId);
- responseDocument.Data.ManyValue[1].Id.Should().Be(account.Cards[1].StringId);
+
+ responseDocument.Data.ManyValue[0].With(resource =>
+ {
+ resource.Id.Should().Be(account.Cards[0].StringId);
+ resource.Links.Should().NotBeNull();
+ resource.Links.Self.Should().Be($"/debitCards/{account.Cards[0].StringId}");
+ });
+
+ responseDocument.Data.ManyValue[1].With(resource =>
+ {
+ resource.Id.Should().Be(account.Cards[1].StringId);
+ resource.Links.Should().NotBeNull();
+ resource.Links.Self.Should().Be($"/debitCards/{account.Cards[1].StringId}");
+ });
}
[Fact]
@@ -186,13 +246,31 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
// Assert
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
+ responseDocument.Links.Should().NotBeNull();
+ responseDocument.Links.Self.Should().Be(route);
+
responseDocument.Data.SingleValue.Should().NotBeNull();
responseDocument.Data.SingleValue.Id.Should().Be(account.StringId);
- responseDocument.Included.Should().HaveCount(1);
- responseDocument.Included[0].Id.Should().Be(account.Cards[0].StringId);
- responseDocument.Included[0].Attributes.Should().HaveCount(1);
- responseDocument.Included[0].Relationships.Should().BeNull();
+ responseDocument.Data.SingleValue.Relationships.Should().ContainKey("cards").WhoseValue.With(value =>
+ {
+ value.Should().NotBeNull();
+ value.Data.ManyValue.Should().ContainSingle().Which.Id.Should().Be(account.Cards[0].StringId);
+
+ value.Links.Should().NotBeNull();
+ value.Links.Self.Should().Be($"/bankAccounts/{account.StringId}/relationships/cards");
+ value.Links.Related.Should().Be($"/bankAccounts/{account.StringId}/cards");
+ });
+
+ responseDocument.Included.Should().ContainSingle().Which.With(resource =>
+ {
+ resource.Id.Should().Be(account.Cards[0].StringId);
+ resource.Attributes.Should().HaveCount(1);
+ resource.Relationships.Should().BeNull();
+
+ resource.Links.Should().NotBeNull();
+ resource.Links.Self.Should().Be($"/debitCards/{account.Cards[0].StringId}");
+ });
}
[Fact]
@@ -216,8 +294,11 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
// Assert
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
- responseDocument.Data.ManyValue.Should().HaveCount(1);
- responseDocument.Data.ManyValue[0].Id.Should().Be(account.Cards[0].StringId);
+ responseDocument.Links.Should().NotBeNull();
+ responseDocument.Links.Self.Should().Be(route);
+ responseDocument.Links.First.Should().Be(route);
+
+ responseDocument.Data.ManyValue.Should().ContainSingle().Which.Id.Should().Be(account.Cards[0].StringId);
}
[Fact]
@@ -266,11 +347,22 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
httpResponse.ShouldHaveStatusCode(HttpStatusCode.Created);
responseDocument.Data.SingleValue.Should().NotBeNull();
+
+ string newCardStringId = responseDocument.Data.SingleValue.Id.RefShould().NotBeNull().And.Subject;
+
+ responseDocument.Data.SingleValue.Links.RefShould().NotBeNull().And.Subject.Self.Should().Be($"/debitCards/{newCardStringId}");
responseDocument.Data.SingleValue.Attributes.Should().ContainKey("ownerName").WhoseValue.Should().Be(newCard.OwnerName);
responseDocument.Data.SingleValue.Attributes.Should().ContainKey("pinCode").WhoseValue.Should().Be(newCard.PinCode);
- var codec = new HexadecimalCodec();
- int newCardId = codec.Decode(responseDocument.Data.SingleValue.Id);
+ responseDocument.Data.SingleValue.Relationships.Should().ContainKey("account").WhoseValue.With(value =>
+ {
+ value.Should().NotBeNull();
+ value.Links.Should().NotBeNull();
+ value.Links.Self.Should().Be($"/debitCards/{newCardStringId}/relationships/account");
+ value.Links.Related.Should().Be($"/debitCards/{newCardStringId}/account");
+ });
+
+ long newCardId = HexadecimalCodec.Instance.Decode(responseDocument.Data.SingleValue.Id);
await _testContext.RunOnDatabaseAsync(async dbContext =>
{
@@ -476,8 +568,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
public async Task Cannot_delete_unknown_resource()
{
// Arrange
- var codec = new HexadecimalCodec();
- string? stringId = codec.Encode(Unknown.TypedId.Int32);
+ string stringId = HexadecimalCodec.Instance.Encode(Unknown.TypedId.Int64)!;
string route = $"/bankAccounts/{stringId}";
@@ -494,4 +585,111 @@ public async Task Cannot_delete_unknown_resource()
error.Title.Should().Be("The requested resource does not exist.");
error.Detail.Should().Be($"Resource of type 'bankAccounts' with ID '{stringId}' does not exist.");
}
+
+ [Fact]
+ public async Task Can_use_operations()
+ {
+ // Arrange
+ BankAccount newAccount = _fakers.BankAccount.GenerateOne();
+ DebitCard newCard = _fakers.DebitCard.GenerateOne();
+
+ const string accountLocalId = "new-bank-account";
+
+ var requestBody = new
+ {
+ atomic__operations = new object[]
+ {
+ new
+ {
+ op = "add",
+ data = new
+ {
+ type = "bankAccounts",
+ lid = accountLocalId,
+ attributes = new
+ {
+ iban = newAccount.Iban
+ }
+ }
+ },
+ new
+ {
+ op = "add",
+ data = new
+ {
+ type = "debitCards",
+ attributes = new
+ {
+ ownerName = newCard.OwnerName,
+ pinCode = newCard.PinCode
+ },
+ relationships = new
+ {
+ account = new
+ {
+ data = new
+ {
+ type = "bankAccounts",
+ lid = accountLocalId
+ }
+ }
+ }
+ }
+ }
+ }
+ };
+
+ const string route = "/operations";
+
+ // Act
+ (HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecutePostAtomicAsync(route, requestBody);
+
+ // Assert
+ httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
+
+ responseDocument.Results.Should().HaveCount(2);
+
+ ResourceObject resultData1 = responseDocument.Results[0].Data.SingleValue.RefShould().NotBeNull().And.Subject;
+ ResourceObject resultData2 = responseDocument.Results[1].Data.SingleValue.RefShould().NotBeNull().And.Subject;
+
+ string newAccountStringId = resultData1.Id.RefShould().NotBeNull().And.Subject;
+ string newCardStringId = resultData2.Id.RefShould().NotBeNull().And.Subject;
+
+ resultData1.Type.Should().Be("bankAccounts");
+ resultData1.Links.RefShould().NotBeNull().And.Subject.Self.Should().Be($"/bankAccounts/{newAccountStringId}");
+
+ resultData1.Relationships.Should().ContainKey("cards").WhoseValue.With(value =>
+ {
+ value.Should().NotBeNull();
+ value.Links.Should().NotBeNull();
+ value.Links.Self.Should().Be($"/bankAccounts/{newAccountStringId}/relationships/cards");
+ value.Links.Related.Should().Be($"/bankAccounts/{newAccountStringId}/cards");
+ });
+
+ resultData2.Type.Should().Be("debitCards");
+ resultData2.Links.RefShould().NotBeNull().And.Subject.Self.Should().Be($"/debitCards/{newCardStringId}");
+
+ resultData2.Relationships.Should().ContainKey("account").WhoseValue.With(value =>
+ {
+ value.Should().NotBeNull();
+ value.Links.Should().NotBeNull();
+ value.Links.Self.Should().Be($"/debitCards/{newCardStringId}/relationships/account");
+ value.Links.Related.Should().Be($"/debitCards/{newCardStringId}/account");
+ });
+
+ long newAccountId = HexadecimalCodec.Instance.Decode(newAccountStringId);
+ long newCardId = HexadecimalCodec.Instance.Decode(newCardStringId);
+
+ await _testContext.RunOnDatabaseAsync(async dbContext =>
+ {
+ DebitCard cardInDatabase = await dbContext.DebitCards.Include(card => card.Account).FirstWithIdAsync(newCardId);
+
+ cardInDatabase.OwnerName.Should().Be(newCard.OwnerName);
+ cardInDatabase.PinCode.Should().Be(newCard.PinCode);
+
+ cardInDatabase.Account.Should().NotBeNull();
+ cardInDatabase.Account.Id.Should().Be(newAccountId);
+ cardInDatabase.Account.Iban.Should().Be(newAccount.Iban);
+ });
+ }
}
diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscatedIdentifiable.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscatedIdentifiable.cs
index af6a8a1416..e968b33ef5 100644
--- a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscatedIdentifiable.cs
+++ b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscatedIdentifiable.cs
@@ -2,17 +2,16 @@
namespace JsonApiDotNetCoreTests.IntegrationTests.IdObfuscation;
-public abstract class ObfuscatedIdentifiable : Identifiable
+// Tip: Add [HideResourceIdTypeInOpenApi] if you're using OpenAPI with JsonApiDotNetCore.OpenApi.Swashbuckle.
+public abstract class ObfuscatedIdentifiable : Identifiable
{
- private static readonly HexadecimalCodec Codec = new();
-
- protected override string? GetStringId(int value)
+ protected override string? GetStringId(long value)
{
- return value == 0 ? null : Codec.Encode(value);
+ return value == 0 ? null : HexadecimalCodec.Instance.Encode(value);
}
- protected override int GetTypedId(string? value)
+ protected override long GetTypedId(string? value)
{
- return value == null ? 0 : Codec.Decode(value);
+ return value == null ? 0 : HexadecimalCodec.Instance.Decode(value);
}
}
diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscatedIdentifiableController.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscatedIdentifiableController.cs
index ffe73f7b9a..c9c096c3ea 100644
--- a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscatedIdentifiableController.cs
+++ b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscatedIdentifiableController.cs
@@ -11,12 +11,10 @@
namespace JsonApiDotNetCoreTests.IntegrationTests.IdObfuscation;
public abstract class ObfuscatedIdentifiableController(
- IJsonApiOptions options, IResourceGraph resourceGraph, ILoggerFactory loggerFactory, IResourceService resourceService)
- : BaseJsonApiController(options, resourceGraph, loggerFactory, resourceService)
- where TResource : class, IIdentifiable
+ IJsonApiOptions options, IResourceGraph resourceGraph, ILoggerFactory loggerFactory, IResourceService resourceService)
+ : BaseJsonApiController(options, resourceGraph, loggerFactory, resourceService)
+ where TResource : class, IIdentifiable
{
- private readonly HexadecimalCodec _codec = new();
-
[HttpGet]
[HttpHead]
public override Task GetAsync(CancellationToken cancellationToken)
@@ -28,7 +26,7 @@ public override Task GetAsync(CancellationToken cancellationToken
[HttpHead("{id}")]
public Task GetAsync([Required] string id, CancellationToken cancellationToken)
{
- int idValue = _codec.Decode(id);
+ long idValue = HexadecimalCodec.Instance.Decode(id);
return base.GetAsync(idValue, cancellationToken);
}
@@ -37,7 +35,7 @@ public Task GetAsync([Required] string id, CancellationToken canc
public Task GetSecondaryAsync([Required] string id, [Required] [PreserveEmptyString] string relationshipName,
CancellationToken cancellationToken)
{
- int idValue = _codec.Decode(id);
+ long idValue = HexadecimalCodec.Instance.Decode(id);
return base.GetSecondaryAsync(idValue, relationshipName, cancellationToken);
}
@@ -46,7 +44,7 @@ public Task GetSecondaryAsync([Required] string id, [Required] [P
public Task GetRelationshipAsync([Required] string id, [Required] [PreserveEmptyString] string relationshipName,
CancellationToken cancellationToken)
{
- int idValue = _codec.Decode(id);
+ long idValue = HexadecimalCodec.Instance.Decode(id);
return base.GetRelationshipAsync(idValue, relationshipName, cancellationToken);
}
@@ -60,14 +58,14 @@ public override Task PostAsync([FromBody] [Required] TResource re
public Task PostRelationshipAsync([Required] string id, [Required] [PreserveEmptyString] string relationshipName,
[FromBody] [Required] ISet rightResourceIds, CancellationToken cancellationToken)
{
- int idValue = _codec.Decode(id);
+ long idValue = HexadecimalCodec.Instance.Decode(id);
return base.PostRelationshipAsync(idValue, relationshipName, rightResourceIds, cancellationToken);
}
[HttpPatch("{id}")]
public Task PatchAsync([Required] string id, [FromBody] [Required] TResource resource, CancellationToken cancellationToken)
{
- int idValue = _codec.Decode(id);
+ long idValue = HexadecimalCodec.Instance.Decode(id);
return base.PatchAsync(idValue, resource, cancellationToken);
}
@@ -76,14 +74,14 @@ public Task PatchAsync([Required] string id, [FromBody] [Required
public Task PatchRelationshipAsync([Required] string id, [Required] [PreserveEmptyString] string relationshipName,
[FromBody] [Required] object? rightValue, CancellationToken cancellationToken)
{
- int idValue = _codec.Decode(id);
+ long idValue = HexadecimalCodec.Instance.Decode(id);
return base.PatchRelationshipAsync(idValue, relationshipName, rightValue, cancellationToken);
}
[HttpDelete("{id}")]
public Task DeleteAsync([Required] string id, CancellationToken cancellationToken)
{
- int idValue = _codec.Decode(id);
+ long idValue = HexadecimalCodec.Instance.Decode(id);
return base.DeleteAsync(idValue, cancellationToken);
}
@@ -91,7 +89,7 @@ public Task DeleteAsync([Required] string id, CancellationToken c
public Task DeleteRelationshipAsync([Required] string id, [Required] [PreserveEmptyString] string relationshipName,
[FromBody] [Required] ISet rightResourceIds, CancellationToken cancellationToken)
{
- int idValue = _codec.Decode(id);
+ long idValue = HexadecimalCodec.Instance.Decode(id);
return base.DeleteRelationshipAsync(idValue, relationshipName, rightResourceIds, cancellationToken);
}
}
diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscationOperationFilter.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscationOperationFilter.cs
new file mode 100644
index 0000000000..a38b5e8f57
--- /dev/null
+++ b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscationOperationFilter.cs
@@ -0,0 +1,13 @@
+using JsonApiDotNetCore.AtomicOperations;
+using JsonApiDotNetCore.Configuration;
+using JsonApiDotNetCore.Controllers;
+
+namespace JsonApiDotNetCoreTests.IntegrationTests.IdObfuscation;
+
+internal sealed class ObfuscationOperationFilter : DefaultOperationFilter
+{
+ protected override JsonApiEndpoints? GetJsonApiEndpoints(ResourceType resourceType)
+ {
+ return resourceType.ClrType.Name == nameof(ObfuscatedIdentifiable) ? JsonApiEndpoints.None : JsonApiEndpoints.All;
+ }
+}
diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscationStartup.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscationStartup.cs
new file mode 100644
index 0000000000..a9d8de87d7
--- /dev/null
+++ b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscationStartup.cs
@@ -0,0 +1,20 @@
+using JsonApiDotNetCore.AtomicOperations;
+using JsonApiDotNetCore.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using TestBuildingBlocks;
+
+namespace JsonApiDotNetCoreTests.IntegrationTests.IdObfuscation;
+
+public sealed class ObfuscationStartup : TestableStartup
+{
+ public override void ConfigureServices(IServiceCollection services)
+ {
+ services.AddSingleton();
+ base.ConfigureServices(services);
+ }
+
+ protected override void AddJsonApi(IServiceCollection services)
+ {
+ services.AddJsonApi(ConfigureJsonApiOptions, resources: builder => builder.Remove());
+ }
+}
diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/OperationsController.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/OperationsController.cs
new file mode 100644
index 0000000000..d501eea7bd
--- /dev/null
+++ b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/OperationsController.cs
@@ -0,0 +1,13 @@
+using JsonApiDotNetCore.AtomicOperations;
+using JsonApiDotNetCore.Configuration;
+using JsonApiDotNetCore.Controllers;
+using JsonApiDotNetCore.Middleware;
+using JsonApiDotNetCore.Resources;
+using Microsoft.Extensions.Logging;
+
+namespace JsonApiDotNetCoreTests.IntegrationTests.IdObfuscation;
+
+public sealed class OperationsController(
+ IJsonApiOptions options, IResourceGraph resourceGraph, ILoggerFactory loggerFactory, IOperationsProcessor processor, IJsonApiRequest request,
+ ITargetedFields targetedFields, IAtomicOperationFilter operationFilter)
+ : JsonApiOperationsController(options, resourceGraph, loggerFactory, processor, request, targetedFields, operationFilter);
diff --git a/test/JsonApiDotNetCoreTests/UnitTests/ResourceGraph/ResourceGraphBuilderTests.cs b/test/JsonApiDotNetCoreTests/UnitTests/ResourceGraph/ResourceGraphBuilderTests.cs
index 8288595662..6ed5b6c67a 100644
--- a/test/JsonApiDotNetCoreTests/UnitTests/ResourceGraph/ResourceGraphBuilderTests.cs
+++ b/test/JsonApiDotNetCoreTests/UnitTests/ResourceGraph/ResourceGraphBuilderTests.cs
@@ -163,6 +163,55 @@ public void Cannot_add_resource_that_implements_only_non_generic_IIdentifiable()
.WithMessage($"Resource type '{typeof(ResourceWithoutId)}' implements 'IIdentifiable', but not 'IIdentifiable'.");
}
+ [Fact]
+ public void Can_remove_existing_resource_type()
+ {
+ // Arrange
+ var options = new JsonApiOptions();
+ var builder = new ResourceGraphBuilder(options, NullLoggerFactory.Instance);
+ builder.Add();
+ builder.Add();
+
+ // Act
+ builder.Remove();
+
+ // Assert
+ IResourceGraph resourceGraph = builder.Build();
+ resourceGraph.GetResourceTypes().Should().ContainSingle().Which.ClrType.Should().Be();
+ }
+
+ [Fact]
+ public void Can_remove_missing_resource_type()
+ {
+ // Arrange
+ var options = new JsonApiOptions();
+ var builder = new ResourceGraphBuilder(options, NullLoggerFactory.Instance);
+ builder.Add();
+
+ // Act
+ builder.Remove();
+
+ // Assert
+ IResourceGraph resourceGraph = builder.Build();
+ resourceGraph.GetResourceTypes().Should().ContainSingle().Which.ClrType.Should().Be();
+ }
+
+ [Fact]
+ public void Can_remove_non_resource_type()
+ {
+ // Arrange
+ var options = new JsonApiOptions();
+ var builder = new ResourceGraphBuilder(options, NullLoggerFactory.Instance);
+ builder.Add();
+
+ // Act
+ builder.Remove(typeof(NonResource));
+
+ // Assert
+ IResourceGraph resourceGraph = builder.Build();
+ resourceGraph.GetResourceTypes().Should().ContainSingle().Which.ClrType.Should().Be();
+ }
+
[Fact]
public void Cannot_build_graph_with_missing_related_HasOne_resource()
{
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/BankAccountsRequestBuilder.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/BankAccountsRequestBuilder.cs
new file mode 100644
index 0000000000..37930d4ebd
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/BankAccountsRequestBuilder.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 OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item;
+using OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts
+{
+ ///
+ /// Builds and executes requests for operations under \bankAccounts
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class BankAccountsRequestBuilder : BaseRequestBuilder
+ {
+ /// Gets an item from the OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.bankAccounts.item collection
+ /// The identifier of the bankAccount to retrieve.
+ /// A
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.BankAccountsItemRequestBuilder this[string position]
+ {
+ get
+ {
+ var urlTplParams = new Dictionary(PathParameters);
+ urlTplParams.Add("id", position);
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.BankAccountsItemRequestBuilder(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 BankAccountsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/bankAccounts{?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 BankAccountsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/bankAccounts{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves a collection of bankAccounts.
+ ///
+ /// 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.BankAccountCollectionResponseDocument.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 bankAccount.
+ ///
+ /// 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.CreateBankAccountRequestDocument body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPostRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "403", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.PrimaryBankAccountResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves a collection of bankAccounts.
+ ///
+ /// 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 bankAccount.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPostRequestInformation(global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.CreateBankAccountRequestDocument 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.BankAccountsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.BankAccountsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves a collection of bankAccounts.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class BankAccountsRequestBuilderGetQueryParameters
+ {
+ /// 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 BankAccountsRequestBuilderHeadQueryParameters
+ {
+ /// 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 bankAccount.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class BankAccountsRequestBuilderPostQueryParameters
+ {
+ /// 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/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/Item/BankAccountsItemRequestBuilder.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/Item/BankAccountsItemRequestBuilder.cs
new file mode 100644
index 0000000000..06f1e7d574
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/Item/BankAccountsItemRequestBuilder.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 OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Cards;
+using OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Relationships;
+using OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item
+{
+ ///
+ /// Builds and executes requests for operations under \bankAccounts\{id}
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class BankAccountsItemRequestBuilder : BaseRequestBuilder
+ {
+ /// The cards property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Cards.CardsRequestBuilder Cards
+ {
+ get => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Cards.CardsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The relationships property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Relationships.RelationshipsRequestBuilder Relationships
+ {
+ get => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.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 BankAccountsItemRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/bankAccounts/{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 BankAccountsItemRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/bankAccounts/{id}{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Deletes an existing bankAccount 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves an individual bankAccount 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.PrimaryBankAccountResponseDocument.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 bankAccount.
+ ///
+ /// 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.UpdateBankAccountRequestDocument body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPatchRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.PrimaryBankAccountResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Deletes an existing bankAccount 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 bankAccount 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 bankAccount.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPatchRequestInformation(global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.UpdateBankAccountRequestDocument 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.BankAccountsItemRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.BankAccountsItemRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves an individual bankAccount by its identifier.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class BankAccountsItemRequestBuilderGetQueryParameters
+ {
+ /// 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 BankAccountsItemRequestBuilderHeadQueryParameters
+ {
+ /// 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 bankAccount.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class BankAccountsItemRequestBuilderPatchQueryParameters
+ {
+ /// 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/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/Item/Cards/CardsRequestBuilder.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/Item/Cards/CardsRequestBuilder.cs
new file mode 100644
index 0000000000..f4b5881108
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/Item/Cards/CardsRequestBuilder.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 OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Cards
+{
+ ///
+ /// Builds and executes requests for operations under \bankAccounts\{id}\cards
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class CardsRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public CardsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/bankAccounts/{id}/cards{?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 CardsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/bankAccounts/{id}/cards{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves the related debitCards of an individual bankAccount's cards 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.DebitCardCollectionResponseDocument.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 debitCards of an individual bankAccount's cards 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Cards.CardsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Cards.CardsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related debitCards of an individual bankAccount's cards relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class CardsRequestBuilderGetQueryParameters
+ {
+ /// 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 CardsRequestBuilderHeadQueryParameters
+ {
+ /// 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/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/Item/Relationships/Cards/CardsRequestBuilder.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/Item/Relationships/Cards/CardsRequestBuilder.cs
new file mode 100644
index 0000000000..e1f7102a09
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/Item/Relationships/Cards/CardsRequestBuilder.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 OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Relationships.Cards
+{
+ ///
+ /// Builds and executes requests for operations under \bankAccounts\{id}\relationships\cards
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class CardsRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public CardsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/bankAccounts/{id}/relationships/cards{?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 CardsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/bankAccounts/{id}/relationships/cards{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Removes existing debitCards from the cards relationship of an individual bankAccount.
+ ///
+ /// 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ToManyDebitCardInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToDeleteRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related debitCard identities of an individual bankAccount's cards 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.DebitCardIdentifierCollectionResponseDocument.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 debitCards to the cards relationship of an individual bankAccount.
+ ///
+ /// 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ToManyDebitCardInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPatchRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Adds existing debitCards to the cards relationship of an individual bankAccount.
+ ///
+ /// 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ToManyDebitCardInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPostRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Removes existing debitCards from the cards relationship of an individual bankAccount.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToDeleteRequestInformation(global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ToManyDebitCardInRequest 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 debitCard identities of an individual bankAccount's cards 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 debitCards to the cards relationship of an individual bankAccount.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPatchRequestInformation(global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ToManyDebitCardInRequest 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 debitCards to the cards relationship of an individual bankAccount.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPostRequestInformation(global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ToManyDebitCardInRequest 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Relationships.Cards.CardsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Relationships.Cards.CardsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related debitCard identities of an individual bankAccount's cards relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class CardsRequestBuilderGetQueryParameters
+ {
+ /// 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 CardsRequestBuilderHeadQueryParameters
+ {
+ /// 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/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/Item/Relationships/RelationshipsRequestBuilder.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/Item/Relationships/RelationshipsRequestBuilder.cs
new file mode 100644
index 0000000000..1b252b97df
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/BankAccounts/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 OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Relationships.Cards;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Relationships
+{
+ ///
+ /// Builds and executes requests for operations under \bankAccounts\{id}\relationships
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class RelationshipsRequestBuilder : BaseRequestBuilder
+ {
+ /// The cards property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Relationships.Cards.CardsRequestBuilder Cards
+ {
+ get => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.Item.Relationships.Cards.CardsRequestBuilder(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}/bankAccounts/{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}/bankAccounts/{id}/relationships", rawUrl)
+ {
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/DebitCardsRequestBuilder.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/DebitCardsRequestBuilder.cs
new file mode 100644
index 0000000000..20bcb7d70d
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/DebitCardsRequestBuilder.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 OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item;
+using OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards
+{
+ ///
+ /// Builds and executes requests for operations under \debitCards
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class DebitCardsRequestBuilder : BaseRequestBuilder
+ {
+ /// Gets an item from the OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.debitCards.item collection
+ /// The identifier of the debitCard to retrieve.
+ /// A
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.DebitCardsItemRequestBuilder this[string position]
+ {
+ get
+ {
+ var urlTplParams = new Dictionary(PathParameters);
+ urlTplParams.Add("id", position);
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.DebitCardsItemRequestBuilder(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 DebitCardsRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/debitCards{?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 DebitCardsRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/debitCards{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves a collection of debitCards.
+ ///
+ /// 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.DebitCardCollectionResponseDocument.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 debitCard.
+ ///
+ /// 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.CreateDebitCardRequestDocument body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPostRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "403", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.PrimaryDebitCardResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves a collection of debitCards.
+ ///
+ /// 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 debitCard.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPostRequestInformation(global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.CreateDebitCardRequestDocument 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.DebitCardsRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.DebitCardsRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves a collection of debitCards.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class DebitCardsRequestBuilderGetQueryParameters
+ {
+ /// 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 DebitCardsRequestBuilderHeadQueryParameters
+ {
+ /// 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 debitCard.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class DebitCardsRequestBuilderPostQueryParameters
+ {
+ /// 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/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/Item/Account/AccountRequestBuilder.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/Item/Account/AccountRequestBuilder.cs
new file mode 100644
index 0000000000..b8b8f90b12
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/Item/Account/AccountRequestBuilder.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 OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Account
+{
+ ///
+ /// Builds and executes requests for operations under \debitCards\{id}\account
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AccountRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public AccountRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/debitCards/{id}/account{?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 AccountRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/debitCards/{id}/account{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves the related bankAccount of an individual debitCard's account 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.SecondaryBankAccountResponseDocument.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 bankAccount of an individual debitCard's account 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Account.AccountRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Account.AccountRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related bankAccount of an individual debitCard's account relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AccountRequestBuilderGetQueryParameters
+ {
+ /// 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 AccountRequestBuilderHeadQueryParameters
+ {
+ /// 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/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/Item/DebitCardsItemRequestBuilder.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/Item/DebitCardsItemRequestBuilder.cs
new file mode 100644
index 0000000000..58e668dbdc
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/Item/DebitCardsItemRequestBuilder.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 OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Account;
+using OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Relationships;
+using OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item
+{
+ ///
+ /// Builds and executes requests for operations under \debitCards\{id}
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class DebitCardsItemRequestBuilder : BaseRequestBuilder
+ {
+ /// The account property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Account.AccountRequestBuilder Account
+ {
+ get => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Account.AccountRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The relationships property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Relationships.RelationshipsRequestBuilder Relationships
+ {
+ get => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.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 DebitCardsItemRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/debitCards/{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 DebitCardsItemRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/debitCards/{id}{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Deletes an existing debitCard 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves an individual debitCard 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.PrimaryDebitCardResponseDocument.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 debitCard.
+ ///
+ /// 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.UpdateDebitCardRequestDocument body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPatchRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.PrimaryDebitCardResponseDocument.CreateFromDiscriminatorValue, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Deletes an existing debitCard 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 debitCard 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 debitCard.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPatchRequestInformation(global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.UpdateDebitCardRequestDocument 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.DebitCardsItemRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.DebitCardsItemRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves an individual debitCard by its identifier.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class DebitCardsItemRequestBuilderGetQueryParameters
+ {
+ /// 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 DebitCardsItemRequestBuilderHeadQueryParameters
+ {
+ /// 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 debitCard.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class DebitCardsItemRequestBuilderPatchQueryParameters
+ {
+ /// 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/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/Item/Relationships/Account/AccountRequestBuilder.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/Item/Relationships/Account/AccountRequestBuilder.cs
new file mode 100644
index 0000000000..de0ae1ca90
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/Item/Relationships/Account/AccountRequestBuilder.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 OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System.Threading;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Relationships.Account
+{
+ ///
+ /// Builds and executes requests for operations under \debitCards\{id}\relationships\account
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AccountRequestBuilder : BaseRequestBuilder
+ {
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ /// Path parameters for the request
+ /// The request adapter to use to execute the requests.
+ public AccountRequestBuilder(Dictionary pathParameters, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/debitCards/{id}/relationships/account{?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 AccountRequestBuilder(string rawUrl, IRequestAdapter requestAdapter) : base(requestAdapter, "{+baseurl}/debitCards/{id}/relationships/account{?query*}", rawUrl)
+ {
+ }
+
+ ///
+ /// Retrieves the related bankAccount identity of an individual debitCard's account 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ return await RequestAdapter.SendAsync(requestInfo, global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.BankAccountIdentifierResponseDocument.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 bankAccount to the account relationship of an individual debitCard.
+ ///
+ /// 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ToOneBankAccountInRequest body, Action>? requestConfiguration = default, CancellationToken cancellationToken = default)
+ {
+ _ = body ?? throw new ArgumentNullException(nameof(body));
+ var requestInfo = ToPatchRequestInformation(body, requestConfiguration);
+ var errorMapping = new Dictionary>
+ {
+ { "400", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "404", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "409", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ { "422", global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ErrorResponseDocument.CreateFromDiscriminatorValue },
+ };
+ await RequestAdapter.SendNoContentAsync(requestInfo, errorMapping, cancellationToken).ConfigureAwait(false);
+ }
+
+ ///
+ /// Retrieves the related bankAccount identity of an individual debitCard's account 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 bankAccount to the account relationship of an individual debitCard.
+ ///
+ /// A
+ /// The request body
+ /// Configuration for the request such as headers, query parameters, and middleware options.
+ public RequestInformation ToPatchRequestInformation(global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ToOneBankAccountInRequest 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::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Relationships.Account.AccountRequestBuilder WithUrl(string rawUrl)
+ {
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Relationships.Account.AccountRequestBuilder(rawUrl, RequestAdapter);
+ }
+
+ ///
+ /// Retrieves the related bankAccount identity of an individual debitCard's account relationship.
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class AccountRequestBuilderGetQueryParameters
+ {
+ /// 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 AccountRequestBuilderHeadQueryParameters
+ {
+ /// 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/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/Item/Relationships/RelationshipsRequestBuilder.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/Item/Relationships/RelationshipsRequestBuilder.cs
new file mode 100644
index 0000000000..cf3f9ecd9c
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/DebitCards/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 OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Relationships.Account;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Relationships
+{
+ ///
+ /// Builds and executes requests for operations under \debitCards\{id}\relationships
+ ///
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ public partial class RelationshipsRequestBuilder : BaseRequestBuilder
+ {
+ /// The account property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Relationships.Account.AccountRequestBuilder Account
+ {
+ get => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.Item.Relationships.Account.AccountRequestBuilder(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}/debitCards/{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}/debitCards/{id}/relationships", rawUrl)
+ {
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/IdObfuscationClient.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/IdObfuscationClient.cs
new file mode 100644
index 0000000000..30816354ad
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/IdObfuscationClient.cs
@@ -0,0 +1,68 @@
+//
+#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 OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts;
+using OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards;
+using OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Operations;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading.Tasks;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.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 IdObfuscationClient : BaseRequestBuilder
+ {
+ /// The bankAccounts property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.BankAccountsRequestBuilder BankAccounts
+ {
+ get => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.BankAccounts.BankAccountsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The debitCards property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.DebitCardsRequestBuilder DebitCards
+ {
+ get => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.DebitCards.DebitCardsRequestBuilder(PathParameters, RequestAdapter);
+ }
+
+ /// The operations property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Operations.OperationsRequestBuilder Operations
+ {
+ get => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Operations.OperationsRequestBuilder(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 IdObfuscationClient(IRequestAdapter requestAdapter, IBackingStoreFactory backingStore = default) : base(requestAdapter, "{+baseurl}", new Dictionary())
+ {
+ ApiClientBuilder.RegisterDefaultSerializer();
+ ApiClientBuilder.RegisterDefaultSerializer();
+ ApiClientBuilder.RegisterDefaultSerializer();
+ ApiClientBuilder.RegisterDefaultSerializer();
+ ApiClientBuilder.RegisterDefaultDeserializer();
+ ApiClientBuilder.RegisterDefaultDeserializer();
+ ApiClientBuilder.RegisterDefaultDeserializer();
+ if (string.IsNullOrEmpty(RequestAdapter.BaseUrl))
+ {
+ RequestAdapter.BaseUrl = "http://localhost";
+ }
+ PathParameters.TryAdd("baseurl", RequestAdapter.BaseUrl);
+ RequestAdapter.EnableBackingStore(backingStore);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AddOperationCode.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AddOperationCode.cs
new file mode 100644
index 0000000000..73d67b4b2c
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AddOperationCode.cs
@@ -0,0 +1,18 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+using System.Runtime.Serialization;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public enum AddOperationCode
+ #pragma warning restore CS1591
+ {
+ [EnumMember(Value = "add")]
+ #pragma warning disable CS1591
+ Add,
+ #pragma warning restore CS1591
+ }
+}
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AddToBankAccountCardsRelationshipOperation.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AddToBankAccountCardsRelationshipOperation.cs
new file mode 100644
index 0000000000..8e8304528d
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AddToBankAccountCardsRelationshipOperation.cs
@@ -0,0 +1,77 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class AddToBankAccountCardsRelationshipOperation : global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AtomicOperation, IParsable
+ #pragma warning restore CS1591
+ {
+ /// The data property
+ public List? Data
+ {
+ get { return BackingStore?.Get?>("data"); }
+ set { BackingStore?.Set("data", value); }
+ }
+
+ /// The op property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AddOperationCode? Op
+ {
+ get { return BackingStore?.Get("op"); }
+ set { BackingStore?.Set("op", value); }
+ }
+
+ /// The ref property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.BankAccountCardsRelationshipIdentifier? Ref
+ {
+ get { return BackingStore?.Get("ref"); }
+ set { BackingStore?.Set("ref", value); }
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AddToBankAccountCardsRelationshipOperation CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AddToBankAccountCardsRelationshipOperation();
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public override IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>(base.GetFieldDeserializers())
+ {
+ { "data", n => { Data = n.GetCollectionOfObjectValues(global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.DebitCardIdentifierInRequest.CreateFromDiscriminatorValue)?.AsList(); } },
+ { "op", n => { Op = n.GetEnumValue(); } },
+ { "ref", n => { Ref = n.GetObjectValue(global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.BankAccountCardsRelationshipIdentifier.CreateFromDiscriminatorValue); } },
+ };
+ }
+
+ ///
+ /// Serializes information the current object
+ ///
+ /// Serialization writer to use to serialize this model
+ public override void Serialize(ISerializationWriter writer)
+ {
+ _ = writer ?? throw new ArgumentNullException(nameof(writer));
+ base.Serialize(writer);
+ writer.WriteCollectionOfObjectValues("data", Data);
+ writer.WriteEnumValue("op", Op);
+ writer.WriteObjectValue("ref", Ref);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AtomicOperation.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AtomicOperation.cs
new file mode 100644
index 0000000000..98284e44d3
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AtomicOperation.cs
@@ -0,0 +1,93 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions.Store;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class AtomicOperation : IBackedModel, IParsable
+ #pragma warning restore CS1591
+ {
+ /// Stores model information.
+ public IBackingStore BackingStore { get; private set; }
+
+ /// The meta property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.Meta? Meta
+ {
+ get { return BackingStore?.Get("meta"); }
+ set { BackingStore?.Set("meta", value); }
+ }
+
+ /// The openapiDiscriminator property
+ public string? OpenapiDiscriminator
+ {
+ get { return BackingStore?.Get("openapi:discriminator"); }
+ set { BackingStore?.Set("openapi:discriminator", value); }
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ public AtomicOperation()
+ {
+ BackingStore = BackingStoreFactorySingleton.Instance.CreateBackingStore();
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AtomicOperation CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ var mappingValue = parseNode.GetChildNode("openapi:discriminator")?.GetStringValue();
+ return mappingValue switch
+ {
+ "addBankAccount" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.CreateBankAccountOperation(),
+ "addDebitCard" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.CreateDebitCardOperation(),
+ "addToBankAccountCards" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AddToBankAccountCardsRelationshipOperation(),
+ "removeBankAccount" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.DeleteBankAccountOperation(),
+ "removeDebitCard" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.DeleteDebitCardOperation(),
+ "removeFromBankAccountCards" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.RemoveFromBankAccountCardsRelationshipOperation(),
+ "updateBankAccount" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.UpdateBankAccountOperation(),
+ "updateBankAccountCards" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.UpdateBankAccountCardsRelationshipOperation(),
+ "updateDebitCard" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.UpdateDebitCardOperation(),
+ "updateDebitCardAccount" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.UpdateDebitCardAccountRelationshipOperation(),
+ _ => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AtomicOperation(),
+ };
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public virtual IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>
+ {
+ { "meta", n => { Meta = n.GetObjectValue(global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.Meta.CreateFromDiscriminatorValue); } },
+ { "openapi:discriminator", n => { OpenapiDiscriminator = n.GetStringValue(); } },
+ };
+ }
+
+ ///
+ /// Serializes information the current object
+ ///
+ /// Serialization writer to use to serialize this model
+ public virtual void Serialize(ISerializationWriter writer)
+ {
+ _ = writer ?? throw new ArgumentNullException(nameof(writer));
+ writer.WriteObjectValue("meta", Meta);
+ writer.WriteStringValue("openapi:discriminator", OpenapiDiscriminator);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AtomicResult.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AtomicResult.cs
new file mode 100644
index 0000000000..20049bcbe5
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AtomicResult.cs
@@ -0,0 +1,79 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions.Store;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class AtomicResult : IBackedModel, IParsable
+ #pragma warning restore CS1591
+ {
+ /// Stores model information.
+ public IBackingStore BackingStore { get; private set; }
+
+ /// The data property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ResourceInResponse? Data
+ {
+ get { return BackingStore?.Get("data"); }
+ set { BackingStore?.Set("data", value); }
+ }
+
+ /// The meta property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.Meta? Meta
+ {
+ get { return BackingStore?.Get("meta"); }
+ set { BackingStore?.Set("meta", value); }
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ public AtomicResult()
+ {
+ BackingStore = BackingStoreFactorySingleton.Instance.CreateBackingStore();
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AtomicResult CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AtomicResult();
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public virtual IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>
+ {
+ { "data", n => { Data = n.GetObjectValue(global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ResourceInResponse.CreateFromDiscriminatorValue); } },
+ { "meta", n => { Meta = n.GetObjectValue(global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.Meta.CreateFromDiscriminatorValue); } },
+ };
+ }
+
+ ///
+ /// Serializes information the current object
+ ///
+ /// Serialization writer to use to serialize this model
+ public virtual void Serialize(ISerializationWriter writer)
+ {
+ _ = writer ?? throw new ArgumentNullException(nameof(writer));
+ writer.WriteObjectValue("data", Data);
+ writer.WriteObjectValue("meta", Meta);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInBankAccountResponse.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInBankAccountResponse.cs
new file mode 100644
index 0000000000..4ccf5242e3
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInBankAccountResponse.cs
@@ -0,0 +1,59 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class AttributesInBankAccountResponse : global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInResponse, IParsable
+ #pragma warning restore CS1591
+ {
+ /// The iban property
+ public string? Iban
+ {
+ get { return BackingStore?.Get("iban"); }
+ set { BackingStore?.Set("iban", value); }
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInBankAccountResponse CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInBankAccountResponse();
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public override IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>(base.GetFieldDeserializers())
+ {
+ { "iban", n => { Iban = n.GetStringValue(); } },
+ };
+ }
+
+ ///
+ /// Serializes information the current object
+ ///
+ /// Serialization writer to use to serialize this model
+ public override void Serialize(ISerializationWriter writer)
+ {
+ _ = writer ?? throw new ArgumentNullException(nameof(writer));
+ base.Serialize(writer);
+ writer.WriteStringValue("iban", Iban);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInCreateBankAccountRequest.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInCreateBankAccountRequest.cs
new file mode 100644
index 0000000000..c368cdd597
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInCreateBankAccountRequest.cs
@@ -0,0 +1,59 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class AttributesInCreateBankAccountRequest : global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInCreateRequest, IParsable
+ #pragma warning restore CS1591
+ {
+ /// The iban property
+ public string? Iban
+ {
+ get { return BackingStore?.Get("iban"); }
+ set { BackingStore?.Set("iban", value); }
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInCreateBankAccountRequest CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInCreateBankAccountRequest();
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public override IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>(base.GetFieldDeserializers())
+ {
+ { "iban", n => { Iban = n.GetStringValue(); } },
+ };
+ }
+
+ ///
+ /// Serializes information the current object
+ ///
+ /// Serialization writer to use to serialize this model
+ public override void Serialize(ISerializationWriter writer)
+ {
+ _ = writer ?? throw new ArgumentNullException(nameof(writer));
+ base.Serialize(writer);
+ writer.WriteStringValue("iban", Iban);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInCreateDebitCardRequest.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInCreateDebitCardRequest.cs
new file mode 100644
index 0000000000..7220f279d0
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInCreateDebitCardRequest.cs
@@ -0,0 +1,68 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class AttributesInCreateDebitCardRequest : global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInCreateRequest, IParsable
+ #pragma warning restore CS1591
+ {
+ /// The ownerName property
+ public string? OwnerName
+ {
+ get { return BackingStore?.Get("ownerName"); }
+ set { BackingStore?.Set("ownerName", value); }
+ }
+
+ /// The pinCode property
+ public int? PinCode
+ {
+ get { return BackingStore?.Get("pinCode"); }
+ set { BackingStore?.Set("pinCode", value); }
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInCreateDebitCardRequest CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInCreateDebitCardRequest();
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public override IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>(base.GetFieldDeserializers())
+ {
+ { "ownerName", n => { OwnerName = n.GetStringValue(); } },
+ { "pinCode", n => { PinCode = n.GetIntValue(); } },
+ };
+ }
+
+ ///
+ /// Serializes information the current object
+ ///
+ /// Serialization writer to use to serialize this model
+ public override void Serialize(ISerializationWriter writer)
+ {
+ _ = writer ?? throw new ArgumentNullException(nameof(writer));
+ base.Serialize(writer);
+ writer.WriteStringValue("ownerName", OwnerName);
+ writer.WriteIntValue("pinCode", PinCode);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInCreateRequest.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInCreateRequest.cs
new file mode 100644
index 0000000000..7d4b1426eb
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInCreateRequest.cs
@@ -0,0 +1,76 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions.Store;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class AttributesInCreateRequest : IBackedModel, IParsable
+ #pragma warning restore CS1591
+ {
+ /// Stores model information.
+ public IBackingStore BackingStore { get; private set; }
+
+ /// The openapiDiscriminator property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ResourceType? OpenapiDiscriminator
+ {
+ get { return BackingStore?.Get("openapi:discriminator"); }
+ set { BackingStore?.Set("openapi:discriminator", value); }
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ public AttributesInCreateRequest()
+ {
+ BackingStore = BackingStoreFactorySingleton.Instance.CreateBackingStore();
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInCreateRequest CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ var mappingValue = parseNode.GetChildNode("openapi:discriminator")?.GetStringValue();
+ return mappingValue switch
+ {
+ "bankAccounts" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInCreateBankAccountRequest(),
+ "debitCards" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInCreateDebitCardRequest(),
+ _ => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInCreateRequest(),
+ };
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public virtual IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>
+ {
+ { "openapi:discriminator", n => { OpenapiDiscriminator = n.GetEnumValue(); } },
+ };
+ }
+
+ ///
+ /// Serializes information the current object
+ ///
+ /// Serialization writer to use to serialize this model
+ public virtual void Serialize(ISerializationWriter writer)
+ {
+ _ = writer ?? throw new ArgumentNullException(nameof(writer));
+ writer.WriteEnumValue("openapi:discriminator", OpenapiDiscriminator);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInDebitCardResponse.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInDebitCardResponse.cs
new file mode 100644
index 0000000000..7f3888ab85
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInDebitCardResponse.cs
@@ -0,0 +1,68 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class AttributesInDebitCardResponse : global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInResponse, IParsable
+ #pragma warning restore CS1591
+ {
+ /// The ownerName property
+ public string? OwnerName
+ {
+ get { return BackingStore?.Get("ownerName"); }
+ set { BackingStore?.Set("ownerName", value); }
+ }
+
+ /// The pinCode property
+ public int? PinCode
+ {
+ get { return BackingStore?.Get("pinCode"); }
+ set { BackingStore?.Set("pinCode", value); }
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInDebitCardResponse CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInDebitCardResponse();
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public override IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>(base.GetFieldDeserializers())
+ {
+ { "ownerName", n => { OwnerName = n.GetStringValue(); } },
+ { "pinCode", n => { PinCode = n.GetIntValue(); } },
+ };
+ }
+
+ ///
+ /// Serializes information the current object
+ ///
+ /// Serialization writer to use to serialize this model
+ public override void Serialize(ISerializationWriter writer)
+ {
+ _ = writer ?? throw new ArgumentNullException(nameof(writer));
+ base.Serialize(writer);
+ writer.WriteStringValue("ownerName", OwnerName);
+ writer.WriteIntValue("pinCode", PinCode);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInResponse.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInResponse.cs
new file mode 100644
index 0000000000..9f334f6c3f
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInResponse.cs
@@ -0,0 +1,76 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions.Store;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class AttributesInResponse : IBackedModel, IParsable
+ #pragma warning restore CS1591
+ {
+ /// Stores model information.
+ public IBackingStore BackingStore { get; private set; }
+
+ /// The openapiDiscriminator property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ResourceType? OpenapiDiscriminator
+ {
+ get { return BackingStore?.Get("openapi:discriminator"); }
+ set { BackingStore?.Set("openapi:discriminator", value); }
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ public AttributesInResponse()
+ {
+ BackingStore = BackingStoreFactorySingleton.Instance.CreateBackingStore();
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInResponse CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ var mappingValue = parseNode.GetChildNode("openapi:discriminator")?.GetStringValue();
+ return mappingValue switch
+ {
+ "bankAccounts" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInBankAccountResponse(),
+ "debitCards" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInDebitCardResponse(),
+ _ => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInResponse(),
+ };
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public virtual IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>
+ {
+ { "openapi:discriminator", n => { OpenapiDiscriminator = n.GetEnumValue(); } },
+ };
+ }
+
+ ///
+ /// Serializes information the current object
+ ///
+ /// Serialization writer to use to serialize this model
+ public virtual void Serialize(ISerializationWriter writer)
+ {
+ _ = writer ?? throw new ArgumentNullException(nameof(writer));
+ writer.WriteEnumValue("openapi:discriminator", OpenapiDiscriminator);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInUpdateBankAccountRequest.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInUpdateBankAccountRequest.cs
new file mode 100644
index 0000000000..c617fc2d69
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInUpdateBankAccountRequest.cs
@@ -0,0 +1,59 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class AttributesInUpdateBankAccountRequest : global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInUpdateRequest, IParsable
+ #pragma warning restore CS1591
+ {
+ /// The iban property
+ public string? Iban
+ {
+ get { return BackingStore?.Get("iban"); }
+ set { BackingStore?.Set("iban", value); }
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInUpdateBankAccountRequest CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInUpdateBankAccountRequest();
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public override IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>(base.GetFieldDeserializers())
+ {
+ { "iban", n => { Iban = n.GetStringValue(); } },
+ };
+ }
+
+ ///
+ /// Serializes information the current object
+ ///
+ /// Serialization writer to use to serialize this model
+ public override void Serialize(ISerializationWriter writer)
+ {
+ _ = writer ?? throw new ArgumentNullException(nameof(writer));
+ base.Serialize(writer);
+ writer.WriteStringValue("iban", Iban);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInUpdateDebitCardRequest.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInUpdateDebitCardRequest.cs
new file mode 100644
index 0000000000..fe8b16531d
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInUpdateDebitCardRequest.cs
@@ -0,0 +1,68 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class AttributesInUpdateDebitCardRequest : global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInUpdateRequest, IParsable
+ #pragma warning restore CS1591
+ {
+ /// The ownerName property
+ public string? OwnerName
+ {
+ get { return BackingStore?.Get("ownerName"); }
+ set { BackingStore?.Set("ownerName", value); }
+ }
+
+ /// The pinCode property
+ public int? PinCode
+ {
+ get { return BackingStore?.Get("pinCode"); }
+ set { BackingStore?.Set("pinCode", value); }
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInUpdateDebitCardRequest CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInUpdateDebitCardRequest();
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public override IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>(base.GetFieldDeserializers())
+ {
+ { "ownerName", n => { OwnerName = n.GetStringValue(); } },
+ { "pinCode", n => { PinCode = n.GetIntValue(); } },
+ };
+ }
+
+ ///
+ /// Serializes information the current object
+ ///
+ /// Serialization writer to use to serialize this model
+ public override void Serialize(ISerializationWriter writer)
+ {
+ _ = writer ?? throw new ArgumentNullException(nameof(writer));
+ base.Serialize(writer);
+ writer.WriteStringValue("ownerName", OwnerName);
+ writer.WriteIntValue("pinCode", PinCode);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInUpdateRequest.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInUpdateRequest.cs
new file mode 100644
index 0000000000..0fc4a8a517
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/AttributesInUpdateRequest.cs
@@ -0,0 +1,76 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions.Store;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class AttributesInUpdateRequest : IBackedModel, IParsable
+ #pragma warning restore CS1591
+ {
+ /// Stores model information.
+ public IBackingStore BackingStore { get; private set; }
+
+ /// The openapiDiscriminator property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ResourceType? OpenapiDiscriminator
+ {
+ get { return BackingStore?.Get("openapi:discriminator"); }
+ set { BackingStore?.Set("openapi:discriminator", value); }
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ public AttributesInUpdateRequest()
+ {
+ BackingStore = BackingStoreFactorySingleton.Instance.CreateBackingStore();
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInUpdateRequest CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ var mappingValue = parseNode.GetChildNode("openapi:discriminator")?.GetStringValue();
+ return mappingValue switch
+ {
+ "bankAccounts" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInUpdateBankAccountRequest(),
+ "debitCards" => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInUpdateDebitCardRequest(),
+ _ => new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.AttributesInUpdateRequest(),
+ };
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public virtual IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>
+ {
+ { "openapi:discriminator", n => { OpenapiDiscriminator = n.GetEnumValue(); } },
+ };
+ }
+
+ ///
+ /// Serializes information the current object
+ ///
+ /// Serialization writer to use to serialize this model
+ public virtual void Serialize(ISerializationWriter writer)
+ {
+ _ = writer ?? throw new ArgumentNullException(nameof(writer));
+ writer.WriteEnumValue("openapi:discriminator", OpenapiDiscriminator);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/BankAccountCardsRelationshipIdentifier.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/BankAccountCardsRelationshipIdentifier.cs
new file mode 100644
index 0000000000..22e95f1aea
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/BankAccountCardsRelationshipIdentifier.cs
@@ -0,0 +1,97 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions.Store;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class BankAccountCardsRelationshipIdentifier : IBackedModel, IParsable
+ #pragma warning restore CS1591
+ {
+ /// Stores model information.
+ public IBackingStore BackingStore { get; private set; }
+
+ /// The id property
+ public string? Id
+ {
+ get { return BackingStore?.Get("id"); }
+ set { BackingStore?.Set("id", value); }
+ }
+
+ /// The lid property
+ public string? Lid
+ {
+ get { return BackingStore?.Get("lid"); }
+ set { BackingStore?.Set("lid", value); }
+ }
+
+ /// The relationship property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.BankAccountCardsRelationshipName? Relationship
+ {
+ get { return BackingStore?.Get("relationship"); }
+ set { BackingStore?.Set("relationship", value); }
+ }
+
+ /// The type property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.BankAccountResourceType? Type
+ {
+ get { return BackingStore?.Get("type"); }
+ set { BackingStore?.Set("type", value); }
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ public BankAccountCardsRelationshipIdentifier()
+ {
+ BackingStore = BackingStoreFactorySingleton.Instance.CreateBackingStore();
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.BankAccountCardsRelationshipIdentifier CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.BankAccountCardsRelationshipIdentifier();
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public virtual IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>
+ {
+ { "id", n => { Id = n.GetStringValue(); } },
+ { "lid", n => { Lid = n.GetStringValue(); } },
+ { "relationship", n => { Relationship = n.GetEnumValue(); } },
+ { "type", n => { Type = n.GetEnumValue(); } },
+ };
+ }
+
+ ///
+ /// Serializes information the current object
+ ///
+ /// Serialization writer to use to serialize this model
+ public virtual void Serialize(ISerializationWriter writer)
+ {
+ _ = writer ?? throw new ArgumentNullException(nameof(writer));
+ writer.WriteStringValue("id", Id);
+ writer.WriteStringValue("lid", Lid);
+ writer.WriteEnumValue("relationship", Relationship);
+ writer.WriteEnumValue("type", Type);
+ }
+ }
+}
+#pragma warning restore CS0618
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/BankAccountCardsRelationshipName.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/BankAccountCardsRelationshipName.cs
new file mode 100644
index 0000000000..fbb3859f1d
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/BankAccountCardsRelationshipName.cs
@@ -0,0 +1,18 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+using System.Runtime.Serialization;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public enum BankAccountCardsRelationshipName
+ #pragma warning restore CS1591
+ {
+ [EnumMember(Value = "cards")]
+ #pragma warning disable CS1591
+ Cards,
+ #pragma warning restore CS1591
+ }
+}
diff --git a/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/BankAccountCollectionResponseDocument.cs b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/BankAccountCollectionResponseDocument.cs
new file mode 100644
index 0000000000..1edf471c06
--- /dev/null
+++ b/test/OpenApiKiotaEndToEndTests/IdObfuscation/GeneratedCode/Models/BankAccountCollectionResponseDocument.cs
@@ -0,0 +1,97 @@
+//
+#nullable enable
+#pragma warning disable CS8625
+#pragma warning disable CS0618
+using Microsoft.Kiota.Abstractions.Extensions;
+using Microsoft.Kiota.Abstractions.Serialization;
+using Microsoft.Kiota.Abstractions.Store;
+using System.Collections.Generic;
+using System.IO;
+using System;
+namespace OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models
+{
+ [global::System.CodeDom.Compiler.GeneratedCode("Kiota", "1.0.0")]
+ #pragma warning disable CS1591
+ public partial class BankAccountCollectionResponseDocument : IBackedModel, IParsable
+ #pragma warning restore CS1591
+ {
+ /// Stores model information.
+ public IBackingStore BackingStore { get; private set; }
+
+ /// The data property
+ public List? Data
+ {
+ get { return BackingStore?.Get?>("data"); }
+ set { BackingStore?.Set("data", value); }
+ }
+
+ /// The included property
+ public List? Included
+ {
+ get { return BackingStore?.Get?>("included"); }
+ set { BackingStore?.Set("included", value); }
+ }
+
+ /// The links property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.ResourceCollectionTopLevelLinks? Links
+ {
+ get { return BackingStore?.Get("links"); }
+ set { BackingStore?.Set("links", value); }
+ }
+
+ /// The meta property
+ public global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.Meta? Meta
+ {
+ get { return BackingStore?.Get("meta"); }
+ set { BackingStore?.Set("meta", value); }
+ }
+
+ ///
+ /// Instantiates a new and sets the default values.
+ ///
+ public BankAccountCollectionResponseDocument()
+ {
+ BackingStore = BackingStoreFactorySingleton.Instance.CreateBackingStore();
+ }
+
+ ///
+ /// Creates a new instance of the appropriate class based on discriminator value
+ ///
+ /// A
+ /// The parse node to use to read the discriminator value and create the object
+ public static global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.BankAccountCollectionResponseDocument CreateFromDiscriminatorValue(IParseNode parseNode)
+ {
+ _ = parseNode ?? throw new ArgumentNullException(nameof(parseNode));
+ return new global::OpenApiKiotaEndToEndTests.IdObfuscation.GeneratedCode.Models.BankAccountCollectionResponseDocument();
+ }
+
+ ///
+ /// The deserialization information for the current model
+ ///
+ /// A IDictionary<string, Action<IParseNode>>
+ public virtual IDictionary> GetFieldDeserializers()
+ {
+ return new Dictionary>
+ {
+ { "data", n => { Data = n.GetCollectionOfObjectValues