Skip to content

Commit 43bae56

Browse files
lol
1 parent f3c6575 commit 43bae56

File tree

4 files changed

+61
-113
lines changed

4 files changed

+61
-113
lines changed

src/workos/authorization.py

Lines changed: 19 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from workos.types.authorization.organization_role import OrganizationRole
1414
from workos.types.authorization.permission import Permission
1515
from workos.types.authorization.resource import Resource
16+
from workos.types.authorization.resource_identifier import ParentResourceIdentifier
1617
from workos.types.authorization.role import Role, RoleList
1718
from workos.types.list_resource import (
1819
ListArgs,
@@ -48,9 +49,7 @@ class PermissionListFilters(ListArgs, total=False):
4849

4950
class ResourcesForMembershipListFilters(ListArgs, total=False):
5051
permission_slug: str
51-
parent_resource_id: Optional[str]
52-
parent_resource_type_slug: Optional[str]
53-
parent_resource_external_id: Optional[str]
52+
parent_resource: ParentResourceIdentifier
5453

5554

5655
ResourcesForMembershipListResource = WorkOSListResource[
@@ -197,9 +196,7 @@ def list_resources_for_membership(
197196
organization_membership_id: str,
198197
*,
199198
permission_slug: str,
200-
parent_resource_id: Optional[str] = None,
201-
parent_resource_type_slug: Optional[str] = None,
202-
parent_resource_external_id: Optional[str] = None,
199+
parent_resource: ParentResourceIdentifier,
203200
limit: int = DEFAULT_LIST_RESPONSE_LIMIT,
204201
before: Optional[str] = None,
205202
after: Optional[str] = None,
@@ -515,47 +512,30 @@ def list_resources_for_membership(
515512
organization_membership_id: str,
516513
*,
517514
permission_slug: str,
518-
parent_resource_id: Optional[str] = None,
519-
parent_resource_type_slug: Optional[str] = None,
520-
parent_resource_external_id: Optional[str] = None,
515+
parent_resource: ParentResourceIdentifier,
521516
limit: int = DEFAULT_LIST_RESPONSE_LIMIT,
522517
before: Optional[str] = None,
523518
after: Optional[str] = None,
524519
order: PaginationOrder = "desc",
525520
) -> ResourcesForMembershipListResource:
526-
if parent_resource_id is not None and (
527-
parent_resource_type_slug is not None
528-
or parent_resource_external_id is not None
529-
):
530-
raise ValueError(
531-
"Cannot specify both parent_resource_id and "
532-
"parent_resource_type_slug/parent_resource_external_id. "
533-
"Use one identification method."
534-
)
535-
if (parent_resource_type_slug is None) != (parent_resource_external_id is None):
536-
raise ValueError(
537-
"parent_resource_type_slug and parent_resource_external_id "
538-
"must be provided together."
539-
)
540-
541521
list_params: ResourcesForMembershipListFilters = {
542522
"limit": limit,
543523
"before": before,
544524
"after": after,
545525
"order": order,
546526
"permission_slug": permission_slug,
527+
"parent_resource": parent_resource,
528+
}
529+
530+
http_params: Dict[str, Any] = {
531+
k: v for k, v in list_params.items() if k != "parent_resource"
547532
}
548-
if parent_resource_id is not None:
549-
list_params["parent_resource_id"] = parent_resource_id
550-
if parent_resource_type_slug is not None:
551-
list_params["parent_resource_type_slug"] = parent_resource_type_slug
552-
if parent_resource_external_id is not None:
553-
list_params["parent_resource_external_id"] = parent_resource_external_id
533+
http_params.update(parent_resource)
554534

555535
response = self._http_client.request(
556536
f"authorization/organization_memberships/{organization_membership_id}/resources",
557537
method=REQUEST_METHOD_GET,
558-
params=list_params,
538+
params=http_params,
559539
)
560540

561541
return WorkOSListResource[
@@ -932,47 +912,30 @@ async def list_resources_for_membership(
932912
organization_membership_id: str,
933913
*,
934914
permission_slug: str,
935-
parent_resource_id: Optional[str] = None,
936-
parent_resource_type_slug: Optional[str] = None,
937-
parent_resource_external_id: Optional[str] = None,
915+
parent_resource: ParentResourceIdentifier,
938916
limit: int = DEFAULT_LIST_RESPONSE_LIMIT,
939917
before: Optional[str] = None,
940918
after: Optional[str] = None,
941919
order: PaginationOrder = "desc",
942920
) -> ResourcesForMembershipListResource:
943-
if parent_resource_id is not None and (
944-
parent_resource_type_slug is not None
945-
or parent_resource_external_id is not None
946-
):
947-
raise ValueError(
948-
"Cannot specify both parent_resource_id and "
949-
"parent_resource_type_slug/parent_resource_external_id. "
950-
"Use one identification method."
951-
)
952-
if (parent_resource_type_slug is None) != (parent_resource_external_id is None):
953-
raise ValueError(
954-
"parent_resource_type_slug and parent_resource_external_id "
955-
"must be provided together."
956-
)
957-
958921
list_params: ResourcesForMembershipListFilters = {
959922
"limit": limit,
960923
"before": before,
961924
"after": after,
962925
"order": order,
963926
"permission_slug": permission_slug,
927+
"parent_resource": parent_resource,
928+
}
929+
930+
http_params: Dict[str, Any] = {
931+
k: v for k, v in list_params.items() if k != "parent_resource"
964932
}
965-
if parent_resource_id is not None:
966-
list_params["parent_resource_id"] = parent_resource_id
967-
if parent_resource_type_slug is not None:
968-
list_params["parent_resource_type_slug"] = parent_resource_type_slug
969-
if parent_resource_external_id is not None:
970-
list_params["parent_resource_external_id"] = parent_resource_external_id
933+
http_params.update(parent_resource)
971934

972935
response = await self._http_client.request(
973936
f"authorization/organization_memberships/{organization_membership_id}/resources",
974937
method=REQUEST_METHOD_GET,
975-
params=list_params,
938+
params=http_params,
976939
)
977940

978941
return WorkOSListResource[

src/workos/types/authorization/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@
1313
)
1414
from workos.types.authorization.permission import Permission
1515
from workos.types.authorization.resource import Resource
16+
from workos.types.authorization.resource_identifier import (
17+
ParentResourceIdentifier,
18+
ParentResourceIdentifierByExternalId,
19+
ParentResourceIdentifierById,
20+
)
1621
from workos.types.authorization.role import (
1722
Role,
1823
RoleList,
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from typing import Union
2+
3+
from typing_extensions import TypedDict
4+
5+
6+
class ParentResourceIdentifierById(TypedDict):
7+
"""Identify a parent resource by its WorkOS-assigned ID."""
8+
9+
parent_resource_id: str
10+
11+
12+
class ParentResourceIdentifierByExternalId(TypedDict):
13+
"""Identify a parent resource by its external ID and resource type."""
14+
15+
parent_resource_type_slug: str
16+
parent_resource_external_id: str
17+
18+
19+
ParentResourceIdentifier = Union[
20+
ParentResourceIdentifierById, ParentResourceIdentifierByExternalId
21+
]

tests/test_authorization_resource_memberships.py

Lines changed: 16 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
from tests.utils.list_resource import list_response_of
66
from tests.utils.syncify import syncify
77
from workos.authorization import AsyncAuthorization, Authorization
8+
from workos.types.authorization.resource_identifier import (
9+
ParentResourceIdentifierByExternalId,
10+
ParentResourceIdentifierById,
11+
)
812

913

1014
def _mock_membership(
@@ -48,7 +52,7 @@ def mock_resources_multiple_pages(self):
4852
resources = [MockResource(id=f"res_{i}").dict() for i in range(40)]
4953
return list_response_of(data=resources)
5054

51-
def test_list_resources_for_membership(
55+
def test_list_resources_for_membership_with_parent_resource_id(
5256
self, mock_resources_list, capture_and_mock_http_client_request
5357
):
5458
request_kwargs = capture_and_mock_http_client_request(
@@ -59,6 +63,9 @@ def test_list_resources_for_membership(
5963
self.authorization.list_resources_for_membership(
6064
"om_01ABC",
6165
permission_slug="documents:read",
66+
parent_resource=ParentResourceIdentifierById(
67+
parent_resource_id="res_parent_01",
68+
),
6269
)
6370
)
6471

@@ -68,22 +75,6 @@ def test_list_resources_for_membership(
6875
"/authorization/organization_memberships/om_01ABC/resources"
6976
)
7077
assert request_kwargs["params"]["permission_slug"] == "documents:read"
71-
72-
def test_list_resources_for_membership_with_parent_resource_id(
73-
self, mock_resources_list, capture_and_mock_http_client_request
74-
):
75-
request_kwargs = capture_and_mock_http_client_request(
76-
self.http_client, mock_resources_list, 200
77-
)
78-
79-
syncify(
80-
self.authorization.list_resources_for_membership(
81-
"om_01ABC",
82-
permission_slug="documents:read",
83-
parent_resource_id="res_parent_01",
84-
)
85-
)
86-
8778
assert request_kwargs["params"]["parent_resource_id"] == "res_parent_01"
8879
assert "parent_resource_type_slug" not in request_kwargs["params"]
8980
assert "parent_resource_external_id" not in request_kwargs["params"]
@@ -99,52 +90,17 @@ def test_list_resources_for_membership_with_parent_external_id(
9990
self.authorization.list_resources_for_membership(
10091
"om_01ABC",
10192
permission_slug="documents:read",
102-
parent_resource_type_slug="folder",
103-
parent_resource_external_id="folder_abc",
93+
parent_resource=ParentResourceIdentifierByExternalId(
94+
parent_resource_type_slug="folder",
95+
parent_resource_external_id="folder_abc",
96+
),
10497
)
10598
)
10699

107100
assert request_kwargs["params"]["parent_resource_type_slug"] == "folder"
108101
assert request_kwargs["params"]["parent_resource_external_id"] == "folder_abc"
109102
assert "parent_resource_id" not in request_kwargs["params"]
110103

111-
def test_list_resources_for_membership_rejects_both_parent_id_and_external_id(
112-
self,
113-
):
114-
with pytest.raises(ValueError, match="Cannot specify both"):
115-
syncify(
116-
self.authorization.list_resources_for_membership(
117-
"om_01ABC",
118-
permission_slug="documents:read",
119-
parent_resource_id="res_parent_01",
120-
parent_resource_external_id="folder_abc",
121-
)
122-
)
123-
124-
def test_list_resources_for_membership_rejects_type_slug_without_external_id(
125-
self,
126-
):
127-
with pytest.raises(ValueError, match="must be provided together"):
128-
syncify(
129-
self.authorization.list_resources_for_membership(
130-
"om_01ABC",
131-
permission_slug="documents:read",
132-
parent_resource_type_slug="folder",
133-
)
134-
)
135-
136-
def test_list_resources_for_membership_rejects_external_id_without_type_slug(
137-
self,
138-
):
139-
with pytest.raises(ValueError, match="must be provided together"):
140-
syncify(
141-
self.authorization.list_resources_for_membership(
142-
"om_01ABC",
143-
permission_slug="documents:read",
144-
parent_resource_external_id="folder_abc",
145-
)
146-
)
147-
148104
def test_list_resources_for_membership_auto_pagination(
149105
self,
150106
mock_resources_multiple_pages,
@@ -157,8 +113,11 @@ def test_list_resources_for_membership_auto_pagination(
157113
list_function_params={
158114
"organization_membership_id": "om_01ABC",
159115
"permission_slug": "documents:read",
116+
"parent_resource": ParentResourceIdentifierById(
117+
parent_resource_id="res_parent_01",
118+
),
160119
},
161-
url_path_keys=["organization_membership_id"],
120+
url_path_keys=["organization_membership_id", "parent_resource"],
162121
)
163122

164123

0 commit comments

Comments
 (0)