Skip to content

Commit 0659573

Browse files
authored
[SYNPY-1426] Deprecate user and team services in Synapse client (#1212)
* Refactor user and team services in Synapse client - Added asynchronous methods for retrieving user profiles by ID and username. - Implemented a method to check if a user is certified. - Deprecated several synchronous methods in the Synapse class, providing migration paths to new asynchronous methods in the UserProfile model. - Updated the Team model to use new asynchronous API functions for team management (create, delete, get members, invite). - Use UserGroupHeader to manage user group metadata. - Enhanced documentation with migration examples for deprecated methods. - Updated tests to reflect changes in error message formatting for non-existent teams.
1 parent eb129a2 commit 0659573

File tree

19 files changed

+1439
-295
lines changed

19 files changed

+1439
-295
lines changed

docs/reference/experimental/async/team.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,5 @@ at your own risk.
1818
- invite_async
1919
- open_invitations_async
2020
---
21+
22+
::: synapseclient.models.TeamMember

docs/reference/experimental/sync/team.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,6 @@ at your own risk.
2828
- members
2929
- invite
3030
- open_invitations
31+
---
32+
33+
::: synapseclient.models.TeamMember

docs/reference/rest_apis.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,15 @@ favor of an auto-generated client derived from the
1212
[Synapse Open API Spec](https://rest-docs.synapse.org/rest/openapi/openapispecification.json).
1313

1414

15-
::: synapseclient.api.entity_bundle_services_v2
15+
::: synapseclient.api.agent_services
1616
::: synapseclient.api.annotations
17+
::: synapseclient.api.api_client
18+
::: synapseclient.api.configuration_services
19+
::: synapseclient.api.entity_bundle_services_v2
20+
::: synapseclient.api.entity_factory
21+
::: synapseclient.api.entity_services
22+
::: synapseclient.api.file_services
23+
::: synapseclient.api.json_schema_services
24+
::: synapseclient.api.table_services
25+
::: synapseclient.api.team_services
26+
::: synapseclient.api.user_services

synapseclient/api/__init__.py

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
update_session,
99
)
1010
from .annotations import set_annotations, set_annotations_async
11-
from .api_client import rest_post_paginated_async
11+
from .api_client import rest_get_paginated_async, rest_post_paginated_async
1212
from .configuration_services import (
1313
get_client_authenticated_s3_profile,
1414
get_config_authentication,
@@ -66,8 +66,25 @@
6666
get_default_columns,
6767
post_columns,
6868
)
69-
from .team_services import post_team_list
70-
from .user_services import get_user_group_headers_batch
69+
from .team_services import (
70+
create_team,
71+
delete_membership_invitation,
72+
delete_team,
73+
find_team,
74+
get_membership_status,
75+
get_team,
76+
get_team_members,
77+
get_team_open_invitations,
78+
invite_to_team,
79+
post_team_list,
80+
send_membership_invitation,
81+
)
82+
from .user_services import (
83+
get_user_group_headers_batch,
84+
get_user_profile_by_id,
85+
get_user_profile_by_username,
86+
is_user_certified,
87+
)
7188

7289
__all__ = [
7390
# annotations
@@ -134,8 +151,22 @@
134151
"get_json_schema_derived_keys",
135152
# api client
136153
"rest_post_paginated_async",
154+
"rest_get_paginated_async",
137155
# team_services
138156
"post_team_list",
157+
"create_team",
158+
"delete_team",
159+
"get_team",
160+
"find_team",
161+
"get_team_members",
162+
"send_membership_invitation",
163+
"get_team_open_invitations",
164+
"get_membership_status",
165+
"delete_membership_invitation",
166+
"invite_to_team",
139167
# user_services
140168
"get_user_group_headers_batch",
169+
"get_user_profile_by_id",
170+
"get_user_profile_by_username",
171+
"is_user_certified",
141172
]

synapseclient/api/api_client.py

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import sys
12
from typing import TYPE_CHECKING, Any, AsyncGenerator, Dict, Optional
23

34
import httpx
@@ -11,7 +12,7 @@ async def rest_post_paginated_async(
1112
body: Optional[Dict[str, Any]] = None,
1213
endpoint: Optional[str] = None,
1314
headers: Optional[httpx.Headers] = None,
14-
retry_policy: Optional[Dict[str, Any]] = {},
15+
retry_policy: Optional[Dict[str, Any]] = None,
1516
requests_session_async_synapse: Optional[httpx.AsyncClient] = None,
1617
*,
1718
synapse_client: Optional["Synapse"] = None,
@@ -34,6 +35,9 @@ async def rest_post_paginated_async(
3435
"""
3536
from synapseclient import Synapse
3637

38+
if not retry_policy:
39+
retry_policy = {}
40+
3741
client = Synapse.get_client(synapse_client=synapse_client)
3842
next_page_token = None
3943
while True:
@@ -54,3 +58,60 @@ async def rest_post_paginated_async(
5458
yield item
5559
if next_page_token is None:
5660
break
61+
62+
63+
async def rest_get_paginated_async(
64+
uri: str,
65+
limit: int = 20,
66+
offset: int = 0,
67+
endpoint: Optional[str] = None,
68+
headers: Optional[httpx.Headers] = None,
69+
retry_policy: Optional[Dict[str, Any]] = None,
70+
requests_session_async_synapse: Optional[httpx.AsyncClient] = None,
71+
*,
72+
synapse_client: Optional["Synapse"] = None,
73+
**kwargs,
74+
) -> AsyncGenerator[Dict[str, str], None]:
75+
"""
76+
Asynchronously yield items from a paginated GET endpoint.
77+
78+
Arguments:
79+
uri: Endpoint URI for the GET request.
80+
limit: How many records should be returned per request
81+
offset: At what record offset from the first should iteration start
82+
endpoint: Optional server endpoint override.
83+
headers: Optional HTTP headers.
84+
retry_policy: Optional retry settings.
85+
requests_session_async_synapse: Optional async HTTPX client session.
86+
kwargs: Additional keyword arguments for the request.
87+
synapse_client: Optional Synapse client instance for authentication.
88+
Yields:
89+
Individual items from each page of the response.
90+
91+
The limit parameter is set at 20 by default. Using a larger limit results in fewer calls to the service, but if
92+
responses are large enough to be a burden on the service they may be truncated.
93+
"""
94+
from synapseclient import Synapse
95+
from synapseclient.core import utils
96+
97+
if not retry_policy:
98+
retry_policy = {}
99+
100+
client = Synapse.get_client(synapse_client=synapse_client)
101+
prev_num_results = sys.maxsize
102+
while prev_num_results > 0:
103+
paginated_uri = utils._limit_and_offset(uri, limit=limit, offset=offset)
104+
response = await client.rest_get_async(
105+
uri=paginated_uri,
106+
endpoint=endpoint,
107+
headers=headers,
108+
retry_policy=retry_policy,
109+
requests_session_async_synapse=requests_session_async_synapse,
110+
**kwargs,
111+
)
112+
results = response["results"] if "results" in response else response["children"]
113+
prev_num_results = len(results)
114+
115+
for result in results:
116+
offset += 1
117+
yield result

0 commit comments

Comments
 (0)