Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions src/WorkOS.net/Client/Utilities/RequestUtilities.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ namespace WorkOS
using System.Reflection;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;

/// <summary>
Expand Down Expand Up @@ -67,6 +68,21 @@ public static HttpContent CreateHttpContent(WorkOSRequest request)
if (request.IsJsonContentType)
{
var jsonOptions = ToJsonString(options);

// Merge extra body params (from parameter-group dispatch) into
// the serialized JSON so that fields like password / password_hash
// appear as top-level body keys instead of query parameters.
if (request.ExtraBodyParams != null && request.ExtraBodyParams.Count > 0)
{
var jobj = JObject.Parse(jsonOptions);
foreach (var kvp in request.ExtraBodyParams)
{
jobj[kvp.Key] = JToken.FromObject(kvp.Value, JsonSerializer.Create(JsonSettings));
}

jsonOptions = jobj.ToString(Formatting.None);
}

var content = new StringContent(jsonOptions, Encoding.UTF8);
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
return content;
Expand Down
2 changes: 2 additions & 0 deletions src/WorkOS.net/Client/WorkOSClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,8 @@ public async IAsyncEnumerable<T> ListAutoPagingAsync<T>(
AccessToken = request.AccessToken,
Options = workingOptions,
RequestOptions = request.RequestOptions,
ExtraQueryParams = request.ExtraQueryParams,
ExtraBodyParams = request.ExtraBodyParams,
};

string? afterCursor = null;
Expand Down
18 changes: 18 additions & 0 deletions src/WorkOS.net/Client/_interfaces/WorkOSRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,13 @@ public class WorkOSRequest
/// </summary>
internal Dictionary<string, string>? ExtraQueryParams { get; set; }

/// <summary>
/// Extra body parameters injected by parameter-group dispatch
/// (e.g. password variants for user creation). These are merged
/// into the JSON request body alongside the options-derived fields.
/// </summary>
internal Dictionary<string, object>? ExtraBodyParams { get; set; }

/// <summary>
/// Append an extra query parameter to the request.
/// </summary>
Expand All @@ -60,5 +67,16 @@ internal void AddQueryParam(string key, string value)
this.ExtraQueryParams ??= new Dictionary<string, string>();
this.ExtraQueryParams[key] = value;
}

/// <summary>
/// Append an extra body parameter to the request. The value is
/// merged into the serialized JSON body. Accepts strings, arrays,
/// or other objects that will be serialized as their native JSON type.
/// </summary>
internal void AddBodyParam(string key, object value)
{
this.ExtraBodyParams ??= new Dictionary<string, object>();
this.ExtraBodyParams[key] = value;
}
}
}
30 changes: 15 additions & 15 deletions src/WorkOS.net/Services/Authorization/AuthorizationService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,19 +47,19 @@ public virtual async Task<AuthorizationCheck> CheckAsync(string organizationMemb
{
if (byId.ResourceId != null)
{
request.AddQueryParam("resource_id", byId.ResourceId);
request.AddBodyParam("resource_id", byId.ResourceId);
}
}
else if (options?.ResourceTarget is AuthorizationResourceTargetByExternalId byExternalId)
{
if (byExternalId.ResourceExternalId != null)
{
request.AddQueryParam("resource_external_id", byExternalId.ResourceExternalId);
request.AddBodyParam("resource_external_id", byExternalId.ResourceExternalId);
}

if (byExternalId.ResourceTypeSlug != null)
{
request.AddQueryParam("resource_type_slug", byExternalId.ResourceTypeSlug);
request.AddBodyParam("resource_type_slug", byExternalId.ResourceTypeSlug);
}
}

Expand Down Expand Up @@ -254,19 +254,19 @@ public virtual async Task<RoleAssignment> AssignRoleAsync(string organizationMem
{
if (byId.ResourceId != null)
{
request.AddQueryParam("resource_id", byId.ResourceId);
request.AddBodyParam("resource_id", byId.ResourceId);
}
}
else if (options?.ResourceTarget is AuthorizationResourceTargetByExternalId byExternalId)
{
if (byExternalId.ResourceExternalId != null)
{
request.AddQueryParam("resource_external_id", byExternalId.ResourceExternalId);
request.AddBodyParam("resource_external_id", byExternalId.ResourceExternalId);
}

if (byExternalId.ResourceTypeSlug != null)
{
request.AddQueryParam("resource_type_slug", byExternalId.ResourceTypeSlug);
request.AddBodyParam("resource_type_slug", byExternalId.ResourceTypeSlug);
}
}

Expand Down Expand Up @@ -552,19 +552,19 @@ public virtual async Task<AuthorizationResource> UpdateOrganizationResourceAsync
{
if (byId.ParentResourceId != null)
{
request.AddQueryParam("parent_resource_id", byId.ParentResourceId);
request.AddBodyParam("parent_resource_id", byId.ParentResourceId);
}
}
else if (options?.ParentResource is AuthorizationParentResourceByExternalId byExternalId)
{
if (byExternalId.ParentResourceExternalId != null)
{
request.AddQueryParam("parent_resource_external_id", byExternalId.ParentResourceExternalId);
request.AddBodyParam("parent_resource_external_id", byExternalId.ParentResourceExternalId);
}

if (byExternalId.ParentResourceTypeSlug != null)
{
request.AddQueryParam("parent_resource_type_slug", byExternalId.ParentResourceTypeSlug);
request.AddBodyParam("parent_resource_type_slug", byExternalId.ParentResourceTypeSlug);
}
}

Expand Down Expand Up @@ -712,19 +712,19 @@ public virtual async Task<AuthorizationResource> CreateResourceAsync(Authorizati
{
if (byId.ParentResourceId != null)
{
request.AddQueryParam("parent_resource_id", byId.ParentResourceId);
request.AddBodyParam("parent_resource_id", byId.ParentResourceId);
}
}
else if (options?.ParentResource is AuthorizationParentResourceByExternalId byExternalId)
{
if (byExternalId.ParentResourceExternalId != null)
{
request.AddQueryParam("parent_resource_external_id", byExternalId.ParentResourceExternalId);
request.AddBodyParam("parent_resource_external_id", byExternalId.ParentResourceExternalId);
}

if (byExternalId.ParentResourceTypeSlug != null)
{
request.AddQueryParam("parent_resource_type_slug", byExternalId.ParentResourceTypeSlug);
request.AddBodyParam("parent_resource_type_slug", byExternalId.ParentResourceTypeSlug);
}
}

Expand Down Expand Up @@ -779,19 +779,19 @@ public virtual async Task<AuthorizationResource> UpdateResourceAsync(string reso
{
if (byId.ParentResourceId != null)
{
request.AddQueryParam("parent_resource_id", byId.ParentResourceId);
request.AddBodyParam("parent_resource_id", byId.ParentResourceId);
}
}
else if (options?.ParentResource is AuthorizationParentResourceByExternalId byExternalId)
{
if (byExternalId.ParentResourceExternalId != null)
{
request.AddQueryParam("parent_resource_external_id", byExternalId.ParentResourceExternalId);
request.AddBodyParam("parent_resource_external_id", byExternalId.ParentResourceExternalId);
}

if (byExternalId.ParentResourceTypeSlug != null)
{
request.AddQueryParam("parent_resource_type_slug", byExternalId.ParentResourceTypeSlug);
request.AddBodyParam("parent_resource_type_slug", byExternalId.ParentResourceTypeSlug);
}
}

Expand Down
20 changes: 10 additions & 10 deletions src/WorkOS.net/Services/UserManagement/UserManagementService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -415,17 +415,17 @@ public virtual async Task<User> CreateAsync(UserManagementCreateOptions options,
{
if (plaintext.Password != null)
{
request.AddQueryParam("password", plaintext.Password);
request.AddBodyParam("password", plaintext.Password);
}
}
else if (options?.Password is UserManagementPasswordHashed hashed)
{
if (hashed.PasswordHash != null)
{
request.AddQueryParam("password_hash", hashed.PasswordHash);
request.AddBodyParam("password_hash", hashed.PasswordHash);
}

request.AddQueryParam("password_hash_type", JsonConvert.SerializeObject(hashed.PasswordHashType).Trim('"'));
request.AddBodyParam("password_hash_type", JsonConvert.SerializeObject(hashed.PasswordHashType).Trim('"'));
}

return await this.Client.MakeAPIRequest<User>(request, cancellationToken);
Expand Down Expand Up @@ -498,17 +498,17 @@ public virtual async Task<User> UpdateAsync(string id, UserManagementUpdateOptio
{
if (plaintext.Password != null)
{
request.AddQueryParam("password", plaintext.Password);
request.AddBodyParam("password", plaintext.Password);
}
}
else if (options?.Password is UserManagementPasswordHashed hashed)
{
if (hashed.PasswordHash != null)
{
request.AddQueryParam("password_hash", hashed.PasswordHash);
request.AddBodyParam("password_hash", hashed.PasswordHash);
}

request.AddQueryParam("password_hash_type", JsonConvert.SerializeObject(hashed.PasswordHashType).Trim('"'));
request.AddBodyParam("password_hash_type", JsonConvert.SerializeObject(hashed.PasswordHashType).Trim('"'));
}

return await this.Client.MakeAPIRequest<User>(request, cancellationToken);
Expand Down Expand Up @@ -920,14 +920,14 @@ public virtual async Task<OrganizationMembership> CreateOrganizationMembershipAs
{
if (single.RoleSlug != null)
{
request.AddQueryParam("role_slug", single.RoleSlug);
request.AddBodyParam("role_slug", single.RoleSlug);
}
}
else if (options?.Role is UserManagementRoleMultiple multiple)
{
if (multiple.RoleSlugs != null)
{
request.AddQueryParam("role_slugs", string.Join(",", multiple.RoleSlugs));
request.AddBodyParam("role_slugs", multiple.RoleSlugs);
}
Comment thread
greptile-apps[bot] marked this conversation as resolved.
}

Expand Down Expand Up @@ -982,14 +982,14 @@ public virtual async Task<OrganizationMembership> UpdateOrganizationMembershipAs
{
if (single.RoleSlug != null)
{
request.AddQueryParam("role_slug", single.RoleSlug);
request.AddBodyParam("role_slug", single.RoleSlug);
}
}
else if (options?.Role is UserManagementRoleMultiple multiple)
{
if (multiple.RoleSlugs != null)
{
request.AddQueryParam("role_slugs", string.Join(",", multiple.RoleSlugs));
request.AddBodyParam("role_slugs", multiple.RoleSlugs);
}
}

Expand Down