From f12ea4d54dcb51d4a7ff8b2b9c343434f8b40bbe Mon Sep 17 00:00:00 2001 From: Colin Barber Date: Mon, 22 Sep 2025 16:22:55 -0300 Subject: [PATCH 1/2] Adds multiple roles support to OrganizationMembership Create and Update --- .gitignore | 3 + lib/Resource/OrganizationMembership.php | 3 + lib/UserManagement.php | 14 +++-- tests/WorkOS/UserManagementTest.php | 74 ++++++++++++++++++++++++- 4 files changed, 87 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index de306388..18fe8f76 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ vendor/ # PHPUnit /.phpunit.cache .phpunit.result.cache + +# IDEs +.idea/ \ No newline at end of file diff --git a/lib/Resource/OrganizationMembership.php b/lib/Resource/OrganizationMembership.php index 00667dcc..ce4ffe48 100644 --- a/lib/Resource/OrganizationMembership.php +++ b/lib/Resource/OrganizationMembership.php @@ -10,6 +10,7 @@ * @property string $userId * @property string $organizationId * @property RoleResponse $role + * @property array $roles * @property 'active'|'inactive'|'pending' $status * @property string $createdAt * @property string $updatedAt @@ -24,6 +25,7 @@ class OrganizationMembership extends BaseWorkOSResource "userId", "organizationId", "role", + "roles", "status", "createdAt", "updatedAt" @@ -35,6 +37,7 @@ class OrganizationMembership extends BaseWorkOSResource "user_id" => "userId", "organization_id" => "organizationId", "role" => "role", + "roles" => "roles", "status" => "status", "created_at" => "createdAt", "updated_at" => "updatedAt" diff --git a/lib/UserManagement.php b/lib/UserManagement.php index 51d8a9ef..dbf08a33 100644 --- a/lib/UserManagement.php +++ b/lib/UserManagement.php @@ -222,19 +222,21 @@ public function deleteUser($userId) * @param string $userId User ID * @param string $organizationId Organization ID * @param string|null $roleSlug Role Slug + * @param string|null $roleSlugs Role Slugs * * @throws Exception\WorkOSException * * @return Resource\OrganizationMembership */ - public function createOrganizationMembership($userId, $organizationId, $roleSlug = null) + public function createOrganizationMembership($userId, $organizationId, $roleSlug = null, $roleSlugs = null) { $path = "user_management/organization_memberships"; $params = [ "organization_id" => $organizationId, "user_id" => $userId, - "role_slug" => $roleSlug + "role_slug" => $roleSlug, + "role_slugs" => $roleSlugs ]; $response = Client::request( @@ -300,18 +302,20 @@ public function deleteOrganizationMembership($organizationMembershipId) * Update a User organization membership. * * @param string $organizationMembershipId Organization Membership ID - * @param string|null $role_slug The unique role identifier. + * @param string|null $role_slug The unique slug of the role to grant to this membership. + * @param string|null $role_slugs The unique slugs of the roles to grant to this membership. * * @throws Exception\WorkOSException * * @return Resource\OrganizationMembership */ - public function updateOrganizationMembership($organizationMembershipId, $roleSlug = null) + public function updateOrganizationMembership($organizationMembershipId, $roleSlug = null, $roleSlugs = null) { $path = "user_management/organization_memberships/{$organizationMembershipId}"; $params = [ - "role_slug" => $roleSlug + "role_slug" => $roleSlug, + "role_slugs" => $roleSlugs ]; $response = Client::request( diff --git a/tests/WorkOS/UserManagementTest.php b/tests/WorkOS/UserManagementTest.php index 9b9042c9..d136b7dd 100644 --- a/tests/WorkOS/UserManagementTest.php +++ b/tests/WorkOS/UserManagementTest.php @@ -893,7 +893,8 @@ public function testCreateOrganizationMembership() $params = [ "organization_id" => $orgId, "user_id" => $userId, - "role_slug" => $roleSlug + "role_slug" => $roleSlug, + "role_slugs" => null, ]; $this->mockRequest( @@ -912,6 +913,38 @@ public function testCreateOrganizationMembership() $this->assertSame($organizationMembership, $response->toArray()); } + public function testCreateOrganizationMembershipWithRoleSlugs() + { + $userId = "user_01H7X1M4TZJN5N4HG4XXMA1234"; + $orgId = "org_01EHQMYV6MBK39QC5PZXHY59C3"; + $roleSlugs = ["admin"]; + $path = "user_management/organization_memberships"; + + $result = $this->organizationMembershipResponseFixture(); + + $params = [ + "organization_id" => $orgId, + "user_id" => $userId, + "role_slug" => null, + "role_slugs" => $roleSlugs, + ]; + + $this->mockRequest( + Client::METHOD_POST, + $path, + null, + $params, + true, + $result + ); + + $organizationMembership = $this->organizationMembershipFixture(); + + $response = $this->userManagement->createOrganizationMembership($userId, $orgId, null, $roleSlugs); + + $this->assertSame($organizationMembership, $response->toArray()); + } + public function testGetOrganizationMembership() { $organizationMembershipId = "om_01E4ZCR3C56J083X43JQXF3JK5"; @@ -1071,7 +1104,7 @@ public function testUpdateOrganizationMembership() Client::METHOD_PUT, $path, null, - ["role_slug" => $roleSlug], + ["role_slug" => $roleSlug, "role_slugs" => null], true, $result ); @@ -1080,6 +1113,28 @@ public function testUpdateOrganizationMembership() $this->assertSame($this->organizationMembershipFixture(), $response->toArray()); } + public function testUpdateOrganizationMembershipWithRoleSlugs() + { + $organizationMembershipId = "om_01E4ZCR3C56J083X43JQXF3JK5"; + $roleSlugs = ["admin"]; + $path = "user_management/organization_memberships/{$organizationMembershipId}"; + + $result = $this->organizationMembershipResponseFixture(); + + $this->mockRequest( + Client::METHOD_PUT, + $path, + null, + ["role_slug" => null, "role_slugs" => $roleSlugs], + true, + $result + ); + + $response = $this->userManagement->updateOrganizationMembership($organizationMembershipId, null, $roleSlugs); + $this->assertSame($this->organizationMembershipFixture(), $response->toArray()); + } + + public function testDeactivateOrganizationMembership() { $organizationMembershipId = "om_01E4ZCR3C56J083X43JQXF3JK5"; @@ -1396,6 +1451,11 @@ private function organizationMembershipResponseFixture($status = "active") "role" => [ "slug" => "admin", ], + "roles" => [ + [ + "slug" => "admin", + ], + ], "status" => $status, "created_at" => "2021-06-25T19:07:33.155Z", "updated_at" => "2021-06-25T19:07:33.155Z", @@ -1415,6 +1475,11 @@ private function organizationMembershipListResponseFixture() "role" => [ "slug" => "admin", ], + "roles" => [ + [ + "slug" => "admin", + ] + ], "status" => "active", "created_at" => "2021-06-25T19:07:33.155Z", "updated_at" => "2021-06-25T19:07:33.155Z", @@ -1438,6 +1503,11 @@ private function organizationMembershipFixture() "role" => [ "slug" => "admin", ], + "roles" => [ + [ + "slug" => "admin", + ], + ], "status" => "active", "createdAt" => "2021-06-25T19:07:33.155Z", "updatedAt" => "2021-06-25T19:07:33.155Z", From 07bed01a6cd8ddf5ccf09ac55bd0e08be869a109 Mon Sep 17 00:00:00 2001 From: Colin Barber Date: Tue, 23 Sep 2025 15:03:05 -0300 Subject: [PATCH 2/2] Remove null params --- lib/UserManagement.php | 25 ++++++++++++++++++------- tests/WorkOS/UserManagementTest.php | 6 ++---- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/lib/UserManagement.php b/lib/UserManagement.php index dbf08a33..d6f04877 100644 --- a/lib/UserManagement.php +++ b/lib/UserManagement.php @@ -234,11 +234,17 @@ public function createOrganizationMembership($userId, $organizationId, $roleSlug $params = [ "organization_id" => $organizationId, - "user_id" => $userId, - "role_slug" => $roleSlug, - "role_slugs" => $roleSlugs + "user_id" => $userId ]; + if (!is_null($roleSlug)) { + $params["role_slug"] = $roleSlug; + } + + if (!is_null($roleSlugs)) { + $params["role_slugs"] = $roleSlugs; + } + $response = Client::request( Client::METHOD_POST, $path, @@ -313,10 +319,15 @@ public function updateOrganizationMembership($organizationMembershipId, $roleSlu { $path = "user_management/organization_memberships/{$organizationMembershipId}"; - $params = [ - "role_slug" => $roleSlug, - "role_slugs" => $roleSlugs - ]; + $params = []; + + if (!is_null($roleSlug)) { + $params["role_slug"] = $roleSlug; + } + + if (!is_null($roleSlugs)) { + $params["role_slugs"] = $roleSlugs; + } $response = Client::request( Client::METHOD_PUT, diff --git a/tests/WorkOS/UserManagementTest.php b/tests/WorkOS/UserManagementTest.php index d136b7dd..288f3603 100644 --- a/tests/WorkOS/UserManagementTest.php +++ b/tests/WorkOS/UserManagementTest.php @@ -894,7 +894,6 @@ public function testCreateOrganizationMembership() "organization_id" => $orgId, "user_id" => $userId, "role_slug" => $roleSlug, - "role_slugs" => null, ]; $this->mockRequest( @@ -925,7 +924,6 @@ public function testCreateOrganizationMembershipWithRoleSlugs() $params = [ "organization_id" => $orgId, "user_id" => $userId, - "role_slug" => null, "role_slugs" => $roleSlugs, ]; @@ -1104,7 +1102,7 @@ public function testUpdateOrganizationMembership() Client::METHOD_PUT, $path, null, - ["role_slug" => $roleSlug, "role_slugs" => null], + ["role_slug" => $roleSlug], true, $result ); @@ -1125,7 +1123,7 @@ public function testUpdateOrganizationMembershipWithRoleSlugs() Client::METHOD_PUT, $path, null, - ["role_slug" => null, "role_slugs" => $roleSlugs], + ["role_slugs" => $roleSlugs], true, $result );