Skip to content

Commit 1004bd7

Browse files
feat: add resource_type_slug to permissions, environment and organization roles (#576)
Co-authored-by: Garen Torikian <gjtorikian@users.noreply.github.com>
1 parent 8018c57 commit 1004bd7

8 files changed

Lines changed: 65 additions & 0 deletions

File tree

src/workos/authorization.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ def create_permission(
117117
slug: str,
118118
name: str,
119119
description: Optional[str] = None,
120+
resource_type_slug: Optional[str] = None,
120121
) -> SyncOrAsync[Permission]: ...
121122

122123
def list_permissions(
@@ -200,6 +201,7 @@ def create_environment_role(
200201
slug: str,
201202
name: str,
202203
description: Optional[str] = None,
204+
resource_type_slug: Optional[str] = None,
203205
) -> SyncOrAsync[EnvironmentRole]: ...
204206

205207
def list_environment_roles(self) -> SyncOrAsync[EnvironmentRoleList]: ...
@@ -388,10 +390,13 @@ def create_permission(
388390
slug: str,
389391
name: str,
390392
description: Optional[str] = None,
393+
resource_type_slug: Optional[str] = None,
391394
) -> Permission:
392395
json: Dict[str, Any] = {"slug": slug, "name": name}
393396
if description is not None:
394397
json["description"] = description
398+
if resource_type_slug is not None:
399+
json["resource_type_slug"] = resource_type_slug
395400

396401
response = self._http_client.request(
397402
AUTHORIZATION_PERMISSIONS_PATH,
@@ -573,10 +578,13 @@ def create_environment_role(
573578
slug: str,
574579
name: str,
575580
description: Optional[str] = None,
581+
resource_type_slug: Optional[str] = None,
576582
) -> EnvironmentRole:
577583
json: Dict[str, Any] = {"slug": slug, "name": name}
578584
if description is not None:
579585
json["description"] = description
586+
if resource_type_slug is not None:
587+
json["resource_type_slug"] = resource_type_slug
580588

581589
response = self._http_client.request(
582590
"authorization/roles",
@@ -1062,10 +1070,13 @@ async def create_permission(
10621070
slug: str,
10631071
name: str,
10641072
description: Optional[str] = None,
1073+
resource_type_slug: Optional[str] = None,
10651074
) -> Permission:
10661075
json: Dict[str, Any] = {"slug": slug, "name": name}
10671076
if description is not None:
10681077
json["description"] = description
1078+
if resource_type_slug is not None:
1079+
json["resource_type_slug"] = resource_type_slug
10691080

10701081
response = await self._http_client.request(
10711082
AUTHORIZATION_PERMISSIONS_PATH,
@@ -1243,10 +1254,13 @@ async def create_environment_role(
12431254
slug: str,
12441255
name: str,
12451256
description: Optional[str] = None,
1257+
resource_type_slug: Optional[str] = None,
12461258
) -> EnvironmentRole:
12471259
json: Dict[str, Any] = {"slug": slug, "name": name}
12481260
if description is not None:
12491261
json["description"] = description
1262+
if resource_type_slug is not None:
1263+
json["resource_type_slug"] = resource_type_slug
12501264

12511265
response = await self._http_client.request(
12521266
"authorization/roles",

src/workos/types/authorization/environment_role.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class EnvironmentRole(WorkOSModel):
99
name: str
1010
slug: str
1111
description: Optional[str] = None
12+
resource_type_slug: str
1213
permissions: Sequence[str]
1314
type: Literal["EnvironmentRole"]
1415
created_at: str

src/workos/types/authorization/organization_role.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class OrganizationRole(WorkOSModel):
99
name: str
1010
slug: str
1111
description: Optional[str] = None
12+
resource_type_slug: str
1213
permissions: Sequence[str]
1314
type: Literal["OrganizationRole"]
1415
created_at: str

src/workos/types/authorization/permission.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class Permission(WorkOSModel):
99
slug: str
1010
name: str
1111
description: Optional[str] = None
12+
resource_type_slug: str
1213
system: bool
1314
created_at: str
1415
updated_at: str

tests/test_authorization.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,35 @@ def test_create_permission(
5353

5454
assert permission.id == "perm_01ABC"
5555
assert permission.slug == "documents:read"
56+
assert permission.resource_type_slug == "organization"
5657
assert request_kwargs["method"] == "post"
5758
assert request_kwargs["url"].endswith("/authorization/permissions")
5859
assert request_kwargs["json"] == {
5960
"slug": "documents:read",
6061
"name": "Read Documents",
6162
}
6263

64+
def test_create_permission_with_resource_type_slug(
65+
self, mock_permission, capture_and_mock_http_client_request
66+
):
67+
request_kwargs = capture_and_mock_http_client_request(
68+
self.http_client, mock_permission, 201
69+
)
70+
71+
syncify(
72+
self.authorization.create_permission(
73+
slug="documents:read",
74+
name="Read Documents",
75+
resource_type_slug="project",
76+
)
77+
)
78+
79+
assert request_kwargs["json"] == {
80+
"slug": "documents:read",
81+
"name": "Read Documents",
82+
"resource_type_slug": "project",
83+
}
84+
6385
def test_create_permission_with_description(
6486
self, mock_permission, capture_and_mock_http_client_request
6587
):
@@ -205,6 +227,7 @@ def test_create_organization_role(
205227

206228
assert role.id == "role_01ABC"
207229
assert role.type == "OrganizationRole"
230+
assert role.resource_type_slug == "organization"
208231
assert request_kwargs["method"] == "post"
209232
assert request_kwargs["url"].endswith(
210233
"/authorization/organizations/org_01EHT88Z8J8795GZNQ4ZP1J81T/roles"
@@ -366,10 +389,32 @@ def test_create_environment_role(
366389

367390
assert role.id == "role_01DEF"
368391
assert role.type == "EnvironmentRole"
392+
assert role.resource_type_slug == "organization"
369393
assert request_kwargs["method"] == "post"
370394
assert request_kwargs["url"].endswith("/authorization/roles")
371395
assert request_kwargs["json"] == {"slug": "member", "name": "Member"}
372396

397+
def test_create_environment_role_with_resource_type_slug(
398+
self, mock_environment_role, capture_and_mock_http_client_request
399+
):
400+
request_kwargs = capture_and_mock_http_client_request(
401+
self.http_client, mock_environment_role, 201
402+
)
403+
404+
syncify(
405+
self.authorization.create_environment_role(
406+
slug="member",
407+
name="Member",
408+
resource_type_slug="project",
409+
)
410+
)
411+
412+
assert request_kwargs["json"] == {
413+
"slug": "member",
414+
"name": "Member",
415+
"resource_type_slug": "project",
416+
}
417+
373418
def test_list_environment_roles(
374419
self, mock_environment_roles, capture_and_mock_http_client_request
375420
):

tests/utils/fixtures/mock_environment_role.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ def __init__(self, id: str):
1212
name="Member",
1313
slug="member",
1414
description="Default environment member role",
15+
resource_type_slug="organization",
1516
permissions=["documents:read"],
1617
type="EnvironmentRole",
1718
created_at=now,

tests/utils/fixtures/mock_organization_role.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ def __init__(
1717
name="Admin",
1818
slug="admin",
1919
description="Organization admin role",
20+
resource_type_slug="organization",
2021
permissions=["documents:read", "documents:write"],
2122
type="OrganizationRole",
2223
created_at=now,

tests/utils/fixtures/mock_permission.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ def __init__(self, id: str, slug: str = "documents:read"):
1212
slug=slug,
1313
name="Read Documents",
1414
description="Allows reading documents",
15+
resource_type_slug="organization",
1516
system=False,
1617
created_at=now,
1718
updated_at=now,

0 commit comments

Comments
 (0)