From 5f647cda2cc4403a3634f983023d6e25b36e8683 Mon Sep 17 00:00:00 2001 From: Yun Wang Date: Mon, 16 Feb 2026 15:14:06 +0100 Subject: [PATCH 1/8] feat: update by openapi refactor --- getstream/chat/async_rest_client.py | 37 +- getstream/chat/rest_client.py | 37 +- getstream/common/async_rest_client.py | 2 +- getstream/common/rest_client.py | 2 +- getstream/feeds/feeds.py | 2 + getstream/feeds/rest_client.py | 155 +- getstream/models/__init__.py | 3936 +++++++++++++-------- getstream/moderation/async_rest_client.py | 36 +- getstream/moderation/rest_client.py | 36 +- getstream/tests/test_webhook.py | 724 ++++ getstream/video/async_call.py | 91 +- getstream/video/async_rest_client.py | 189 +- getstream/video/call.py | 91 +- getstream/video/rest_client.py | 191 +- getstream/webhook.py | 572 +++ 15 files changed, 4300 insertions(+), 1801 deletions(-) create mode 100644 getstream/tests/test_webhook.py create mode 100644 getstream/webhook.py diff --git a/getstream/chat/async_rest_client.py b/getstream/chat/async_rest_client.py index 3b5f9cdc..3c2090fa 100644 --- a/getstream/chat/async_rest_client.py +++ b/getstream/chat/async_rest_client.py @@ -113,10 +113,13 @@ async def query_channels( member_limit: Optional[int] = None, message_limit: Optional[int] = None, offset: Optional[int] = None, + predefined_filter: Optional[str] = None, state: Optional[bool] = None, user_id: Optional[str] = None, sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, + filter_values: Optional[Dict[str, object]] = None, + sort_values: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryChannelsResponse]: json = build_body_dict( @@ -124,10 +127,13 @@ async def query_channels( member_limit=member_limit, message_limit=message_limit, offset=offset, + predefined_filter=predefined_filter, state=state, user_id=user_id, sort=sort, filter_conditions=filter_conditions, + filter_values=filter_values, + sort_values=sort_values, user=user, ) return await self.post( @@ -680,6 +686,7 @@ async def create_channel_type( partition_size: Optional[int] = None, partition_ttl: Optional[str] = None, polls: Optional[bool] = None, + push_level: Optional[str] = None, push_notifications: Optional[bool] = None, reactions: Optional[bool] = None, read_events: Optional[bool] = None, @@ -713,6 +720,7 @@ async def create_channel_type( partition_size=partition_size, partition_ttl=partition_ttl, polls=polls, + push_level=push_level, push_notifications=push_notifications, reactions=reactions, read_events=read_events, @@ -773,6 +781,7 @@ async def update_channel_type( partition_size: Optional[int] = None, partition_ttl: Optional[str] = None, polls: Optional[bool] = None, + push_level: Optional[str] = None, push_notifications: Optional[bool] = None, quotes: Optional[bool] = None, reactions: Optional[bool] = None, @@ -811,6 +820,7 @@ async def update_channel_type( partition_size=partition_size, partition_ttl=partition_ttl, polls=polls, + push_level=push_level, push_notifications=push_notifications, quotes=quotes, reactions=reactions, @@ -1027,6 +1037,7 @@ async def update_message_partial( self, id: str, skip_enrich_url: Optional[bool] = None, + skip_push: Optional[bool] = None, user_id: Optional[str] = None, unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, @@ -1037,6 +1048,7 @@ async def update_message_partial( } json = build_body_dict( skip_enrich_url=skip_enrich_url, + skip_push=skip_push, user_id=user_id, unset=unset, set=set, @@ -1056,14 +1068,14 @@ async def run_message_action( form_data: Dict[str, str], user_id: Optional[str] = None, user: Optional[UserRequest] = None, - ) -> StreamResponse[MessageResponse]: + ) -> StreamResponse[MessageActionResponse]: path_params = { "id": id, } json = build_body_dict(form_data=form_data, user_id=user_id, user=user) return await self.post( "/api/v2/chat/messages/{id}/action", - MessageResponse, + MessageActionResponse, path_params=path_params, json=json, ) @@ -1072,14 +1084,14 @@ async def run_message_action( async def commit_message( self, id: str, - ) -> StreamResponse[MessageResponse]: + ) -> StreamResponse[MessageActionResponse]: path_params = { "id": id, } json = build_body_dict() return await self.post( "/api/v2/chat/messages/{id}/commit", - MessageResponse, + MessageActionResponse, path_params=path_params, json=json, ) @@ -1089,6 +1101,7 @@ async def ephemeral_message_update( self, id: str, skip_enrich_url: Optional[bool] = None, + skip_push: Optional[bool] = None, user_id: Optional[str] = None, unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, @@ -1099,6 +1112,7 @@ async def ephemeral_message_update( } json = build_body_dict( skip_enrich_url=skip_enrich_url, + skip_push=skip_push, user_id=user_id, unset=unset, set=set, @@ -1197,14 +1211,14 @@ async def query_reactions( @telemetry.operation_name("getstream.api.chat.translate_message") async def translate_message( self, id: str, language: str - ) -> StreamResponse[MessageResponse]: + ) -> StreamResponse[MessageActionResponse]: path_params = { "id": id, } json = build_body_dict(language=language) return await self.post( "/api/v2/chat/messages/{id}/translate", - MessageResponse, + MessageActionResponse, path_params=path_params, json=json, ) @@ -1404,6 +1418,17 @@ async def query_banned_users( query_params=query_params, ) + @telemetry.operation_name("getstream.api.chat.query_future_channel_bans") + async def query_future_channel_bans( + self, payload: Optional[QueryFutureChannelBansPayload] = None + ) -> StreamResponse[QueryFutureChannelBansResponse]: + query_params = build_query_param(payload=payload) + return await self.get( + "/api/v2/chat/query_future_channel_bans", + QueryFutureChannelBansResponse, + query_params=query_params, + ) + @telemetry.operation_name("getstream.api.chat.query_reminders") async def query_reminders( self, diff --git a/getstream/chat/rest_client.py b/getstream/chat/rest_client.py index 7130c897..d20ddd72 100644 --- a/getstream/chat/rest_client.py +++ b/getstream/chat/rest_client.py @@ -113,10 +113,13 @@ def query_channels( member_limit: Optional[int] = None, message_limit: Optional[int] = None, offset: Optional[int] = None, + predefined_filter: Optional[str] = None, state: Optional[bool] = None, user_id: Optional[str] = None, sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, + filter_values: Optional[Dict[str, object]] = None, + sort_values: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryChannelsResponse]: json = build_body_dict( @@ -124,10 +127,13 @@ def query_channels( member_limit=member_limit, message_limit=message_limit, offset=offset, + predefined_filter=predefined_filter, state=state, user_id=user_id, sort=sort, filter_conditions=filter_conditions, + filter_values=filter_values, + sort_values=sort_values, user=user, ) return self.post("/api/v2/chat/channels", QueryChannelsResponse, json=json) @@ -676,6 +682,7 @@ def create_channel_type( partition_size: Optional[int] = None, partition_ttl: Optional[str] = None, polls: Optional[bool] = None, + push_level: Optional[str] = None, push_notifications: Optional[bool] = None, reactions: Optional[bool] = None, read_events: Optional[bool] = None, @@ -709,6 +716,7 @@ def create_channel_type( partition_size=partition_size, partition_ttl=partition_ttl, polls=polls, + push_level=push_level, push_notifications=push_notifications, reactions=reactions, read_events=read_events, @@ -767,6 +775,7 @@ def update_channel_type( partition_size: Optional[int] = None, partition_ttl: Optional[str] = None, polls: Optional[bool] = None, + push_level: Optional[str] = None, push_notifications: Optional[bool] = None, quotes: Optional[bool] = None, reactions: Optional[bool] = None, @@ -805,6 +814,7 @@ def update_channel_type( partition_size=partition_size, partition_ttl=partition_ttl, polls=polls, + push_level=push_level, push_notifications=push_notifications, quotes=quotes, reactions=reactions, @@ -1017,6 +1027,7 @@ def update_message_partial( self, id: str, skip_enrich_url: Optional[bool] = None, + skip_push: Optional[bool] = None, user_id: Optional[str] = None, unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, @@ -1027,6 +1038,7 @@ def update_message_partial( } json = build_body_dict( skip_enrich_url=skip_enrich_url, + skip_push=skip_push, user_id=user_id, unset=unset, set=set, @@ -1046,14 +1058,14 @@ def run_message_action( form_data: Dict[str, str], user_id: Optional[str] = None, user: Optional[UserRequest] = None, - ) -> StreamResponse[MessageResponse]: + ) -> StreamResponse[MessageActionResponse]: path_params = { "id": id, } json = build_body_dict(form_data=form_data, user_id=user_id, user=user) return self.post( "/api/v2/chat/messages/{id}/action", - MessageResponse, + MessageActionResponse, path_params=path_params, json=json, ) @@ -1062,14 +1074,14 @@ def run_message_action( def commit_message( self, id: str, - ) -> StreamResponse[MessageResponse]: + ) -> StreamResponse[MessageActionResponse]: path_params = { "id": id, } json = build_body_dict() return self.post( "/api/v2/chat/messages/{id}/commit", - MessageResponse, + MessageActionResponse, path_params=path_params, json=json, ) @@ -1079,6 +1091,7 @@ def ephemeral_message_update( self, id: str, skip_enrich_url: Optional[bool] = None, + skip_push: Optional[bool] = None, user_id: Optional[str] = None, unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, @@ -1089,6 +1102,7 @@ def ephemeral_message_update( } json = build_body_dict( skip_enrich_url=skip_enrich_url, + skip_push=skip_push, user_id=user_id, unset=unset, set=set, @@ -1187,14 +1201,14 @@ def query_reactions( @telemetry.operation_name("getstream.api.chat.translate_message") def translate_message( self, id: str, language: str - ) -> StreamResponse[MessageResponse]: + ) -> StreamResponse[MessageActionResponse]: path_params = { "id": id, } json = build_body_dict(language=language) return self.post( "/api/v2/chat/messages/{id}/translate", - MessageResponse, + MessageActionResponse, path_params=path_params, json=json, ) @@ -1394,6 +1408,17 @@ def query_banned_users( query_params=query_params, ) + @telemetry.operation_name("getstream.api.chat.query_future_channel_bans") + def query_future_channel_bans( + self, payload: Optional[QueryFutureChannelBansPayload] = None + ) -> StreamResponse[QueryFutureChannelBansResponse]: + query_params = build_query_param(payload=payload) + return self.get( + "/api/v2/chat/query_future_channel_bans", + QueryFutureChannelBansResponse, + query_params=query_params, + ) + @telemetry.operation_name("getstream.api.chat.query_reminders") def query_reminders( self, diff --git a/getstream/common/async_rest_client.py b/getstream/common/async_rest_client.py index 0f416c88..1b4f9211 100644 --- a/getstream/common/async_rest_client.py +++ b/getstream/common/async_rest_client.py @@ -761,7 +761,7 @@ async def list_push_providers(self) -> StreamResponse[ListPushProvidersResponse] @telemetry.operation_name("getstream.api.common.upsert_push_provider") async def upsert_push_provider( - self, push_provider: Optional[PushProvider] = None + self, push_provider: Optional[PushProviderRequest] = None ) -> StreamResponse[UpsertPushProviderResponse]: json = build_body_dict(push_provider=push_provider) return await self.post( diff --git a/getstream/common/rest_client.py b/getstream/common/rest_client.py index 49c1e524..d134c70f 100644 --- a/getstream/common/rest_client.py +++ b/getstream/common/rest_client.py @@ -747,7 +747,7 @@ def list_push_providers(self) -> StreamResponse[ListPushProvidersResponse]: @telemetry.operation_name("getstream.api.common.upsert_push_provider") def upsert_push_provider( - self, push_provider: Optional[PushProvider] = None + self, push_provider: Optional[PushProviderRequest] = None ) -> StreamResponse[UpsertPushProviderResponse]: json = build_body_dict(push_provider=push_provider) return self.post( diff --git a/getstream/feeds/feeds.py b/getstream/feeds/feeds.py index d0c8c7a0..4378e8c5 100644 --- a/getstream/feeds/feeds.py +++ b/getstream/feeds/feeds.py @@ -38,6 +38,7 @@ def get_or_create( filter: Optional[Dict[str, object]] = None, followers_pagination: Optional[PagerRequest] = None, following_pagination: Optional[PagerRequest] = None, + friend_reactions_options: Optional[FriendReactionsOptions] = None, interest_weights: Optional[Dict[str, float]] = None, member_pagination: Optional[PagerRequest] = None, user: Optional[UserRequest] = None, @@ -58,6 +59,7 @@ def get_or_create( filter=filter, followers_pagination=followers_pagination, following_pagination=following_pagination, + friend_reactions_options=friend_reactions_options, interest_weights=interest_weights, member_pagination=member_pagination, user=user, diff --git a/getstream/feeds/rest_client.py b/getstream/feeds/rest_client.py index 9b43414b..e2b9d7a0 100644 --- a/getstream/feeds/rest_client.py +++ b/getstream/feeds/rest_client.py @@ -36,12 +36,15 @@ def add_activity( self, type: str, feeds: List[str], + copy_custom_to_notification: Optional[bool] = None, + create_notification_activity: Optional[bool] = None, expires_at: Optional[str] = None, id: Optional[str] = None, parent_id: Optional[str] = None, poll_id: Optional[str] = None, restrict_replies: Optional[str] = None, skip_enrich_url: Optional[bool] = None, + skip_push: Optional[bool] = None, text: Optional[str] = None, user_id: Optional[str] = None, visibility: Optional[str] = None, @@ -58,12 +61,15 @@ def add_activity( json = build_body_dict( type=type, feeds=feeds, + copy_custom_to_notification=copy_custom_to_notification, + create_notification_activity=create_notification_activity, expires_at=expires_at, id=id, parent_id=parent_id, poll_id=poll_id, restrict_replies=restrict_replies, skip_enrich_url=skip_enrich_url, + skip_push=skip_push, text=text, user_id=user_id, visibility=visibility, @@ -88,16 +94,32 @@ def upsert_activities( "/api/v2/feeds/activities/batch", UpsertActivitiesResponse, json=json ) + @telemetry.operation_name("getstream.api.feeds.update_activities_partial_batch") + def update_activities_partial_batch( + self, changes: List[UpdateActivityPartialChangeRequest] + ) -> StreamResponse[UpdateActivitiesPartialBatchResponse]: + json = build_body_dict(changes=changes) + return self.patch( + "/api/v2/feeds/activities/batch/partial", + UpdateActivitiesPartialBatchResponse, + json=json, + ) + @telemetry.operation_name("getstream.api.feeds.delete_activities") def delete_activities( self, ids: List[str], + delete_notification_activity: Optional[bool] = None, hard_delete: Optional[bool] = None, user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[DeleteActivitiesResponse]: json = build_body_dict( - ids=ids, hard_delete=hard_delete, user_id=user_id, user=user + ids=ids, + delete_notification_activity=delete_notification_activity, + hard_delete=hard_delete, + user_id=user_id, + user=user, ) return self.post( "/api/v2/feeds/activities/delete", DeleteActivitiesResponse, json=json @@ -277,6 +299,7 @@ def add_activity_reaction( self, activity_id: str, type: str, + copy_custom_to_notification: Optional[bool] = None, create_notification_activity: Optional[bool] = None, enforce_unique: Optional[bool] = None, skip_push: Optional[bool] = None, @@ -289,6 +312,7 @@ def add_activity_reaction( } json = build_body_dict( type=type, + copy_custom_to_notification=copy_custom_to_notification, create_notification_activity=create_notification_activity, enforce_unique=enforce_unique, skip_push=skip_push, @@ -328,9 +352,15 @@ def query_activity_reactions( @telemetry.operation_name("getstream.api.feeds.delete_activity_reaction") def delete_activity_reaction( - self, activity_id: str, type: str, user_id: Optional[str] = None + self, + activity_id: str, + type: str, + delete_notification_activity: Optional[bool] = None, + user_id: Optional[str] = None, ) -> StreamResponse[DeleteActivityReactionResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param( + delete_notification_activity=delete_notification_activity, user_id=user_id + ) path_params = { "activity_id": activity_id, "type": type, @@ -344,9 +374,15 @@ def delete_activity_reaction( @telemetry.operation_name("getstream.api.feeds.delete_activity") def delete_activity( - self, id: str, hard_delete: Optional[bool] = None + self, + id: str, + hard_delete: Optional[bool] = None, + delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[DeleteActivityResponse]: - query_params = build_query_param(hard_delete=hard_delete) + query_params = build_query_param( + hard_delete=hard_delete, + delete_notification_activity=delete_notification_activity, + ) path_params = { "id": id, } @@ -372,6 +408,9 @@ def get_activity(self, id: str) -> StreamResponse[GetActivityResponse]: def update_activity_partial( self, id: str, + copy_custom_to_notification: Optional[bool] = None, + handle_mention_notifications: Optional[bool] = None, + run_activity_processors: Optional[bool] = None, user_id: Optional[str] = None, unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, @@ -380,7 +419,15 @@ def update_activity_partial( path_params = { "id": id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + copy_custom_to_notification=copy_custom_to_notification, + handle_mention_notifications=handle_mention_notifications, + run_activity_processors=run_activity_processors, + user_id=user_id, + unset=unset, + set=set, + user=user, + ) return self.patch( "/api/v2/feeds/activities/{id}", UpdateActivityPartialResponse, @@ -392,13 +439,17 @@ def update_activity_partial( def update_activity( self, id: str, + copy_custom_to_notification: Optional[bool] = None, expires_at: Optional[datetime] = None, + handle_mention_notifications: Optional[bool] = None, poll_id: Optional[str] = None, restrict_replies: Optional[str] = None, + run_activity_processors: Optional[bool] = None, skip_enrich_url: Optional[bool] = None, text: Optional[str] = None, user_id: Optional[str] = None, visibility: Optional[str] = None, + visibility_tag: Optional[str] = None, attachments: Optional[List[Attachment]] = None, collection_refs: Optional[List[str]] = None, feeds: Optional[List[str]] = None, @@ -407,19 +458,24 @@ def update_activity( mentioned_user_ids: Optional[List[str]] = None, custom: Optional[Dict[str, object]] = None, location: Optional[ActivityLocation] = None, + search_data: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UpdateActivityResponse]: path_params = { "id": id, } json = build_body_dict( + copy_custom_to_notification=copy_custom_to_notification, expires_at=expires_at, + handle_mention_notifications=handle_mention_notifications, poll_id=poll_id, restrict_replies=restrict_replies, + run_activity_processors=run_activity_processors, skip_enrich_url=skip_enrich_url, text=text, user_id=user_id, visibility=visibility, + visibility_tag=visibility_tag, attachments=attachments, collection_refs=collection_refs, feeds=feeds, @@ -428,6 +484,7 @@ def update_activity( mentioned_user_ids=mentioned_user_ids, custom=custom, location=location, + search_data=search_data, user=user, ) return self.put( @@ -437,6 +494,21 @@ def update_activity( json=json, ) + @telemetry.operation_name("getstream.api.feeds.restore_activity") + def restore_activity( + self, id: str, user_id: Optional[str] = None, user: Optional[UserRequest] = None + ) -> StreamResponse[RestoreActivityResponse]: + path_params = { + "id": id, + } + json = build_body_dict(user_id=user_id, user=user) + return self.post( + "/api/v2/feeds/activities/{id}/restore", + RestoreActivityResponse, + path_params=path_params, + json=json, + ) + @telemetry.operation_name("getstream.api.feeds.query_bookmark_folders") def query_bookmark_folders( self, @@ -569,6 +641,7 @@ def get_comments( depth: Optional[int] = None, sort: Optional[str] = None, replies_limit: Optional[int] = None, + user_id: Optional[str] = None, limit: Optional[int] = None, prev: Optional[str] = None, next: Optional[str] = None, @@ -579,6 +652,7 @@ def get_comments( depth=depth, sort=sort, replies_limit=replies_limit, + user_id=user_id, limit=limit, prev=prev, next=next, @@ -591,6 +665,7 @@ def get_comments( def add_comment( self, comment: Optional[str] = None, + copy_custom_to_notification: Optional[bool] = None, create_notification_activity: Optional[bool] = None, id: Optional[str] = None, object_id: Optional[str] = None, @@ -606,6 +681,7 @@ def add_comment( ) -> StreamResponse[AddCommentResponse]: json = build_body_dict( comment=comment, + copy_custom_to_notification=copy_custom_to_notification, create_notification_activity=create_notification_activity, id=id, object_id=object_id, @@ -648,9 +724,15 @@ def query_comments( @telemetry.operation_name("getstream.api.feeds.delete_comment") def delete_comment( - self, id: str, hard_delete: Optional[bool] = None + self, + id: str, + hard_delete: Optional[bool] = None, + delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[DeleteCommentResponse]: - query_params = build_query_param(hard_delete=hard_delete) + query_params = build_query_param( + hard_delete=hard_delete, + delete_notification_activity=delete_notification_activity, + ) path_params = { "id": id, } @@ -675,10 +757,13 @@ def update_comment( self, id: str, comment: Optional[str] = None, + copy_custom_to_notification: Optional[bool] = None, + handle_mention_notifications: Optional[bool] = None, skip_enrich_url: Optional[bool] = None, skip_push: Optional[bool] = None, user_id: Optional[str] = None, attachments: Optional[List[Attachment]] = None, + mentioned_user_ids: Optional[List[str]] = None, custom: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UpdateCommentResponse]: @@ -687,10 +772,13 @@ def update_comment( } json = build_body_dict( comment=comment, + copy_custom_to_notification=copy_custom_to_notification, + handle_mention_notifications=handle_mention_notifications, skip_enrich_url=skip_enrich_url, skip_push=skip_push, user_id=user_id, attachments=attachments, + mentioned_user_ids=mentioned_user_ids, custom=custom, user=user, ) @@ -706,6 +794,7 @@ def add_comment_reaction( self, id: str, type: str, + copy_custom_to_notification: Optional[bool] = None, create_notification_activity: Optional[bool] = None, enforce_unique: Optional[bool] = None, skip_push: Optional[bool] = None, @@ -718,6 +807,7 @@ def add_comment_reaction( } json = build_body_dict( type=type, + copy_custom_to_notification=copy_custom_to_notification, create_notification_activity=create_notification_activity, enforce_unique=enforce_unique, skip_push=skip_push, @@ -757,9 +847,15 @@ def query_comment_reactions( @telemetry.operation_name("getstream.api.feeds.delete_comment_reaction") def delete_comment_reaction( - self, id: str, type: str, user_id: Optional[str] = None + self, + id: str, + type: str, + delete_notification_activity: Optional[bool] = None, + user_id: Optional[str] = None, ) -> StreamResponse[DeleteCommentReactionResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param( + delete_notification_activity=delete_notification_activity, user_id=user_id + ) path_params = { "id": id, "type": type, @@ -778,6 +874,7 @@ def get_comment_replies( depth: Optional[int] = None, sort: Optional[str] = None, replies_limit: Optional[int] = None, + user_id: Optional[str] = None, limit: Optional[int] = None, prev: Optional[str] = None, next: Optional[str] = None, @@ -786,6 +883,7 @@ def get_comment_replies( depth=depth, sort=sort, replies_limit=replies_limit, + user_id=user_id, limit=limit, prev=prev, next=next, @@ -875,6 +973,7 @@ def get_or_create_feed( filter: Optional[Dict[str, object]] = None, followers_pagination: Optional[PagerRequest] = None, following_pagination: Optional[PagerRequest] = None, + friend_reactions_options: Optional[FriendReactionsOptions] = None, interest_weights: Optional[Dict[str, float]] = None, member_pagination: Optional[PagerRequest] = None, user: Optional[UserRequest] = None, @@ -897,6 +996,7 @@ def get_or_create_feed( filter=filter, followers_pagination=followers_pagination, following_pagination=following_pagination, + friend_reactions_options=friend_reactions_options, interest_weights=interest_weights, member_pagination=member_pagination, user=user, @@ -1412,19 +1512,23 @@ def update_follow( self, source: str, target: str, + copy_custom_to_notification: Optional[bool] = None, create_notification_activity: Optional[bool] = None, follower_role: Optional[str] = None, push_preference: Optional[str] = None, skip_push: Optional[bool] = None, + status: Optional[str] = None, custom: Optional[Dict[str, object]] = None, ) -> StreamResponse[UpdateFollowResponse]: json = build_body_dict( source=source, target=target, + copy_custom_to_notification=copy_custom_to_notification, create_notification_activity=create_notification_activity, follower_role=follower_role, push_preference=push_preference, skip_push=skip_push, + status=status, custom=custom, ) return self.patch("/api/v2/feeds/follows", UpdateFollowResponse, json=json) @@ -1434,17 +1538,21 @@ def follow( self, source: str, target: str, + copy_custom_to_notification: Optional[bool] = None, create_notification_activity: Optional[bool] = None, push_preference: Optional[str] = None, skip_push: Optional[bool] = None, + status: Optional[str] = None, custom: Optional[Dict[str, object]] = None, ) -> StreamResponse[SingleFollowResponse]: json = build_body_dict( source=source, target=target, + copy_custom_to_notification=copy_custom_to_notification, create_notification_activity=create_notification_activity, push_preference=push_preference, skip_push=skip_push, + status=status, custom=custom, ) return self.post("/api/v2/feeds/follows", SingleFollowResponse, json=json) @@ -1500,7 +1608,15 @@ def reject_follow( ) @telemetry.operation_name("getstream.api.feeds.unfollow") - def unfollow(self, source: str, target: str) -> StreamResponse[UnfollowResponse]: + def unfollow( + self, + source: str, + target: str, + delete_notification_activity: Optional[bool] = None, + ) -> StreamResponse[UnfollowResponse]: + query_params = build_query_param( + delete_notification_activity=delete_notification_activity + ) path_params = { "source": source, "target": target, @@ -1508,6 +1624,7 @@ def unfollow(self, source: str, target: str) -> StreamResponse[UnfollowResponse] return self.delete( "/api/v2/feeds/follows/{source}/{target}", UnfollowResponse, + query_params=query_params, path_params=path_params, ) @@ -1598,18 +1715,26 @@ def query_feeds_usage_stats( @telemetry.operation_name("getstream.api.feeds.unfollow_batch") def unfollow_batch( - self, follows: List[FollowPair] + self, + follows: List[FollowPair], + delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[UnfollowBatchResponse]: - json = build_body_dict(follows=follows) + json = build_body_dict( + follows=follows, delete_notification_activity=delete_notification_activity + ) return self.post( "/api/v2/feeds/unfollow/batch", UnfollowBatchResponse, json=json ) @telemetry.operation_name("getstream.api.feeds.get_or_create_unfollows") def get_or_create_unfollows( - self, follows: List[FollowPair] + self, + follows: List[FollowPair], + delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[UnfollowBatchResponse]: - json = build_body_dict(follows=follows) + json = build_body_dict( + follows=follows, delete_notification_activity=delete_notification_activity + ) return self.post( "/api/v2/feeds/unfollow/batch/upsert", UnfollowBatchResponse, json=json ) diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index 2006363c..ac880f15 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -151,6 +151,26 @@ class APNS(DataClassJsonMixin): ) +@dataclass +class APNSPayload(DataClassJsonMixin): + body: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="body")) + content_available: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="content-available") + ) + mutable_content: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="mutable-content") + ) + sound: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="sound") + ) + title: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="title") + ) + data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="data") + ) + + @dataclass class AWSRekognitionRule(DataClassJsonMixin): action: str = dc_field(metadata=dc_config(field_name="action")) @@ -501,31 +521,6 @@ class ActivityMarkEvent(DataClassJsonMixin): ) -@dataclass -class ActivityMarkedEvent(DataClassJsonMixin): - all_read: bool = dc_field(metadata=dc_config(field_name="all_read")) - all_seen: bool = dc_field(metadata=dc_config(field_name="all_seen")) - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - feed_id: str = dc_field(metadata=dc_config(field_name="feed_id")) - user_id: str = dc_field(metadata=dc_config(field_name="user_id")) - type: str = dc_field( - default="activity.marked", metadata=dc_config(field_name="type") - ) - marked_read: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="marked_read") - ) - marked_watched: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="marked_watched") - ) - - @dataclass class ActivityPinResponse(DataClassJsonMixin): created_at: datetime = dc_field( @@ -735,6 +730,12 @@ class ActivityRemovedFromFeedEvent(DataClassJsonMixin): class ActivityRequest(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) feeds: List[str] = dc_field(metadata=dc_config(field_name="feeds")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) + create_notification_activity: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="create_notification_activity") + ) expires_at: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="expires_at") ) @@ -751,6 +752,9 @@ class ActivityRequest(DataClassJsonMixin): skip_enrich_url: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_enrich_url") ) + skip_push: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="skip_push") + ) text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") @@ -842,7 +846,7 @@ class ActivityResponse(DataClassJsonMixin): metadata=dc_config(field_name="collections") ) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - reaction_groups: "Dict[str, Optional[ReactionGroupResponse]]" = dc_field( + reaction_groups: "Dict[str, FeedsReactionGroupResponse]" = dc_field( metadata=dc_config(field_name="reaction_groups") ) search_data: Dict[str, object] = dc_field( @@ -876,16 +880,25 @@ class ActivityResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + friend_reaction_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="friend_reaction_count") + ) is_watched: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="is_watched") ) moderation_action: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="moderation_action") ) + selector_source: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="selector_source") + ) text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) visibility_tag: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="visibility_tag") ) + friend_reactions: "Optional[List[FeedsReactionResponse]]" = dc_field( + default=None, metadata=dc_config(field_name="friend_reactions") + ) current_feed: "Optional[FeedResponse]" = dc_field( default=None, metadata=dc_config(field_name="current_feed") ) @@ -906,6 +919,39 @@ class ActivityResponse(DataClassJsonMixin): ) +@dataclass +class ActivityRestoredEvent(DataClassJsonMixin): + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + fid: str = dc_field(metadata=dc_config(field_name="fid")) + activity: "ActivityResponse" = dc_field(metadata=dc_config(field_name="activity")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="feeds.activity.restored", metadata=dc_config(field_name="type") + ) + feed_visibility: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="feed_visibility") + ) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + @dataclass class ActivitySelectorConfig(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) @@ -1030,6 +1076,12 @@ class ActivityUpdatedEvent(DataClassJsonMixin): class AddActivityRequest(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) feeds: List[str] = dc_field(metadata=dc_config(field_name="feeds")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) + create_notification_activity: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="create_notification_activity") + ) expires_at: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="expires_at") ) @@ -1046,6 +1098,9 @@ class AddActivityRequest(DataClassJsonMixin): skip_enrich_url: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_enrich_url") ) + skip_push: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="skip_push") + ) text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") @@ -1086,6 +1141,9 @@ class AddActivityRequest(DataClassJsonMixin): class AddActivityResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) activity: "ActivityResponse" = dc_field(metadata=dc_config(field_name="activity")) + mention_notifications_created: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="mention_notifications_created") + ) @dataclass @@ -1116,6 +1174,9 @@ class AddBookmarkResponse(DataClassJsonMixin): @dataclass class AddCommentReactionRequest(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) create_notification_activity: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="create_notification_activity") ) @@ -1143,6 +1204,9 @@ class AddCommentReactionResponse(DataClassJsonMixin): reaction: "FeedsReactionResponse" = dc_field( metadata=dc_config(field_name="reaction") ) + notification_created: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="notification_created") + ) @dataclass @@ -1150,6 +1214,9 @@ class AddCommentRequest(DataClassJsonMixin): comment: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="comment") ) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) create_notification_activity: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="create_notification_activity") ) @@ -1190,6 +1257,12 @@ class AddCommentRequest(DataClassJsonMixin): class AddCommentResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) comment: "CommentResponse" = dc_field(metadata=dc_config(field_name="comment")) + mention_notifications_created: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="mention_notifications_created") + ) + notification_created: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="notification_created") + ) @dataclass @@ -1218,6 +1291,9 @@ class AddFolderRequest(DataClassJsonMixin): @dataclass class AddReactionRequest(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) create_notification_activity: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="create_notification_activity") ) @@ -1245,6 +1321,9 @@ class AddReactionResponse(DataClassJsonMixin): reaction: "FeedsReactionResponse" = dc_field( metadata=dc_config(field_name="reaction") ) + notification_created: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="notification_created") + ) @dataclass @@ -1287,19 +1366,6 @@ class AggregationConfig(DataClassJsonMixin): ) -@dataclass -class AnyEvent(DataClassJsonMixin): - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - type: str = dc_field(default="*", metadata=dc_config(field_name="type")) - - @dataclass class AppResponseFields(DataClassJsonMixin): allow_multi_user_devices: bool = dc_field( @@ -1337,9 +1403,6 @@ class AppResponseFields(DataClassJsonMixin): max_aggregated_activities_length: int = dc_field( metadata=dc_config(field_name="max_aggregated_activities_length") ) - moderation_bulk_submit_action_enabled: bool = dc_field( - metadata=dc_config(field_name="moderation_bulk_submit_action_enabled") - ) moderation_enabled: bool = dc_field( metadata=dc_config(field_name="moderation_enabled") ) @@ -1699,7 +1762,7 @@ class AsyncExportErrorEvent(DataClassJsonMixin): task_id: str = dc_field(metadata=dc_config(field_name="task_id")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( - default="export.users.error", metadata=dc_config(field_name="type") + default="export.channels.error", metadata=dc_config(field_name="type") ) received_at: Optional[datetime] = dc_field( default=None, @@ -1951,7 +2014,7 @@ class AudioSettingsResponse(DataClassJsonMixin): @dataclass -class AutomodDetails(DataClassJsonMixin): +class AutomodDetailsResponse(DataClassJsonMixin): action: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="action") ) @@ -1961,7 +2024,7 @@ class AutomodDetails(DataClassJsonMixin): image_labels: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="image_labels") ) - message_details: "Optional[FlagMessageDetails]" = dc_field( + message_details: "Optional[FlagMessageDetailsResponse]" = dc_field( default=None, metadata=dc_config(field_name="message_details") ) result: "Optional[MessageModerationResult]" = dc_field( @@ -2059,7 +2122,32 @@ class BackstageSettingsResponse(DataClassJsonMixin): @dataclass -class Ban(DataClassJsonMixin): +class BanActionRequestPayload(DataClassJsonMixin): + channel_ban_only: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="channel_ban_only") + ) + delete_messages: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="delete_messages") + ) + ip_ban: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="ip_ban") + ) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) + shadow: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="shadow") + ) + target_user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="target_user_id") + ) + timeout: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="timeout") + ) + + +@dataclass +class BanInfoResponse(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -2068,7 +2156,6 @@ class Ban(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - shadow: bool = dc_field(metadata=dc_config(field_name="shadow")) expires: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -2081,36 +2168,14 @@ class Ban(DataClassJsonMixin): reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="reason") ) - channel: "Optional[Channel]" = dc_field( - default=None, metadata=dc_config(field_name="channel") - ) - created_by: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="created_by") - ) - target: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="target") - ) - - -@dataclass -class BanActionRequest(DataClassJsonMixin): - channel_ban_only: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="channel_ban_only") - ) - delete_messages: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="delete_messages") - ) - ip_ban: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="ip_ban") - ) - reason: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="reason") - ) shadow: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="shadow") ) - timeout: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="timeout") + created_by: "Optional[UserResponse]" = dc_field( + default=None, metadata=dc_config(field_name="created_by") + ) + user: "Optional[UserResponse]" = dc_field( + default=None, metadata=dc_config(field_name="user") ) @@ -2199,7 +2264,7 @@ class BanResponse(DataClassJsonMixin): @dataclass -class BlockActionRequest(DataClassJsonMixin): +class BlockActionRequestPayload(DataClassJsonMixin): reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="reason") ) @@ -2732,6 +2797,32 @@ class CallCreatedEvent(DataClassJsonMixin): type: str = dc_field(default="call.created", metadata=dc_config(field_name="type")) +@dataclass +class CallDTMFEvent(DataClassJsonMixin): + call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + digit: str = dc_field(metadata=dc_config(field_name="digit")) + duration_ms: int = dc_field(metadata=dc_config(field_name="duration_ms")) + seq_number: int = dc_field(metadata=dc_config(field_name="seq_number")) + timestamp: datetime = dc_field( + metadata=dc_config( + field_name="timestamp", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + user: "UserResponse" = dc_field(metadata=dc_config(field_name="user")) + type: str = dc_field(default="call.dtmf", metadata=dc_config(field_name="type")) + + @dataclass class CallDeletedEvent(DataClassJsonMixin): call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) @@ -3145,7 +3236,9 @@ class CallReactionEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - reaction: "ReactionResponse" = dc_field(metadata=dc_config(field_name="reaction")) + reaction: "VideoReactionResponse" = dc_field( + metadata=dc_config(field_name="reaction") + ) type: str = dc_field( default="call.reaction_new", metadata=dc_config(field_name="type") ) @@ -3381,6 +3474,9 @@ class CallResponse(DataClassJsonMixin): join_ahead_time_seconds: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="join_ahead_time_seconds") ) + routing_number: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="routing_number") + ) starts_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -3933,6 +4029,9 @@ class CallStatsParticipantCounts(DataClassJsonMixin): ) publishers: int = dc_field(metadata=dc_config(field_name="publishers")) sessions: int = dc_field(metadata=dc_config(field_name="sessions")) + total_participant_duration: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="total_participant_duration") + ) @dataclass @@ -4196,7 +4295,7 @@ class CallTypeResponse(DataClassJsonMixin): ) ) grants: "Dict[str, List[str]]" = dc_field(metadata=dc_config(field_name="grants")) - notification_settings: "NotificationSettings" = dc_field( + notification_settings: "NotificationSettingsResponse" = dc_field( metadata=dc_config(field_name="notification_settings") ) settings: "CallSettingsResponse" = dc_field( @@ -4487,156 +4586,57 @@ class CastPollVoteRequest(DataClassJsonMixin): @dataclass -class Channel(DataClassJsonMixin): - auto_translation_language: str = dc_field( - metadata=dc_config(field_name="auto_translation_language") - ) - cid: str = dc_field(metadata=dc_config(field_name="cid")) - created_at: datetime = dc_field( +class ChannelBatchCompletedEvent(DataClassJsonMixin): + batch_created_at: datetime = dc_field( metadata=dc_config( - field_name="created_at", + field_name="batch_created_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ) ) - disabled: bool = dc_field(metadata=dc_config(field_name="disabled")) - frozen: bool = dc_field(metadata=dc_config(field_name="frozen")) - id: str = dc_field(metadata=dc_config(field_name="id")) - type: str = dc_field(metadata=dc_config(field_name="type")) - updated_at: datetime = dc_field( + created_at: datetime = dc_field( metadata=dc_config( - field_name="updated_at", + field_name="created_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ) ) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - auto_translation_enabled: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="auto_translation_enabled") - ) - cooldown: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="cooldown") - ) - deleted_at: Optional[datetime] = dc_field( - default=None, + finished_at: datetime = dc_field( metadata=dc_config( - field_name="deleted_at", + field_name="finished_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), - ), - ) - last_campaigns: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="last_campaigns") + ) ) - last_message_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="last_message_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), + operation: str = dc_field(metadata=dc_config(field_name="operation")) + status: str = dc_field(metadata=dc_config(field_name="status")) + success_channels_count: int = dc_field( + metadata=dc_config(field_name="success_channels_count") ) - member_count: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="member_count") + task_id: str = dc_field(metadata=dc_config(field_name="task_id")) + failed_channels: "List[FailedChannelUpdates]" = dc_field( + metadata=dc_config(field_name="failed_channels") ) - message_count: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="message_count") + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="channel_batch_update.completed", metadata=dc_config(field_name="type") ) - message_count_updated_at: Optional[datetime] = dc_field( + received_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="message_count_updated_at", + field_name="received_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - active_live_locations: "Optional[List[SharedLocation]]" = dc_field( - default=None, metadata=dc_config(field_name="active_live_locations") - ) - filter_tags: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="filter_tags") - ) - invites: "Optional[List[ChannelMember]]" = dc_field( - default=None, metadata=dc_config(field_name="invites") - ) - members: "Optional[List[ChannelMember]]" = dc_field( - default=None, metadata=dc_config(field_name="members") - ) - config: "Optional[ChannelConfig]" = dc_field( - default=None, metadata=dc_config(field_name="config") - ) - config_overrides: "Optional[ConfigOverrides]" = dc_field( - default=None, metadata=dc_config(field_name="config_overrides") - ) - created_by: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="created_by") - ) - members_lookup: "Optional[Dict[str, Optional[ChannelMemberLookup]]]" = dc_field( - default=None, metadata=dc_config(field_name="members_lookup") - ) - truncated_by: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="truncated_by") - ) @dataclass -class ChannelBatchCompletedEvent(DataClassJsonMixin): - batch_created_at: datetime = dc_field( - metadata=dc_config( - field_name="batch_created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - finished_at: datetime = dc_field( - metadata=dc_config( - field_name="finished_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - operation: str = dc_field(metadata=dc_config(field_name="operation")) - status: str = dc_field(metadata=dc_config(field_name="status")) - success_channels_count: int = dc_field( - metadata=dc_config(field_name="success_channels_count") - ) - task_id: str = dc_field(metadata=dc_config(field_name="task_id")) - failed_channels: "List[FailedChannelUpdates]" = dc_field( - metadata=dc_config(field_name="failed_channels") - ) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - type: str = dc_field( - default="channel_batch_update.completed", metadata=dc_config(field_name="type") - ) - received_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="received_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - - -@dataclass -class ChannelBatchStartedEvent(DataClassJsonMixin): +class ChannelBatchStartedEvent(DataClassJsonMixin): batch_created_at: datetime = dc_field( metadata=dc_config( field_name="batch_created_at", @@ -4750,6 +4750,9 @@ class ChannelConfig(DataClassJsonMixin): partition_ttl: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="partition_ttl") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) @@ -4826,6 +4829,9 @@ class ChannelConfigWithInfo(DataClassJsonMixin): partition_ttl: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="partition_ttl") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) @@ -4850,19 +4856,44 @@ class ChannelCreatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.created", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) @dataclass class ChannelDeletedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_member_count: int = dc_field( - metadata=dc_config(field_name="channel_member_count") - ) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -4871,12 +4902,39 @@ class ChannelDeletedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.deleted", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - channel: "Optional[ChannelResponse]" = dc_field( - default=None, metadata=dc_config(field_name="channel") + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") ) @@ -4907,9 +4965,6 @@ class ChannelExport(DataClassJsonMixin): @dataclass class ChannelFrozenEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -4918,9 +4973,26 @@ class ChannelFrozenEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.frozen", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) @dataclass @@ -4950,12 +5022,6 @@ class ChannelGetOrCreateRequest(DataClassJsonMixin): @dataclass class ChannelHiddenEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_member_count: int = dc_field( - metadata=dc_config(field_name="channel_member_count") - ) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) clear_history: bool = dc_field(metadata=dc_config(field_name="clear_history")) created_at: datetime = dc_field( metadata=dc_config( @@ -4965,13 +5031,38 @@ class ChannelHiddenEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.hidden", metadata=dc_config(field_name="type") ) - channel: "Optional[ChannelResponse]" = dc_field( - default=None, metadata=dc_config(field_name="channel") + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") ) - user: "Optional[User]" = dc_field( + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -5032,16 +5123,16 @@ class ChannelInputRequest(DataClassJsonMixin): default=None, metadata=dc_config(field_name="frozen") ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - invites: "Optional[List[ChannelMember]]" = dc_field( + invites: "Optional[List[ChannelMemberRequest]]" = dc_field( default=None, metadata=dc_config(field_name="invites") ) - members: "Optional[List[ChannelMember]]" = dc_field( + members: "Optional[List[ChannelMemberRequest]]" = dc_field( default=None, metadata=dc_config(field_name="members") ) - config_overrides: "Optional[ConfigOverrides]" = dc_field( + config_overrides: "Optional[ConfigOverridesRequest]" = dc_field( default=None, metadata=dc_config(field_name="config_overrides") ) - created_by: "Optional[User]" = dc_field( + created_by: "Optional[UserRequest]" = dc_field( default=None, metadata=dc_config(field_name="created_by") ) custom: Optional[Dict[str, object]] = dc_field( @@ -5050,38 +5141,57 @@ class ChannelInputRequest(DataClassJsonMixin): @dataclass -class ChannelMember(DataClassJsonMixin): - archived_at: Optional[datetime] = dc_field( - default=None, +class ChannelMemberRequest(DataClassJsonMixin): + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + channel_role: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_role") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + user: "Optional[UserResponse]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class ChannelMemberResponse(DataClassJsonMixin): + banned: bool = dc_field(metadata=dc_config(field_name="banned")) + channel_role: str = dc_field(metadata=dc_config(field_name="channel_role")) + created_at: datetime = dc_field( metadata=dc_config( - field_name="archived_at", + field_name="created_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), - ), + ) ) - ban_expires: Optional[datetime] = dc_field( + notifications_muted: bool = dc_field( + metadata=dc_config(field_name="notifications_muted") + ) + shadow_banned: bool = dc_field(metadata=dc_config(field_name="shadow_banned")) + updated_at: datetime = dc_field( + metadata=dc_config( + field_name="updated_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + archived_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="ban_expires", + field_name="archived_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - banned: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="banned") - ) - blocked: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="blocked") - ) - channel_role: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="channel_role") - ) - created_at: Optional[datetime] = dc_field( + ban_expires: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="created_at", + field_name="ban_expires", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), @@ -5096,9 +5206,6 @@ class ChannelMember(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) - hidden: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="hidden") - ) invite_accepted_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -5120,15 +5227,9 @@ class ChannelMember(DataClassJsonMixin): invited: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="invited") ) - is_global_banned: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="is_global_banned") - ) is_moderator: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="is_moderator") ) - notifications_muted: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="notifications_muted") - ) pinned_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -5138,92 +5239,31 @@ class ChannelMember(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) - shadow_banned: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="shadow_banned") - ) + role: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="role")) status: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="status") ) - updated_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="updated_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") ) deleted_messages: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="deleted_messages") ) - channel: "Optional[DenormalizedChannelFields]" = dc_field( - default=None, metadata=dc_config(field_name="channel") - ) - custom: Optional[Dict[str, object]] = dc_field( - default=None, metadata=dc_config(field_name="custom") - ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponse]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @dataclass -class ChannelMemberLookup(DataClassJsonMixin): - archived: bool = dc_field(metadata=dc_config(field_name="archived")) - banned: bool = dc_field(metadata=dc_config(field_name="banned")) - blocked: bool = dc_field(metadata=dc_config(field_name="blocked")) - hidden: bool = dc_field(metadata=dc_config(field_name="hidden")) - pinned: bool = dc_field(metadata=dc_config(field_name="pinned")) - archived_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="archived_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - ban_expires: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="ban_expires", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - pinned_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="pinned_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - - -@dataclass -class ChannelMemberRequest(DataClassJsonMixin): - user_id: str = dc_field(metadata=dc_config(field_name="user_id")) - channel_role: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="channel_role") - ) - custom: Optional[Dict[str, object]] = dc_field( - default=None, metadata=dc_config(field_name="custom") - ) - user: "Optional[UserResponse]" = dc_field( - default=None, metadata=dc_config(field_name="user") +class ChannelMessagesResponse(DataClassJsonMixin): + messages: "List[MessageResponse]" = dc_field( + metadata=dc_config(field_name="messages") ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) @dataclass -class ChannelMemberResponse(DataClassJsonMixin): - banned: bool = dc_field(metadata=dc_config(field_name="banned")) - channel_role: str = dc_field(metadata=dc_config(field_name="channel_role")) +class ChannelMute(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -5232,10 +5272,6 @@ class ChannelMemberResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - notifications_muted: bool = dc_field( - metadata=dc_config(field_name="notifications_muted") - ) - shadow_banned: bool = dc_field(metadata=dc_config(field_name="shadow_banned")) updated_at: datetime = dc_field( metadata=dc_config( field_name="updated_at", @@ -5244,76 +5280,17 @@ class ChannelMemberResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - archived_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="archived_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - ban_expires: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="ban_expires", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - deleted_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="deleted_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - invite_accepted_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="invite_accepted_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - invite_rejected_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="invite_rejected_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - invited: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="invited") - ) - is_moderator: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="is_moderator") - ) - pinned_at: Optional[datetime] = dc_field( + expires: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="pinned_at", + field_name="expires", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - role: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="role")) - status: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="status") - ) - user_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="user_id") - ) - deleted_messages: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="deleted_messages") + channel: "Optional[ChannelResponse]" = dc_field( + default=None, metadata=dc_config(field_name="channel") ) user: "Optional[UserResponse]" = dc_field( default=None, metadata=dc_config(field_name="user") @@ -5321,15 +5298,7 @@ class ChannelMemberResponse(DataClassJsonMixin): @dataclass -class ChannelMessages(DataClassJsonMixin): - messages: "List[Message]" = dc_field(metadata=dc_config(field_name="messages")) - channel: "Optional[ChannelResponse]" = dc_field( - default=None, metadata=dc_config(field_name="channel") - ) - - -@dataclass -class ChannelMute(DataClassJsonMixin): +class ChannelMutedEvent(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -5338,42 +5307,26 @@ class ChannelMute(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - updated_at: datetime = dc_field( - metadata=dc_config( - field_name="updated_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - expires: Optional[datetime] = dc_field( + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field(default="channel.muted", metadata=dc_config(field_name="type")) + received_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="expires", + field_name="received_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - channel: "Optional[ChannelResponse]" = dc_field( - default=None, metadata=dc_config(field_name="channel") + mutes: "Optional[List[ChannelMute]]" = dc_field( + default=None, metadata=dc_config(field_name="mutes") ) - user: "Optional[UserResponse]" = dc_field( - default=None, metadata=dc_config(field_name="user") + mute: "Optional[ChannelMute]" = dc_field( + default=None, metadata=dc_config(field_name="mute") ) - - -@dataclass -class ChannelMutedEvent(DataClassJsonMixin): - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") ) - type: str = dc_field(default="channel.muted", metadata=dc_config(field_name="type")) ChannelOwnCapabilityType = NewType("ChannelOwnCapabilityType", str) @@ -5421,22 +5374,6 @@ class ChannelOwnCapability: UPLOAD_FILE: Final[ChannelOwnCapabilityType] = "upload-file" -@dataclass -class ChannelPushPreferences(DataClassJsonMixin): - chat_level: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="chat_level") - ) - disabled_until: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="disabled_until", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - - @dataclass class ChannelPushPreferencesResponse(DataClassJsonMixin): chat_level: Optional[str] = dc_field( @@ -5680,12 +5617,6 @@ class ChannelStateResponseFields(DataClassJsonMixin): @dataclass class ChannelTruncatedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_member_count: int = dc_field( - metadata=dc_config(field_name="channel_member_count") - ) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -5694,11 +5625,45 @@ class ChannelTruncatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.truncated", metadata=dc_config(field_name="type") ) - channel: "Optional[ChannelResponse]" = dc_field( - default=None, metadata=dc_config(field_name="channel") + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="message_id") + ) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + message: "Optional[MessageResponse]" = dc_field( + default=None, metadata=dc_config(field_name="message") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") ) @@ -5771,6 +5736,9 @@ class ChannelTypeConfig(DataClassJsonMixin): partition_ttl: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="partition_ttl") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) @@ -5784,9 +5752,6 @@ class ChannelTypeConfig(DataClassJsonMixin): @dataclass class ChannelUnFrozenEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -5795,9 +5760,26 @@ class ChannelUnFrozenEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.unfrozen", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) @dataclass @@ -5810,19 +5792,32 @@ class ChannelUnmutedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.unmuted", metadata=dc_config(field_name="type") ) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + mutes: "Optional[List[ChannelMute]]" = dc_field( + default=None, metadata=dc_config(field_name="mutes") + ) + mute: "Optional[ChannelMute]" = dc_field( + default=None, metadata=dc_config(field_name="mute") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) @dataclass class ChannelUpdatedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_member_count: int = dc_field( - metadata=dc_config(field_name="channel_member_count") - ) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -5831,26 +5826,50 @@ class ChannelUpdatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.updated", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="message_id") + ) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - channel: "Optional[ChannelResponse]" = dc_field( - default=None, metadata=dc_config(field_name="channel") + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") ) - message: "Optional[Message]" = dc_field( + message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="message") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @dataclass class ChannelVisibleEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -5859,10 +5878,38 @@ class ChannelVisibleEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="channel.visible", metadata=dc_config(field_name="type") ) - user: "Optional[User]" = dc_field( + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -6378,6 +6425,15 @@ class CommentResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + edited_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="edited_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) parent_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="parent_id") ) @@ -6394,7 +6450,7 @@ class CommentResponse(DataClassJsonMixin): moderation: "Optional[ModerationV2Response]" = dc_field( default=None, metadata=dc_config(field_name="moderation") ) - reaction_groups: "Optional[Dict[str, Optional[ReactionGroupResponse]]]" = dc_field( + reaction_groups: "Optional[Dict[str, FeedsReactionGroupResponse]]" = dc_field( default=None, metadata=dc_config(field_name="reaction_groups") ) @@ -6443,7 +6499,7 @@ class CompositeRecordingResponse(DataClassJsonMixin): @dataclass -class ConfigOverrides(DataClassJsonMixin): +class ConfigOverridesRequest(DataClassJsonMixin): blocklist: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="blocklist") ) @@ -6559,7 +6615,7 @@ class ContentCountRuleParameters(DataClassJsonMixin): @dataclass -class Coordinates(DataClassJsonMixin): +class CoordinatesResponse(DataClassJsonMixin): latitude: float = dc_field(metadata=dc_config(field_name="latitude")) longitude: float = dc_field(metadata=dc_config(field_name="longitude")) @@ -6608,7 +6664,7 @@ class CreateCallTypeRequest(DataClassJsonMixin): grants: "Optional[Dict[str, List[str]]]" = dc_field( default=None, metadata=dc_config(field_name="grants") ) - notification_settings: "Optional[NotificationSettings]" = dc_field( + notification_settings: "Optional[NotificationSettingsRequest]" = dc_field( default=None, metadata=dc_config(field_name="notification_settings") ) settings: "Optional[CallSettingsRequest]" = dc_field( @@ -6637,7 +6693,7 @@ class CreateCallTypeResponse(DataClassJsonMixin): ) ) grants: "Dict[str, List[str]]" = dc_field(metadata=dc_config(field_name="grants")) - notification_settings: "NotificationSettings" = dc_field( + notification_settings: "NotificationSettingsResponse" = dc_field( metadata=dc_config(field_name="notification_settings") ) settings: "CallSettingsResponse" = dc_field( @@ -6692,6 +6748,9 @@ class CreateChannelTypeRequest(DataClassJsonMixin): polls: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="polls") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) push_notifications: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="push_notifications") ) @@ -6810,6 +6869,9 @@ class CreateChannelTypeResponse(DataClassJsonMixin): partition_ttl: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="partition_ttl") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) @@ -7175,7 +7237,7 @@ class CreateSIPTrunkResponse(DataClassJsonMixin): @dataclass -class CustomActionRequest(DataClassJsonMixin): +class CustomActionRequestPayload(DataClassJsonMixin): id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) options: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="options") @@ -7207,7 +7269,7 @@ class CustomCheckRequest(DataClassJsonMixin): user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") ) - moderation_payload: "Optional[ModerationPayload]" = dc_field( + moderation_payload: "Optional[ModerationPayloadRequest]" = dc_field( default=None, metadata=dc_config(field_name="moderation_payload") ) user: "Optional[UserRequest]" = dc_field( @@ -7225,6 +7287,29 @@ class CustomCheckResponse(DataClassJsonMixin): ) +@dataclass +class CustomEvent(DataClassJsonMixin): + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field(default="*", metadata=dc_config(field_name="type")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + + @dataclass class CustomVideoEvent(DataClassJsonMixin): call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) @@ -7370,6 +7455,9 @@ class DecayFunctionConfig(DataClassJsonMixin): @dataclass class DeleteActivitiesRequest(DataClassJsonMixin): ids: List[str] = dc_field(metadata=dc_config(field_name="ids")) + delete_notification_activity: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="delete_notification_activity") + ) hard_delete: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hard_delete") ) @@ -7397,7 +7485,7 @@ class DeleteActivityReactionResponse(DataClassJsonMixin): @dataclass -class DeleteActivityRequest(DataClassJsonMixin): +class DeleteActivityRequestPayload(DataClassJsonMixin): hard_delete: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hard_delete") ) @@ -7492,7 +7580,7 @@ class DeleteCommentReactionResponse(DataClassJsonMixin): @dataclass -class DeleteCommentRequest(DataClassJsonMixin): +class DeleteCommentRequestPayload(DataClassJsonMixin): hard_delete: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hard_delete") ) @@ -7562,7 +7650,7 @@ class DeleteImportV2TaskResponse(DataClassJsonMixin): @dataclass -class DeleteMessageRequest(DataClassJsonMixin): +class DeleteMessageRequestPayload(DataClassJsonMixin): hard_delete: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hard_delete") ) @@ -7593,7 +7681,7 @@ class DeleteModerationTemplateResponse(DataClassJsonMixin): @dataclass -class DeleteReactionRequest(DataClassJsonMixin): +class DeleteReactionRequestPayload(DataClassJsonMixin): hard_delete: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="hard_delete") ) @@ -7640,7 +7728,7 @@ class DeleteTranscriptionResponse(DataClassJsonMixin): @dataclass -class DeleteUserRequest(DataClassJsonMixin): +class DeleteUserRequestPayload(DataClassJsonMixin): delete_conversation_channels: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="delete_conversation_channels") ) @@ -7694,13 +7782,6 @@ class DeliveredMessagePayload(DataClassJsonMixin): id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) -@dataclass -class DeliveryReceipts(DataClassJsonMixin): - enabled: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="enabled") - ) - - @dataclass class DeliveryReceiptsResponse(DataClassJsonMixin): enabled: Optional[bool] = dc_field( @@ -7708,62 +7789,6 @@ class DeliveryReceiptsResponse(DataClassJsonMixin): ) -@dataclass -class DenormalizedChannelFields(DataClassJsonMixin): - created_at: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="created_at") - ) - created_by_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="created_by_id") - ) - disabled: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="disabled") - ) - frozen: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="frozen") - ) - id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) - last_message_at: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="last_message_at") - ) - member_count: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="member_count") - ) - team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) - updated_at: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="updated_at") - ) - custom: Optional[Dict[str, object]] = dc_field( - default=None, metadata=dc_config(field_name="custom") - ) - - -@dataclass -class Device(DataClassJsonMixin): - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - id: str = dc_field(metadata=dc_config(field_name="id")) - push_provider: str = dc_field(metadata=dc_config(field_name="push_provider")) - user_id: str = dc_field(metadata=dc_config(field_name="user_id")) - disabled: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="disabled") - ) - disabled_reason: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="disabled_reason") - ) - push_provider_name: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="push_provider_name") - ) - voip: Optional[bool] = dc_field(default=None, metadata=dc_config(field_name="voip")) - - @dataclass class DeviceDataResponse(DataClassJsonMixin): name: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="name")) @@ -8299,6 +8324,26 @@ class EventNotificationSettings(DataClassJsonMixin): fcm: "FCM" = dc_field(metadata=dc_config(field_name="fcm")) +@dataclass +class EventNotificationSettingsRequest(DataClassJsonMixin): + enabled: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="enabled") + ) + apns: "Optional[APNSPayload]" = dc_field( + default=None, metadata=dc_config(field_name="apns") + ) + fcm: "Optional[FCMPayload]" = dc_field( + default=None, metadata=dc_config(field_name="fcm") + ) + + +@dataclass +class EventNotificationSettingsResponse(DataClassJsonMixin): + enabled: bool = dc_field(metadata=dc_config(field_name="enabled")) + apns: "APNSPayload" = dc_field(metadata=dc_config(field_name="apns")) + fcm: "FCMPayload" = dc_field(metadata=dc_config(field_name="fcm")) + + @dataclass class EventRequest(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) @@ -8401,6 +8446,13 @@ class FCM(DataClassJsonMixin): ) +@dataclass +class FCMPayload(DataClassJsonMixin): + data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="data") + ) + + @dataclass class FailedChannelUpdates(DataClassJsonMixin): reason: str = dc_field(metadata=dc_config(field_name="reason")) @@ -9125,9 +9177,11 @@ class FeedVisibilityResponse(DataClassJsonMixin): @dataclass -class FeedsModerationTemplateConfig(DataClassJsonMixin): - config_key: str = dc_field(metadata=dc_config(field_name="config_key")) +class FeedsModerationTemplateConfigPayload(DataClassJsonMixin): data_types: "Dict[str, str]" = dc_field(metadata=dc_config(field_name="data_types")) + config_key: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="config_key") + ) @dataclass @@ -9163,6 +9217,9 @@ class FeedsPreferencesResponse(DataClassJsonMixin): comment_reaction: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="comment_reaction") ) + comment_reply: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="comment_reply") + ) follow: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="follow") ) @@ -9177,6 +9234,27 @@ class FeedsPreferencesResponse(DataClassJsonMixin): ) +@dataclass +class FeedsReactionGroupResponse(DataClassJsonMixin): + count: int = dc_field(metadata=dc_config(field_name="count")) + first_reaction_at: datetime = dc_field( + metadata=dc_config( + field_name="first_reaction_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + last_reaction_at: datetime = dc_field( + metadata=dc_config( + field_name="last_reaction_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + + @dataclass class FeedsReactionResponse(DataClassJsonMixin): activity_id: str = dc_field(metadata=dc_config(field_name="activity_id")) @@ -9298,7 +9376,25 @@ class FirebaseConfigFields(DataClassJsonMixin): @dataclass -class Flag(DataClassJsonMixin): +class FlagCountRuleParameters(DataClassJsonMixin): + threshold: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="threshold") + ) + + +@dataclass +class FlagDetailsResponse(DataClassJsonMixin): + original_text: str = dc_field(metadata=dc_config(field_name="original_text")) + automod: "Optional[AutomodDetailsResponse]" = dc_field( + default=None, metadata=dc_config(field_name="automod") + ) + extra: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="extra") + ) + + +@dataclass +class FlagFeedbackResponse(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -9307,122 +9403,32 @@ class Flag(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - created_by_automod: bool = dc_field( - metadata=dc_config(field_name="created_by_automod") + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + labels: "List[LabelResponse]" = dc_field(metadata=dc_config(field_name="labels")) + + +@dataclass +class FlagMessageDetailsResponse(DataClassJsonMixin): + pin_changed: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="pin_changed") ) - updated_at: datetime = dc_field( - metadata=dc_config( - field_name="updated_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) + should_enrich: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="should_enrich") ) - approved_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="approved_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - reason: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="reason") - ) - rejected_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="rejected_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - reviewed_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="reviewed_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - reviewed_by: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="reviewed_by") - ) - target_message_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="target_message_id") - ) - custom: Optional[Dict[str, object]] = dc_field( - default=None, metadata=dc_config(field_name="custom") - ) - details: "Optional[FlagDetails]" = dc_field( - default=None, metadata=dc_config(field_name="details") - ) - target_message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="target_message") - ) - target_user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="target_user") - ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - -@dataclass -class FlagCountRuleParameters(DataClassJsonMixin): - threshold: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="threshold") - ) - - -@dataclass -class FlagDetails(DataClassJsonMixin): - original_text: str = dc_field(metadata=dc_config(field_name="original_text")) - extra: Dict[str, object] = dc_field(metadata=dc_config(field_name="Extra")) - automod: "Optional[AutomodDetails]" = dc_field( - default=None, metadata=dc_config(field_name="automod") - ) - - -@dataclass -class FlagFeedback(DataClassJsonMixin): - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - message_id: str = dc_field(metadata=dc_config(field_name="message_id")) - labels: "List[Label]" = dc_field(metadata=dc_config(field_name="labels")) - - -@dataclass -class FlagMessageDetails(DataClassJsonMixin): - pin_changed: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="pin_changed") - ) - should_enrich: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="should_enrich") - ) - skip_push: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="skip_push") - ) - updated_by_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="updated_by_id") - ) - - -@dataclass -class FlagRequest(DataClassJsonMixin): - entity_id: str = dc_field(metadata=dc_config(field_name="entity_id")) - entity_type: str = dc_field(metadata=dc_config(field_name="entity_type")) - entity_creator_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="entity_creator_id") + skip_push: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="skip_push") + ) + updated_by_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="updated_by_id") + ) + + +@dataclass +class FlagRequest(DataClassJsonMixin): + entity_id: str = dc_field(metadata=dc_config(field_name="entity_id")) + entity_type: str = dc_field(metadata=dc_config(field_name="entity_type")) + entity_creator_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="entity_creator_id") ) reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="reason") @@ -9568,6 +9574,9 @@ class FollowPair(DataClassJsonMixin): class FollowRequest(DataClassJsonMixin): source: str = dc_field(metadata=dc_config(field_name="source")) target: str = dc_field(metadata=dc_config(field_name="target")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) create_notification_activity: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="create_notification_activity") ) @@ -9577,6 +9586,9 @@ class FollowRequest(DataClassJsonMixin): skip_push: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_push") ) + status: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="status") + ) custom: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="custom") ) @@ -9696,6 +9708,17 @@ class FrameRecordingSettingsResponse(DataClassJsonMixin): ) +@dataclass +class FriendReactionsOptions(DataClassJsonMixin): + enabled: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="enabled") + ) + limit: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="limit") + ) + type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) + + @dataclass class FullUserResponse(DataClassJsonMixin): banned: bool = dc_field(metadata=dc_config(field_name="banned")) @@ -9800,6 +9823,39 @@ class FullUserResponse(DataClassJsonMixin): ) +@dataclass +class FutureChannelBanResponse(DataClassJsonMixin): + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + expires: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="expires", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) + shadow: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="shadow") + ) + banned_by: "Optional[UserResponse]" = dc_field( + default=None, metadata=dc_config(field_name="banned_by") + ) + user: "Optional[UserResponse]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + @dataclass class GeofenceResponse(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) @@ -9892,6 +9948,41 @@ class GetBlockedUsersResponse(DataClassJsonMixin): ) +@dataclass +class GetCallParticipantSessionMetricsResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + is_publisher: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="is_publisher") + ) + is_subscriber: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="is_subscriber") + ) + joined_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="joined_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + publisher_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="publisher_type") + ) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") + ) + user_session_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_session_id") + ) + published_tracks: "Optional[List[PublishedTrackMetrics]]" = dc_field( + default=None, metadata=dc_config(field_name="published_tracks") + ) + client: "Optional[SessionClient]" = dc_field( + default=None, metadata=dc_config(field_name="client") + ) + + @dataclass class GetCallReportResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -9961,7 +10052,7 @@ class GetCallTypeResponse(DataClassJsonMixin): ) ) grants: "Dict[str, List[str]]" = dc_field(metadata=dc_config(field_name="grants")) - notification_settings: "NotificationSettings" = dc_field( + notification_settings: "NotificationSettingsResponse" = dc_field( metadata=dc_config(field_name="notification_settings") ) settings: "CallSettingsResponse" = dc_field( @@ -10053,6 +10144,9 @@ class GetChannelTypeResponse(DataClassJsonMixin): partition_ttl: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="partition_ttl") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) @@ -10168,16 +10262,16 @@ class GetFeedVisibilityResponse(DataClassJsonMixin): @dataclass class GetFeedsRateLimitsResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - android: "Optional[Dict[str, LimitInfo]]" = dc_field( + android: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="android") ) - ios: "Optional[Dict[str, LimitInfo]]" = dc_field( + ios: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="ios") ) - server_side: "Optional[Dict[str, LimitInfo]]" = dc_field( + server_side: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="server_side") ) - web: "Optional[Dict[str, LimitInfo]]" = dc_field( + web: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="web") ) @@ -10424,6 +10518,9 @@ class GetOrCreateFeedRequest(DataClassJsonMixin): following_pagination: "Optional[PagerRequest]" = dc_field( default=None, metadata=dc_config(field_name="following_pagination") ) + friend_reactions_options: "Optional[FriendReactionsOptions]" = dc_field( + default=None, metadata=dc_config(field_name="friend_reactions_options") + ) interest_weights: "Optional[Dict[str, float]]" = dc_field( default=None, metadata=dc_config(field_name="interest_weights") ) @@ -10497,7 +10594,7 @@ class GetOrCreateFeedViewResponse(DataClassJsonMixin): @dataclass class GetPushTemplatesResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - templates: "List[PushTemplate]" = dc_field( + templates: "List[PushTemplateResponse]" = dc_field( metadata=dc_config(field_name="templates") ) @@ -10505,16 +10602,16 @@ class GetPushTemplatesResponse(DataClassJsonMixin): @dataclass class GetRateLimitsResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - android: "Optional[Dict[str, LimitInfo]]" = dc_field( + android: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="android") ) - ios: "Optional[Dict[str, LimitInfo]]" = dc_field( + ios: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="ios") ) - server_side: "Optional[Dict[str, LimitInfo]]" = dc_field( + server_side: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="server_side") ) - web: "Optional[Dict[str, LimitInfo]]" = dc_field( + web: "Optional[Dict[str, LimitInfoResponse]]" = dc_field( default=None, metadata=dc_config(field_name="web") ) @@ -10887,6 +10984,8 @@ class ImportV2TaskItem(DataClassJsonMixin): @dataclass class ImportV2TaskSettings(DataClassJsonMixin): + mode: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="mode")) + path: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="path")) skip_references_check: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_references_check") ) @@ -10949,6 +11048,26 @@ class IngressAudioEncodingResponse(DataClassJsonMixin): enable_dtx: bool = dc_field(metadata=dc_config(field_name="enable_dtx")) +@dataclass +class IngressErrorEvent(DataClassJsonMixin): + call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + error: str = dc_field(metadata=dc_config(field_name="error")) + ingress_stream_id: str = dc_field( + metadata=dc_config(field_name="ingress_stream_id") + ) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + type: str = dc_field(default="ingress.error", metadata=dc_config(field_name="type")) + code: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="code")) + + @dataclass class IngressSettings(DataClassJsonMixin): enabled: bool = dc_field(metadata=dc_config(field_name="enabled")) @@ -11005,6 +11124,56 @@ class IngressSourceResponse(DataClassJsonMixin): width: int = dc_field(metadata=dc_config(field_name="width")) +@dataclass +class IngressStartedEvent(DataClassJsonMixin): + call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + ingress_stream_id: str = dc_field( + metadata=dc_config(field_name="ingress_stream_id") + ) + publisher_type: str = dc_field(metadata=dc_config(field_name="publisher_type")) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + type: str = dc_field( + default="ingress.started", metadata=dc_config(field_name="type") + ) + client_ip: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="client_ip") + ) + client_name: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="client_name") + ) + version: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="version") + ) + + +@dataclass +class IngressStoppedEvent(DataClassJsonMixin): + call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + ingress_stream_id: str = dc_field( + metadata=dc_config(field_name="ingress_stream_id") + ) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + type: str = dc_field( + default="ingress.stopped", metadata=dc_config(field_name="type") + ) + + @dataclass class IngressVideoEncodingOptions(DataClassJsonMixin): layers: "List[IngressVideoLayer]" = dc_field( @@ -11138,7 +11307,7 @@ class LLMRule(DataClassJsonMixin): @dataclass -class Label(DataClassJsonMixin): +class LabelResponse(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) harm_labels: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="harm_labels") @@ -11202,7 +11371,7 @@ class LayoutSettingsResponse(DataClassJsonMixin): @dataclass -class LimitInfo(DataClassJsonMixin): +class LimitInfoResponse(DataClassJsonMixin): limit: int = dc_field(metadata=dc_config(field_name="limit")) remaining: int = dc_field(metadata=dc_config(field_name="remaining")) reset: int = dc_field(metadata=dc_config(field_name="reset")) @@ -11397,7 +11566,7 @@ class ListTranscriptionsResponse(DataClassJsonMixin): @dataclass -class Location(DataClassJsonMixin): +class LocationResponse(DataClassJsonMixin): continent_code: str = dc_field(metadata=dc_config(field_name="continent_code")) country_iso_code: str = dc_field(metadata=dc_config(field_name="country_iso_code")) subdivision_iso_code: str = dc_field( @@ -11474,13 +11643,51 @@ class MarkReadRequest(DataClassJsonMixin): @dataclass class MarkReadResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - event: "Optional[MessageReadEvent]" = dc_field( + event: "Optional[MarkReadResponseEvent]" = dc_field( default=None, metadata=dc_config(field_name="event") ) @dataclass -class MarkReviewedRequest(DataClassJsonMixin): +class MarkReadResponseEvent(DataClassJsonMixin): + channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) + channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) + cid: str = dc_field(metadata=dc_config(field_name="cid")) + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + type: str = dc_field(metadata=dc_config(field_name="type")) + channel_last_message_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="channel_last_message_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + last_read_message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="last_read_message_id") + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel: "Optional[ChannelResponse]" = dc_field( + default=None, metadata=dc_config(field_name="channel") + ) + thread: "Optional[ThreadResponse]" = dc_field( + default=None, metadata=dc_config(field_name="thread") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class MarkReviewedRequestPayload(DataClassJsonMixin): content_to_mark_as_reviewed_limit: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="content_to_mark_as_reviewed_limit") ) @@ -11519,10 +11726,7 @@ class MarkUnreadRequest(DataClassJsonMixin): @dataclass -class MemberAddedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) +class MaxStreakChangedEvent(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -11531,21 +11735,68 @@ class MemberAddedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - type: str = dc_field(default="member.added", metadata=dc_config(field_name="type")) - team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - member: "Optional[ChannelMember]" = dc_field( - default=None, metadata=dc_config(field_name="member") + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="channel.max_streak_changed", metadata=dc_config(field_name="type") ) - user: "Optional[User]" = dc_field( + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + + +@dataclass +class MemberAddedEvent(DataClassJsonMixin): + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + member: "ChannelMemberResponse" = dc_field(metadata=dc_config(field_name="member")) + type: str = dc_field(default="member.added", metadata=dc_config(field_name="type")) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @dataclass class MemberRemovedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -11554,13 +11805,39 @@ class MemberRemovedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + member: "ChannelMemberResponse" = dc_field(metadata=dc_config(field_name="member")) type: str = dc_field( default="member.removed", metadata=dc_config(field_name="type") ) - member: "Optional[ChannelMember]" = dc_field( - default=None, metadata=dc_config(field_name="member") + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") ) - user: "Optional[User]" = dc_field( + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -11609,9 +11886,6 @@ class MemberResponse(DataClassJsonMixin): @dataclass class MemberUpdatedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -11620,14 +11894,39 @@ class MemberUpdatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + member: "ChannelMemberResponse" = dc_field(metadata=dc_config(field_name="member")) type: str = dc_field( default="member.updated", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - member: "Optional[ChannelMember]" = dc_field( - default=None, metadata=dc_config(field_name="member") + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -11671,250 +11970,129 @@ class MembershipLevelResponse(DataClassJsonMixin): @dataclass -class Message(DataClassJsonMixin): - cid: str = dc_field(metadata=dc_config(field_name="cid")) - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) +class MessageActionRequest(DataClassJsonMixin): + form_data: "Dict[str, str]" = dc_field(metadata=dc_config(field_name="form_data")) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") ) - deleted_reply_count: int = dc_field( - metadata=dc_config(field_name="deleted_reply_count") + user: "Optional[UserRequest]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class MessageActionResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + message: "Optional[MessageResponse]" = dc_field( + default=None, metadata=dc_config(field_name="message") + ) + + +@dataclass +class MessageChangeSet(DataClassJsonMixin): + attachments: bool = dc_field(metadata=dc_config(field_name="attachments")) + custom: bool = dc_field(metadata=dc_config(field_name="custom")) + html: bool = dc_field(metadata=dc_config(field_name="html")) + mentioned_user_ids: bool = dc_field( + metadata=dc_config(field_name="mentioned_user_ids") + ) + mml: bool = dc_field(metadata=dc_config(field_name="mml")) + pin: bool = dc_field(metadata=dc_config(field_name="pin")) + quoted_message_id: bool = dc_field( + metadata=dc_config(field_name="quoted_message_id") ) - html: str = dc_field(metadata=dc_config(field_name="html")) - id: str = dc_field(metadata=dc_config(field_name="id")) - pinned: bool = dc_field(metadata=dc_config(field_name="pinned")) - reply_count: int = dc_field(metadata=dc_config(field_name="reply_count")) - shadowed: bool = dc_field(metadata=dc_config(field_name="shadowed")) silent: bool = dc_field(metadata=dc_config(field_name="silent")) - text: str = dc_field(metadata=dc_config(field_name="text")) - type: str = dc_field(metadata=dc_config(field_name="type")) - updated_at: datetime = dc_field( + text: bool = dc_field(metadata=dc_config(field_name="text")) + + +@dataclass +class MessageDeletedEvent(DataClassJsonMixin): + created_at: datetime = dc_field( metadata=dc_config( - field_name="updated_at", + field_name="created_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ) ) - attachments: "List[Attachment]" = dc_field( - metadata=dc_config(field_name="attachments") - ) - latest_reactions: "List[Reaction]" = dc_field( - metadata=dc_config(field_name="latest_reactions") - ) - mentioned_users: "List[User]" = dc_field( - metadata=dc_config(field_name="mentioned_users") - ) - own_reactions: "List[Reaction]" = dc_field( - metadata=dc_config(field_name="own_reactions") - ) - restricted_visibility: List[str] = dc_field( - metadata=dc_config(field_name="restricted_visibility") - ) + hard_delete: bool = dc_field(metadata=dc_config(field_name="hard_delete")) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - reaction_counts: "Dict[str, int]" = dc_field( - metadata=dc_config(field_name="reaction_counts") + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) + type: str = dc_field( + default="message.deleted", metadata=dc_config(field_name="type") ) - reaction_groups: "Dict[str, Optional[ReactionGroupResponse]]" = dc_field( - metadata=dc_config(field_name="reaction_groups") + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") ) - reaction_scores: "Dict[str, int]" = dc_field( - metadata=dc_config(field_name="reaction_scores") + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") ) - before_message_send_failed: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="before_message_send_failed") + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") ) - command: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="command") + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") ) - deleted_at: Optional[datetime] = dc_field( + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + deleted_for_me: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="deleted_for_me") + ) + received_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="deleted_at", + field_name="received_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - deleted_for_me: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="deleted_for_me") + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") ) - message_text_updated_at: Optional[datetime] = dc_field( - default=None, + user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class MessageFlagResponse(DataClassJsonMixin): + created_at: datetime = dc_field( metadata=dc_config( - field_name="message_text_updated_at", + field_name="created_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), - ), + ) ) - mml: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="mml")) - parent_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="parent_id") + created_by_automod: bool = dc_field( + metadata=dc_config(field_name="created_by_automod") ) - pin_expires: Optional[datetime] = dc_field( + updated_at: datetime = dc_field( + metadata=dc_config( + field_name="updated_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + approved_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="pin_expires", + field_name="approved_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - pinned_at: Optional[datetime] = dc_field( + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) + rejected_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="pinned_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - poll_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="poll_id") - ) - quoted_message_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="quoted_message_id") - ) - show_in_channel: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="show_in_channel") - ) - thread_participants: "Optional[List[User]]" = dc_field( - default=None, metadata=dc_config(field_name="thread_participants") - ) - i18n: "Optional[Dict[str, str]]" = dc_field( - default=None, metadata=dc_config(field_name="i18n") - ) - image_labels: "Optional[Dict[str, List[str]]]" = dc_field( - default=None, metadata=dc_config(field_name="image_labels") - ) - member: "Optional[ChannelMember]" = dc_field( - default=None, metadata=dc_config(field_name="member") - ) - moderation: "Optional[ModerationV2Response]" = dc_field( - default=None, metadata=dc_config(field_name="moderation") - ) - pinned_by: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="pinned_by") - ) - poll: "Optional[Poll]" = dc_field( - default=None, metadata=dc_config(field_name="poll") - ) - quoted_message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="quoted_message") - ) - reminder: "Optional[MessageReminder]" = dc_field( - default=None, metadata=dc_config(field_name="reminder") - ) - shared_location: "Optional[SharedLocation]" = dc_field( - default=None, metadata=dc_config(field_name="shared_location") - ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - -@dataclass -class MessageActionRequest(DataClassJsonMixin): - form_data: "Dict[str, str]" = dc_field(metadata=dc_config(field_name="form_data")) - user_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="user_id") - ) - user: "Optional[UserRequest]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - -@dataclass -class MessageChangeSet(DataClassJsonMixin): - attachments: bool = dc_field(metadata=dc_config(field_name="attachments")) - custom: bool = dc_field(metadata=dc_config(field_name="custom")) - html: bool = dc_field(metadata=dc_config(field_name="html")) - mentioned_user_ids: bool = dc_field( - metadata=dc_config(field_name="mentioned_user_ids") - ) - mml: bool = dc_field(metadata=dc_config(field_name="mml")) - pin: bool = dc_field(metadata=dc_config(field_name="pin")) - quoted_message_id: bool = dc_field( - metadata=dc_config(field_name="quoted_message_id") - ) - silent: bool = dc_field(metadata=dc_config(field_name="silent")) - text: bool = dc_field(metadata=dc_config(field_name="text")) - - -@dataclass -class MessageDeletedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - hard_delete: bool = dc_field(metadata=dc_config(field_name="hard_delete")) - type: str = dc_field( - default="message.deleted", metadata=dc_config(field_name="type") - ) - deleted_for_me: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="deleted_for_me") - ) - team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - thread_participants: "Optional[List[User]]" = dc_field( - default=None, metadata=dc_config(field_name="thread_participants") - ) - message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="message") - ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - -@dataclass -class MessageFlagResponse(DataClassJsonMixin): - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - created_by_automod: bool = dc_field( - metadata=dc_config(field_name="created_by_automod") - ) - updated_at: datetime = dc_field( - metadata=dc_config( - field_name="updated_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - approved_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="approved_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - reason: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="reason") - ) - rejected_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="rejected_at", + field_name="rejected_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), @@ -11932,13 +12110,13 @@ class MessageFlagResponse(DataClassJsonMixin): custom: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="custom") ) - details: "Optional[FlagDetails]" = dc_field( + details: "Optional[FlagDetailsResponse]" = dc_field( default=None, metadata=dc_config(field_name="details") ) - message: "Optional[Message]" = dc_field( + message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="message") ) - moderation_feedback: "Optional[FlagFeedback]" = dc_field( + moderation_feedback: "Optional[FlagFeedbackResponse]" = dc_field( default=None, metadata=dc_config(field_name="moderation_feedback") ) moderation_result: "Optional[MessageModerationResult]" = dc_field( @@ -11954,7 +12132,6 @@ class MessageFlagResponse(DataClassJsonMixin): @dataclass class MessageFlaggedEvent(DataClassJsonMixin): - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -11963,19 +12140,53 @@ class MessageFlaggedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) type: str = dc_field( default="message.flagged", metadata=dc_config(field_name="type") ) - thread_participants: "Optional[List[User]]" = dc_field( - default=None, metadata=dc_config(field_name="thread_participants") + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") ) - flag: "Optional[Flag]" = dc_field( - default=None, metadata=dc_config(field_name="flag") + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") ) - message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="message") + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") ) - user: "Optional[User]" = dc_field( + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + total_flags: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="total_flags") + ) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + details: "Optional[MessageModerationResult]" = dc_field( + default=None, metadata=dc_config(field_name="details") + ) + flag: "Optional[FlagResponse]" = dc_field( + default=None, metadata=dc_config(field_name="flag") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -12043,9 +12254,6 @@ class MessageModerationResult(DataClassJsonMixin): @dataclass class MessageNewEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -12054,18 +12262,56 @@ class MessageNewEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) watcher_count: int = dc_field(metadata=dc_config(field_name="watcher_count")) - type: str = dc_field( - default="notification.thread_message_new", metadata=dc_config(field_name="type") + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) + type: str = dc_field(default="message.new", metadata=dc_config(field_name="type")) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + parent_author: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="parent_author") + ) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - thread_participants: "Optional[List[User]]" = dc_field( + total_unread_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="total_unread_count") + ) + unread_channels: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_channels") + ) + unread_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_count") + ) + thread_participants: "Optional[List[UserResponseCommonFields]]" = dc_field( default=None, metadata=dc_config(field_name="thread_participants") ) - message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="message") + channel: "Optional[ChannelResponse]" = dc_field( + default=None, metadata=dc_config(field_name="channel") ) - user: "Optional[User]" = dc_field( + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -12146,9 +12392,6 @@ class MessagePaginationParams(DataClassJsonMixin): @dataclass class MessageReadEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -12157,23 +12400,40 @@ class MessageReadEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field(default="message.read", metadata=dc_config(field_name="type")) - channel_last_message_at: Optional[datetime] = dc_field( + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + last_read_message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="last_read_message_id") + ) + received_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="channel_last_message_at", + field_name="received_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - last_read_message_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="last_read_message_id") - ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) channel: "Optional[ChannelResponse]" = dc_field( default=None, metadata=dc_config(field_name="channel") ) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) thread: "Optional[ThreadResponse]" = dc_field( default=None, metadata=dc_config(field_name="thread") ) @@ -12182,52 +12442,13 @@ class MessageReadEvent(DataClassJsonMixin): ) -@dataclass -class MessageReminder(DataClassJsonMixin): - channel_cid: str = dc_field(metadata=dc_config(field_name="channel_cid")) - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - message_id: str = dc_field(metadata=dc_config(field_name="message_id")) - task_id: str = dc_field(metadata=dc_config(field_name="task_id")) - updated_at: datetime = dc_field( - metadata=dc_config( - field_name="updated_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - user_id: str = dc_field(metadata=dc_config(field_name="user_id")) - remind_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="remind_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - channel: "Optional[Channel]" = dc_field( - default=None, metadata=dc_config(field_name="channel") - ) - message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="message") - ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - @dataclass class MessageRequest(DataClassJsonMixin): html: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="html")) id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) + mentioned_channel: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="mentioned_channel") + ) mml: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="mml")) parent_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="parent_id") @@ -12306,6 +12527,9 @@ class MessageResponse(DataClassJsonMixin): ) html: str = dc_field(metadata=dc_config(field_name="html")) id: str = dc_field(metadata=dc_config(field_name="id")) + mentioned_channel: bool = dc_field( + metadata=dc_config(field_name="mentioned_channel") + ) pinned: bool = dc_field(metadata=dc_config(field_name="pinned")) reply_count: int = dc_field(metadata=dc_config(field_name="reply_count")) shadowed: bool = dc_field(metadata=dc_config(field_name="shadowed")) @@ -12445,7 +12669,6 @@ class MessageStatsResponse(DataClassJsonMixin): @dataclass class MessageUnblockedEvent(DataClassJsonMixin): - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -12454,25 +12677,29 @@ class MessageUnblockedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) type: str = dc_field( default="message.unblocked", metadata=dc_config(field_name="type") ) - thread_participants: "Optional[List[User]]" = dc_field( - default=None, metadata=dc_config(field_name="thread_participants") - ) - message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="message") + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @dataclass class MessageUndeletedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -12481,18 +12708,37 @@ class MessageUndeletedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) type: str = dc_field( default="message.undeleted", metadata=dc_config(field_name="type") ) - team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - thread_participants: "Optional[List[User]]" = dc_field( - default=None, metadata=dc_config(field_name="thread_participants") + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") ) - message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="message") + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") ) @@ -12508,9 +12754,6 @@ class MessageUpdate(DataClassJsonMixin): @dataclass class MessageUpdatedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -12519,17 +12762,42 @@ class MessageUpdatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) type: str = dc_field( default="message.updated", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - thread_participants: "Optional[List[User]]" = dc_field( - default=None, metadata=dc_config(field_name="thread_participants") + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") ) - message: "Optional[Message]" = dc_field( - default=None, metadata=dc_config(field_name="message") + message_update: "Optional[MessageUpdate]" = dc_field( + default=None, metadata=dc_config(field_name="message_update") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -12550,6 +12818,9 @@ class MessageWithChannelResponse(DataClassJsonMixin): ) html: str = dc_field(metadata=dc_config(field_name="html")) id: str = dc_field(metadata=dc_config(field_name="id")) + mentioned_channel: bool = dc_field( + metadata=dc_config(field_name="mentioned_channel") + ) pinned: bool = dc_field(metadata=dc_config(field_name="pinned")) reply_count: int = dc_field(metadata=dc_config(field_name="reply_count")) shadowed: bool = dc_field(metadata=dc_config(field_name="shadowed")) @@ -12704,13 +12975,22 @@ class MetricThreshold(DataClassJsonMixin): @dataclass -class ModerationActionConfig(DataClassJsonMixin): +class MetricTimeSeries(DataClassJsonMixin): + data_points: "Optional[List[List[float]]]" = dc_field( + default=None, metadata=dc_config(field_name="data_points") + ) + + +@dataclass +class ModerationActionConfigResponse(DataClassJsonMixin): action: str = dc_field(metadata=dc_config(field_name="action")) description: str = dc_field(metadata=dc_config(field_name="description")) entity_type: str = dc_field(metadata=dc_config(field_name="entity_type")) icon: str = dc_field(metadata=dc_config(field_name="icon")) order: int = dc_field(metadata=dc_config(field_name="order")) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) @dataclass @@ -12853,6 +13133,12 @@ class ModerationCustomActionEvent(DataClassJsonMixin): @dataclass class ModerationDashboardPreferences(DataClassJsonMixin): + async_review_queue_upsert: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="async_review_queue_upsert") + ) + disable_audit_logs: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="disable_audit_logs") + ) disable_flagging_reviewed_entity: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="disable_flagging_reviewed_entity") ) @@ -12910,7 +13196,7 @@ class ModerationFlagResponse(DataClassJsonMixin): custom: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="custom") ) - moderation_payload: "Optional[ModerationPayload]" = dc_field( + moderation_payload: "Optional[ModerationPayloadResponse]" = dc_field( default=None, metadata=dc_config(field_name="moderation_payload") ) review_queue_item: "Optional[ReviewQueueItemResponse]" = dc_field( @@ -12923,6 +13209,7 @@ class ModerationFlagResponse(DataClassJsonMixin): @dataclass class ModerationFlaggedEvent(DataClassJsonMixin): + content_type: str = dc_field(metadata=dc_config(field_name="content_type")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -12931,15 +13218,19 @@ class ModerationFlaggedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + object_id: str = dc_field(metadata=dc_config(field_name="object_id")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="moderation.flagged", metadata=dc_config(field_name="type") ) - item: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="item")) - object_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="object_id") - ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), ) @@ -12988,6 +13279,38 @@ class ModerationPayload(DataClassJsonMixin): ) +@dataclass +class ModerationPayloadRequest(DataClassJsonMixin): + images: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="images") + ) + texts: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="texts") + ) + videos: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="videos") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + + +@dataclass +class ModerationPayloadResponse(DataClassJsonMixin): + images: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="images") + ) + texts: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="texts") + ) + videos: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="videos") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + + @dataclass class ModerationResponse(DataClassJsonMixin): action: str = dc_field(metadata=dc_config(field_name="action")) @@ -13082,7 +13405,7 @@ class MuteChannelResponse(DataClassJsonMixin): channel_mute: "Optional[ChannelMute]" = dc_field( default=None, metadata=dc_config(field_name="channel_mute") ) - own_user: "Optional[OwnUser]" = dc_field( + own_user: "Optional[OwnUserResponse]" = dc_field( default=None, metadata=dc_config(field_name="own_user") ) @@ -13104,13 +13427,13 @@ class MuteRequest(DataClassJsonMixin): @dataclass class MuteResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - mutes: "Optional[List[UserMute]]" = dc_field( + mutes: "Optional[List[UserMuteResponse]]" = dc_field( default=None, metadata=dc_config(field_name="mutes") ) non_existing_users: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="non_existing_users") ) - own_user: "Optional[OwnUser]" = dc_field( + own_user: "Optional[OwnUserResponse]" = dc_field( default=None, metadata=dc_config(field_name="own_user") ) @@ -13242,12 +13565,6 @@ class NotificationFeedUpdatedEvent(DataClassJsonMixin): @dataclass class NotificationMarkUnreadEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_member_count: int = dc_field( - metadata=dc_config(field_name="channel_member_count") - ) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -13256,42 +13573,93 @@ class NotificationMarkUnreadEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - first_unread_message_id: str = dc_field( - metadata=dc_config(field_name="first_unread_message_id") + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field( + default="notification.mark_unread", metadata=dc_config(field_name="type") ) - last_read_at: datetime = dc_field( + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + first_unread_message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="first_unread_message_id") + ) + last_read_at: Optional[datetime] = dc_field( + default=None, metadata=dc_config( field_name="last_read_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), - ) - ) - total_unread_count: int = dc_field( - metadata=dc_config(field_name="total_unread_count") - ) - unread_channels: int = dc_field(metadata=dc_config(field_name="unread_channels")) - unread_count: int = dc_field(metadata=dc_config(field_name="unread_count")) - unread_messages: int = dc_field(metadata=dc_config(field_name="unread_messages")) - unread_threads: int = dc_field(metadata=dc_config(field_name="unread_threads")) - type: str = dc_field( - default="notification.mark_unread", metadata=dc_config(field_name="type") + ), ) last_read_message_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="last_read_message_id") ) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) thread_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="thread_id") ) + total_unread_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="total_unread_count") + ) + unread_channels: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_channels") + ) + unread_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_count") + ) + unread_messages: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_messages") + ) + unread_thread_messages: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_thread_messages") + ) + unread_threads: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_threads") + ) channel: "Optional[ChannelResponse]" = dc_field( default=None, metadata=dc_config(field_name="channel") ) - user: "Optional[User]" = dc_field( + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) +@dataclass +class NotificationParentActivity(DataClassJsonMixin): + id: str = dc_field(metadata=dc_config(field_name="id")) + text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) + type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") + ) + attachments: "Optional[List[Attachment]]" = dc_field( + default=None, metadata=dc_config(field_name="attachments") + ) + + @dataclass class NotificationSettings(DataClassJsonMixin): enabled: bool = dc_field(metadata=dc_config(field_name="enabled")) @@ -13312,6 +13680,48 @@ class NotificationSettings(DataClassJsonMixin): ) +@dataclass +class NotificationSettingsRequest(DataClassJsonMixin): + enabled: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="enabled") + ) + call_live_started: "Optional[EventNotificationSettingsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="call_live_started") + ) + call_missed: "Optional[EventNotificationSettingsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="call_missed") + ) + call_notification: "Optional[EventNotificationSettingsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="call_notification") + ) + call_ring: "Optional[EventNotificationSettingsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="call_ring") + ) + session_started: "Optional[EventNotificationSettingsRequest]" = dc_field( + default=None, metadata=dc_config(field_name="session_started") + ) + + +@dataclass +class NotificationSettingsResponse(DataClassJsonMixin): + enabled: bool = dc_field(metadata=dc_config(field_name="enabled")) + call_live_started: "EventNotificationSettingsResponse" = dc_field( + metadata=dc_config(field_name="call_live_started") + ) + call_missed: "EventNotificationSettingsResponse" = dc_field( + metadata=dc_config(field_name="call_missed") + ) + call_notification: "EventNotificationSettingsResponse" = dc_field( + metadata=dc_config(field_name="call_notification") + ) + call_ring: "EventNotificationSettingsResponse" = dc_field( + metadata=dc_config(field_name="call_ring") + ) + session_started: "EventNotificationSettingsResponse" = dc_field( + metadata=dc_config(field_name="session_started") + ) + + @dataclass class NotificationStatusResponse(DataClassJsonMixin): unread: int = dc_field(metadata=dc_config(field_name="unread")) @@ -13357,107 +13767,13 @@ class NotificationTarget(DataClassJsonMixin): comment: "Optional[NotificationComment]" = dc_field( default=None, metadata=dc_config(field_name="comment") ) - - -@dataclass -class NotificationTrigger(DataClassJsonMixin): - text: str = dc_field(metadata=dc_config(field_name="text")) - type: str = dc_field(metadata=dc_config(field_name="type")) - comment: "Optional[NotificationComment]" = dc_field( - default=None, metadata=dc_config(field_name="comment") + parent_activity: "Optional[NotificationParentActivity]" = dc_field( + default=None, metadata=dc_config(field_name="parent_activity") ) @dataclass -class OCRRule(DataClassJsonMixin): - action: str = dc_field(metadata=dc_config(field_name="action")) - label: str = dc_field(metadata=dc_config(field_name="label")) - - -@dataclass -class OnlyUserID(DataClassJsonMixin): - id: str = dc_field(metadata=dc_config(field_name="id")) - - -@dataclass -class OverviewDashboardConfig(DataClassJsonMixin): - default_date_range_days: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="default_date_range_days") - ) - visible_charts: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="visible_charts") - ) - - -@dataclass -class OwnBatchRequest(DataClassJsonMixin): - feeds: List[str] = dc_field(metadata=dc_config(field_name="feeds")) - user_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="user_id") - ) - fields: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="fields") - ) - user: "Optional[UserRequest]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - -@dataclass -class OwnBatchResponse(DataClassJsonMixin): - duration: str = dc_field(metadata=dc_config(field_name="duration")) - data: "Dict[str, FeedOwnData]" = dc_field(metadata=dc_config(field_name="data")) - - -OwnCapabilityType = NewType("OwnCapabilityType", str) - - -class OwnCapability: - BLOCK_USERS: Final[OwnCapabilityType] = "block-users" - CHANGE_MAX_DURATION: Final[OwnCapabilityType] = "change-max-duration" - CREATE_CALL: Final[OwnCapabilityType] = "create-call" - CREATE_REACTION: Final[OwnCapabilityType] = "create-reaction" - ENABLE_NOISE_CANCELLATION: Final[OwnCapabilityType] = "enable-noise-cancellation" - END_CALL: Final[OwnCapabilityType] = "end-call" - JOIN_BACKSTAGE: Final[OwnCapabilityType] = "join-backstage" - JOIN_CALL: Final[OwnCapabilityType] = "join-call" - JOIN_ENDED_CALL: Final[OwnCapabilityType] = "join-ended-call" - KICK_USER: Final[OwnCapabilityType] = "kick-user" - MUTE_USERS: Final[OwnCapabilityType] = "mute-users" - PIN_FOR_EVERYONE: Final[OwnCapabilityType] = "pin-for-everyone" - READ_CALL: Final[OwnCapabilityType] = "read-call" - REMOVE_CALL_MEMBER: Final[OwnCapabilityType] = "remove-call-member" - SCREENSHARE: Final[OwnCapabilityType] = "screenshare" - SEND_AUDIO: Final[OwnCapabilityType] = "send-audio" - SEND_CLOSED_CAPTIONS_CALL: Final[OwnCapabilityType] = "send-closed-captions-call" - SEND_VIDEO: Final[OwnCapabilityType] = "send-video" - START_BROADCAST_CALL: Final[OwnCapabilityType] = "start-broadcast-call" - START_CLOSED_CAPTIONS_CALL: Final[OwnCapabilityType] = "start-closed-captions-call" - START_FRAME_RECORD_CALL: Final[OwnCapabilityType] = "start-frame-record-call" - START_INDIVIDUAL_RECORD_CALL: Final[OwnCapabilityType] = ( - "start-individual-record-call" - ) - START_RAW_RECORD_CALL: Final[OwnCapabilityType] = "start-raw-record-call" - START_RECORD_CALL: Final[OwnCapabilityType] = "start-record-call" - START_TRANSCRIPTION_CALL: Final[OwnCapabilityType] = "start-transcription-call" - STOP_BROADCAST_CALL: Final[OwnCapabilityType] = "stop-broadcast-call" - STOP_CLOSED_CAPTIONS_CALL: Final[OwnCapabilityType] = "stop-closed-captions-call" - STOP_FRAME_RECORD_CALL: Final[OwnCapabilityType] = "stop-frame-record-call" - STOP_INDIVIDUAL_RECORD_CALL: Final[OwnCapabilityType] = ( - "stop-individual-record-call" - ) - STOP_RAW_RECORD_CALL: Final[OwnCapabilityType] = "stop-raw-record-call" - STOP_RECORD_CALL: Final[OwnCapabilityType] = "stop-record-call" - STOP_TRANSCRIPTION_CALL: Final[OwnCapabilityType] = "stop-transcription-call" - UPDATE_CALL: Final[OwnCapabilityType] = "update-call" - UPDATE_CALL_MEMBER: Final[OwnCapabilityType] = "update-call-member" - UPDATE_CALL_PERMISSIONS: Final[OwnCapabilityType] = "update-call-permissions" - UPDATE_CALL_SETTINGS: Final[OwnCapabilityType] = "update-call-settings" - - -@dataclass -class OwnUser(DataClassJsonMixin): - banned: bool = dc_field(metadata=dc_config(field_name="banned")) +class NotificationThreadMessageNewEvent(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -13466,93 +13782,149 @@ class OwnUser(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - id: str = dc_field(metadata=dc_config(field_name="id")) - language: str = dc_field(metadata=dc_config(field_name="language")) - online: bool = dc_field(metadata=dc_config(field_name="online")) - role: str = dc_field(metadata=dc_config(field_name="role")) - total_unread_count: int = dc_field( - metadata=dc_config(field_name="total_unread_count") + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + thread_id: str = dc_field(metadata=dc_config(field_name="thread_id")) + watcher_count: int = dc_field(metadata=dc_config(field_name="watcher_count")) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) + type: str = dc_field( + default="notification.thread_message_new", metadata=dc_config(field_name="type") ) - unread_channels: int = dc_field(metadata=dc_config(field_name="unread_channels")) - unread_count: int = dc_field(metadata=dc_config(field_name="unread_count")) - unread_threads: int = dc_field(metadata=dc_config(field_name="unread_threads")) - updated_at: datetime = dc_field( - metadata=dc_config( - field_name="updated_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") ) - channel_mutes: "List[ChannelMute]" = dc_field( - metadata=dc_config(field_name="channel_mutes") + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") ) - devices: "List[Device]" = dc_field(metadata=dc_config(field_name="devices")) - mutes: "List[UserMute]" = dc_field(metadata=dc_config(field_name="mutes")) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - total_unread_count_by_team: "Dict[str, int]" = dc_field( - metadata=dc_config(field_name="total_unread_count_by_team") + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") ) - avg_response_time: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="avg_response_time") + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") ) - deactivated_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="deactivated_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + parent_author: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="parent_author") ) - deleted_at: Optional[datetime] = dc_field( + received_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="deleted_at", + field_name="received_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - invisible: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="invisible") + team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + unread_thread_messages: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_thread_messages") ) - last_active: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="last_active", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), + unread_threads: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="unread_threads") ) - last_engaged_at: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="last_engaged_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), + thread_participants: "Optional[List[UserResponseCommonFields]]" = dc_field( + default=None, metadata=dc_config(field_name="thread_participants") ) - blocked_user_ids: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="blocked_user_ids") + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + + +@dataclass +class NotificationTrigger(DataClassJsonMixin): + text: str = dc_field(metadata=dc_config(field_name="text")) + type: str = dc_field(metadata=dc_config(field_name="type")) + comment: "Optional[NotificationComment]" = dc_field( + default=None, metadata=dc_config(field_name="comment") + ) + + +@dataclass +class OCRRule(DataClassJsonMixin): + action: str = dc_field(metadata=dc_config(field_name="action")) + label: str = dc_field(metadata=dc_config(field_name="label")) + + +@dataclass +class OnlyUserID(DataClassJsonMixin): + id: str = dc_field(metadata=dc_config(field_name="id")) + + +@dataclass +class OverviewDashboardConfig(DataClassJsonMixin): + default_date_range_days: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="default_date_range_days") ) - latest_hidden_channels: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="latest_hidden_channels") + visible_charts: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="visible_charts") ) - teams: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="teams") + + +@dataclass +class OwnBatchRequest(DataClassJsonMixin): + feeds: List[str] = dc_field(metadata=dc_config(field_name="feeds")) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") ) - privacy_settings: "Optional[PrivacySettings]" = dc_field( - default=None, metadata=dc_config(field_name="privacy_settings") + fields: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="fields") ) - push_preferences: "Optional[PushPreferences]" = dc_field( - default=None, metadata=dc_config(field_name="push_preferences") + user: "Optional[UserRequest]" = dc_field( + default=None, metadata=dc_config(field_name="user") ) - teams_role: "Optional[Dict[str, str]]" = dc_field( - default=None, metadata=dc_config(field_name="teams_role") + + +@dataclass +class OwnBatchResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + data: "Dict[str, FeedOwnData]" = dc_field(metadata=dc_config(field_name="data")) + + +OwnCapabilityType = NewType("OwnCapabilityType", str) + + +class OwnCapability: + BLOCK_USERS: Final[OwnCapabilityType] = "block-users" + CHANGE_MAX_DURATION: Final[OwnCapabilityType] = "change-max-duration" + CREATE_CALL: Final[OwnCapabilityType] = "create-call" + CREATE_REACTION: Final[OwnCapabilityType] = "create-reaction" + ENABLE_NOISE_CANCELLATION: Final[OwnCapabilityType] = "enable-noise-cancellation" + END_CALL: Final[OwnCapabilityType] = "end-call" + JOIN_BACKSTAGE: Final[OwnCapabilityType] = "join-backstage" + JOIN_CALL: Final[OwnCapabilityType] = "join-call" + JOIN_ENDED_CALL: Final[OwnCapabilityType] = "join-ended-call" + KICK_USER: Final[OwnCapabilityType] = "kick-user" + MUTE_USERS: Final[OwnCapabilityType] = "mute-users" + PIN_FOR_EVERYONE: Final[OwnCapabilityType] = "pin-for-everyone" + READ_CALL: Final[OwnCapabilityType] = "read-call" + REMOVE_CALL_MEMBER: Final[OwnCapabilityType] = "remove-call-member" + SCREENSHARE: Final[OwnCapabilityType] = "screenshare" + SEND_AUDIO: Final[OwnCapabilityType] = "send-audio" + SEND_CLOSED_CAPTIONS_CALL: Final[OwnCapabilityType] = "send-closed-captions-call" + SEND_VIDEO: Final[OwnCapabilityType] = "send-video" + START_BROADCAST_CALL: Final[OwnCapabilityType] = "start-broadcast-call" + START_CLOSED_CAPTIONS_CALL: Final[OwnCapabilityType] = "start-closed-captions-call" + START_FRAME_RECORD_CALL: Final[OwnCapabilityType] = "start-frame-record-call" + START_INDIVIDUAL_RECORD_CALL: Final[OwnCapabilityType] = ( + "start-individual-record-call" + ) + START_RAW_RECORD_CALL: Final[OwnCapabilityType] = "start-raw-record-call" + START_RECORD_CALL: Final[OwnCapabilityType] = "start-record-call" + START_TRANSCRIPTION_CALL: Final[OwnCapabilityType] = "start-transcription-call" + STOP_BROADCAST_CALL: Final[OwnCapabilityType] = "stop-broadcast-call" + STOP_CLOSED_CAPTIONS_CALL: Final[OwnCapabilityType] = "stop-closed-captions-call" + STOP_FRAME_RECORD_CALL: Final[OwnCapabilityType] = "stop-frame-record-call" + STOP_INDIVIDUAL_RECORD_CALL: Final[OwnCapabilityType] = ( + "stop-individual-record-call" ) + STOP_RAW_RECORD_CALL: Final[OwnCapabilityType] = "stop-raw-record-call" + STOP_RECORD_CALL: Final[OwnCapabilityType] = "stop-record-call" + STOP_TRANSCRIPTION_CALL: Final[OwnCapabilityType] = "stop-transcription-call" + UPDATE_CALL: Final[OwnCapabilityType] = "update-call" + UPDATE_CALL_MEMBER: Final[OwnCapabilityType] = "update-call-member" + UPDATE_CALL_PERMISSIONS: Final[OwnCapabilityType] = "update-call-permissions" + UPDATE_CALL_SETTINGS: Final[OwnCapabilityType] = "update-call-settings" @dataclass @@ -13680,6 +14052,15 @@ class PaginationParams(DataClassJsonMixin): ) +@dataclass +class ParsedPredefinedFilterResponse(DataClassJsonMixin): + name: str = dc_field(metadata=dc_config(field_name="name")) + filter: Dict[str, object] = dc_field(metadata=dc_config(field_name="filter")) + sort: "Optional[List[SortParamRequest]]" = dc_field( + default=None, metadata=dc_config(field_name="sort") + ) + + @dataclass class ParticipantCountByMinuteResponse(DataClassJsonMixin): first: int = dc_field(metadata=dc_config(field_name="first")) @@ -13852,6 +14233,35 @@ class ParticipantSeriesUserStats(DataClassJsonMixin): ) +@dataclass +class ParticipantSessionDetails(DataClassJsonMixin): + publisher_type: str = dc_field(metadata=dc_config(field_name="publisher_type")) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + user_session_id: str = dc_field(metadata=dc_config(field_name="user_session_id")) + roles: List[str] = dc_field(metadata=dc_config(field_name="roles")) + duration_in_seconds: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="duration_in_seconds") + ) + joined_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="joined_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + left_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="left_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + + @dataclass class PendingMessageEvent(DataClassJsonMixin): created_at: datetime = dc_field( @@ -13876,16 +14286,16 @@ class PendingMessageEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) - channel: "Optional[Channel]" = dc_field( + channel: "Optional[ChannelResponse]" = dc_field( default=None, metadata=dc_config(field_name="channel") ) - message: "Optional[Message]" = dc_field( + message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="message") ) metadata: "Optional[Dict[str, str]]" = dc_field( default=None, metadata=dc_config(field_name="metadata") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponse]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -14026,70 +14436,6 @@ class PolicyRequest(DataClassJsonMixin): roles: List[str] = dc_field(metadata=dc_config(field_name="roles")) -@dataclass -class Poll(DataClassJsonMixin): - allow_answers: bool = dc_field(metadata=dc_config(field_name="allow_answers")) - allow_user_suggested_options: bool = dc_field( - metadata=dc_config(field_name="allow_user_suggested_options") - ) - answers_count: int = dc_field(metadata=dc_config(field_name="answers_count")) - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - created_by_id: str = dc_field(metadata=dc_config(field_name="created_by_id")) - description: str = dc_field(metadata=dc_config(field_name="description")) - enforce_unique_vote: bool = dc_field( - metadata=dc_config(field_name="enforce_unique_vote") - ) - id: str = dc_field(metadata=dc_config(field_name="id")) - name: str = dc_field(metadata=dc_config(field_name="name")) - updated_at: datetime = dc_field( - metadata=dc_config( - field_name="updated_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - vote_count: int = dc_field(metadata=dc_config(field_name="vote_count")) - latest_answers: "List[PollVote]" = dc_field( - metadata=dc_config(field_name="latest_answers") - ) - options: "List[PollOption]" = dc_field(metadata=dc_config(field_name="options")) - own_votes: "List[PollVote]" = dc_field(metadata=dc_config(field_name="own_votes")) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="Custom")) - latest_votes_by_option: "Dict[str, List[PollVote]]" = dc_field( - metadata=dc_config(field_name="latest_votes_by_option") - ) - vote_counts_by_option: "Dict[str, int]" = dc_field( - metadata=dc_config(field_name="vote_counts_by_option") - ) - is_closed: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="is_closed") - ) - max_votes_allowed: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="max_votes_allowed") - ) - voting_visibility: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="voting_visibility") - ) - created_by: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="created_by") - ) - - -@dataclass -class PollOption(DataClassJsonMixin): - id: str = dc_field(metadata=dc_config(field_name="id")) - text: str = dc_field(metadata=dc_config(field_name="text")) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - - @dataclass class PollOptionInput(DataClassJsonMixin): text: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="text")) @@ -14189,41 +14535,6 @@ class PollResponseData(DataClassJsonMixin): ) -@dataclass -class PollVote(DataClassJsonMixin): - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - id: str = dc_field(metadata=dc_config(field_name="id")) - option_id: str = dc_field(metadata=dc_config(field_name="option_id")) - poll_id: str = dc_field(metadata=dc_config(field_name="poll_id")) - updated_at: datetime = dc_field( - metadata=dc_config( - field_name="updated_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - answer_text: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="answer_text") - ) - is_answer: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="is_answer") - ) - user_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="user_id") - ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - @dataclass class PollVoteResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) @@ -14280,19 +14591,6 @@ class PollVotesResponse(DataClassJsonMixin): prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) -@dataclass -class PrivacySettings(DataClassJsonMixin): - delivery_receipts: "Optional[DeliveryReceipts]" = dc_field( - default=None, metadata=dc_config(field_name="delivery_receipts") - ) - read_receipts: "Optional[ReadReceipts]" = dc_field( - default=None, metadata=dc_config(field_name="read_receipts") - ) - typing_indicators: "Optional[TypingIndicators]" = dc_field( - default=None, metadata=dc_config(field_name="typing_indicators") - ) - - @dataclass class PrivacySettingsResponse(DataClassJsonMixin): delivery_receipts: "Optional[DeliveryReceiptsResponse]" = dc_field( @@ -14316,6 +14614,31 @@ class PublishedTrackFlags(DataClassJsonMixin): video: bool = dc_field(metadata=dc_config(field_name="video")) +@dataclass +class PublishedTrackMetrics(DataClassJsonMixin): + codec: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="codec") + ) + track_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="track_id") + ) + track_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="track_type") + ) + warnings: "Optional[List[SessionWarningResponse]]" = dc_field( + default=None, metadata=dc_config(field_name="warnings") + ) + bitrate: "Optional[MetricTimeSeries]" = dc_field( + default=None, metadata=dc_config(field_name="bitrate") + ) + framerate: "Optional[MetricTimeSeries]" = dc_field( + default=None, metadata=dc_config(field_name="framerate") + ) + resolution: "Optional[ResolutionMetricsTimeSeries]" = dc_field( + default=None, metadata=dc_config(field_name="resolution") + ) + + @dataclass class PublisherAllMetrics(DataClassJsonMixin): audio: "Optional[PublisherAudioMetrics]" = dc_field( @@ -14421,44 +14744,13 @@ class PushNotificationSettingsResponse(DataClassJsonMixin): @dataclass -class PushPreferenceInput(DataClassJsonMixin): - call_level: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="call_level") - ) - channel_cid: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="channel_cid") - ) - chat_level: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="chat_level") - ) - disabled_until: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="disabled_until", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - feeds_level: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="feeds_level") - ) - remove_disable: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="remove_disable") - ) - user_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="user_id") - ) - feeds_preferences: "Optional[FeedsPreferences]" = dc_field( - default=None, metadata=dc_config(field_name="feeds_preferences") - ) - - -@dataclass -class PushPreferences(DataClassJsonMixin): +class PushPreferenceInput(DataClassJsonMixin): call_level: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="call_level") ) + channel_cid: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_cid") + ) chat_level: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="chat_level") ) @@ -14474,6 +14766,12 @@ class PushPreferences(DataClassJsonMixin): feeds_level: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="feeds_level") ) + remove_disable: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="remove_disable") + ) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") + ) feeds_preferences: "Optional[FeedsPreferences]" = dc_field( default=None, metadata=dc_config(field_name="feeds_preferences") ) @@ -14604,6 +14902,84 @@ class PushProvider(DataClassJsonMixin): ) +@dataclass +class PushProviderRequest(DataClassJsonMixin): + name: str = dc_field(metadata=dc_config(field_name="name")) + apn_auth_key: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_auth_key") + ) + apn_auth_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_auth_type") + ) + apn_development: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="apn_development") + ) + apn_host: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_host") + ) + apn_key_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_key_id") + ) + apn_notification_template: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_notification_template") + ) + apn_p12_cert: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_p12_cert") + ) + apn_team_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_team_id") + ) + apn_topic: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="apn_topic") + ) + description: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="description") + ) + disabled_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="disabled_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + disabled_reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="disabled_reason") + ) + firebase_apn_template: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="firebase_apn_template") + ) + firebase_credentials: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="firebase_credentials") + ) + firebase_data_template: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="firebase_data_template") + ) + firebase_host: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="firebase_host") + ) + firebase_notification_template: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="firebase_notification_template") + ) + firebase_server_key: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="firebase_server_key") + ) + huawei_app_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="huawei_app_id") + ) + huawei_app_secret: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="huawei_app_secret") + ) + type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) + xiaomi_app_secret: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="xiaomi_app_secret") + ) + xiaomi_package_name: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="xiaomi_package_name") + ) + + @dataclass class PushProviderResponse(DataClassJsonMixin): created_at: datetime = dc_field( @@ -14729,6 +15105,34 @@ class PushTemplate(DataClassJsonMixin): ) +@dataclass +class PushTemplateResponse(DataClassJsonMixin): + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + enable_push: bool = dc_field(metadata=dc_config(field_name="enable_push")) + event_type: str = dc_field(metadata=dc_config(field_name="event_type")) + push_provider_internal_id: str = dc_field( + metadata=dc_config(field_name="push_provider_internal_id") + ) + updated_at: datetime = dc_field( + metadata=dc_config( + field_name="updated_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + template: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="template") + ) + + @dataclass class QualityScoreReport(DataClassJsonMixin): histogram: "List[ReportByHistogramBucket]" = dc_field( @@ -14974,6 +15378,28 @@ class QueryCallMembersResponse(DataClassJsonMixin): prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) +@dataclass +class QueryCallParticipantSessionsResponse(DataClassJsonMixin): + call_id: str = dc_field(metadata=dc_config(field_name="call_id")) + call_session_id: str = dc_field(metadata=dc_config(field_name="call_session_id")) + call_type: str = dc_field(metadata=dc_config(field_name="call_type")) + duration: int = dc_field(metadata=dc_config(field_name="duration")) + total_participant_duration: int = dc_field( + metadata=dc_config(field_name="total_participant_duration") + ) + total_participant_sessions: int = dc_field( + metadata=dc_config(field_name="total_participant_sessions") + ) + participants_sessions: "List[ParticipantSessionDetails]" = dc_field( + metadata=dc_config(field_name="participants_sessions") + ) + next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) + prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) + session: "Optional[CallSessionResponse]" = dc_field( + default=None, metadata=dc_config(field_name="session") + ) + + @dataclass class QueryCallParticipantsRequest(DataClassJsonMixin): filter_conditions: Optional[Dict[str, object]] = dc_field( @@ -15207,6 +15633,9 @@ class QueryChannelsRequest(DataClassJsonMixin): offset: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="offset") ) + predefined_filter: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="predefined_filter") + ) state: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="state") ) @@ -15219,6 +15648,12 @@ class QueryChannelsRequest(DataClassJsonMixin): filter_conditions: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="filter_conditions") ) + filter_values: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="filter_values") + ) + sort_values: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="sort_values") + ) user: "Optional[UserRequest]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -15230,6 +15665,9 @@ class QueryChannelsResponse(DataClassJsonMixin): channels: "List[ChannelStateResponseFields]" = dc_field( metadata=dc_config(field_name="channels") ) + predefined_filter: "Optional[ParsedPredefinedFilterResponse]" = dc_field( + default=None, metadata=dc_config(field_name="predefined_filter") + ) @dataclass @@ -15351,7 +15789,7 @@ class QueryFeedModerationTemplate(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - config: "Optional[FeedsModerationTemplateConfig]" = dc_field( + config: "Optional[FeedsModerationTemplateConfigPayload]" = dc_field( default=None, metadata=dc_config(field_name="config") ) @@ -15436,6 +15874,36 @@ class QueryFollowsResponse(DataClassJsonMixin): prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) +@dataclass +class QueryFutureChannelBansPayload(DataClassJsonMixin): + exclude_expired_bans: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="exclude_expired_bans") + ) + limit: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="limit") + ) + offset: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="offset") + ) + target_user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="target_user_id") + ) + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") + ) + user: "Optional[UserRequest]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class QueryFutureChannelBansResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + bans: "List[FutureChannelBanResponse]" = dc_field( + metadata=dc_config(field_name="bans") + ) + + @dataclass class QueryMembersPayload(DataClassJsonMixin): type: str = dc_field(metadata=dc_config(field_name="type")) @@ -15580,7 +16048,7 @@ class QueryModerationFlagsRequest(DataClassJsonMixin): ) next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) - sort: "Optional[List[SortParam]]" = dc_field( + sort: "Optional[List[SortParamRequest]]" = dc_field( default=None, metadata=dc_config(field_name="sort") ) filter: Optional[Dict[str, object]] = dc_field( @@ -15800,7 +16268,7 @@ class QueryReviewQueueResponse(DataClassJsonMixin): items: "List[ReviewQueueItemResponse]" = dc_field( metadata=dc_config(field_name="items") ) - action_config: "Dict[str, List[ModerationActionConfig]]" = dc_field( + action_config: "Dict[str, List[ModerationActionConfigResponse]]" = dc_field( metadata=dc_config(field_name="action_config") ) stats: Dict[str, object] = dc_field(metadata=dc_config(field_name="stats")) @@ -16055,6 +16523,7 @@ class RawRecordingSettingsResponse(DataClassJsonMixin): @dataclass class Reaction(DataClassJsonMixin): + activity_id: str = dc_field(metadata=dc_config(field_name="activity_id")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -16063,9 +16532,7 @@ class Reaction(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - message_id: str = dc_field(metadata=dc_config(field_name="message_id")) - score: int = dc_field(metadata=dc_config(field_name="score")) - type: str = dc_field(metadata=dc_config(field_name="type")) + kind: str = dc_field(metadata=dc_config(field_name="kind")) updated_at: datetime = dc_field( metadata=dc_config( field_name="updated_at", @@ -16074,9 +16541,43 @@ class Reaction(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) - user_id: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="user_id") + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + deleted_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="deleted_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + id: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="id")) + parent: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="parent") + ) + score: Optional[float] = dc_field( + default=None, metadata=dc_config(field_name="score") + ) + target_feeds: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="target_feeds") + ) + children_counts: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="children_counts") + ) + data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="data") + ) + latest_children: "Optional[Dict[str, List[Reaction]]]" = dc_field( + default=None, metadata=dc_config(field_name="latest_children") + ) + moderation: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="moderation") + ) + own_children: "Optional[Dict[str, List[Reaction]]]" = dc_field( + default=None, metadata=dc_config(field_name="own_children") + ) + target_feeds_extra_data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="target_feeds_extra_data") ) user: "Optional[User]" = dc_field( default=None, metadata=dc_config(field_name="user") @@ -16085,9 +16586,6 @@ class Reaction(DataClassJsonMixin): @dataclass class ReactionDeletedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -16096,20 +16594,50 @@ class ReactionDeletedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="reaction.deleted", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="message_id") + ) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - thread_participants: "Optional[List[User]]" = dc_field( + thread_participants: "Optional[List[UserResponseCommonFields]]" = dc_field( default=None, metadata=dc_config(field_name="thread_participants") ) - message: "Optional[Message]" = dc_field( + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="message") ) - reaction: "Optional[Reaction]" = dc_field( + reaction: "Optional[ReactionResponse]" = dc_field( default=None, metadata=dc_config(field_name="reaction") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -16138,29 +16666,56 @@ class ReactionGroupResponse(DataClassJsonMixin): @dataclass class ReactionNewEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( - field_name="created_at", + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + type: str = dc_field(default="reaction.new", metadata=dc_config(field_name="type")) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + message_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="message_id") + ) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), - ) + ), ) - type: str = dc_field(default="reaction.new", metadata=dc_config(field_name="type")) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - thread_participants: "Optional[List[User]]" = dc_field( + thread_participants: "Optional[List[UserResponseCommonFields]]" = dc_field( default=None, metadata=dc_config(field_name="thread_participants") ) - message: "Optional[Message]" = dc_field( + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="message") ) - reaction: "Optional[Reaction]" = dc_field( + reaction: "Optional[ReactionResponse]" = dc_field( default=None, metadata=dc_config(field_name="reaction") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -16228,9 +16783,6 @@ class ReactionResponse(DataClassJsonMixin): @dataclass class ReactionUpdatedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -16239,13 +16791,43 @@ class ReactionUpdatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - message: "Message" = dc_field(metadata=dc_config(field_name="message")) - reaction: "Reaction" = dc_field(metadata=dc_config(field_name="reaction")) + message_id: str = dc_field(metadata=dc_config(field_name="message_id")) + channel: "ChannelResponse" = dc_field(metadata=dc_config(field_name="channel")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + message: "MessageResponse" = dc_field(metadata=dc_config(field_name="message")) type: str = dc_field( default="reaction.updated", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - user: "Optional[User]" = dc_field( + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + reaction: "Optional[ReactionResponse]" = dc_field( + default=None, metadata=dc_config(field_name="reaction") + ) + user: "Optional[UserResponseCommonFields]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -16297,13 +16879,6 @@ class ReadCollectionsResponse(DataClassJsonMixin): ) -@dataclass -class ReadReceipts(DataClassJsonMixin): - enabled: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="enabled") - ) - - @dataclass class ReadReceiptsResponse(DataClassJsonMixin): enabled: Optional[bool] = dc_field( @@ -16377,7 +16952,7 @@ class RecordSettingsResponse(DataClassJsonMixin): @dataclass -class RejectAppealRequest(DataClassJsonMixin): +class RejectAppealRequestPayload(DataClassJsonMixin): decision_reason: str = dc_field(metadata=dc_config(field_name="decision_reason")) @@ -16620,13 +17195,28 @@ class ReportResponse(DataClassJsonMixin): ) +@dataclass +class ResolutionMetricsTimeSeries(DataClassJsonMixin): + height: "Optional[MetricTimeSeries]" = dc_field( + default=None, metadata=dc_config(field_name="height") + ) + width: "Optional[MetricTimeSeries]" = dc_field( + default=None, metadata=dc_config(field_name="width") + ) + + @dataclass class ResolveSipInboundRequest(DataClassJsonMixin): sip_caller_number: str = dc_field( metadata=dc_config(field_name="sip_caller_number") ) sip_trunk_number: str = dc_field(metadata=dc_config(field_name="sip_trunk_number")) - challenge: "SIPChallenge" = dc_field(metadata=dc_config(field_name="challenge")) + challenge: "SIPChallengeRequest" = dc_field( + metadata=dc_config(field_name="challenge") + ) + routing_number: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="routing_number") + ) sip_headers: "Optional[Dict[str, str]]" = dc_field( default=None, metadata=dc_config(field_name="sip_headers") ) @@ -16652,12 +17242,28 @@ class Response(DataClassJsonMixin): @dataclass -class RestoreActionRequest(DataClassJsonMixin): +class RestoreActionRequestPayload(DataClassJsonMixin): decision_reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="decision_reason") ) +@dataclass +class RestoreActivityRequest(DataClassJsonMixin): + user_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="user_id") + ) + user: "Optional[UserRequest]" = dc_field( + default=None, metadata=dc_config(field_name="user") + ) + + +@dataclass +class RestoreActivityResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + activity: "ActivityResponse" = dc_field(metadata=dc_config(field_name="activity")) + + @dataclass class RestoreUsersRequest(DataClassJsonMixin): user_ids: List[str] = dc_field(metadata=dc_config(field_name="user_ids")) @@ -16732,7 +17338,7 @@ class ReviewQueueItemResponse(DataClassJsonMixin): actions: "List[ActionLogResponse]" = dc_field( metadata=dc_config(field_name="actions") ) - bans: "List[Ban]" = dc_field(metadata=dc_config(field_name="bans")) + bans: "List[BanInfoResponse]" = dc_field(metadata=dc_config(field_name="bans")) flags: "List[ModerationFlagResponse]" = dc_field( metadata=dc_config(field_name="flags") ) @@ -16794,7 +17400,7 @@ class ReviewQueueItemResponse(DataClassJsonMixin): message: "Optional[MessageResponse]" = dc_field( default=None, metadata=dc_config(field_name="message") ) - moderation_payload: "Optional[ModerationPayload]" = dc_field( + moderation_payload: "Optional[ModerationPayloadResponse]" = dc_field( default=None, metadata=dc_config(field_name="moderation_payload") ) reaction: "Optional[Reaction]" = dc_field( @@ -17047,8 +17653,10 @@ class SDKUsageReportResponse(DataClassJsonMixin): class SFULocationResponse(DataClassJsonMixin): datacenter: str = dc_field(metadata=dc_config(field_name="datacenter")) id: str = dc_field(metadata=dc_config(field_name="id")) - coordinates: "Coordinates" = dc_field(metadata=dc_config(field_name="coordinates")) - location: "Location" = dc_field(metadata=dc_config(field_name="location")) + coordinates: "CoordinatesResponse" = dc_field( + metadata=dc_config(field_name="coordinates") + ) + location: "LocationResponse" = dc_field(metadata=dc_config(field_name="location")) count: Optional[int] = dc_field( default=None, metadata=dc_config(field_name="count") ) @@ -17085,7 +17693,7 @@ class SIPCallerConfigsResponse(DataClassJsonMixin): @dataclass -class SIPChallenge(DataClassJsonMixin): +class SIPChallengeRequest(DataClassJsonMixin): a1: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="a1")) algorithm: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="algorithm") @@ -17416,6 +18024,9 @@ class SearchResultMessage(DataClassJsonMixin): ) html: str = dc_field(metadata=dc_config(field_name="html")) id: str = dc_field(metadata=dc_config(field_name="id")) + mentioned_channel: bool = dc_field( + metadata=dc_config(field_name="mentioned_channel") + ) pinned: bool = dc_field(metadata=dc_config(field_name="pinned")) reply_count: int = dc_field(metadata=dc_config(field_name="reply_count")) shadowed: bool = dc_field(metadata=dc_config(field_name="shadowed")) @@ -17784,6 +18395,21 @@ class SendUserCustomEventRequest(DataClassJsonMixin): event: "UserCustomEventRequest" = dc_field(metadata=dc_config(field_name="event")) +@dataclass +class SessionClient(DataClassJsonMixin): + ip: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="ip")) + name: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="name")) + network_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="network_type") + ) + version: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="version") + ) + location: "Optional[CallStatsLocation]" = dc_field( + default=None, metadata=dc_config(field_name="location") + ) + + @dataclass class SessionSettings(DataClassJsonMixin): inactivity_timeout_seconds: int = dc_field( @@ -17806,7 +18432,22 @@ class SessionSettingsResponse(DataClassJsonMixin): @dataclass -class ShadowBlockActionRequest(DataClassJsonMixin): +class SessionWarningResponse(DataClassJsonMixin): + code: str = dc_field(metadata=dc_config(field_name="code")) + warning: str = dc_field(metadata=dc_config(field_name="warning")) + time: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="time", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + + +@dataclass +class ShadowBlockActionRequestPayload(DataClassJsonMixin): reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="reason") ) @@ -17944,10 +18585,14 @@ class ShowChannelResponse(DataClassJsonMixin): class SingleFollowResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) follow: "FollowResponse" = dc_field(metadata=dc_config(field_name="follow")) + notification_created: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="notification_created") + ) @dataclass class SipInboundCredentials(DataClassJsonMixin): + api_key: str = dc_field(metadata=dc_config(field_name="api_key")) call_id: str = dc_field(metadata=dc_config(field_name="call_id")) call_type: str = dc_field(metadata=dc_config(field_name="call_type")) token: str = dc_field(metadata=dc_config(field_name="token")) @@ -17960,17 +18605,6 @@ class SipInboundCredentials(DataClassJsonMixin): ) -@dataclass -class SortParam(DataClassJsonMixin): - direction: Optional[int] = dc_field( - default=None, metadata=dc_config(field_name="direction") - ) - field: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="field") - ) - type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) - - @dataclass class SortParamRequest(DataClassJsonMixin): direction: Optional[int] = dc_field( @@ -18284,46 +18918,49 @@ class SubmitActionRequest(DataClassJsonMixin): user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") ) - ban: "Optional[BanActionRequest]" = dc_field( + ban: "Optional[BanActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="ban") ) - block: "Optional[BlockActionRequest]" = dc_field( + block: "Optional[BlockActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="block") ) - custom: "Optional[CustomActionRequest]" = dc_field( + custom: "Optional[CustomActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="custom") ) - delete_activity: "Optional[DeleteActivityRequest]" = dc_field( + delete_activity: "Optional[DeleteActivityRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="delete_activity") ) - delete_comment: "Optional[DeleteCommentRequest]" = dc_field( + delete_comment: "Optional[DeleteCommentRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="delete_comment") ) - delete_message: "Optional[DeleteMessageRequest]" = dc_field( + delete_message: "Optional[DeleteMessageRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="delete_message") ) - delete_reaction: "Optional[DeleteReactionRequest]" = dc_field( + delete_reaction: "Optional[DeleteReactionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="delete_reaction") ) - delete_user: "Optional[DeleteUserRequest]" = dc_field( + delete_user: "Optional[DeleteUserRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="delete_user") ) - mark_reviewed: "Optional[MarkReviewedRequest]" = dc_field( + flag: "Optional[FlagRequest]" = dc_field( + default=None, metadata=dc_config(field_name="flag") + ) + mark_reviewed: "Optional[MarkReviewedRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="mark_reviewed") ) - reject_appeal: "Optional[RejectAppealRequest]" = dc_field( + reject_appeal: "Optional[RejectAppealRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="reject_appeal") ) - restore: "Optional[RestoreActionRequest]" = dc_field( + restore: "Optional[RestoreActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="restore") ) - shadow_block: "Optional[ShadowBlockActionRequest]" = dc_field( + shadow_block: "Optional[ShadowBlockActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="shadow_block") ) - unban: "Optional[UnbanActionRequest]" = dc_field( + unban: "Optional[UnbanActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="unban") ) - unblock: "Optional[UnblockActionRequest]" = dc_field( + unblock: "Optional[UnblockActionRequestPayload]" = dc_field( default=None, metadata=dc_config(field_name="unblock") ) user: "Optional[UserRequest]" = dc_field( @@ -18651,9 +19288,6 @@ class ThreadStateResponse(DataClassJsonMixin): @dataclass class ThreadUpdatedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -18662,15 +19296,29 @@ class ThreadUpdatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( default="thread.updated", metadata=dc_config(field_name="type") ) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) thread: "Optional[ThreadResponse]" = dc_field( default=None, metadata=dc_config(field_name="thread") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) @dataclass @@ -18722,6 +19370,15 @@ class ThreadedCommentResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + edited_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="edited_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) parent_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="parent_id") ) @@ -18744,7 +19401,7 @@ class ThreadedCommentResponse(DataClassJsonMixin): moderation: "Optional[ModerationV2Response]" = dc_field( default=None, metadata=dc_config(field_name="moderation") ) - reaction_groups: "Optional[Dict[str, Optional[ReactionGroupResponse]]]" = dc_field( + reaction_groups: "Optional[Dict[str, FeedsReactionGroupResponse]]" = dc_field( default=None, metadata=dc_config(field_name="reaction_groups") ) @@ -18895,13 +19552,6 @@ class TruncateChannelResponse(DataClassJsonMixin): ) -@dataclass -class TypingIndicators(DataClassJsonMixin): - enabled: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="enabled") - ) - - @dataclass class TypingIndicatorsResponse(DataClassJsonMixin): enabled: Optional[bool] = dc_field( @@ -18910,7 +19560,10 @@ class TypingIndicatorsResponse(DataClassJsonMixin): @dataclass -class UnbanActionRequest(DataClassJsonMixin): +class UnbanActionRequestPayload(DataClassJsonMixin): + channel_cid: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_cid") + ) decision_reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="decision_reason") ) @@ -18932,7 +19585,7 @@ class UnbanResponse(DataClassJsonMixin): @dataclass -class UnblockActionRequest(DataClassJsonMixin): +class UnblockActionRequestPayload(DataClassJsonMixin): decision_reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="decision_reason") ) @@ -18984,6 +19637,9 @@ class UnblockedUserEvent(DataClassJsonMixin): @dataclass class UnfollowBatchRequest(DataClassJsonMixin): follows: "List[FollowPair]" = dc_field(metadata=dc_config(field_name="follows")) + delete_notification_activity: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="delete_notification_activity") + ) @dataclass @@ -19127,8 +19783,49 @@ class UnreadCountsThread(DataClassJsonMixin): unread_count: int = dc_field(metadata=dc_config(field_name="unread_count")) +@dataclass +class UpdateActivitiesPartialBatchRequest(DataClassJsonMixin): + changes: "List[UpdateActivityPartialChangeRequest]" = dc_field( + metadata=dc_config(field_name="changes") + ) + + +@dataclass +class UpdateActivitiesPartialBatchResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + activities: "List[ActivityResponse]" = dc_field( + metadata=dc_config(field_name="activities") + ) + + +@dataclass +class UpdateActivityPartialChangeRequest(DataClassJsonMixin): + activity_id: str = dc_field(metadata=dc_config(field_name="activity_id")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) + handle_mention_notifications: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="handle_mention_notifications") + ) + unset: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="unset") + ) + set: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="set") + ) + + @dataclass class UpdateActivityPartialRequest(DataClassJsonMixin): + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) + handle_mention_notifications: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="handle_mention_notifications") + ) + run_activity_processors: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="run_activity_processors") + ) user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") ) @@ -19151,6 +19848,9 @@ class UpdateActivityPartialResponse(DataClassJsonMixin): @dataclass class UpdateActivityRequest(DataClassJsonMixin): + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) expires_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -19160,12 +19860,18 @@ class UpdateActivityRequest(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) + handle_mention_notifications: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="handle_mention_notifications") + ) poll_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="poll_id") ) restrict_replies: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="restrict_replies") ) + run_activity_processors: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="run_activity_processors") + ) skip_enrich_url: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_enrich_url") ) @@ -19176,6 +19882,9 @@ class UpdateActivityRequest(DataClassJsonMixin): visibility: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="visibility") ) + visibility_tag: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="visibility_tag") + ) attachments: "Optional[List[Attachment]]" = dc_field( default=None, metadata=dc_config(field_name="attachments") ) @@ -19200,6 +19909,9 @@ class UpdateActivityRequest(DataClassJsonMixin): location: "Optional[ActivityLocation]" = dc_field( default=None, metadata=dc_config(field_name="location") ) + search_data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="search_data") + ) user: "Optional[UserRequest]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @@ -19490,7 +20202,7 @@ class UpdateCallTypeRequest(DataClassJsonMixin): grants: "Optional[Dict[str, List[str]]]" = dc_field( default=None, metadata=dc_config(field_name="grants") ) - notification_settings: "Optional[NotificationSettings]" = dc_field( + notification_settings: "Optional[NotificationSettingsRequest]" = dc_field( default=None, metadata=dc_config(field_name="notification_settings") ) settings: "Optional[CallSettingsRequest]" = dc_field( @@ -19519,7 +20231,7 @@ class UpdateCallTypeResponse(DataClassJsonMixin): ) ) grants: "Dict[str, List[str]]" = dc_field(metadata=dc_config(field_name="grants")) - notification_settings: "NotificationSettings" = dc_field( + notification_settings: "NotificationSettingsResponse" = dc_field( metadata=dc_config(field_name="notification_settings") ) settings: "CallSettingsResponse" = dc_field( @@ -19675,6 +20387,9 @@ class UpdateChannelTypeRequest(DataClassJsonMixin): polls: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="polls") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) push_notifications: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="push_notifications") ) @@ -19805,6 +20520,9 @@ class UpdateChannelTypeResponse(DataClassJsonMixin): partition_ttl: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="partition_ttl") ) + push_level: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_level") + ) allowed_flag_reasons: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="allowed_flag_reasons") ) @@ -19864,6 +20582,12 @@ class UpdateCommentRequest(DataClassJsonMixin): comment: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="comment") ) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) + handle_mention_notifications: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="handle_mention_notifications") + ) skip_enrich_url: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_enrich_url") ) @@ -19876,6 +20600,9 @@ class UpdateCommentRequest(DataClassJsonMixin): attachments: "Optional[List[Attachment]]" = dc_field( default=None, metadata=dc_config(field_name="attachments") ) + mentioned_user_ids: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="mentioned_user_ids") + ) custom: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="custom") ) @@ -20038,6 +20765,9 @@ class UpdateFeedVisibilityResponse(DataClassJsonMixin): class UpdateFollowRequest(DataClassJsonMixin): source: str = dc_field(metadata=dc_config(field_name="source")) target: str = dc_field(metadata=dc_config(field_name="target")) + copy_custom_to_notification: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="copy_custom_to_notification") + ) create_notification_activity: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="create_notification_activity") ) @@ -20050,6 +20780,9 @@ class UpdateFollowRequest(DataClassJsonMixin): skip_push: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_push") ) + status: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="status") + ) custom: Optional[Dict[str, object]] = dc_field( default=None, metadata=dc_config(field_name="custom") ) @@ -20129,6 +20862,9 @@ class UpdateMessagePartialRequest(DataClassJsonMixin): skip_enrich_url: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="skip_enrich_url") ) + skip_push: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="skip_push") + ) user_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="user_id") ) @@ -20471,6 +21207,9 @@ class UpsertActivitiesResponse(DataClassJsonMixin): activities: "List[ActivityResponse]" = dc_field( metadata=dc_config(field_name="activities") ) + mention_notifications_created: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="mention_notifications_created") + ) @dataclass @@ -20597,7 +21336,7 @@ class UpsertModerationRuleResponse(DataClassJsonMixin): @dataclass class UpsertModerationTemplateRequest(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) - config: "FeedsModerationTemplateConfig" = dc_field( + config: "FeedsModerationTemplateConfigPayload" = dc_field( metadata=dc_config(field_name="config") ) @@ -20622,7 +21361,7 @@ class UpsertModerationTemplateResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - config: "Optional[FeedsModerationTemplateConfig]" = dc_field( + config: "Optional[FeedsModerationTemplateConfigPayload]" = dc_field( default=None, metadata=dc_config(field_name="config") ) @@ -20637,17 +21376,17 @@ class UpsertPushPreferencesRequest(DataClassJsonMixin): @dataclass class UpsertPushPreferencesResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) - user_channel_preferences: "Dict[str, Dict[str, Optional[ChannelPushPreferences]]]" = dc_field( + user_channel_preferences: "Dict[str, Dict[str, Optional[ChannelPushPreferencesResponse]]]" = dc_field( metadata=dc_config(field_name="user_channel_preferences") ) - user_preferences: "Dict[str, Optional[PushPreferences]]" = dc_field( + user_preferences: "Dict[str, Optional[PushPreferencesResponse]]" = dc_field( metadata=dc_config(field_name="user_preferences") ) @dataclass class UpsertPushProviderRequest(DataClassJsonMixin): - push_provider: "Optional[PushProvider]" = dc_field( + push_provider: "Optional[PushProviderRequest]" = dc_field( default=None, metadata=dc_config(field_name="push_provider") ) @@ -20663,78 +21402,38 @@ class UpsertPushProviderResponse(DataClassJsonMixin): @dataclass class UpsertPushTemplateRequest(DataClassJsonMixin): event_type: str = dc_field(metadata=dc_config(field_name="event_type")) - push_provider_type: str = dc_field( - metadata=dc_config(field_name="push_provider_type") - ) - enable_push: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="enable_push") - ) - push_provider_name: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="push_provider_name") - ) - template: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="template") - ) - - -@dataclass -class UpsertPushTemplateResponse(DataClassJsonMixin): - duration: str = dc_field(metadata=dc_config(field_name="duration")) - template: "Optional[PushTemplate]" = dc_field( - default=None, metadata=dc_config(field_name="template") - ) - - -@dataclass -class User(DataClassJsonMixin): - id: str = dc_field(metadata=dc_config(field_name="id")) - ban_expires: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="ban_expires", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), - ) - banned: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="banned") - ) - invisible: Optional[bool] = dc_field( - default=None, metadata=dc_config(field_name="invisible") - ) - language: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="language") + push_provider_type: str = dc_field( + metadata=dc_config(field_name="push_provider_type") ) - revoke_tokens_issued_before: Optional[datetime] = dc_field( - default=None, - metadata=dc_config( - field_name="revoke_tokens_issued_before", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ), + enable_push: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="enable_push") ) - role: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="role")) - teams: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="teams") + push_provider_name: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="push_provider_name") ) - custom: Optional[Dict[str, object]] = dc_field( - default=None, metadata=dc_config(field_name="custom") + template: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="template") ) - privacy_settings: "Optional[PrivacySettings]" = dc_field( - default=None, metadata=dc_config(field_name="privacy_settings") + + +@dataclass +class UpsertPushTemplateResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + template: "Optional[PushTemplateResponse]" = dc_field( + default=None, metadata=dc_config(field_name="template") ) - teams_role: "Optional[Dict[str, str]]" = dc_field( - default=None, metadata=dc_config(field_name="teams_role") + + +@dataclass +class User(DataClassJsonMixin): + id: str = dc_field(metadata=dc_config(field_name="id")) + data: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="data") ) @dataclass class UserBannedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -20743,9 +21442,22 @@ class UserBannedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - shadow: bool = dc_field(metadata=dc_config(field_name="shadow")) - created_by: "User" = dc_field(metadata=dc_config(field_name="created_by")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field(default="user.banned", metadata=dc_config(field_name="type")) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) expiration: Optional[datetime] = dc_field( default=None, metadata=dc_config( @@ -20758,9 +21470,27 @@ class UserBannedEvent(DataClassJsonMixin): reason: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="reason") ) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + shadow: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="shadow") + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + total_bans: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="total_bans") + ) + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + created_by: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="created_by") ) @@ -20799,12 +21529,22 @@ class UserDeactivatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - created_by: "User" = dc_field(metadata=dc_config(field_name="created_by")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field( default="user.deactivated", metadata=dc_config(field_name="type") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + created_by: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="created_by") ) @@ -20818,16 +21558,29 @@ class UserDeletedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + delete_conversation: str = dc_field( + metadata=dc_config(field_name="delete_conversation") + ) delete_conversation_channels: bool = dc_field( metadata=dc_config(field_name="delete_conversation_channels") ) + delete_messages: str = dc_field(metadata=dc_config(field_name="delete_messages")) + delete_user: str = dc_field(metadata=dc_config(field_name="delete_user")) hard_delete: bool = dc_field(metadata=dc_config(field_name="hard_delete")) mark_messages_deleted: bool = dc_field( metadata=dc_config(field_name="mark_messages_deleted") ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field(default="user.deleted", metadata=dc_config(field_name="type")) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), ) @@ -20873,15 +21626,24 @@ class UserFlaggedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + reason: str = dc_field(metadata=dc_config(field_name="reason")) + total_flags: int = dc_field(metadata=dc_config(field_name="total_flags")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field(default="user.flagged", metadata=dc_config(field_name="type")) - target_user: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="target_user") + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), ) - target_users: Optional[List[str]] = dc_field( - default=None, metadata=dc_config(field_name="target_users") + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + target_user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="target_user") ) @@ -20942,7 +21704,7 @@ class UserMessagesDeletedEvent(DataClassJsonMixin): @dataclass -class UserMute(DataClassJsonMixin): +class UserMuteResponse(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -20968,16 +21730,16 @@ class UserMute(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ), ) - target: "Optional[User]" = dc_field( + target: "Optional[UserResponse]" = dc_field( default=None, metadata=dc_config(field_name="target") ) - user: "Optional[User]" = dc_field( + user: "Optional[UserResponse]" = dc_field( default=None, metadata=dc_config(field_name="user") ) @dataclass -class UserMuteResponse(DataClassJsonMixin): +class UserMutedEvent(DataClassJsonMixin): created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -20986,50 +21748,23 @@ class UserMuteResponse(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - updated_at: datetime = dc_field( - metadata=dc_config( - field_name="updated_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - expires: Optional[datetime] = dc_field( + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) + type: str = dc_field(default="user.muted", metadata=dc_config(field_name="type")) + received_at: Optional[datetime] = dc_field( default=None, metadata=dc_config( - field_name="expires", + field_name="received_at", encoder=encode_datetime, decoder=datetime_from_unix_ns, mm_field=fields.DateTime(format="iso"), ), ) - target: "Optional[UserResponse]" = dc_field( - default=None, metadata=dc_config(field_name="target") - ) - user: "Optional[UserResponse]" = dc_field( - default=None, metadata=dc_config(field_name="user") - ) - - -@dataclass -class UserMutedEvent(DataClassJsonMixin): - created_at: datetime = dc_field( - metadata=dc_config( - field_name="created_at", - encoder=encode_datetime, - decoder=datetime_from_unix_ns, - mm_field=fields.DateTime(format="iso"), - ) - ) - type: str = dc_field(default="user.muted", metadata=dc_config(field_name="type")) - target_user: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="target_user") - ) - target_users: Optional[List[str]] = dc_field( + target_users: "Optional[List[UserResponseCommonFields]]" = dc_field( default=None, metadata=dc_config(field_name="target_users") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + target_user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="target_user") ) @@ -21049,11 +21784,22 @@ class UserReactivatedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field( default="user.reactivated", metadata=dc_config(field_name="type") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + created_by: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="created_by") ) @@ -21356,9 +22102,6 @@ class UserRuleParameters(DataClassJsonMixin): @dataclass class UserUnbannedEvent(DataClassJsonMixin): - channel_id: str = dc_field(metadata=dc_config(field_name="channel_id")) - channel_type: str = dc_field(metadata=dc_config(field_name="channel_type")) - cid: str = dc_field(metadata=dc_config(field_name="cid")) created_at: datetime = dc_field( metadata=dc_config( field_name="created_at", @@ -21367,11 +22110,40 @@ class UserUnbannedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - shadow: bool = dc_field(metadata=dc_config(field_name="shadow")) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field(default="user.unbanned", metadata=dc_config(field_name="type")) + channel_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_id") + ) + channel_member_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_member_count") + ) + channel_message_count: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="channel_message_count") + ) + channel_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="channel_type") + ) + cid: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="cid")) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + shadow: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="shadow") + ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + channel_custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="channel_custom") + ) + created_by: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="created_by") ) @@ -21385,15 +22157,23 @@ class UserUnmutedEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field(default="user.unmuted", metadata=dc_config(field_name="type")) - target_user: Optional[str] = dc_field( - default=None, metadata=dc_config(field_name="target_user") + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), ) - target_users: Optional[List[str]] = dc_field( + target_users: "Optional[List[UserResponseCommonFields]]" = dc_field( default=None, metadata=dc_config(field_name="target_users") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + target_user: "Optional[UserResponseCommonFields]" = dc_field( + default=None, metadata=dc_config(field_name="target_user") ) @@ -21407,14 +22187,22 @@ class UserUnreadReminderEvent(DataClassJsonMixin): mm_field=fields.DateTime(format="iso"), ) ) - channels: "Dict[str, Optional[ChannelMessages]]" = dc_field( + channels: "Dict[str, Optional[ChannelMessagesResponse]]" = dc_field( metadata=dc_config(field_name="channels") ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + user: "UserResponseCommonFields" = dc_field(metadata=dc_config(field_name="user")) type: str = dc_field( default="user.unread_message_reminder", metadata=dc_config(field_name="type") ) - user: "Optional[User]" = dc_field( - default=None, metadata=dc_config(field_name="user") + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), ) @@ -21532,12 +22320,12 @@ class VideoContentParameters(DataClassJsonMixin): @dataclass -class VideoEndCallRequest(DataClassJsonMixin): +class VideoEndCallRequestPayload(DataClassJsonMixin): pass @dataclass -class VideoKickUserRequest(DataClassJsonMixin): +class VideoKickUserRequestPayload(DataClassJsonMixin): pass @@ -21548,6 +22336,18 @@ class VideoReactionOverTimeResponse(DataClassJsonMixin): ) +@dataclass +class VideoReactionResponse(DataClassJsonMixin): + type: str = dc_field(metadata=dc_config(field_name="type")) + user: "UserResponse" = dc_field(metadata=dc_config(field_name="user")) + emoji_code: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="emoji_code") + ) + custom: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="custom") + ) + + @dataclass class VideoReactionsResponse(DataClassJsonMixin): reaction: str = dc_field(metadata=dc_config(field_name="reaction")) @@ -21628,6 +22428,11 @@ class VoteData(DataClassJsonMixin): ) +@dataclass +class WHEvent(DataClassJsonMixin): + type: str = dc_field(metadata=dc_config(field_name="type")) + + @dataclass class WHIPIngress(DataClassJsonMixin): address: str = dc_field(metadata=dc_config(field_name="address")) @@ -21721,11 +22526,6 @@ class WSEvent(DataClassJsonMixin): ) -@dataclass -class WebhookEvent(DataClassJsonMixin): - type: str = dc_field(metadata=dc_config(field_name="type")) - - @dataclass class WrappedUnreadCountsResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) diff --git a/getstream/moderation/async_rest_client.py b/getstream/moderation/async_rest_client.py index 1272a45d..d2497e00 100644 --- a/getstream/moderation/async_rest_client.py +++ b/getstream/moderation/async_rest_client.py @@ -263,7 +263,7 @@ async def custom_check( flags: List[CustomCheckFlag], entity_creator_id: Optional[str] = None, user_id: Optional[str] = None, - moderation_payload: Optional[ModerationPayload] = None, + moderation_payload: Optional[ModerationPayloadRequest] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CustomCheckResponse]: json = build_body_dict( @@ -299,7 +299,7 @@ async def v2_query_templates( @telemetry.operation_name("getstream.api.moderation.v2_upsert_template") async def v2_upsert_template( - self, name: str, config: FeedsModerationTemplateConfig + self, name: str, config: FeedsModerationTemplateConfigPayload ) -> StreamResponse[UpsertModerationTemplateResponse]: json = build_body_dict(name=name, config=config) return await self.post( @@ -338,7 +338,7 @@ async def query_moderation_flags( limit: Optional[int] = None, next: Optional[str] = None, prev: Optional[str] = None, - sort: Optional[List[SortParam]] = None, + sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryModerationFlagsResponse]: json = build_body_dict( @@ -511,20 +511,21 @@ async def submit_action( appeal_id: Optional[str] = None, item_id: Optional[str] = None, user_id: Optional[str] = None, - ban: Optional[BanActionRequest] = None, - block: Optional[BlockActionRequest] = None, - custom: Optional[CustomActionRequest] = None, - delete_activity: Optional[DeleteActivityRequest] = None, - delete_comment: Optional[DeleteCommentRequest] = None, - delete_message: Optional[DeleteMessageRequest] = None, - delete_reaction: Optional[DeleteReactionRequest] = None, - delete_user: Optional[DeleteUserRequest] = None, - mark_reviewed: Optional[MarkReviewedRequest] = None, - reject_appeal: Optional[RejectAppealRequest] = None, - restore: Optional[RestoreActionRequest] = None, - shadow_block: Optional[ShadowBlockActionRequest] = None, - unban: Optional[UnbanActionRequest] = None, - unblock: Optional[UnblockActionRequest] = None, + ban: Optional[BanActionRequestPayload] = None, + block: Optional[BlockActionRequestPayload] = None, + custom: Optional[CustomActionRequestPayload] = None, + delete_activity: Optional[DeleteActivityRequestPayload] = None, + delete_comment: Optional[DeleteCommentRequestPayload] = None, + delete_message: Optional[DeleteMessageRequestPayload] = None, + delete_reaction: Optional[DeleteReactionRequestPayload] = None, + delete_user: Optional[DeleteUserRequestPayload] = None, + flag: Optional[FlagRequest] = None, + mark_reviewed: Optional[MarkReviewedRequestPayload] = None, + reject_appeal: Optional[RejectAppealRequestPayload] = None, + restore: Optional[RestoreActionRequestPayload] = None, + shadow_block: Optional[ShadowBlockActionRequestPayload] = None, + unban: Optional[UnbanActionRequestPayload] = None, + unblock: Optional[UnblockActionRequestPayload] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[SubmitActionResponse]: json = build_body_dict( @@ -540,6 +541,7 @@ async def submit_action( delete_message=delete_message, delete_reaction=delete_reaction, delete_user=delete_user, + flag=flag, mark_reviewed=mark_reviewed, reject_appeal=reject_appeal, restore=restore, diff --git a/getstream/moderation/rest_client.py b/getstream/moderation/rest_client.py index e82f9a41..3378a256 100644 --- a/getstream/moderation/rest_client.py +++ b/getstream/moderation/rest_client.py @@ -259,7 +259,7 @@ def custom_check( flags: List[CustomCheckFlag], entity_creator_id: Optional[str] = None, user_id: Optional[str] = None, - moderation_payload: Optional[ModerationPayload] = None, + moderation_payload: Optional[ModerationPayloadRequest] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CustomCheckResponse]: json = build_body_dict( @@ -293,7 +293,7 @@ def v2_query_templates( @telemetry.operation_name("getstream.api.moderation.v2_upsert_template") def v2_upsert_template( - self, name: str, config: FeedsModerationTemplateConfig + self, name: str, config: FeedsModerationTemplateConfigPayload ) -> StreamResponse[UpsertModerationTemplateResponse]: json = build_body_dict(name=name, config=config) return self.post( @@ -332,7 +332,7 @@ def query_moderation_flags( limit: Optional[int] = None, next: Optional[str] = None, prev: Optional[str] = None, - sort: Optional[List[SortParam]] = None, + sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryModerationFlagsResponse]: json = build_body_dict( @@ -503,20 +503,21 @@ def submit_action( appeal_id: Optional[str] = None, item_id: Optional[str] = None, user_id: Optional[str] = None, - ban: Optional[BanActionRequest] = None, - block: Optional[BlockActionRequest] = None, - custom: Optional[CustomActionRequest] = None, - delete_activity: Optional[DeleteActivityRequest] = None, - delete_comment: Optional[DeleteCommentRequest] = None, - delete_message: Optional[DeleteMessageRequest] = None, - delete_reaction: Optional[DeleteReactionRequest] = None, - delete_user: Optional[DeleteUserRequest] = None, - mark_reviewed: Optional[MarkReviewedRequest] = None, - reject_appeal: Optional[RejectAppealRequest] = None, - restore: Optional[RestoreActionRequest] = None, - shadow_block: Optional[ShadowBlockActionRequest] = None, - unban: Optional[UnbanActionRequest] = None, - unblock: Optional[UnblockActionRequest] = None, + ban: Optional[BanActionRequestPayload] = None, + block: Optional[BlockActionRequestPayload] = None, + custom: Optional[CustomActionRequestPayload] = None, + delete_activity: Optional[DeleteActivityRequestPayload] = None, + delete_comment: Optional[DeleteCommentRequestPayload] = None, + delete_message: Optional[DeleteMessageRequestPayload] = None, + delete_reaction: Optional[DeleteReactionRequestPayload] = None, + delete_user: Optional[DeleteUserRequestPayload] = None, + flag: Optional[FlagRequest] = None, + mark_reviewed: Optional[MarkReviewedRequestPayload] = None, + reject_appeal: Optional[RejectAppealRequestPayload] = None, + restore: Optional[RestoreActionRequestPayload] = None, + shadow_block: Optional[ShadowBlockActionRequestPayload] = None, + unban: Optional[UnbanActionRequestPayload] = None, + unblock: Optional[UnblockActionRequestPayload] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[SubmitActionResponse]: json = build_body_dict( @@ -532,6 +533,7 @@ def submit_action( delete_message=delete_message, delete_reaction=delete_reaction, delete_user=delete_user, + flag=flag, mark_reviewed=mark_reviewed, reject_appeal=reject_appeal, restore=restore, diff --git a/getstream/tests/test_webhook.py b/getstream/tests/test_webhook.py new file mode 100644 index 00000000..6cf1e456 --- /dev/null +++ b/getstream/tests/test_webhook.py @@ -0,0 +1,724 @@ +# Code generated by GetStream internal OpenAPI code generator. DO NOT EDIT. + +import hmac +import hashlib + +import pytest + +from getstream.webhook import ( + get_event_type, + parse_webhook_event, + verify_webhook_signature, +) + + +class TestVerifyWebhookSignature: + def setup_method(self): + self.secret = "test-webhook-secret" + self.body = b'{"type":"test.event"}' + self.valid_signature = hmac.new( + self.secret.encode("utf-8"), self.body, hashlib.sha256 + ).hexdigest() + + def test_valid_signature(self): + assert ( + verify_webhook_signature(self.body, self.valid_signature, self.secret) + is True + ) + + def test_wrong_signature(self): + assert ( + verify_webhook_signature(self.body, "invalidsignature", self.secret) + is False + ) + + def test_tampered_body(self): + assert ( + verify_webhook_signature( + b'{"type":"tampered"}', self.valid_signature, self.secret + ) + is False + ) + + def test_wrong_secret(self): + assert ( + verify_webhook_signature(self.body, self.valid_signature, "wrong-secret") + is False + ) + + def test_string_body(self): + body_str = '{"type":"test.event"}' + sig = hmac.new( + self.secret.encode("utf-8"), body_str.encode("utf-8"), hashlib.sha256 + ).hexdigest() + assert verify_webhook_signature(body_str, sig, self.secret) is True + + +class TestGetEventType: + def test_from_string(self): + assert get_event_type('{"type":"message.new"}') == "message.new" + + def test_from_bytes(self): + assert get_event_type(b'{"type":"message.new"}') == "message.new" + + def test_from_dict(self): + assert get_event_type({"type": "message.new"}) == "message.new" + + def test_missing_type(self): + assert get_event_type('{"foo":"bar"}') == "" + + def test_invalid_json(self): + assert get_event_type("not json") == "" + + def test_empty_object(self): + assert get_event_type("{}") == "" + + +class TestParseWebhookEvent: + def test_parse_(self): + event = parse_webhook_event({"type": "*"}) + assert type(event).__name__ == "CustomEvent" + + def test_parse_appeal_accepted(self): + event = parse_webhook_event({"type": "appeal.accepted"}) + assert type(event).__name__ == "AppealAcceptedEvent" + + def test_parse_appeal_created(self): + event = parse_webhook_event({"type": "appeal.created"}) + assert type(event).__name__ == "AppealCreatedEvent" + + def test_parse_appeal_rejected(self): + event = parse_webhook_event({"type": "appeal.rejected"}) + assert type(event).__name__ == "AppealRejectedEvent" + + def test_parse_call_accepted(self): + event = parse_webhook_event({"type": "call.accepted"}) + assert type(event).__name__ == "CallAcceptedEvent" + + def test_parse_call_blocked_user(self): + event = parse_webhook_event({"type": "call.blocked_user"}) + assert type(event).__name__ == "BlockedUserEvent" + + def test_parse_call_closed_caption(self): + event = parse_webhook_event({"type": "call.closed_caption"}) + assert type(event).__name__ == "ClosedCaptionEvent" + + def test_parse_call_closed_captions_failed(self): + event = parse_webhook_event({"type": "call.closed_captions_failed"}) + assert type(event).__name__ == "CallClosedCaptionsFailedEvent" + + def test_parse_call_closed_captions_started(self): + event = parse_webhook_event({"type": "call.closed_captions_started"}) + assert type(event).__name__ == "CallClosedCaptionsStartedEvent" + + def test_parse_call_closed_captions_stopped(self): + event = parse_webhook_event({"type": "call.closed_captions_stopped"}) + assert type(event).__name__ == "CallClosedCaptionsStoppedEvent" + + def test_parse_call_created(self): + event = parse_webhook_event({"type": "call.created"}) + assert type(event).__name__ == "CallCreatedEvent" + + def test_parse_call_deleted(self): + event = parse_webhook_event({"type": "call.deleted"}) + assert type(event).__name__ == "CallDeletedEvent" + + def test_parse_call_dtmf(self): + event = parse_webhook_event({"type": "call.dtmf"}) + assert type(event).__name__ == "CallDTMFEvent" + + def test_parse_call_ended(self): + event = parse_webhook_event({"type": "call.ended"}) + assert type(event).__name__ == "CallEndedEvent" + + def test_parse_call_frame_recording_failed(self): + event = parse_webhook_event({"type": "call.frame_recording_failed"}) + assert type(event).__name__ == "CallFrameRecordingFailedEvent" + + def test_parse_call_frame_recording_ready(self): + event = parse_webhook_event({"type": "call.frame_recording_ready"}) + assert type(event).__name__ == "CallFrameRecordingFrameReadyEvent" + + def test_parse_call_frame_recording_started(self): + event = parse_webhook_event({"type": "call.frame_recording_started"}) + assert type(event).__name__ == "CallFrameRecordingStartedEvent" + + def test_parse_call_frame_recording_stopped(self): + event = parse_webhook_event({"type": "call.frame_recording_stopped"}) + assert type(event).__name__ == "CallFrameRecordingStoppedEvent" + + def test_parse_call_hls_broadcasting_failed(self): + event = parse_webhook_event({"type": "call.hls_broadcasting_failed"}) + assert type(event).__name__ == "CallHLSBroadcastingFailedEvent" + + def test_parse_call_hls_broadcasting_started(self): + event = parse_webhook_event({"type": "call.hls_broadcasting_started"}) + assert type(event).__name__ == "CallHLSBroadcastingStartedEvent" + + def test_parse_call_hls_broadcasting_stopped(self): + event = parse_webhook_event({"type": "call.hls_broadcasting_stopped"}) + assert type(event).__name__ == "CallHLSBroadcastingStoppedEvent" + + def test_parse_call_kicked_user(self): + event = parse_webhook_event({"type": "call.kicked_user"}) + assert type(event).__name__ == "KickedUserEvent" + + def test_parse_call_live_started(self): + event = parse_webhook_event({"type": "call.live_started"}) + assert type(event).__name__ == "CallLiveStartedEvent" + + def test_parse_call_member_added(self): + event = parse_webhook_event({"type": "call.member_added"}) + assert type(event).__name__ == "CallMemberAddedEvent" + + def test_parse_call_member_removed(self): + event = parse_webhook_event({"type": "call.member_removed"}) + assert type(event).__name__ == "CallMemberRemovedEvent" + + def test_parse_call_member_updated(self): + event = parse_webhook_event({"type": "call.member_updated"}) + assert type(event).__name__ == "CallMemberUpdatedEvent" + + def test_parse_call_member_updated_permission(self): + event = parse_webhook_event({"type": "call.member_updated_permission"}) + assert type(event).__name__ == "CallMemberUpdatedPermissionEvent" + + def test_parse_call_missed(self): + event = parse_webhook_event({"type": "call.missed"}) + assert type(event).__name__ == "CallMissedEvent" + + def test_parse_call_moderation_blur(self): + event = parse_webhook_event({"type": "call.moderation_blur"}) + assert type(event).__name__ == "CallModerationBlurEvent" + + def test_parse_call_moderation_warning(self): + event = parse_webhook_event({"type": "call.moderation_warning"}) + assert type(event).__name__ == "CallModerationWarningEvent" + + def test_parse_call_notification(self): + event = parse_webhook_event({"type": "call.notification"}) + assert type(event).__name__ == "CallNotificationEvent" + + def test_parse_call_permission_request(self): + event = parse_webhook_event({"type": "call.permission_request"}) + assert type(event).__name__ == "PermissionRequestEvent" + + def test_parse_call_permissions_updated(self): + event = parse_webhook_event({"type": "call.permissions_updated"}) + assert type(event).__name__ == "UpdatedCallPermissionsEvent" + + def test_parse_call_reaction_new(self): + event = parse_webhook_event({"type": "call.reaction_new"}) + assert type(event).__name__ == "CallReactionEvent" + + def test_parse_call_recording_failed(self): + event = parse_webhook_event({"type": "call.recording_failed"}) + assert type(event).__name__ == "CallRecordingFailedEvent" + + def test_parse_call_recording_ready(self): + event = parse_webhook_event({"type": "call.recording_ready"}) + assert type(event).__name__ == "CallRecordingReadyEvent" + + def test_parse_call_recording_started(self): + event = parse_webhook_event({"type": "call.recording_started"}) + assert type(event).__name__ == "CallRecordingStartedEvent" + + def test_parse_call_recording_stopped(self): + event = parse_webhook_event({"type": "call.recording_stopped"}) + assert type(event).__name__ == "CallRecordingStoppedEvent" + + def test_parse_call_rejected(self): + event = parse_webhook_event({"type": "call.rejected"}) + assert type(event).__name__ == "CallRejectedEvent" + + def test_parse_call_ring(self): + event = parse_webhook_event({"type": "call.ring"}) + assert type(event).__name__ == "CallRingEvent" + + def test_parse_call_rtmp_broadcast_failed(self): + event = parse_webhook_event({"type": "call.rtmp_broadcast_failed"}) + assert type(event).__name__ == "CallRtmpBroadcastFailedEvent" + + def test_parse_call_rtmp_broadcast_started(self): + event = parse_webhook_event({"type": "call.rtmp_broadcast_started"}) + assert type(event).__name__ == "CallRtmpBroadcastStartedEvent" + + def test_parse_call_rtmp_broadcast_stopped(self): + event = parse_webhook_event({"type": "call.rtmp_broadcast_stopped"}) + assert type(event).__name__ == "CallRtmpBroadcastStoppedEvent" + + def test_parse_call_session_ended(self): + event = parse_webhook_event({"type": "call.session_ended"}) + assert type(event).__name__ == "CallSessionEndedEvent" + + def test_parse_call_session_participant_count_updated(self): + event = parse_webhook_event({"type": "call.session_participant_count_updated"}) + assert type(event).__name__ == "CallSessionParticipantCountsUpdatedEvent" + + def test_parse_call_session_participant_joined(self): + event = parse_webhook_event({"type": "call.session_participant_joined"}) + assert type(event).__name__ == "CallSessionParticipantJoinedEvent" + + def test_parse_call_session_participant_left(self): + event = parse_webhook_event({"type": "call.session_participant_left"}) + assert type(event).__name__ == "CallSessionParticipantLeftEvent" + + def test_parse_call_session_started(self): + event = parse_webhook_event({"type": "call.session_started"}) + assert type(event).__name__ == "CallSessionStartedEvent" + + def test_parse_call_stats_report_ready(self): + event = parse_webhook_event({"type": "call.stats_report_ready"}) + assert type(event).__name__ == "CallStatsReportReadyEvent" + + def test_parse_call_transcription_failed(self): + event = parse_webhook_event({"type": "call.transcription_failed"}) + assert type(event).__name__ == "CallTranscriptionFailedEvent" + + def test_parse_call_transcription_ready(self): + event = parse_webhook_event({"type": "call.transcription_ready"}) + assert type(event).__name__ == "CallTranscriptionReadyEvent" + + def test_parse_call_transcription_started(self): + event = parse_webhook_event({"type": "call.transcription_started"}) + assert type(event).__name__ == "CallTranscriptionStartedEvent" + + def test_parse_call_transcription_stopped(self): + event = parse_webhook_event({"type": "call.transcription_stopped"}) + assert type(event).__name__ == "CallTranscriptionStoppedEvent" + + def test_parse_call_unblocked_user(self): + event = parse_webhook_event({"type": "call.unblocked_user"}) + assert type(event).__name__ == "UnblockedUserEvent" + + def test_parse_call_updated(self): + event = parse_webhook_event({"type": "call.updated"}) + assert type(event).__name__ == "CallUpdatedEvent" + + def test_parse_call_user_feedback_submitted(self): + event = parse_webhook_event({"type": "call.user_feedback_submitted"}) + assert type(event).__name__ == "CallUserFeedbackSubmittedEvent" + + def test_parse_call_user_muted(self): + event = parse_webhook_event({"type": "call.user_muted"}) + assert type(event).__name__ == "CallUserMutedEvent" + + def test_parse_campaign_completed(self): + event = parse_webhook_event({"type": "campaign.completed"}) + assert type(event).__name__ == "CampaignCompletedEvent" + + def test_parse_campaign_started(self): + event = parse_webhook_event({"type": "campaign.started"}) + assert type(event).__name__ == "CampaignStartedEvent" + + def test_parse_channel_created(self): + event = parse_webhook_event({"type": "channel.created"}) + assert type(event).__name__ == "ChannelCreatedEvent" + + def test_parse_channel_deleted(self): + event = parse_webhook_event({"type": "channel.deleted"}) + assert type(event).__name__ == "ChannelDeletedEvent" + + def test_parse_channel_frozen(self): + event = parse_webhook_event({"type": "channel.frozen"}) + assert type(event).__name__ == "ChannelFrozenEvent" + + def test_parse_channel_hidden(self): + event = parse_webhook_event({"type": "channel.hidden"}) + assert type(event).__name__ == "ChannelHiddenEvent" + + def test_parse_channel_max_streak_changed(self): + event = parse_webhook_event({"type": "channel.max_streak_changed"}) + assert type(event).__name__ == "MaxStreakChangedEvent" + + def test_parse_channel_muted(self): + event = parse_webhook_event({"type": "channel.muted"}) + assert type(event).__name__ == "ChannelMutedEvent" + + def test_parse_channel_truncated(self): + event = parse_webhook_event({"type": "channel.truncated"}) + assert type(event).__name__ == "ChannelTruncatedEvent" + + def test_parse_channel_unfrozen(self): + event = parse_webhook_event({"type": "channel.unfrozen"}) + assert type(event).__name__ == "ChannelUnFrozenEvent" + + def test_parse_channel_unmuted(self): + event = parse_webhook_event({"type": "channel.unmuted"}) + assert type(event).__name__ == "ChannelUnmutedEvent" + + def test_parse_channel_updated(self): + event = parse_webhook_event({"type": "channel.updated"}) + assert type(event).__name__ == "ChannelUpdatedEvent" + + def test_parse_channel_visible(self): + event = parse_webhook_event({"type": "channel.visible"}) + assert type(event).__name__ == "ChannelVisibleEvent" + + def test_parse_channel_batch_update_completed(self): + event = parse_webhook_event({"type": "channel_batch_update.completed"}) + assert type(event).__name__ == "ChannelBatchCompletedEvent" + + def test_parse_channel_batch_update_started(self): + event = parse_webhook_event({"type": "channel_batch_update.started"}) + assert type(event).__name__ == "ChannelBatchStartedEvent" + + def test_parse_custom(self): + event = parse_webhook_event({"type": "custom"}) + assert type(event).__name__ == "CustomVideoEvent" + + def test_parse_export_bulk_image_moderation_error(self): + event = parse_webhook_event({"type": "export.bulk_image_moderation.error"}) + assert type(event).__name__ == "AsyncExportErrorEvent" + + def test_parse_export_bulk_image_moderation_success(self): + event = parse_webhook_event({"type": "export.bulk_image_moderation.success"}) + assert type(event).__name__ == "AsyncBulkImageModerationEvent" + + def test_parse_export_channels_error(self): + event = parse_webhook_event({"type": "export.channels.error"}) + assert type(event).__name__ == "AsyncExportErrorEvent" + + def test_parse_export_channels_success(self): + event = parse_webhook_event({"type": "export.channels.success"}) + assert type(event).__name__ == "AsyncExportChannelsEvent" + + def test_parse_export_moderation_logs_error(self): + event = parse_webhook_event({"type": "export.moderation_logs.error"}) + assert type(event).__name__ == "AsyncExportErrorEvent" + + def test_parse_export_moderation_logs_success(self): + event = parse_webhook_event({"type": "export.moderation_logs.success"}) + assert type(event).__name__ == "AsyncExportModerationLogsEvent" + + def test_parse_export_users_error(self): + event = parse_webhook_event({"type": "export.users.error"}) + assert type(event).__name__ == "AsyncExportErrorEvent" + + def test_parse_export_users_success(self): + event = parse_webhook_event({"type": "export.users.success"}) + assert type(event).__name__ == "AsyncExportUsersEvent" + + def test_parse_feeds_activity_added(self): + event = parse_webhook_event({"type": "feeds.activity.added"}) + assert type(event).__name__ == "ActivityAddedEvent" + + def test_parse_feeds_activity_deleted(self): + event = parse_webhook_event({"type": "feeds.activity.deleted"}) + assert type(event).__name__ == "ActivityDeletedEvent" + + def test_parse_feeds_activity_feedback(self): + event = parse_webhook_event({"type": "feeds.activity.feedback"}) + assert type(event).__name__ == "ActivityFeedbackEvent" + + def test_parse_feeds_activity_marked(self): + event = parse_webhook_event({"type": "feeds.activity.marked"}) + assert type(event).__name__ == "ActivityMarkEvent" + + def test_parse_feeds_activity_pinned(self): + event = parse_webhook_event({"type": "feeds.activity.pinned"}) + assert type(event).__name__ == "ActivityPinnedEvent" + + def test_parse_feeds_activity_reaction_added(self): + event = parse_webhook_event({"type": "feeds.activity.reaction.added"}) + assert type(event).__name__ == "ActivityReactionAddedEvent" + + def test_parse_feeds_activity_reaction_deleted(self): + event = parse_webhook_event({"type": "feeds.activity.reaction.deleted"}) + assert type(event).__name__ == "ActivityReactionDeletedEvent" + + def test_parse_feeds_activity_reaction_updated(self): + event = parse_webhook_event({"type": "feeds.activity.reaction.updated"}) + assert type(event).__name__ == "ActivityReactionUpdatedEvent" + + def test_parse_feeds_activity_removed_from_feed(self): + event = parse_webhook_event({"type": "feeds.activity.removed_from_feed"}) + assert type(event).__name__ == "ActivityRemovedFromFeedEvent" + + def test_parse_feeds_activity_restored(self): + event = parse_webhook_event({"type": "feeds.activity.restored"}) + assert type(event).__name__ == "ActivityRestoredEvent" + + def test_parse_feeds_activity_unpinned(self): + event = parse_webhook_event({"type": "feeds.activity.unpinned"}) + assert type(event).__name__ == "ActivityUnpinnedEvent" + + def test_parse_feeds_activity_updated(self): + event = parse_webhook_event({"type": "feeds.activity.updated"}) + assert type(event).__name__ == "ActivityUpdatedEvent" + + def test_parse_feeds_bookmark_added(self): + event = parse_webhook_event({"type": "feeds.bookmark.added"}) + assert type(event).__name__ == "BookmarkAddedEvent" + + def test_parse_feeds_bookmark_deleted(self): + event = parse_webhook_event({"type": "feeds.bookmark.deleted"}) + assert type(event).__name__ == "BookmarkDeletedEvent" + + def test_parse_feeds_bookmark_updated(self): + event = parse_webhook_event({"type": "feeds.bookmark.updated"}) + assert type(event).__name__ == "BookmarkUpdatedEvent" + + def test_parse_feeds_bookmark_folder_deleted(self): + event = parse_webhook_event({"type": "feeds.bookmark_folder.deleted"}) + assert type(event).__name__ == "BookmarkFolderDeletedEvent" + + def test_parse_feeds_bookmark_folder_updated(self): + event = parse_webhook_event({"type": "feeds.bookmark_folder.updated"}) + assert type(event).__name__ == "BookmarkFolderUpdatedEvent" + + def test_parse_feeds_comment_added(self): + event = parse_webhook_event({"type": "feeds.comment.added"}) + assert type(event).__name__ == "CommentAddedEvent" + + def test_parse_feeds_comment_deleted(self): + event = parse_webhook_event({"type": "feeds.comment.deleted"}) + assert type(event).__name__ == "CommentDeletedEvent" + + def test_parse_feeds_comment_reaction_added(self): + event = parse_webhook_event({"type": "feeds.comment.reaction.added"}) + assert type(event).__name__ == "CommentReactionAddedEvent" + + def test_parse_feeds_comment_reaction_deleted(self): + event = parse_webhook_event({"type": "feeds.comment.reaction.deleted"}) + assert type(event).__name__ == "CommentReactionDeletedEvent" + + def test_parse_feeds_comment_reaction_updated(self): + event = parse_webhook_event({"type": "feeds.comment.reaction.updated"}) + assert type(event).__name__ == "CommentReactionUpdatedEvent" + + def test_parse_feeds_comment_updated(self): + event = parse_webhook_event({"type": "feeds.comment.updated"}) + assert type(event).__name__ == "CommentUpdatedEvent" + + def test_parse_feeds_feed_created(self): + event = parse_webhook_event({"type": "feeds.feed.created"}) + assert type(event).__name__ == "FeedCreatedEvent" + + def test_parse_feeds_feed_deleted(self): + event = parse_webhook_event({"type": "feeds.feed.deleted"}) + assert type(event).__name__ == "FeedDeletedEvent" + + def test_parse_feeds_feed_updated(self): + event = parse_webhook_event({"type": "feeds.feed.updated"}) + assert type(event).__name__ == "FeedUpdatedEvent" + + def test_parse_feeds_feed_group_changed(self): + event = parse_webhook_event({"type": "feeds.feed_group.changed"}) + assert type(event).__name__ == "FeedGroupChangedEvent" + + def test_parse_feeds_feed_group_deleted(self): + event = parse_webhook_event({"type": "feeds.feed_group.deleted"}) + assert type(event).__name__ == "FeedGroupDeletedEvent" + + def test_parse_feeds_feed_member_added(self): + event = parse_webhook_event({"type": "feeds.feed_member.added"}) + assert type(event).__name__ == "FeedMemberAddedEvent" + + def test_parse_feeds_feed_member_removed(self): + event = parse_webhook_event({"type": "feeds.feed_member.removed"}) + assert type(event).__name__ == "FeedMemberRemovedEvent" + + def test_parse_feeds_feed_member_updated(self): + event = parse_webhook_event({"type": "feeds.feed_member.updated"}) + assert type(event).__name__ == "FeedMemberUpdatedEvent" + + def test_parse_feeds_follow_created(self): + event = parse_webhook_event({"type": "feeds.follow.created"}) + assert type(event).__name__ == "FollowCreatedEvent" + + def test_parse_feeds_follow_deleted(self): + event = parse_webhook_event({"type": "feeds.follow.deleted"}) + assert type(event).__name__ == "FollowDeletedEvent" + + def test_parse_feeds_follow_updated(self): + event = parse_webhook_event({"type": "feeds.follow.updated"}) + assert type(event).__name__ == "FollowUpdatedEvent" + + def test_parse_feeds_notification_feed_updated(self): + event = parse_webhook_event({"type": "feeds.notification_feed.updated"}) + assert type(event).__name__ == "NotificationFeedUpdatedEvent" + + def test_parse_feeds_stories_feed_updated(self): + event = parse_webhook_event({"type": "feeds.stories_feed.updated"}) + assert type(event).__name__ == "StoriesFeedUpdatedEvent" + + def test_parse_flag_updated(self): + event = parse_webhook_event({"type": "flag.updated"}) + assert type(event).__name__ == "FlagUpdatedEvent" + + def test_parse_ingress_error(self): + event = parse_webhook_event({"type": "ingress.error"}) + assert type(event).__name__ == "IngressErrorEvent" + + def test_parse_ingress_started(self): + event = parse_webhook_event({"type": "ingress.started"}) + assert type(event).__name__ == "IngressStartedEvent" + + def test_parse_ingress_stopped(self): + event = parse_webhook_event({"type": "ingress.stopped"}) + assert type(event).__name__ == "IngressStoppedEvent" + + def test_parse_member_added(self): + event = parse_webhook_event({"type": "member.added"}) + assert type(event).__name__ == "MemberAddedEvent" + + def test_parse_member_removed(self): + event = parse_webhook_event({"type": "member.removed"}) + assert type(event).__name__ == "MemberRemovedEvent" + + def test_parse_member_updated(self): + event = parse_webhook_event({"type": "member.updated"}) + assert type(event).__name__ == "MemberUpdatedEvent" + + def test_parse_message_deleted(self): + event = parse_webhook_event({"type": "message.deleted"}) + assert type(event).__name__ == "MessageDeletedEvent" + + def test_parse_message_flagged(self): + event = parse_webhook_event({"type": "message.flagged"}) + assert type(event).__name__ == "MessageFlaggedEvent" + + def test_parse_message_new(self): + event = parse_webhook_event({"type": "message.new"}) + assert type(event).__name__ == "MessageNewEvent" + + def test_parse_message_pending(self): + event = parse_webhook_event({"type": "message.pending"}) + assert type(event).__name__ == "PendingMessageEvent" + + def test_parse_message_read(self): + event = parse_webhook_event({"type": "message.read"}) + assert type(event).__name__ == "MessageReadEvent" + + def test_parse_message_unblocked(self): + event = parse_webhook_event({"type": "message.unblocked"}) + assert type(event).__name__ == "MessageUnblockedEvent" + + def test_parse_message_undeleted(self): + event = parse_webhook_event({"type": "message.undeleted"}) + assert type(event).__name__ == "MessageUndeletedEvent" + + def test_parse_message_updated(self): + event = parse_webhook_event({"type": "message.updated"}) + assert type(event).__name__ == "MessageUpdatedEvent" + + def test_parse_moderation_custom_action(self): + event = parse_webhook_event({"type": "moderation.custom_action"}) + assert type(event).__name__ == "ModerationCustomActionEvent" + + def test_parse_moderation_flagged(self): + event = parse_webhook_event({"type": "moderation.flagged"}) + assert type(event).__name__ == "ModerationFlaggedEvent" + + def test_parse_moderation_mark_reviewed(self): + event = parse_webhook_event({"type": "moderation.mark_reviewed"}) + assert type(event).__name__ == "ModerationMarkReviewedEvent" + + def test_parse_moderation_check_completed(self): + event = parse_webhook_event({"type": "moderation_check.completed"}) + assert type(event).__name__ == "ModerationCheckCompletedEvent" + + def test_parse_notification_mark_unread(self): + event = parse_webhook_event({"type": "notification.mark_unread"}) + assert type(event).__name__ == "NotificationMarkUnreadEvent" + + def test_parse_notification_reminder_due(self): + event = parse_webhook_event({"type": "notification.reminder_due"}) + assert type(event).__name__ == "ReminderNotificationEvent" + + def test_parse_notification_thread_message_new(self): + event = parse_webhook_event({"type": "notification.thread_message_new"}) + assert type(event).__name__ == "NotificationThreadMessageNewEvent" + + def test_parse_reaction_deleted(self): + event = parse_webhook_event({"type": "reaction.deleted"}) + assert type(event).__name__ == "ReactionDeletedEvent" + + def test_parse_reaction_new(self): + event = parse_webhook_event({"type": "reaction.new"}) + assert type(event).__name__ == "ReactionNewEvent" + + def test_parse_reaction_updated(self): + event = parse_webhook_event({"type": "reaction.updated"}) + assert type(event).__name__ == "ReactionUpdatedEvent" + + def test_parse_reminder_created(self): + event = parse_webhook_event({"type": "reminder.created"}) + assert type(event).__name__ == "ReminderCreatedEvent" + + def test_parse_reminder_deleted(self): + event = parse_webhook_event({"type": "reminder.deleted"}) + assert type(event).__name__ == "ReminderDeletedEvent" + + def test_parse_reminder_updated(self): + event = parse_webhook_event({"type": "reminder.updated"}) + assert type(event).__name__ == "ReminderUpdatedEvent" + + def test_parse_review_queue_item_new(self): + event = parse_webhook_event({"type": "review_queue_item.new"}) + assert type(event).__name__ == "ReviewQueueItemNewEvent" + + def test_parse_review_queue_item_updated(self): + event = parse_webhook_event({"type": "review_queue_item.updated"}) + assert type(event).__name__ == "ReviewQueueItemUpdatedEvent" + + def test_parse_thread_updated(self): + event = parse_webhook_event({"type": "thread.updated"}) + assert type(event).__name__ == "ThreadUpdatedEvent" + + def test_parse_user_banned(self): + event = parse_webhook_event({"type": "user.banned"}) + assert type(event).__name__ == "UserBannedEvent" + + def test_parse_user_deactivated(self): + event = parse_webhook_event({"type": "user.deactivated"}) + assert type(event).__name__ == "UserDeactivatedEvent" + + def test_parse_user_deleted(self): + event = parse_webhook_event({"type": "user.deleted"}) + assert type(event).__name__ == "UserDeletedEvent" + + def test_parse_user_flagged(self): + event = parse_webhook_event({"type": "user.flagged"}) + assert type(event).__name__ == "UserFlaggedEvent" + + def test_parse_user_messages_deleted(self): + event = parse_webhook_event({"type": "user.messages.deleted"}) + assert type(event).__name__ == "UserMessagesDeletedEvent" + + def test_parse_user_muted(self): + event = parse_webhook_event({"type": "user.muted"}) + assert type(event).__name__ == "UserMutedEvent" + + def test_parse_user_reactivated(self): + event = parse_webhook_event({"type": "user.reactivated"}) + assert type(event).__name__ == "UserReactivatedEvent" + + def test_parse_user_unbanned(self): + event = parse_webhook_event({"type": "user.unbanned"}) + assert type(event).__name__ == "UserUnbannedEvent" + + def test_parse_user_unmuted(self): + event = parse_webhook_event({"type": "user.unmuted"}) + assert type(event).__name__ == "UserUnmutedEvent" + + def test_parse_user_unread_message_reminder(self): + event = parse_webhook_event({"type": "user.unread_message_reminder"}) + assert type(event).__name__ == "UserUnreadReminderEvent" + + def test_parse_user_updated(self): + event = parse_webhook_event({"type": "user.updated"}) + assert type(event).__name__ == "UserUpdatedEvent" + + def test_unknown_event_type(self): + with pytest.raises(ValueError, match="Unknown webhook event type"): + parse_webhook_event({"type": "unknown.event"}) + + def test_missing_type_field(self): + with pytest.raises(ValueError, match="missing 'type' field"): + parse_webhook_event({"foo": "bar"}) + + def test_invalid_json(self): + with pytest.raises(ValueError, match="Failed to parse"): + parse_webhook_event("not json") diff --git a/getstream/video/async_call.py b/getstream/video/async_call.py index 2fe0b7ea..ec7fd972 100644 --- a/getstream/video/async_call.py +++ b/getstream/video/async_call.py @@ -273,6 +273,32 @@ async def list_recordings(self) -> StreamResponse[ListRecordingsResponse]: self._sync_from_response(response.data) return response + @attach_call_cid_async + async def start_recording( + self, recording_type: str, recording_external_storage: Optional[str] = None + ) -> StreamResponse[StartRecordingResponse]: + response = await self.client.start_recording( + type=self.call_type, + id=self.id, + recording_type=recording_type, + recording_external_storage=recording_external_storage, + ) + self._sync_from_response(response.data) + return response + + @attach_call_cid_async + async def stop_recording( + self, + recording_type: str, + ) -> StreamResponse[StopRecordingResponse]: + response = await self.client.stop_recording( + type=self.call_type, + id=self.id, + recording_type=recording_type, + ) + self._sync_from_response(response.data) + return response + @attach_call_cid_async async def get_call_report( self, session_id: Optional[str] = None @@ -326,6 +352,48 @@ async def stop_rtmp_broadcast( self._sync_from_response(response.data) return response + @attach_call_cid_async + async def get_call_participant_session_metrics( + self, + session: str, + user: str, + user_session: str, + since: Optional[datetime] = None, + until: Optional[datetime] = None, + ) -> StreamResponse[GetCallParticipantSessionMetricsResponse]: + response = await self.client.get_call_participant_session_metrics( + type=self.call_type, + id=self.id, + session=session, + user=user, + user_session=user_session, + since=since, + until=until, + ) + self._sync_from_response(response.data) + return response + + @attach_call_cid_async + async def query_call_participant_sessions( + self, + session: str, + limit: Optional[int] = None, + prev: Optional[str] = None, + next: Optional[str] = None, + filter_conditions: Optional[Dict[str, object]] = None, + ) -> StreamResponse[QueryCallParticipantSessionsResponse]: + response = await self.client.query_call_participant_sessions( + type=self.call_type, + id=self.id, + session=session, + limit=limit, + prev=prev, + next=next, + filter_conditions=filter_conditions, + ) + self._sync_from_response(response.data) + return response + @attach_call_cid_async async def start_hls_broadcasting( self, @@ -367,18 +435,6 @@ async def start_frame_recording( self._sync_from_response(response.data) return response - @attach_call_cid_async - async def start_recording( - self, recording_external_storage: Optional[str] = None - ) -> StreamResponse[StartRecordingResponse]: - response = await self.client.start_recording( - type=self.call_type, - id=self.id, - recording_external_storage=recording_external_storage, - ) - self._sync_from_response(response.data) - return response - @attach_call_cid_async async def start_transcription( self, @@ -451,17 +507,6 @@ async def stop_live( self._sync_from_response(response.data) return response - @attach_call_cid_async - async def stop_recording( - self, - ) -> StreamResponse[StopRecordingResponse]: - response = await self.client.stop_recording( - type=self.call_type, - id=self.id, - ) - self._sync_from_response(response.data) - return response - @attach_call_cid_async async def stop_transcription( self, stop_closed_captions: Optional[bool] = None diff --git a/getstream/video/async_rest_client.py b/getstream/video/async_rest_client.py index 815a4059..82d36489 100644 --- a/getstream/video/async_rest_client.py +++ b/getstream/video/async_rest_client.py @@ -487,6 +487,47 @@ async def list_recordings( path_params=path_params, ) + @telemetry.operation_name("getstream.api.video.start_recording") + async def start_recording( + self, + type: str, + id: str, + recording_type: str, + recording_external_storage: Optional[str] = None, + ) -> StreamResponse[StartRecordingResponse]: + path_params = { + "type": type, + "id": id, + "recording_type": recording_type, + } + json = build_body_dict(recording_external_storage=recording_external_storage) + return await self.post( + "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/start", + StartRecordingResponse, + path_params=path_params, + json=json, + ) + + @telemetry.operation_name("getstream.api.video.stop_recording") + async def stop_recording( + self, + type: str, + id: str, + recording_type: str, + ) -> StreamResponse[StopRecordingResponse]: + path_params = { + "type": type, + "id": id, + "recording_type": recording_type, + } + json = build_body_dict() + return await self.post( + "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/stop", + StopRecordingResponse, + path_params=path_params, + json=json, + ) + @telemetry.operation_name("getstream.api.video.get_call_report") async def get_call_report( self, type: str, id: str, session_id: Optional[str] = None @@ -573,6 +614,60 @@ async def stop_rtmp_broadcast( json=json, ) + @telemetry.operation_name( + "getstream.api.video.get_call_participant_session_metrics" + ) + async def get_call_participant_session_metrics( + self, + type: str, + id: str, + session: str, + user: str, + user_session: str, + since: Optional[datetime] = None, + until: Optional[datetime] = None, + ) -> StreamResponse[GetCallParticipantSessionMetricsResponse]: + query_params = build_query_param(since=since, until=until) + path_params = { + "type": type, + "id": id, + "session": session, + "user": user, + "user_session": user_session, + } + return await self.get( + "/api/v2/video/call/{type}/{id}/session/{session}/participant/{user}/{user_session}/details/track", + GetCallParticipantSessionMetricsResponse, + query_params=query_params, + path_params=path_params, + ) + + @telemetry.operation_name("getstream.api.video.query_call_participant_sessions") + async def query_call_participant_sessions( + self, + type: str, + id: str, + session: str, + limit: Optional[int] = None, + prev: Optional[str] = None, + next: Optional[str] = None, + filter_conditions: Optional[Dict[str, object]] = None, + ) -> StreamResponse[QueryCallParticipantSessionsResponse]: + query_params = build_query_param( + limit=limit, prev=prev, next=next, filter_conditions=filter_conditions + ) + path_params = { + "type": type, + "id": id, + "session": session, + } + return await self.get( + "/api/v2/video/call/{type}/{id}/session/{session}/participant_sessions", + QueryCallParticipantSessionsResponse, + query_params=query_params, + path_params=path_params, + ) + @telemetry.operation_name("getstream.api.video.start_hls_broadcasting") async def start_hls_broadcasting( self, type: str, id: str @@ -630,22 +725,6 @@ async def start_frame_recording( json=json, ) - @telemetry.operation_name("getstream.api.video.start_recording") - async def start_recording( - self, type: str, id: str, recording_external_storage: Optional[str] = None - ) -> StreamResponse[StartRecordingResponse]: - path_params = { - "type": type, - "id": id, - } - json = build_body_dict(recording_external_storage=recording_external_storage) - return await self.post( - "/api/v2/video/call/{type}/{id}/start_recording", - StartRecordingResponse, - path_params=path_params, - json=json, - ) - @telemetry.operation_name("getstream.api.video.start_transcription") async def start_transcription( self, @@ -750,24 +829,6 @@ async def stop_live( json=json, ) - @telemetry.operation_name("getstream.api.video.stop_recording") - async def stop_recording( - self, - type: str, - id: str, - ) -> StreamResponse[StopRecordingResponse]: - path_params = { - "type": type, - "id": id, - } - json = build_body_dict() - return await self.post( - "/api/v2/video/call/{type}/{id}/stop_recording", - StopRecordingResponse, - path_params=path_params, - json=json, - ) - @telemetry.operation_name("getstream.api.video.stop_transcription") async def stop_transcription( self, type: str, id: str, stop_closed_captions: Optional[bool] = None @@ -1041,7 +1102,7 @@ async def create_call_type( name: str, external_storage: Optional[str] = None, grants: Optional[Dict[str, List[str]]] = None, - notification_settings: Optional[NotificationSettings] = None, + notification_settings: Optional[NotificationSettingsRequest] = None, settings: Optional[CallSettingsRequest] = None, ) -> StreamResponse[CreateCallTypeResponse]: json = build_body_dict( @@ -1081,7 +1142,7 @@ async def update_call_type( name: str, external_storage: Optional[str] = None, grants: Optional[Dict[str, List[str]]] = None, - notification_settings: Optional[NotificationSettings] = None, + notification_settings: Optional[NotificationSettingsRequest] = None, settings: Optional[CallSettingsRequest] = None, ) -> StreamResponse[UpdateCallTypeResponse]: path_params = { @@ -1104,30 +1165,12 @@ async def update_call_type( async def get_edges(self) -> StreamResponse[GetEdgesResponse]: return await self.get("/api/v2/video/edges", GetEdgesResponse) - @telemetry.operation_name("getstream.api.video.resolve_sip_inbound") - async def resolve_sip_inbound( - self, - sip_caller_number: str, - sip_trunk_number: str, - challenge: SIPChallenge, - sip_headers: Optional[Dict[str, str]] = None, - ) -> StreamResponse[ResolveSipInboundResponse]: - json = build_body_dict( - sip_caller_number=sip_caller_number, - sip_trunk_number=sip_trunk_number, - challenge=challenge, - sip_headers=sip_headers, - ) - return await self.post( - "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json - ) - @telemetry.operation_name("getstream.api.video.list_sip_inbound_routing_rule") async def list_sip_inbound_routing_rule( self, ) -> StreamResponse[ListSIPInboundRoutingRuleResponse]: return await self.get( - "/api/v2/video/sip/routing_rules", ListSIPInboundRoutingRuleResponse + "/api/v2/video/sip/inbound_routing_rules", ListSIPInboundRoutingRuleResponse ) @telemetry.operation_name("getstream.api.video.create_sip_inbound_routing_rule") @@ -1155,7 +1198,9 @@ async def create_sip_inbound_routing_rule( pin_routing_configs=pin_routing_configs, ) return await self.post( - "/api/v2/video/sip/routing_rules", SIPInboundRoutingRuleResponse, json=json + "/api/v2/video/sip/inbound_routing_rules", + SIPInboundRoutingRuleResponse, + json=json, ) @telemetry.operation_name("getstream.api.video.delete_sip_inbound_routing_rule") @@ -1166,7 +1211,7 @@ async def delete_sip_inbound_routing_rule( "id": id, } return await self.delete( - "/api/v2/video/sip/routing_rules/{id}", + "/api/v2/video/sip/inbound_routing_rules/{id}", DeleteSIPInboundRoutingRuleResponse, path_params=path_params, ) @@ -1200,7 +1245,7 @@ async def update_sip_inbound_routing_rule( pin_routing_configs=pin_routing_configs, ) return await self.put( - "/api/v2/video/sip/routing_rules/{id}", + "/api/v2/video/sip/inbound_routing_rules/{id}", UpdateSIPInboundRoutingRuleResponse, path_params=path_params, json=json, @@ -1208,7 +1253,7 @@ async def update_sip_inbound_routing_rule( @telemetry.operation_name("getstream.api.video.list_sip_trunks") async def list_sip_trunks(self) -> StreamResponse[ListSIPTrunksResponse]: - return await self.get("/api/v2/video/sip/trunks", ListSIPTrunksResponse) + return await self.get("/api/v2/video/sip/inbound_trunks", ListSIPTrunksResponse) @telemetry.operation_name("getstream.api.video.create_sip_trunk") async def create_sip_trunk( @@ -1216,7 +1261,7 @@ async def create_sip_trunk( ) -> StreamResponse[CreateSIPTrunkResponse]: json = build_body_dict(name=name, numbers=numbers) return await self.post( - "/api/v2/video/sip/trunks", CreateSIPTrunkResponse, json=json + "/api/v2/video/sip/inbound_trunks", CreateSIPTrunkResponse, json=json ) @telemetry.operation_name("getstream.api.video.delete_sip_trunk") @@ -1225,7 +1270,7 @@ async def delete_sip_trunk(self, id: str) -> StreamResponse[DeleteSIPTrunkRespon "id": id, } return await self.delete( - "/api/v2/video/sip/trunks/{id}", + "/api/v2/video/sip/inbound_trunks/{id}", DeleteSIPTrunkResponse, path_params=path_params, ) @@ -1239,12 +1284,32 @@ async def update_sip_trunk( } json = build_body_dict(name=name, numbers=numbers) return await self.put( - "/api/v2/video/sip/trunks/{id}", + "/api/v2/video/sip/inbound_trunks/{id}", UpdateSIPTrunkResponse, path_params=path_params, json=json, ) + @telemetry.operation_name("getstream.api.video.resolve_sip_inbound") + async def resolve_sip_inbound( + self, + sip_caller_number: str, + sip_trunk_number: str, + challenge: SIPChallengeRequest, + routing_number: Optional[str] = None, + sip_headers: Optional[Dict[str, str]] = None, + ) -> StreamResponse[ResolveSipInboundResponse]: + json = build_body_dict( + sip_caller_number=sip_caller_number, + sip_trunk_number=sip_trunk_number, + challenge=challenge, + routing_number=routing_number, + sip_headers=sip_headers, + ) + return await self.post( + "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json + ) + @telemetry.operation_name("getstream.api.video.query_aggregate_call_stats") async def query_aggregate_call_stats( self, diff --git a/getstream/video/call.py b/getstream/video/call.py index 5dfef99d..197f5d0e 100644 --- a/getstream/video/call.py +++ b/getstream/video/call.py @@ -267,6 +267,32 @@ def list_recordings(self) -> StreamResponse[ListRecordingsResponse]: self._sync_from_response(response.data) return response + @attach_call_cid + def start_recording( + self, recording_type: str, recording_external_storage: Optional[str] = None + ) -> StreamResponse[StartRecordingResponse]: + response = self.client.start_recording( + type=self.call_type, + id=self.id, + recording_type=recording_type, + recording_external_storage=recording_external_storage, + ) + self._sync_from_response(response.data) + return response + + @attach_call_cid + def stop_recording( + self, + recording_type: str, + ) -> StreamResponse[StopRecordingResponse]: + response = self.client.stop_recording( + type=self.call_type, + id=self.id, + recording_type=recording_type, + ) + self._sync_from_response(response.data) + return response + @attach_call_cid def get_call_report( self, session_id: Optional[str] = None @@ -316,6 +342,48 @@ def stop_rtmp_broadcast( self._sync_from_response(response.data) return response + @attach_call_cid + def get_call_participant_session_metrics( + self, + session: str, + user: str, + user_session: str, + since: Optional[datetime] = None, + until: Optional[datetime] = None, + ) -> StreamResponse[GetCallParticipantSessionMetricsResponse]: + response = self.client.get_call_participant_session_metrics( + type=self.call_type, + id=self.id, + session=session, + user=user, + user_session=user_session, + since=since, + until=until, + ) + self._sync_from_response(response.data) + return response + + @attach_call_cid + def query_call_participant_sessions( + self, + session: str, + limit: Optional[int] = None, + prev: Optional[str] = None, + next: Optional[str] = None, + filter_conditions: Optional[Dict[str, object]] = None, + ) -> StreamResponse[QueryCallParticipantSessionsResponse]: + response = self.client.query_call_participant_sessions( + type=self.call_type, + id=self.id, + session=session, + limit=limit, + prev=prev, + next=next, + filter_conditions=filter_conditions, + ) + self._sync_from_response(response.data) + return response + @attach_call_cid def start_hls_broadcasting(self) -> StreamResponse[StartHLSBroadcastingResponse]: response = self.client.start_hls_broadcasting(type=self.call_type, id=self.id) @@ -353,18 +421,6 @@ def start_frame_recording( self._sync_from_response(response.data) return response - @attach_call_cid - def start_recording( - self, recording_external_storage: Optional[str] = None - ) -> StreamResponse[StartRecordingResponse]: - response = self.client.start_recording( - type=self.call_type, - id=self.id, - recording_external_storage=recording_external_storage, - ) - self._sync_from_response(response.data) - return response - @attach_call_cid def start_transcription( self, @@ -431,17 +487,6 @@ def stop_live( self._sync_from_response(response.data) return response - @attach_call_cid - def stop_recording( - self, - ) -> StreamResponse[StopRecordingResponse]: - response = self.client.stop_recording( - type=self.call_type, - id=self.id, - ) - self._sync_from_response(response.data) - return response - @attach_call_cid def stop_transcription( self, stop_closed_captions: Optional[bool] = None diff --git a/getstream/video/rest_client.py b/getstream/video/rest_client.py index 17dcd2d8..45e46e3b 100644 --- a/getstream/video/rest_client.py +++ b/getstream/video/rest_client.py @@ -483,6 +483,47 @@ def list_recordings( path_params=path_params, ) + @telemetry.operation_name("getstream.api.video.start_recording") + def start_recording( + self, + type: str, + id: str, + recording_type: str, + recording_external_storage: Optional[str] = None, + ) -> StreamResponse[StartRecordingResponse]: + path_params = { + "type": type, + "id": id, + "recording_type": recording_type, + } + json = build_body_dict(recording_external_storage=recording_external_storage) + return self.post( + "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/start", + StartRecordingResponse, + path_params=path_params, + json=json, + ) + + @telemetry.operation_name("getstream.api.video.stop_recording") + def stop_recording( + self, + type: str, + id: str, + recording_type: str, + ) -> StreamResponse[StopRecordingResponse]: + path_params = { + "type": type, + "id": id, + "recording_type": recording_type, + } + json = build_body_dict() + return self.post( + "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/stop", + StopRecordingResponse, + path_params=path_params, + json=json, + ) + @telemetry.operation_name("getstream.api.video.get_call_report") def get_call_report( self, type: str, id: str, session_id: Optional[str] = None @@ -569,6 +610,60 @@ def stop_rtmp_broadcast( json=json, ) + @telemetry.operation_name( + "getstream.api.video.get_call_participant_session_metrics" + ) + def get_call_participant_session_metrics( + self, + type: str, + id: str, + session: str, + user: str, + user_session: str, + since: Optional[datetime] = None, + until: Optional[datetime] = None, + ) -> StreamResponse[GetCallParticipantSessionMetricsResponse]: + query_params = build_query_param(since=since, until=until) + path_params = { + "type": type, + "id": id, + "session": session, + "user": user, + "user_session": user_session, + } + return self.get( + "/api/v2/video/call/{type}/{id}/session/{session}/participant/{user}/{user_session}/details/track", + GetCallParticipantSessionMetricsResponse, + query_params=query_params, + path_params=path_params, + ) + + @telemetry.operation_name("getstream.api.video.query_call_participant_sessions") + def query_call_participant_sessions( + self, + type: str, + id: str, + session: str, + limit: Optional[int] = None, + prev: Optional[str] = None, + next: Optional[str] = None, + filter_conditions: Optional[Dict[str, object]] = None, + ) -> StreamResponse[QueryCallParticipantSessionsResponse]: + query_params = build_query_param( + limit=limit, prev=prev, next=next, filter_conditions=filter_conditions + ) + path_params = { + "type": type, + "id": id, + "session": session, + } + return self.get( + "/api/v2/video/call/{type}/{id}/session/{session}/participant_sessions", + QueryCallParticipantSessionsResponse, + query_params=query_params, + path_params=path_params, + ) + @telemetry.operation_name("getstream.api.video.start_hls_broadcasting") def start_hls_broadcasting( self, type: str, id: str @@ -626,22 +721,6 @@ def start_frame_recording( json=json, ) - @telemetry.operation_name("getstream.api.video.start_recording") - def start_recording( - self, type: str, id: str, recording_external_storage: Optional[str] = None - ) -> StreamResponse[StartRecordingResponse]: - path_params = { - "type": type, - "id": id, - } - json = build_body_dict(recording_external_storage=recording_external_storage) - return self.post( - "/api/v2/video/call/{type}/{id}/start_recording", - StartRecordingResponse, - path_params=path_params, - json=json, - ) - @telemetry.operation_name("getstream.api.video.start_transcription") def start_transcription( self, @@ -746,24 +825,6 @@ def stop_live( json=json, ) - @telemetry.operation_name("getstream.api.video.stop_recording") - def stop_recording( - self, - type: str, - id: str, - ) -> StreamResponse[StopRecordingResponse]: - path_params = { - "type": type, - "id": id, - } - json = build_body_dict() - return self.post( - "/api/v2/video/call/{type}/{id}/stop_recording", - StopRecordingResponse, - path_params=path_params, - json=json, - ) - @telemetry.operation_name("getstream.api.video.stop_transcription") def stop_transcription( self, type: str, id: str, stop_closed_captions: Optional[bool] = None @@ -1037,7 +1098,7 @@ def create_call_type( name: str, external_storage: Optional[str] = None, grants: Optional[Dict[str, List[str]]] = None, - notification_settings: Optional[NotificationSettings] = None, + notification_settings: Optional[NotificationSettingsRequest] = None, settings: Optional[CallSettingsRequest] = None, ) -> StreamResponse[CreateCallTypeResponse]: json = build_body_dict( @@ -1075,7 +1136,7 @@ def update_call_type( name: str, external_storage: Optional[str] = None, grants: Optional[Dict[str, List[str]]] = None, - notification_settings: Optional[NotificationSettings] = None, + notification_settings: Optional[NotificationSettingsRequest] = None, settings: Optional[CallSettingsRequest] = None, ) -> StreamResponse[UpdateCallTypeResponse]: path_params = { @@ -1098,30 +1159,12 @@ def update_call_type( def get_edges(self) -> StreamResponse[GetEdgesResponse]: return self.get("/api/v2/video/edges", GetEdgesResponse) - @telemetry.operation_name("getstream.api.video.resolve_sip_inbound") - def resolve_sip_inbound( - self, - sip_caller_number: str, - sip_trunk_number: str, - challenge: SIPChallenge, - sip_headers: Optional[Dict[str, str]] = None, - ) -> StreamResponse[ResolveSipInboundResponse]: - json = build_body_dict( - sip_caller_number=sip_caller_number, - sip_trunk_number=sip_trunk_number, - challenge=challenge, - sip_headers=sip_headers, - ) - return self.post( - "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json - ) - @telemetry.operation_name("getstream.api.video.list_sip_inbound_routing_rule") def list_sip_inbound_routing_rule( self, ) -> StreamResponse[ListSIPInboundRoutingRuleResponse]: return self.get( - "/api/v2/video/sip/routing_rules", ListSIPInboundRoutingRuleResponse + "/api/v2/video/sip/inbound_routing_rules", ListSIPInboundRoutingRuleResponse ) @telemetry.operation_name("getstream.api.video.create_sip_inbound_routing_rule") @@ -1149,7 +1192,9 @@ def create_sip_inbound_routing_rule( pin_routing_configs=pin_routing_configs, ) return self.post( - "/api/v2/video/sip/routing_rules", SIPInboundRoutingRuleResponse, json=json + "/api/v2/video/sip/inbound_routing_rules", + SIPInboundRoutingRuleResponse, + json=json, ) @telemetry.operation_name("getstream.api.video.delete_sip_inbound_routing_rule") @@ -1160,7 +1205,7 @@ def delete_sip_inbound_routing_rule( "id": id, } return self.delete( - "/api/v2/video/sip/routing_rules/{id}", + "/api/v2/video/sip/inbound_routing_rules/{id}", DeleteSIPInboundRoutingRuleResponse, path_params=path_params, ) @@ -1194,7 +1239,7 @@ def update_sip_inbound_routing_rule( pin_routing_configs=pin_routing_configs, ) return self.put( - "/api/v2/video/sip/routing_rules/{id}", + "/api/v2/video/sip/inbound_routing_rules/{id}", UpdateSIPInboundRoutingRuleResponse, path_params=path_params, json=json, @@ -1202,14 +1247,16 @@ def update_sip_inbound_routing_rule( @telemetry.operation_name("getstream.api.video.list_sip_trunks") def list_sip_trunks(self) -> StreamResponse[ListSIPTrunksResponse]: - return self.get("/api/v2/video/sip/trunks", ListSIPTrunksResponse) + return self.get("/api/v2/video/sip/inbound_trunks", ListSIPTrunksResponse) @telemetry.operation_name("getstream.api.video.create_sip_trunk") def create_sip_trunk( self, name: str, numbers: List[str] ) -> StreamResponse[CreateSIPTrunkResponse]: json = build_body_dict(name=name, numbers=numbers) - return self.post("/api/v2/video/sip/trunks", CreateSIPTrunkResponse, json=json) + return self.post( + "/api/v2/video/sip/inbound_trunks", CreateSIPTrunkResponse, json=json + ) @telemetry.operation_name("getstream.api.video.delete_sip_trunk") def delete_sip_trunk(self, id: str) -> StreamResponse[DeleteSIPTrunkResponse]: @@ -1217,7 +1264,7 @@ def delete_sip_trunk(self, id: str) -> StreamResponse[DeleteSIPTrunkResponse]: "id": id, } return self.delete( - "/api/v2/video/sip/trunks/{id}", + "/api/v2/video/sip/inbound_trunks/{id}", DeleteSIPTrunkResponse, path_params=path_params, ) @@ -1231,12 +1278,32 @@ def update_sip_trunk( } json = build_body_dict(name=name, numbers=numbers) return self.put( - "/api/v2/video/sip/trunks/{id}", + "/api/v2/video/sip/inbound_trunks/{id}", UpdateSIPTrunkResponse, path_params=path_params, json=json, ) + @telemetry.operation_name("getstream.api.video.resolve_sip_inbound") + def resolve_sip_inbound( + self, + sip_caller_number: str, + sip_trunk_number: str, + challenge: SIPChallengeRequest, + routing_number: Optional[str] = None, + sip_headers: Optional[Dict[str, str]] = None, + ) -> StreamResponse[ResolveSipInboundResponse]: + json = build_body_dict( + sip_caller_number=sip_caller_number, + sip_trunk_number=sip_trunk_number, + challenge=challenge, + routing_number=routing_number, + sip_headers=sip_headers, + ) + return self.post( + "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json + ) + @telemetry.operation_name("getstream.api.video.query_aggregate_call_stats") def query_aggregate_call_stats( self, diff --git a/getstream/webhook.py b/getstream/webhook.py new file mode 100644 index 00000000..ecfc12f8 --- /dev/null +++ b/getstream/webhook.py @@ -0,0 +1,572 @@ +# Code generated by GetStream internal OpenAPI code generator. DO NOT EDIT. + +import hmac +import hashlib +import json +from typing import Union, Any, Dict +from .models import ( + CustomEvent, + AppealAcceptedEvent, + AppealCreatedEvent, + AppealRejectedEvent, + CallAcceptedEvent, + BlockedUserEvent, + ClosedCaptionEvent, + CallClosedCaptionsFailedEvent, + CallClosedCaptionsStartedEvent, + CallClosedCaptionsStoppedEvent, + CallCreatedEvent, + CallDeletedEvent, + CallDTMFEvent, + CallEndedEvent, + CallFrameRecordingFailedEvent, + CallFrameRecordingFrameReadyEvent, + CallFrameRecordingStartedEvent, + CallFrameRecordingStoppedEvent, + CallHLSBroadcastingFailedEvent, + CallHLSBroadcastingStartedEvent, + CallHLSBroadcastingStoppedEvent, + KickedUserEvent, + CallLiveStartedEvent, + CallMemberAddedEvent, + CallMemberRemovedEvent, + CallMemberUpdatedEvent, + CallMemberUpdatedPermissionEvent, + CallMissedEvent, + CallModerationBlurEvent, + CallModerationWarningEvent, + CallNotificationEvent, + PermissionRequestEvent, + UpdatedCallPermissionsEvent, + CallReactionEvent, + CallRecordingFailedEvent, + CallRecordingReadyEvent, + CallRecordingStartedEvent, + CallRecordingStoppedEvent, + CallRejectedEvent, + CallRingEvent, + CallRtmpBroadcastFailedEvent, + CallRtmpBroadcastStartedEvent, + CallRtmpBroadcastStoppedEvent, + CallSessionEndedEvent, + CallSessionParticipantCountsUpdatedEvent, + CallSessionParticipantJoinedEvent, + CallSessionParticipantLeftEvent, + CallSessionStartedEvent, + CallStatsReportReadyEvent, + CallTranscriptionFailedEvent, + CallTranscriptionReadyEvent, + CallTranscriptionStartedEvent, + CallTranscriptionStoppedEvent, + UnblockedUserEvent, + CallUpdatedEvent, + CallUserFeedbackSubmittedEvent, + CallUserMutedEvent, + CampaignCompletedEvent, + CampaignStartedEvent, + ChannelCreatedEvent, + ChannelDeletedEvent, + ChannelFrozenEvent, + ChannelHiddenEvent, + MaxStreakChangedEvent, + ChannelMutedEvent, + ChannelTruncatedEvent, + ChannelUnFrozenEvent, + ChannelUnmutedEvent, + ChannelUpdatedEvent, + ChannelVisibleEvent, + ChannelBatchCompletedEvent, + ChannelBatchStartedEvent, + CustomVideoEvent, + AsyncBulkImageModerationEvent, + AsyncExportChannelsEvent, + AsyncExportModerationLogsEvent, + AsyncExportErrorEvent, + AsyncExportUsersEvent, + ActivityAddedEvent, + ActivityDeletedEvent, + ActivityFeedbackEvent, + ActivityMarkEvent, + ActivityPinnedEvent, + ActivityReactionAddedEvent, + ActivityReactionDeletedEvent, + ActivityReactionUpdatedEvent, + ActivityRemovedFromFeedEvent, + ActivityRestoredEvent, + ActivityUnpinnedEvent, + ActivityUpdatedEvent, + BookmarkAddedEvent, + BookmarkDeletedEvent, + BookmarkUpdatedEvent, + BookmarkFolderDeletedEvent, + BookmarkFolderUpdatedEvent, + CommentAddedEvent, + CommentDeletedEvent, + CommentReactionAddedEvent, + CommentReactionDeletedEvent, + CommentReactionUpdatedEvent, + CommentUpdatedEvent, + FeedCreatedEvent, + FeedDeletedEvent, + FeedUpdatedEvent, + FeedGroupChangedEvent, + FeedGroupDeletedEvent, + FeedMemberAddedEvent, + FeedMemberRemovedEvent, + FeedMemberUpdatedEvent, + FollowCreatedEvent, + FollowDeletedEvent, + FollowUpdatedEvent, + NotificationFeedUpdatedEvent, + StoriesFeedUpdatedEvent, + FlagUpdatedEvent, + IngressErrorEvent, + IngressStartedEvent, + IngressStoppedEvent, + MemberAddedEvent, + MemberRemovedEvent, + MemberUpdatedEvent, + MessageDeletedEvent, + MessageFlaggedEvent, + MessageNewEvent, + PendingMessageEvent, + MessageReadEvent, + MessageUnblockedEvent, + MessageUndeletedEvent, + MessageUpdatedEvent, + ModerationCustomActionEvent, + ModerationFlaggedEvent, + ModerationMarkReviewedEvent, + ModerationCheckCompletedEvent, + NotificationMarkUnreadEvent, + ReminderNotificationEvent, + NotificationThreadMessageNewEvent, + ReactionDeletedEvent, + ReactionNewEvent, + ReactionUpdatedEvent, + ReminderCreatedEvent, + ReminderDeletedEvent, + ReminderUpdatedEvent, + ReviewQueueItemNewEvent, + ReviewQueueItemUpdatedEvent, + ThreadUpdatedEvent, + UserBannedEvent, + UserDeactivatedEvent, + UserDeletedEvent, + UserFlaggedEvent, + UserMessagesDeletedEvent, + UserMutedEvent, + UserReactivatedEvent, + UserUnbannedEvent, + UserUnmutedEvent, + UserUnreadReminderEvent, + UserUpdatedEvent, +) + + +# Webhook event type constants +EVENT_TYPE_WILDCARD = "*" +EVENT_TYPE_APPEAL_ACCEPTED = "appeal.accepted" +EVENT_TYPE_APPEAL_CREATED = "appeal.created" +EVENT_TYPE_APPEAL_REJECTED = "appeal.rejected" +EVENT_TYPE_CALL_ACCEPTED = "call.accepted" +EVENT_TYPE_CALL_BLOCKED_USER = "call.blocked_user" +EVENT_TYPE_CALL_CLOSED_CAPTION = "call.closed_caption" +EVENT_TYPE_CALL_CLOSED_CAPTIONS_FAILED = "call.closed_captions_failed" +EVENT_TYPE_CALL_CLOSED_CAPTIONS_STARTED = "call.closed_captions_started" +EVENT_TYPE_CALL_CLOSED_CAPTIONS_STOPPED = "call.closed_captions_stopped" +EVENT_TYPE_CALL_CREATED = "call.created" +EVENT_TYPE_CALL_DELETED = "call.deleted" +EVENT_TYPE_CALL_DTMF = "call.dtmf" +EVENT_TYPE_CALL_ENDED = "call.ended" +EVENT_TYPE_CALL_FRAME_RECORDING_FAILED = "call.frame_recording_failed" +EVENT_TYPE_CALL_FRAME_RECORDING_READY = "call.frame_recording_ready" +EVENT_TYPE_CALL_FRAME_RECORDING_STARTED = "call.frame_recording_started" +EVENT_TYPE_CALL_FRAME_RECORDING_STOPPED = "call.frame_recording_stopped" +EVENT_TYPE_CALL_HLS_BROADCASTING_FAILED = "call.hls_broadcasting_failed" +EVENT_TYPE_CALL_HLS_BROADCASTING_STARTED = "call.hls_broadcasting_started" +EVENT_TYPE_CALL_HLS_BROADCASTING_STOPPED = "call.hls_broadcasting_stopped" +EVENT_TYPE_CALL_KICKED_USER = "call.kicked_user" +EVENT_TYPE_CALL_LIVE_STARTED = "call.live_started" +EVENT_TYPE_CALL_MEMBER_ADDED = "call.member_added" +EVENT_TYPE_CALL_MEMBER_REMOVED = "call.member_removed" +EVENT_TYPE_CALL_MEMBER_UPDATED = "call.member_updated" +EVENT_TYPE_CALL_MEMBER_UPDATED_PERMISSION = "call.member_updated_permission" +EVENT_TYPE_CALL_MISSED = "call.missed" +EVENT_TYPE_CALL_MODERATION_BLUR = "call.moderation_blur" +EVENT_TYPE_CALL_MODERATION_WARNING = "call.moderation_warning" +EVENT_TYPE_CALL_NOTIFICATION = "call.notification" +EVENT_TYPE_CALL_PERMISSION_REQUEST = "call.permission_request" +EVENT_TYPE_CALL_PERMISSIONS_UPDATED = "call.permissions_updated" +EVENT_TYPE_CALL_REACTION_NEW = "call.reaction_new" +EVENT_TYPE_CALL_RECORDING_FAILED = "call.recording_failed" +EVENT_TYPE_CALL_RECORDING_READY = "call.recording_ready" +EVENT_TYPE_CALL_RECORDING_STARTED = "call.recording_started" +EVENT_TYPE_CALL_RECORDING_STOPPED = "call.recording_stopped" +EVENT_TYPE_CALL_REJECTED = "call.rejected" +EVENT_TYPE_CALL_RING = "call.ring" +EVENT_TYPE_CALL_RTMP_BROADCAST_FAILED = "call.rtmp_broadcast_failed" +EVENT_TYPE_CALL_RTMP_BROADCAST_STARTED = "call.rtmp_broadcast_started" +EVENT_TYPE_CALL_RTMP_BROADCAST_STOPPED = "call.rtmp_broadcast_stopped" +EVENT_TYPE_CALL_SESSION_ENDED = "call.session_ended" +EVENT_TYPE_CALL_SESSION_PARTICIPANT_COUNT_UPDATED = ( + "call.session_participant_count_updated" +) +EVENT_TYPE_CALL_SESSION_PARTICIPANT_JOINED = "call.session_participant_joined" +EVENT_TYPE_CALL_SESSION_PARTICIPANT_LEFT = "call.session_participant_left" +EVENT_TYPE_CALL_SESSION_STARTED = "call.session_started" +EVENT_TYPE_CALL_STATS_REPORT_READY = "call.stats_report_ready" +EVENT_TYPE_CALL_TRANSCRIPTION_FAILED = "call.transcription_failed" +EVENT_TYPE_CALL_TRANSCRIPTION_READY = "call.transcription_ready" +EVENT_TYPE_CALL_TRANSCRIPTION_STARTED = "call.transcription_started" +EVENT_TYPE_CALL_TRANSCRIPTION_STOPPED = "call.transcription_stopped" +EVENT_TYPE_CALL_UNBLOCKED_USER = "call.unblocked_user" +EVENT_TYPE_CALL_UPDATED = "call.updated" +EVENT_TYPE_CALL_USER_FEEDBACK_SUBMITTED = "call.user_feedback_submitted" +EVENT_TYPE_CALL_USER_MUTED = "call.user_muted" +EVENT_TYPE_CAMPAIGN_COMPLETED = "campaign.completed" +EVENT_TYPE_CAMPAIGN_STARTED = "campaign.started" +EVENT_TYPE_CHANNEL_CREATED = "channel.created" +EVENT_TYPE_CHANNEL_DELETED = "channel.deleted" +EVENT_TYPE_CHANNEL_FROZEN = "channel.frozen" +EVENT_TYPE_CHANNEL_HIDDEN = "channel.hidden" +EVENT_TYPE_CHANNEL_MAX_STREAK_CHANGED = "channel.max_streak_changed" +EVENT_TYPE_CHANNEL_MUTED = "channel.muted" +EVENT_TYPE_CHANNEL_TRUNCATED = "channel.truncated" +EVENT_TYPE_CHANNEL_UNFROZEN = "channel.unfrozen" +EVENT_TYPE_CHANNEL_UNMUTED = "channel.unmuted" +EVENT_TYPE_CHANNEL_UPDATED = "channel.updated" +EVENT_TYPE_CHANNEL_VISIBLE = "channel.visible" +EVENT_TYPE_CHANNEL_BATCH_UPDATE_COMPLETED = "channel_batch_update.completed" +EVENT_TYPE_CHANNEL_BATCH_UPDATE_STARTED = "channel_batch_update.started" +EVENT_TYPE_CUSTOM = "custom" +EVENT_TYPE_EXPORT_BULK_IMAGE_MODERATION_ERROR = "export.bulk_image_moderation.error" +EVENT_TYPE_EXPORT_BULK_IMAGE_MODERATION_SUCCESS = "export.bulk_image_moderation.success" +EVENT_TYPE_EXPORT_CHANNELS_ERROR = "export.channels.error" +EVENT_TYPE_EXPORT_CHANNELS_SUCCESS = "export.channels.success" +EVENT_TYPE_EXPORT_MODERATION_LOGS_ERROR = "export.moderation_logs.error" +EVENT_TYPE_EXPORT_MODERATION_LOGS_SUCCESS = "export.moderation_logs.success" +EVENT_TYPE_EXPORT_USERS_ERROR = "export.users.error" +EVENT_TYPE_EXPORT_USERS_SUCCESS = "export.users.success" +EVENT_TYPE_FEEDS_ACTIVITY_ADDED = "feeds.activity.added" +EVENT_TYPE_FEEDS_ACTIVITY_DELETED = "feeds.activity.deleted" +EVENT_TYPE_FEEDS_ACTIVITY_FEEDBACK = "feeds.activity.feedback" +EVENT_TYPE_FEEDS_ACTIVITY_MARKED = "feeds.activity.marked" +EVENT_TYPE_FEEDS_ACTIVITY_PINNED = "feeds.activity.pinned" +EVENT_TYPE_FEEDS_ACTIVITY_REACTION_ADDED = "feeds.activity.reaction.added" +EVENT_TYPE_FEEDS_ACTIVITY_REACTION_DELETED = "feeds.activity.reaction.deleted" +EVENT_TYPE_FEEDS_ACTIVITY_REACTION_UPDATED = "feeds.activity.reaction.updated" +EVENT_TYPE_FEEDS_ACTIVITY_REMOVED_FROM_FEED = "feeds.activity.removed_from_feed" +EVENT_TYPE_FEEDS_ACTIVITY_RESTORED = "feeds.activity.restored" +EVENT_TYPE_FEEDS_ACTIVITY_UNPINNED = "feeds.activity.unpinned" +EVENT_TYPE_FEEDS_ACTIVITY_UPDATED = "feeds.activity.updated" +EVENT_TYPE_FEEDS_BOOKMARK_ADDED = "feeds.bookmark.added" +EVENT_TYPE_FEEDS_BOOKMARK_DELETED = "feeds.bookmark.deleted" +EVENT_TYPE_FEEDS_BOOKMARK_UPDATED = "feeds.bookmark.updated" +EVENT_TYPE_FEEDS_BOOKMARK_FOLDER_DELETED = "feeds.bookmark_folder.deleted" +EVENT_TYPE_FEEDS_BOOKMARK_FOLDER_UPDATED = "feeds.bookmark_folder.updated" +EVENT_TYPE_FEEDS_COMMENT_ADDED = "feeds.comment.added" +EVENT_TYPE_FEEDS_COMMENT_DELETED = "feeds.comment.deleted" +EVENT_TYPE_FEEDS_COMMENT_REACTION_ADDED = "feeds.comment.reaction.added" +EVENT_TYPE_FEEDS_COMMENT_REACTION_DELETED = "feeds.comment.reaction.deleted" +EVENT_TYPE_FEEDS_COMMENT_REACTION_UPDATED = "feeds.comment.reaction.updated" +EVENT_TYPE_FEEDS_COMMENT_UPDATED = "feeds.comment.updated" +EVENT_TYPE_FEEDS_FEED_CREATED = "feeds.feed.created" +EVENT_TYPE_FEEDS_FEED_DELETED = "feeds.feed.deleted" +EVENT_TYPE_FEEDS_FEED_UPDATED = "feeds.feed.updated" +EVENT_TYPE_FEEDS_FEED_GROUP_CHANGED = "feeds.feed_group.changed" +EVENT_TYPE_FEEDS_FEED_GROUP_DELETED = "feeds.feed_group.deleted" +EVENT_TYPE_FEEDS_FEED_MEMBER_ADDED = "feeds.feed_member.added" +EVENT_TYPE_FEEDS_FEED_MEMBER_REMOVED = "feeds.feed_member.removed" +EVENT_TYPE_FEEDS_FEED_MEMBER_UPDATED = "feeds.feed_member.updated" +EVENT_TYPE_FEEDS_FOLLOW_CREATED = "feeds.follow.created" +EVENT_TYPE_FEEDS_FOLLOW_DELETED = "feeds.follow.deleted" +EVENT_TYPE_FEEDS_FOLLOW_UPDATED = "feeds.follow.updated" +EVENT_TYPE_FEEDS_NOTIFICATION_FEED_UPDATED = "feeds.notification_feed.updated" +EVENT_TYPE_FEEDS_STORIES_FEED_UPDATED = "feeds.stories_feed.updated" +EVENT_TYPE_FLAG_UPDATED = "flag.updated" +EVENT_TYPE_INGRESS_ERROR = "ingress.error" +EVENT_TYPE_INGRESS_STARTED = "ingress.started" +EVENT_TYPE_INGRESS_STOPPED = "ingress.stopped" +EVENT_TYPE_MEMBER_ADDED = "member.added" +EVENT_TYPE_MEMBER_REMOVED = "member.removed" +EVENT_TYPE_MEMBER_UPDATED = "member.updated" +EVENT_TYPE_MESSAGE_DELETED = "message.deleted" +EVENT_TYPE_MESSAGE_FLAGGED = "message.flagged" +EVENT_TYPE_MESSAGE_NEW = "message.new" +EVENT_TYPE_MESSAGE_PENDING = "message.pending" +EVENT_TYPE_MESSAGE_READ = "message.read" +EVENT_TYPE_MESSAGE_UNBLOCKED = "message.unblocked" +EVENT_TYPE_MESSAGE_UNDELETED = "message.undeleted" +EVENT_TYPE_MESSAGE_UPDATED = "message.updated" +EVENT_TYPE_MODERATION_CUSTOM_ACTION = "moderation.custom_action" +EVENT_TYPE_MODERATION_FLAGGED = "moderation.flagged" +EVENT_TYPE_MODERATION_MARK_REVIEWED = "moderation.mark_reviewed" +EVENT_TYPE_MODERATION_CHECK_COMPLETED = "moderation_check.completed" +EVENT_TYPE_NOTIFICATION_MARK_UNREAD = "notification.mark_unread" +EVENT_TYPE_NOTIFICATION_REMINDER_DUE = "notification.reminder_due" +EVENT_TYPE_NOTIFICATION_THREAD_MESSAGE_NEW = "notification.thread_message_new" +EVENT_TYPE_REACTION_DELETED = "reaction.deleted" +EVENT_TYPE_REACTION_NEW = "reaction.new" +EVENT_TYPE_REACTION_UPDATED = "reaction.updated" +EVENT_TYPE_REMINDER_CREATED = "reminder.created" +EVENT_TYPE_REMINDER_DELETED = "reminder.deleted" +EVENT_TYPE_REMINDER_UPDATED = "reminder.updated" +EVENT_TYPE_REVIEW_QUEUE_ITEM_NEW = "review_queue_item.new" +EVENT_TYPE_REVIEW_QUEUE_ITEM_UPDATED = "review_queue_item.updated" +EVENT_TYPE_THREAD_UPDATED = "thread.updated" +EVENT_TYPE_USER_BANNED = "user.banned" +EVENT_TYPE_USER_DEACTIVATED = "user.deactivated" +EVENT_TYPE_USER_DELETED = "user.deleted" +EVENT_TYPE_USER_FLAGGED = "user.flagged" +EVENT_TYPE_USER_MESSAGES_DELETED = "user.messages.deleted" +EVENT_TYPE_USER_MUTED = "user.muted" +EVENT_TYPE_USER_REACTIVATED = "user.reactivated" +EVENT_TYPE_USER_UNBANNED = "user.unbanned" +EVENT_TYPE_USER_UNMUTED = "user.unmuted" +EVENT_TYPE_USER_UNREAD_MESSAGE_REMINDER = "user.unread_message_reminder" +EVENT_TYPE_USER_UPDATED = "user.updated" + + +def get_event_type(raw_event: Union[bytes, str, Dict[str, Any]]) -> str: + """ + Extract the event type from a raw webhook payload. + + Args: + raw_event: The raw webhook payload + + Returns: + The event type string (e.g., "message.new"), or empty string if parsing fails + """ + if isinstance(raw_event, dict): + return raw_event.get("type", "") + + try: + if isinstance(raw_event, bytes): + raw_event = raw_event.decode("utf-8") + data = json.loads(raw_event) + return data.get("type", "") + except (json.JSONDecodeError, UnicodeDecodeError, AttributeError): + return "" + + +def parse_webhook_event(raw_event: Union[bytes, str, Dict[str, Any]]) -> Any: + """ + Deserialize a raw webhook payload into a typed event object. + + Args: + raw_event: The raw webhook payload + + Returns: + A typed event object corresponding to the event type + + Raises: + ValueError: If the event type is unknown or deserialization fails + """ + try: + if isinstance(raw_event, dict): + data = raw_event + elif isinstance(raw_event, bytes): + data = json.loads(raw_event.decode("utf-8")) + else: + data = json.loads(raw_event) + except (json.JSONDecodeError, UnicodeDecodeError) as e: + raise ValueError(f"Failed to parse webhook payload: {e}") + + event_type = data.get("type") + if not event_type: + raise ValueError("Webhook payload missing 'type' field") + + event_class = _get_event_class(event_type) + if event_class is None: + raise ValueError(f"Unknown webhook event type: {event_type}") + + return event_class(**data) + + +def _get_event_class(event_type: str): + """Map event type to event class.""" + event_map = { + "*": CustomEvent, + "appeal.accepted": AppealAcceptedEvent, + "appeal.created": AppealCreatedEvent, + "appeal.rejected": AppealRejectedEvent, + "call.accepted": CallAcceptedEvent, + "call.blocked_user": BlockedUserEvent, + "call.closed_caption": ClosedCaptionEvent, + "call.closed_captions_failed": CallClosedCaptionsFailedEvent, + "call.closed_captions_started": CallClosedCaptionsStartedEvent, + "call.closed_captions_stopped": CallClosedCaptionsStoppedEvent, + "call.created": CallCreatedEvent, + "call.deleted": CallDeletedEvent, + "call.dtmf": CallDTMFEvent, + "call.ended": CallEndedEvent, + "call.frame_recording_failed": CallFrameRecordingFailedEvent, + "call.frame_recording_ready": CallFrameRecordingFrameReadyEvent, + "call.frame_recording_started": CallFrameRecordingStartedEvent, + "call.frame_recording_stopped": CallFrameRecordingStoppedEvent, + "call.hls_broadcasting_failed": CallHLSBroadcastingFailedEvent, + "call.hls_broadcasting_started": CallHLSBroadcastingStartedEvent, + "call.hls_broadcasting_stopped": CallHLSBroadcastingStoppedEvent, + "call.kicked_user": KickedUserEvent, + "call.live_started": CallLiveStartedEvent, + "call.member_added": CallMemberAddedEvent, + "call.member_removed": CallMemberRemovedEvent, + "call.member_updated": CallMemberUpdatedEvent, + "call.member_updated_permission": CallMemberUpdatedPermissionEvent, + "call.missed": CallMissedEvent, + "call.moderation_blur": CallModerationBlurEvent, + "call.moderation_warning": CallModerationWarningEvent, + "call.notification": CallNotificationEvent, + "call.permission_request": PermissionRequestEvent, + "call.permissions_updated": UpdatedCallPermissionsEvent, + "call.reaction_new": CallReactionEvent, + "call.recording_failed": CallRecordingFailedEvent, + "call.recording_ready": CallRecordingReadyEvent, + "call.recording_started": CallRecordingStartedEvent, + "call.recording_stopped": CallRecordingStoppedEvent, + "call.rejected": CallRejectedEvent, + "call.ring": CallRingEvent, + "call.rtmp_broadcast_failed": CallRtmpBroadcastFailedEvent, + "call.rtmp_broadcast_started": CallRtmpBroadcastStartedEvent, + "call.rtmp_broadcast_stopped": CallRtmpBroadcastStoppedEvent, + "call.session_ended": CallSessionEndedEvent, + "call.session_participant_count_updated": CallSessionParticipantCountsUpdatedEvent, + "call.session_participant_joined": CallSessionParticipantJoinedEvent, + "call.session_participant_left": CallSessionParticipantLeftEvent, + "call.session_started": CallSessionStartedEvent, + "call.stats_report_ready": CallStatsReportReadyEvent, + "call.transcription_failed": CallTranscriptionFailedEvent, + "call.transcription_ready": CallTranscriptionReadyEvent, + "call.transcription_started": CallTranscriptionStartedEvent, + "call.transcription_stopped": CallTranscriptionStoppedEvent, + "call.unblocked_user": UnblockedUserEvent, + "call.updated": CallUpdatedEvent, + "call.user_feedback_submitted": CallUserFeedbackSubmittedEvent, + "call.user_muted": CallUserMutedEvent, + "campaign.completed": CampaignCompletedEvent, + "campaign.started": CampaignStartedEvent, + "channel.created": ChannelCreatedEvent, + "channel.deleted": ChannelDeletedEvent, + "channel.frozen": ChannelFrozenEvent, + "channel.hidden": ChannelHiddenEvent, + "channel.max_streak_changed": MaxStreakChangedEvent, + "channel.muted": ChannelMutedEvent, + "channel.truncated": ChannelTruncatedEvent, + "channel.unfrozen": ChannelUnFrozenEvent, + "channel.unmuted": ChannelUnmutedEvent, + "channel.updated": ChannelUpdatedEvent, + "channel.visible": ChannelVisibleEvent, + "channel_batch_update.completed": ChannelBatchCompletedEvent, + "channel_batch_update.started": ChannelBatchStartedEvent, + "custom": CustomVideoEvent, + "export.bulk_image_moderation.error": AsyncExportErrorEvent, + "export.bulk_image_moderation.success": AsyncBulkImageModerationEvent, + "export.channels.error": AsyncExportErrorEvent, + "export.channels.success": AsyncExportChannelsEvent, + "export.moderation_logs.error": AsyncExportErrorEvent, + "export.moderation_logs.success": AsyncExportModerationLogsEvent, + "export.users.error": AsyncExportErrorEvent, + "export.users.success": AsyncExportUsersEvent, + "feeds.activity.added": ActivityAddedEvent, + "feeds.activity.deleted": ActivityDeletedEvent, + "feeds.activity.feedback": ActivityFeedbackEvent, + "feeds.activity.marked": ActivityMarkEvent, + "feeds.activity.pinned": ActivityPinnedEvent, + "feeds.activity.reaction.added": ActivityReactionAddedEvent, + "feeds.activity.reaction.deleted": ActivityReactionDeletedEvent, + "feeds.activity.reaction.updated": ActivityReactionUpdatedEvent, + "feeds.activity.removed_from_feed": ActivityRemovedFromFeedEvent, + "feeds.activity.restored": ActivityRestoredEvent, + "feeds.activity.unpinned": ActivityUnpinnedEvent, + "feeds.activity.updated": ActivityUpdatedEvent, + "feeds.bookmark.added": BookmarkAddedEvent, + "feeds.bookmark.deleted": BookmarkDeletedEvent, + "feeds.bookmark.updated": BookmarkUpdatedEvent, + "feeds.bookmark_folder.deleted": BookmarkFolderDeletedEvent, + "feeds.bookmark_folder.updated": BookmarkFolderUpdatedEvent, + "feeds.comment.added": CommentAddedEvent, + "feeds.comment.deleted": CommentDeletedEvent, + "feeds.comment.reaction.added": CommentReactionAddedEvent, + "feeds.comment.reaction.deleted": CommentReactionDeletedEvent, + "feeds.comment.reaction.updated": CommentReactionUpdatedEvent, + "feeds.comment.updated": CommentUpdatedEvent, + "feeds.feed.created": FeedCreatedEvent, + "feeds.feed.deleted": FeedDeletedEvent, + "feeds.feed.updated": FeedUpdatedEvent, + "feeds.feed_group.changed": FeedGroupChangedEvent, + "feeds.feed_group.deleted": FeedGroupDeletedEvent, + "feeds.feed_member.added": FeedMemberAddedEvent, + "feeds.feed_member.removed": FeedMemberRemovedEvent, + "feeds.feed_member.updated": FeedMemberUpdatedEvent, + "feeds.follow.created": FollowCreatedEvent, + "feeds.follow.deleted": FollowDeletedEvent, + "feeds.follow.updated": FollowUpdatedEvent, + "feeds.notification_feed.updated": NotificationFeedUpdatedEvent, + "feeds.stories_feed.updated": StoriesFeedUpdatedEvent, + "flag.updated": FlagUpdatedEvent, + "ingress.error": IngressErrorEvent, + "ingress.started": IngressStartedEvent, + "ingress.stopped": IngressStoppedEvent, + "member.added": MemberAddedEvent, + "member.removed": MemberRemovedEvent, + "member.updated": MemberUpdatedEvent, + "message.deleted": MessageDeletedEvent, + "message.flagged": MessageFlaggedEvent, + "message.new": MessageNewEvent, + "message.pending": PendingMessageEvent, + "message.read": MessageReadEvent, + "message.unblocked": MessageUnblockedEvent, + "message.undeleted": MessageUndeletedEvent, + "message.updated": MessageUpdatedEvent, + "moderation.custom_action": ModerationCustomActionEvent, + "moderation.flagged": ModerationFlaggedEvent, + "moderation.mark_reviewed": ModerationMarkReviewedEvent, + "moderation_check.completed": ModerationCheckCompletedEvent, + "notification.mark_unread": NotificationMarkUnreadEvent, + "notification.reminder_due": ReminderNotificationEvent, + "notification.thread_message_new": NotificationThreadMessageNewEvent, + "reaction.deleted": ReactionDeletedEvent, + "reaction.new": ReactionNewEvent, + "reaction.updated": ReactionUpdatedEvent, + "reminder.created": ReminderCreatedEvent, + "reminder.deleted": ReminderDeletedEvent, + "reminder.updated": ReminderUpdatedEvent, + "review_queue_item.new": ReviewQueueItemNewEvent, + "review_queue_item.updated": ReviewQueueItemUpdatedEvent, + "thread.updated": ThreadUpdatedEvent, + "user.banned": UserBannedEvent, + "user.deactivated": UserDeactivatedEvent, + "user.deleted": UserDeletedEvent, + "user.flagged": UserFlaggedEvent, + "user.messages.deleted": UserMessagesDeletedEvent, + "user.muted": UserMutedEvent, + "user.reactivated": UserReactivatedEvent, + "user.unbanned": UserUnbannedEvent, + "user.unmuted": UserUnmutedEvent, + "user.unread_message_reminder": UserUnreadReminderEvent, + "user.updated": UserUpdatedEvent, + } + return event_map.get(event_type) + + +def verify_webhook_signature( + body: Union[bytes, str], signature: str, secret: str +) -> bool: + """ + Verify the HMAC-SHA256 signature of a webhook payload. + + Args: + body: The raw request body (bytes or UTF-8 string) + signature: The signature from the X-Signature header + secret: Your webhook secret (found in the Stream Dashboard) + + Returns: + True if the signature is valid, False otherwise + """ + if isinstance(body, str): + body = body.encode("utf-8") + + h = hmac.new(secret.encode("utf-8"), body, hashlib.sha256) + expected = h.hexdigest() + return hmac.compare_digest(signature, expected) From 7538729981481d31b5e74832dea53685a96558b0 Mon Sep 17 00:00:00 2001 From: Yun Wang Date: Mon, 16 Feb 2026 16:55:16 +0100 Subject: [PATCH 2/8] test: update test cases --- getstream/models/__init__.py | 2 +- getstream/webhook.py | 5 ++++- tests/test_video_examples.py | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index ac880f15..acf0d77a 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -1762,7 +1762,7 @@ class AsyncExportErrorEvent(DataClassJsonMixin): task_id: str = dc_field(metadata=dc_config(field_name="task_id")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( - default="export.channels.error", metadata=dc_config(field_name="type") + default="export.moderation_logs.error", metadata=dc_config(field_name="type") ) received_at: Optional[datetime] = dc_field( default=None, diff --git a/getstream/webhook.py b/getstream/webhook.py index ecfc12f8..057d294e 100644 --- a/getstream/webhook.py +++ b/getstream/webhook.py @@ -381,7 +381,10 @@ def parse_webhook_event(raw_event: Union[bytes, str, Dict[str, Any]]) -> Any: if event_class is None: raise ValueError(f"Unknown webhook event type: {event_type}") - return event_class(**data) + try: + return event_class.from_dict(data, infer_missing=True) + except Exception as e: + raise ValueError(f"Failed to deserialize webhook event: {e}") def _get_event_class(event_type: str): diff --git a/tests/test_video_examples.py b/tests/test_video_examples.py index 8527f8f2..0812e07c 100644 --- a/tests/test_video_examples.py +++ b/tests/test_video_examples.py @@ -329,7 +329,7 @@ def test_start_stop_frame_recording(client: Stream): call.get_or_create(data=CallRequest(created_by_id=user_id)) with pytest.raises(StreamAPIException) as e_info: - call.start_recording() + call.start_recording(recording_type="composite") assert e_info.value.status_code == 400 assert ( @@ -338,7 +338,7 @@ def test_start_stop_frame_recording(client: Stream): ) with pytest.raises(StreamAPIException) as e_info: - call.stop_recording() + call.stop_recording(recording_type="composite") assert e_info.value.status_code == 400 assert ( From 2cea235cedaf855794a3a4a87053dc3239d346ca Mon Sep 17 00:00:00 2001 From: Yun Wang Date: Mon, 16 Feb 2026 17:11:58 +0100 Subject: [PATCH 3/8] test: suppress warning messages for webhook tests --- getstream/models/__init__.py | 5 +- getstream/tests/test_webhook.py | 642 ++++++++++++++++++++++++-------- 2 files changed, 487 insertions(+), 160 deletions(-) diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index acf0d77a..f5fe2e1b 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -1762,7 +1762,7 @@ class AsyncExportErrorEvent(DataClassJsonMixin): task_id: str = dc_field(metadata=dc_config(field_name="task_id")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( - default="export.moderation_logs.error", metadata=dc_config(field_name="type") + default="export.users.error", metadata=dc_config(field_name="type") ) received_at: Optional[datetime] = dc_field( default=None, @@ -13372,6 +13372,9 @@ class ModerationV2Response(DataClassJsonMixin): semantic_filter_matched: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="semantic_filter_matched") ) + blocklists_matched: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="blocklists_matched") + ) image_harms: Optional[List[str]] = dc_field( default=None, metadata=dc_config(field_name="image_harms") ) diff --git a/getstream/tests/test_webhook.py b/getstream/tests/test_webhook.py index 6cf1e456..8987a5b8 100644 --- a/getstream/tests/test_webhook.py +++ b/getstream/tests/test_webhook.py @@ -3,6 +3,8 @@ import hmac import hashlib +import warnings + import pytest from getstream.webhook import ( @@ -76,639 +78,961 @@ def test_empty_object(self): class TestParseWebhookEvent: def test_parse_(self): - event = parse_webhook_event({"type": "*"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "*"}) assert type(event).__name__ == "CustomEvent" def test_parse_appeal_accepted(self): - event = parse_webhook_event({"type": "appeal.accepted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "appeal.accepted"}) assert type(event).__name__ == "AppealAcceptedEvent" def test_parse_appeal_created(self): - event = parse_webhook_event({"type": "appeal.created"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "appeal.created"}) assert type(event).__name__ == "AppealCreatedEvent" def test_parse_appeal_rejected(self): - event = parse_webhook_event({"type": "appeal.rejected"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "appeal.rejected"}) assert type(event).__name__ == "AppealRejectedEvent" def test_parse_call_accepted(self): - event = parse_webhook_event({"type": "call.accepted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.accepted"}) assert type(event).__name__ == "CallAcceptedEvent" def test_parse_call_blocked_user(self): - event = parse_webhook_event({"type": "call.blocked_user"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.blocked_user"}) assert type(event).__name__ == "BlockedUserEvent" def test_parse_call_closed_caption(self): - event = parse_webhook_event({"type": "call.closed_caption"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.closed_caption"}) assert type(event).__name__ == "ClosedCaptionEvent" def test_parse_call_closed_captions_failed(self): - event = parse_webhook_event({"type": "call.closed_captions_failed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.closed_captions_failed"}) assert type(event).__name__ == "CallClosedCaptionsFailedEvent" def test_parse_call_closed_captions_started(self): - event = parse_webhook_event({"type": "call.closed_captions_started"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.closed_captions_started"}) assert type(event).__name__ == "CallClosedCaptionsStartedEvent" def test_parse_call_closed_captions_stopped(self): - event = parse_webhook_event({"type": "call.closed_captions_stopped"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.closed_captions_stopped"}) assert type(event).__name__ == "CallClosedCaptionsStoppedEvent" def test_parse_call_created(self): - event = parse_webhook_event({"type": "call.created"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.created"}) assert type(event).__name__ == "CallCreatedEvent" def test_parse_call_deleted(self): - event = parse_webhook_event({"type": "call.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.deleted"}) assert type(event).__name__ == "CallDeletedEvent" def test_parse_call_dtmf(self): - event = parse_webhook_event({"type": "call.dtmf"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.dtmf"}) assert type(event).__name__ == "CallDTMFEvent" def test_parse_call_ended(self): - event = parse_webhook_event({"type": "call.ended"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.ended"}) assert type(event).__name__ == "CallEndedEvent" def test_parse_call_frame_recording_failed(self): - event = parse_webhook_event({"type": "call.frame_recording_failed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.frame_recording_failed"}) assert type(event).__name__ == "CallFrameRecordingFailedEvent" def test_parse_call_frame_recording_ready(self): - event = parse_webhook_event({"type": "call.frame_recording_ready"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.frame_recording_ready"}) assert type(event).__name__ == "CallFrameRecordingFrameReadyEvent" def test_parse_call_frame_recording_started(self): - event = parse_webhook_event({"type": "call.frame_recording_started"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.frame_recording_started"}) assert type(event).__name__ == "CallFrameRecordingStartedEvent" def test_parse_call_frame_recording_stopped(self): - event = parse_webhook_event({"type": "call.frame_recording_stopped"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.frame_recording_stopped"}) assert type(event).__name__ == "CallFrameRecordingStoppedEvent" def test_parse_call_hls_broadcasting_failed(self): - event = parse_webhook_event({"type": "call.hls_broadcasting_failed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.hls_broadcasting_failed"}) assert type(event).__name__ == "CallHLSBroadcastingFailedEvent" def test_parse_call_hls_broadcasting_started(self): - event = parse_webhook_event({"type": "call.hls_broadcasting_started"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.hls_broadcasting_started"}) assert type(event).__name__ == "CallHLSBroadcastingStartedEvent" def test_parse_call_hls_broadcasting_stopped(self): - event = parse_webhook_event({"type": "call.hls_broadcasting_stopped"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.hls_broadcasting_stopped"}) assert type(event).__name__ == "CallHLSBroadcastingStoppedEvent" def test_parse_call_kicked_user(self): - event = parse_webhook_event({"type": "call.kicked_user"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.kicked_user"}) assert type(event).__name__ == "KickedUserEvent" def test_parse_call_live_started(self): - event = parse_webhook_event({"type": "call.live_started"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.live_started"}) assert type(event).__name__ == "CallLiveStartedEvent" def test_parse_call_member_added(self): - event = parse_webhook_event({"type": "call.member_added"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.member_added"}) assert type(event).__name__ == "CallMemberAddedEvent" def test_parse_call_member_removed(self): - event = parse_webhook_event({"type": "call.member_removed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.member_removed"}) assert type(event).__name__ == "CallMemberRemovedEvent" def test_parse_call_member_updated(self): - event = parse_webhook_event({"type": "call.member_updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.member_updated"}) assert type(event).__name__ == "CallMemberUpdatedEvent" def test_parse_call_member_updated_permission(self): - event = parse_webhook_event({"type": "call.member_updated_permission"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.member_updated_permission"}) assert type(event).__name__ == "CallMemberUpdatedPermissionEvent" def test_parse_call_missed(self): - event = parse_webhook_event({"type": "call.missed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.missed"}) assert type(event).__name__ == "CallMissedEvent" def test_parse_call_moderation_blur(self): - event = parse_webhook_event({"type": "call.moderation_blur"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.moderation_blur"}) assert type(event).__name__ == "CallModerationBlurEvent" def test_parse_call_moderation_warning(self): - event = parse_webhook_event({"type": "call.moderation_warning"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.moderation_warning"}) assert type(event).__name__ == "CallModerationWarningEvent" def test_parse_call_notification(self): - event = parse_webhook_event({"type": "call.notification"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.notification"}) assert type(event).__name__ == "CallNotificationEvent" def test_parse_call_permission_request(self): - event = parse_webhook_event({"type": "call.permission_request"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.permission_request"}) assert type(event).__name__ == "PermissionRequestEvent" def test_parse_call_permissions_updated(self): - event = parse_webhook_event({"type": "call.permissions_updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.permissions_updated"}) assert type(event).__name__ == "UpdatedCallPermissionsEvent" def test_parse_call_reaction_new(self): - event = parse_webhook_event({"type": "call.reaction_new"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.reaction_new"}) assert type(event).__name__ == "CallReactionEvent" def test_parse_call_recording_failed(self): - event = parse_webhook_event({"type": "call.recording_failed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.recording_failed"}) assert type(event).__name__ == "CallRecordingFailedEvent" def test_parse_call_recording_ready(self): - event = parse_webhook_event({"type": "call.recording_ready"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.recording_ready"}) assert type(event).__name__ == "CallRecordingReadyEvent" def test_parse_call_recording_started(self): - event = parse_webhook_event({"type": "call.recording_started"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.recording_started"}) assert type(event).__name__ == "CallRecordingStartedEvent" def test_parse_call_recording_stopped(self): - event = parse_webhook_event({"type": "call.recording_stopped"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.recording_stopped"}) assert type(event).__name__ == "CallRecordingStoppedEvent" def test_parse_call_rejected(self): - event = parse_webhook_event({"type": "call.rejected"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.rejected"}) assert type(event).__name__ == "CallRejectedEvent" def test_parse_call_ring(self): - event = parse_webhook_event({"type": "call.ring"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.ring"}) assert type(event).__name__ == "CallRingEvent" def test_parse_call_rtmp_broadcast_failed(self): - event = parse_webhook_event({"type": "call.rtmp_broadcast_failed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.rtmp_broadcast_failed"}) assert type(event).__name__ == "CallRtmpBroadcastFailedEvent" def test_parse_call_rtmp_broadcast_started(self): - event = parse_webhook_event({"type": "call.rtmp_broadcast_started"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.rtmp_broadcast_started"}) assert type(event).__name__ == "CallRtmpBroadcastStartedEvent" def test_parse_call_rtmp_broadcast_stopped(self): - event = parse_webhook_event({"type": "call.rtmp_broadcast_stopped"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.rtmp_broadcast_stopped"}) assert type(event).__name__ == "CallRtmpBroadcastStoppedEvent" def test_parse_call_session_ended(self): - event = parse_webhook_event({"type": "call.session_ended"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.session_ended"}) assert type(event).__name__ == "CallSessionEndedEvent" def test_parse_call_session_participant_count_updated(self): - event = parse_webhook_event({"type": "call.session_participant_count_updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event( + {"type": "call.session_participant_count_updated"} + ) assert type(event).__name__ == "CallSessionParticipantCountsUpdatedEvent" def test_parse_call_session_participant_joined(self): - event = parse_webhook_event({"type": "call.session_participant_joined"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.session_participant_joined"}) assert type(event).__name__ == "CallSessionParticipantJoinedEvent" def test_parse_call_session_participant_left(self): - event = parse_webhook_event({"type": "call.session_participant_left"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.session_participant_left"}) assert type(event).__name__ == "CallSessionParticipantLeftEvent" def test_parse_call_session_started(self): - event = parse_webhook_event({"type": "call.session_started"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.session_started"}) assert type(event).__name__ == "CallSessionStartedEvent" def test_parse_call_stats_report_ready(self): - event = parse_webhook_event({"type": "call.stats_report_ready"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.stats_report_ready"}) assert type(event).__name__ == "CallStatsReportReadyEvent" def test_parse_call_transcription_failed(self): - event = parse_webhook_event({"type": "call.transcription_failed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.transcription_failed"}) assert type(event).__name__ == "CallTranscriptionFailedEvent" def test_parse_call_transcription_ready(self): - event = parse_webhook_event({"type": "call.transcription_ready"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.transcription_ready"}) assert type(event).__name__ == "CallTranscriptionReadyEvent" def test_parse_call_transcription_started(self): - event = parse_webhook_event({"type": "call.transcription_started"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.transcription_started"}) assert type(event).__name__ == "CallTranscriptionStartedEvent" def test_parse_call_transcription_stopped(self): - event = parse_webhook_event({"type": "call.transcription_stopped"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.transcription_stopped"}) assert type(event).__name__ == "CallTranscriptionStoppedEvent" def test_parse_call_unblocked_user(self): - event = parse_webhook_event({"type": "call.unblocked_user"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.unblocked_user"}) assert type(event).__name__ == "UnblockedUserEvent" def test_parse_call_updated(self): - event = parse_webhook_event({"type": "call.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.updated"}) assert type(event).__name__ == "CallUpdatedEvent" def test_parse_call_user_feedback_submitted(self): - event = parse_webhook_event({"type": "call.user_feedback_submitted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.user_feedback_submitted"}) assert type(event).__name__ == "CallUserFeedbackSubmittedEvent" def test_parse_call_user_muted(self): - event = parse_webhook_event({"type": "call.user_muted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "call.user_muted"}) assert type(event).__name__ == "CallUserMutedEvent" def test_parse_campaign_completed(self): - event = parse_webhook_event({"type": "campaign.completed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "campaign.completed"}) assert type(event).__name__ == "CampaignCompletedEvent" def test_parse_campaign_started(self): - event = parse_webhook_event({"type": "campaign.started"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "campaign.started"}) assert type(event).__name__ == "CampaignStartedEvent" def test_parse_channel_created(self): - event = parse_webhook_event({"type": "channel.created"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.created"}) assert type(event).__name__ == "ChannelCreatedEvent" def test_parse_channel_deleted(self): - event = parse_webhook_event({"type": "channel.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.deleted"}) assert type(event).__name__ == "ChannelDeletedEvent" def test_parse_channel_frozen(self): - event = parse_webhook_event({"type": "channel.frozen"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.frozen"}) assert type(event).__name__ == "ChannelFrozenEvent" def test_parse_channel_hidden(self): - event = parse_webhook_event({"type": "channel.hidden"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.hidden"}) assert type(event).__name__ == "ChannelHiddenEvent" def test_parse_channel_max_streak_changed(self): - event = parse_webhook_event({"type": "channel.max_streak_changed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.max_streak_changed"}) assert type(event).__name__ == "MaxStreakChangedEvent" def test_parse_channel_muted(self): - event = parse_webhook_event({"type": "channel.muted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.muted"}) assert type(event).__name__ == "ChannelMutedEvent" def test_parse_channel_truncated(self): - event = parse_webhook_event({"type": "channel.truncated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.truncated"}) assert type(event).__name__ == "ChannelTruncatedEvent" def test_parse_channel_unfrozen(self): - event = parse_webhook_event({"type": "channel.unfrozen"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.unfrozen"}) assert type(event).__name__ == "ChannelUnFrozenEvent" def test_parse_channel_unmuted(self): - event = parse_webhook_event({"type": "channel.unmuted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.unmuted"}) assert type(event).__name__ == "ChannelUnmutedEvent" def test_parse_channel_updated(self): - event = parse_webhook_event({"type": "channel.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.updated"}) assert type(event).__name__ == "ChannelUpdatedEvent" def test_parse_channel_visible(self): - event = parse_webhook_event({"type": "channel.visible"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel.visible"}) assert type(event).__name__ == "ChannelVisibleEvent" def test_parse_channel_batch_update_completed(self): - event = parse_webhook_event({"type": "channel_batch_update.completed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel_batch_update.completed"}) assert type(event).__name__ == "ChannelBatchCompletedEvent" def test_parse_channel_batch_update_started(self): - event = parse_webhook_event({"type": "channel_batch_update.started"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "channel_batch_update.started"}) assert type(event).__name__ == "ChannelBatchStartedEvent" def test_parse_custom(self): - event = parse_webhook_event({"type": "custom"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "custom"}) assert type(event).__name__ == "CustomVideoEvent" def test_parse_export_bulk_image_moderation_error(self): - event = parse_webhook_event({"type": "export.bulk_image_moderation.error"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.bulk_image_moderation.error"}) assert type(event).__name__ == "AsyncExportErrorEvent" def test_parse_export_bulk_image_moderation_success(self): - event = parse_webhook_event({"type": "export.bulk_image_moderation.success"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event( + {"type": "export.bulk_image_moderation.success"} + ) assert type(event).__name__ == "AsyncBulkImageModerationEvent" def test_parse_export_channels_error(self): - event = parse_webhook_event({"type": "export.channels.error"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.channels.error"}) assert type(event).__name__ == "AsyncExportErrorEvent" def test_parse_export_channels_success(self): - event = parse_webhook_event({"type": "export.channels.success"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.channels.success"}) assert type(event).__name__ == "AsyncExportChannelsEvent" def test_parse_export_moderation_logs_error(self): - event = parse_webhook_event({"type": "export.moderation_logs.error"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.moderation_logs.error"}) assert type(event).__name__ == "AsyncExportErrorEvent" def test_parse_export_moderation_logs_success(self): - event = parse_webhook_event({"type": "export.moderation_logs.success"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.moderation_logs.success"}) assert type(event).__name__ == "AsyncExportModerationLogsEvent" def test_parse_export_users_error(self): - event = parse_webhook_event({"type": "export.users.error"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.users.error"}) assert type(event).__name__ == "AsyncExportErrorEvent" def test_parse_export_users_success(self): - event = parse_webhook_event({"type": "export.users.success"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "export.users.success"}) assert type(event).__name__ == "AsyncExportUsersEvent" def test_parse_feeds_activity_added(self): - event = parse_webhook_event({"type": "feeds.activity.added"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.added"}) assert type(event).__name__ == "ActivityAddedEvent" def test_parse_feeds_activity_deleted(self): - event = parse_webhook_event({"type": "feeds.activity.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.deleted"}) assert type(event).__name__ == "ActivityDeletedEvent" def test_parse_feeds_activity_feedback(self): - event = parse_webhook_event({"type": "feeds.activity.feedback"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.feedback"}) assert type(event).__name__ == "ActivityFeedbackEvent" def test_parse_feeds_activity_marked(self): - event = parse_webhook_event({"type": "feeds.activity.marked"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.marked"}) assert type(event).__name__ == "ActivityMarkEvent" def test_parse_feeds_activity_pinned(self): - event = parse_webhook_event({"type": "feeds.activity.pinned"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.pinned"}) assert type(event).__name__ == "ActivityPinnedEvent" def test_parse_feeds_activity_reaction_added(self): - event = parse_webhook_event({"type": "feeds.activity.reaction.added"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.reaction.added"}) assert type(event).__name__ == "ActivityReactionAddedEvent" def test_parse_feeds_activity_reaction_deleted(self): - event = parse_webhook_event({"type": "feeds.activity.reaction.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.reaction.deleted"}) assert type(event).__name__ == "ActivityReactionDeletedEvent" def test_parse_feeds_activity_reaction_updated(self): - event = parse_webhook_event({"type": "feeds.activity.reaction.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.reaction.updated"}) assert type(event).__name__ == "ActivityReactionUpdatedEvent" def test_parse_feeds_activity_removed_from_feed(self): - event = parse_webhook_event({"type": "feeds.activity.removed_from_feed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.removed_from_feed"}) assert type(event).__name__ == "ActivityRemovedFromFeedEvent" def test_parse_feeds_activity_restored(self): - event = parse_webhook_event({"type": "feeds.activity.restored"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.restored"}) assert type(event).__name__ == "ActivityRestoredEvent" def test_parse_feeds_activity_unpinned(self): - event = parse_webhook_event({"type": "feeds.activity.unpinned"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.unpinned"}) assert type(event).__name__ == "ActivityUnpinnedEvent" def test_parse_feeds_activity_updated(self): - event = parse_webhook_event({"type": "feeds.activity.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.activity.updated"}) assert type(event).__name__ == "ActivityUpdatedEvent" def test_parse_feeds_bookmark_added(self): - event = parse_webhook_event({"type": "feeds.bookmark.added"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.bookmark.added"}) assert type(event).__name__ == "BookmarkAddedEvent" def test_parse_feeds_bookmark_deleted(self): - event = parse_webhook_event({"type": "feeds.bookmark.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.bookmark.deleted"}) assert type(event).__name__ == "BookmarkDeletedEvent" def test_parse_feeds_bookmark_updated(self): - event = parse_webhook_event({"type": "feeds.bookmark.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.bookmark.updated"}) assert type(event).__name__ == "BookmarkUpdatedEvent" def test_parse_feeds_bookmark_folder_deleted(self): - event = parse_webhook_event({"type": "feeds.bookmark_folder.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.bookmark_folder.deleted"}) assert type(event).__name__ == "BookmarkFolderDeletedEvent" def test_parse_feeds_bookmark_folder_updated(self): - event = parse_webhook_event({"type": "feeds.bookmark_folder.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.bookmark_folder.updated"}) assert type(event).__name__ == "BookmarkFolderUpdatedEvent" def test_parse_feeds_comment_added(self): - event = parse_webhook_event({"type": "feeds.comment.added"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.comment.added"}) assert type(event).__name__ == "CommentAddedEvent" def test_parse_feeds_comment_deleted(self): - event = parse_webhook_event({"type": "feeds.comment.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.comment.deleted"}) assert type(event).__name__ == "CommentDeletedEvent" def test_parse_feeds_comment_reaction_added(self): - event = parse_webhook_event({"type": "feeds.comment.reaction.added"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.comment.reaction.added"}) assert type(event).__name__ == "CommentReactionAddedEvent" def test_parse_feeds_comment_reaction_deleted(self): - event = parse_webhook_event({"type": "feeds.comment.reaction.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.comment.reaction.deleted"}) assert type(event).__name__ == "CommentReactionDeletedEvent" def test_parse_feeds_comment_reaction_updated(self): - event = parse_webhook_event({"type": "feeds.comment.reaction.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.comment.reaction.updated"}) assert type(event).__name__ == "CommentReactionUpdatedEvent" def test_parse_feeds_comment_updated(self): - event = parse_webhook_event({"type": "feeds.comment.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.comment.updated"}) assert type(event).__name__ == "CommentUpdatedEvent" def test_parse_feeds_feed_created(self): - event = parse_webhook_event({"type": "feeds.feed.created"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed.created"}) assert type(event).__name__ == "FeedCreatedEvent" def test_parse_feeds_feed_deleted(self): - event = parse_webhook_event({"type": "feeds.feed.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed.deleted"}) assert type(event).__name__ == "FeedDeletedEvent" def test_parse_feeds_feed_updated(self): - event = parse_webhook_event({"type": "feeds.feed.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed.updated"}) assert type(event).__name__ == "FeedUpdatedEvent" def test_parse_feeds_feed_group_changed(self): - event = parse_webhook_event({"type": "feeds.feed_group.changed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed_group.changed"}) assert type(event).__name__ == "FeedGroupChangedEvent" def test_parse_feeds_feed_group_deleted(self): - event = parse_webhook_event({"type": "feeds.feed_group.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed_group.deleted"}) assert type(event).__name__ == "FeedGroupDeletedEvent" def test_parse_feeds_feed_member_added(self): - event = parse_webhook_event({"type": "feeds.feed_member.added"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed_member.added"}) assert type(event).__name__ == "FeedMemberAddedEvent" def test_parse_feeds_feed_member_removed(self): - event = parse_webhook_event({"type": "feeds.feed_member.removed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed_member.removed"}) assert type(event).__name__ == "FeedMemberRemovedEvent" def test_parse_feeds_feed_member_updated(self): - event = parse_webhook_event({"type": "feeds.feed_member.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.feed_member.updated"}) assert type(event).__name__ == "FeedMemberUpdatedEvent" def test_parse_feeds_follow_created(self): - event = parse_webhook_event({"type": "feeds.follow.created"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.follow.created"}) assert type(event).__name__ == "FollowCreatedEvent" def test_parse_feeds_follow_deleted(self): - event = parse_webhook_event({"type": "feeds.follow.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.follow.deleted"}) assert type(event).__name__ == "FollowDeletedEvent" def test_parse_feeds_follow_updated(self): - event = parse_webhook_event({"type": "feeds.follow.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.follow.updated"}) assert type(event).__name__ == "FollowUpdatedEvent" def test_parse_feeds_notification_feed_updated(self): - event = parse_webhook_event({"type": "feeds.notification_feed.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.notification_feed.updated"}) assert type(event).__name__ == "NotificationFeedUpdatedEvent" def test_parse_feeds_stories_feed_updated(self): - event = parse_webhook_event({"type": "feeds.stories_feed.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "feeds.stories_feed.updated"}) assert type(event).__name__ == "StoriesFeedUpdatedEvent" def test_parse_flag_updated(self): - event = parse_webhook_event({"type": "flag.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "flag.updated"}) assert type(event).__name__ == "FlagUpdatedEvent" def test_parse_ingress_error(self): - event = parse_webhook_event({"type": "ingress.error"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "ingress.error"}) assert type(event).__name__ == "IngressErrorEvent" def test_parse_ingress_started(self): - event = parse_webhook_event({"type": "ingress.started"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "ingress.started"}) assert type(event).__name__ == "IngressStartedEvent" def test_parse_ingress_stopped(self): - event = parse_webhook_event({"type": "ingress.stopped"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "ingress.stopped"}) assert type(event).__name__ == "IngressStoppedEvent" def test_parse_member_added(self): - event = parse_webhook_event({"type": "member.added"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "member.added"}) assert type(event).__name__ == "MemberAddedEvent" def test_parse_member_removed(self): - event = parse_webhook_event({"type": "member.removed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "member.removed"}) assert type(event).__name__ == "MemberRemovedEvent" def test_parse_member_updated(self): - event = parse_webhook_event({"type": "member.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "member.updated"}) assert type(event).__name__ == "MemberUpdatedEvent" def test_parse_message_deleted(self): - event = parse_webhook_event({"type": "message.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.deleted"}) assert type(event).__name__ == "MessageDeletedEvent" def test_parse_message_flagged(self): - event = parse_webhook_event({"type": "message.flagged"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.flagged"}) assert type(event).__name__ == "MessageFlaggedEvent" def test_parse_message_new(self): - event = parse_webhook_event({"type": "message.new"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.new"}) assert type(event).__name__ == "MessageNewEvent" def test_parse_message_pending(self): - event = parse_webhook_event({"type": "message.pending"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.pending"}) assert type(event).__name__ == "PendingMessageEvent" def test_parse_message_read(self): - event = parse_webhook_event({"type": "message.read"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.read"}) assert type(event).__name__ == "MessageReadEvent" def test_parse_message_unblocked(self): - event = parse_webhook_event({"type": "message.unblocked"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.unblocked"}) assert type(event).__name__ == "MessageUnblockedEvent" def test_parse_message_undeleted(self): - event = parse_webhook_event({"type": "message.undeleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.undeleted"}) assert type(event).__name__ == "MessageUndeletedEvent" def test_parse_message_updated(self): - event = parse_webhook_event({"type": "message.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "message.updated"}) assert type(event).__name__ == "MessageUpdatedEvent" def test_parse_moderation_custom_action(self): - event = parse_webhook_event({"type": "moderation.custom_action"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "moderation.custom_action"}) assert type(event).__name__ == "ModerationCustomActionEvent" def test_parse_moderation_flagged(self): - event = parse_webhook_event({"type": "moderation.flagged"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "moderation.flagged"}) assert type(event).__name__ == "ModerationFlaggedEvent" def test_parse_moderation_mark_reviewed(self): - event = parse_webhook_event({"type": "moderation.mark_reviewed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "moderation.mark_reviewed"}) assert type(event).__name__ == "ModerationMarkReviewedEvent" def test_parse_moderation_check_completed(self): - event = parse_webhook_event({"type": "moderation_check.completed"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "moderation_check.completed"}) assert type(event).__name__ == "ModerationCheckCompletedEvent" def test_parse_notification_mark_unread(self): - event = parse_webhook_event({"type": "notification.mark_unread"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "notification.mark_unread"}) assert type(event).__name__ == "NotificationMarkUnreadEvent" def test_parse_notification_reminder_due(self): - event = parse_webhook_event({"type": "notification.reminder_due"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "notification.reminder_due"}) assert type(event).__name__ == "ReminderNotificationEvent" def test_parse_notification_thread_message_new(self): - event = parse_webhook_event({"type": "notification.thread_message_new"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "notification.thread_message_new"}) assert type(event).__name__ == "NotificationThreadMessageNewEvent" def test_parse_reaction_deleted(self): - event = parse_webhook_event({"type": "reaction.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "reaction.deleted"}) assert type(event).__name__ == "ReactionDeletedEvent" def test_parse_reaction_new(self): - event = parse_webhook_event({"type": "reaction.new"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "reaction.new"}) assert type(event).__name__ == "ReactionNewEvent" def test_parse_reaction_updated(self): - event = parse_webhook_event({"type": "reaction.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "reaction.updated"}) assert type(event).__name__ == "ReactionUpdatedEvent" def test_parse_reminder_created(self): - event = parse_webhook_event({"type": "reminder.created"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "reminder.created"}) assert type(event).__name__ == "ReminderCreatedEvent" def test_parse_reminder_deleted(self): - event = parse_webhook_event({"type": "reminder.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "reminder.deleted"}) assert type(event).__name__ == "ReminderDeletedEvent" def test_parse_reminder_updated(self): - event = parse_webhook_event({"type": "reminder.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "reminder.updated"}) assert type(event).__name__ == "ReminderUpdatedEvent" def test_parse_review_queue_item_new(self): - event = parse_webhook_event({"type": "review_queue_item.new"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "review_queue_item.new"}) assert type(event).__name__ == "ReviewQueueItemNewEvent" def test_parse_review_queue_item_updated(self): - event = parse_webhook_event({"type": "review_queue_item.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "review_queue_item.updated"}) assert type(event).__name__ == "ReviewQueueItemUpdatedEvent" def test_parse_thread_updated(self): - event = parse_webhook_event({"type": "thread.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "thread.updated"}) assert type(event).__name__ == "ThreadUpdatedEvent" def test_parse_user_banned(self): - event = parse_webhook_event({"type": "user.banned"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.banned"}) assert type(event).__name__ == "UserBannedEvent" def test_parse_user_deactivated(self): - event = parse_webhook_event({"type": "user.deactivated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.deactivated"}) assert type(event).__name__ == "UserDeactivatedEvent" def test_parse_user_deleted(self): - event = parse_webhook_event({"type": "user.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.deleted"}) assert type(event).__name__ == "UserDeletedEvent" def test_parse_user_flagged(self): - event = parse_webhook_event({"type": "user.flagged"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.flagged"}) assert type(event).__name__ == "UserFlaggedEvent" def test_parse_user_messages_deleted(self): - event = parse_webhook_event({"type": "user.messages.deleted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.messages.deleted"}) assert type(event).__name__ == "UserMessagesDeletedEvent" def test_parse_user_muted(self): - event = parse_webhook_event({"type": "user.muted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.muted"}) assert type(event).__name__ == "UserMutedEvent" def test_parse_user_reactivated(self): - event = parse_webhook_event({"type": "user.reactivated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.reactivated"}) assert type(event).__name__ == "UserReactivatedEvent" def test_parse_user_unbanned(self): - event = parse_webhook_event({"type": "user.unbanned"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.unbanned"}) assert type(event).__name__ == "UserUnbannedEvent" def test_parse_user_unmuted(self): - event = parse_webhook_event({"type": "user.unmuted"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.unmuted"}) assert type(event).__name__ == "UserUnmutedEvent" def test_parse_user_unread_message_reminder(self): - event = parse_webhook_event({"type": "user.unread_message_reminder"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.unread_message_reminder"}) assert type(event).__name__ == "UserUnreadReminderEvent" def test_parse_user_updated(self): - event = parse_webhook_event({"type": "user.updated"}) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "user.updated"}) assert type(event).__name__ == "UserUpdatedEvent" def test_unknown_event_type(self): From fb7e50f8eec5bb8169f8086594c71dd039977a7c Mon Sep 17 00:00:00 2001 From: Yun Wang Date: Mon, 16 Feb 2026 18:25:50 +0100 Subject: [PATCH 4/8] feat: replace legacy WebSocketClientProtocol with ClientConnection --- getstream/video/rtc/coordinator/ws.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/getstream/video/rtc/coordinator/ws.py b/getstream/video/rtc/coordinator/ws.py index 4b666d40..01b82099 100644 --- a/getstream/video/rtc/coordinator/ws.py +++ b/getstream/video/rtc/coordinator/ws.py @@ -9,12 +9,11 @@ import json import logging import time -from typing import TYPE_CHECKING, Optional +from typing import Optional import websockets -if TYPE_CHECKING: - from websockets.legacy.client import WebSocketClientProtocol +from websockets import ClientConnection from getstream import AsyncStream from getstream.utils import StreamAsyncIOEventEmitter @@ -88,7 +87,7 @@ def __init__( self._logger = logger or globals()["logger"] # Connection state - self._websocket: Optional["WebSocketClientProtocol"] = None + self._websocket: Optional[ClientConnection] = None self._connected = False self._client_id: Optional[str] = None @@ -152,6 +151,7 @@ async def _open_socket(self) -> dict: self._build_auth_payload(), ) self._logger.debug("WebSocket connection established") + assert self._websocket is not None # Send authentication payload immediately self._logger.debug("Sending auth payload") From 8f2d86f51e904f0232652bb4ba1fdf195c252e41 Mon Sep 17 00:00:00 2001 From: Yun Wang Date: Tue, 17 Feb 2026 14:03:31 +0100 Subject: [PATCH 5/8] feat: update by openapi refactor --- getstream/feeds/rest_client.py | 2 + getstream/models/__init__.py | 174 +++++++++++++++++++++- getstream/moderation/async_rest_client.py | 6 +- getstream/moderation/rest_client.py | 6 +- getstream/tests/test_webhook.py | 6 + getstream/webhook.py | 3 + 6 files changed, 189 insertions(+), 8 deletions(-) diff --git a/getstream/feeds/rest_client.py b/getstream/feeds/rest_client.py index e2b9d7a0..1e3cad80 100644 --- a/getstream/feeds/rest_client.py +++ b/getstream/feeds/rest_client.py @@ -128,6 +128,7 @@ def delete_activities( @telemetry.operation_name("getstream.api.feeds.query_activities") def query_activities( self, + include_expired_activities: Optional[bool] = None, include_private_activities: Optional[bool] = None, limit: Optional[int] = None, next: Optional[str] = None, @@ -138,6 +139,7 @@ def query_activities( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryActivitiesResponse]: json = build_body_dict( + include_expired_activities=include_expired_activities, include_private_activities=include_private_activities, limit=limit, next=next, diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index f5fe2e1b..48569d5c 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -2704,6 +2704,31 @@ class CallAcceptedEvent(DataClassJsonMixin): type: str = dc_field(default="call.accepted", metadata=dc_config(field_name="type")) +@dataclass +class CallActionOptions(DataClassJsonMixin): + duration: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="duration") + ) + flag_reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="flag_reason") + ) + kick_reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="kick_reason") + ) + mute_audio: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="mute_audio") + ) + mute_video: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="mute_video") + ) + reason: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="reason") + ) + warning_text: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="warning_text") + ) + + @dataclass class CallClosedCaption(DataClassJsonMixin): end_time: datetime = dc_field( @@ -2797,6 +2822,16 @@ class CallCreatedEvent(DataClassJsonMixin): type: str = dc_field(default="call.created", metadata=dc_config(field_name="type")) +@dataclass +class CallCustomPropertyParameters(DataClassJsonMixin): + operator: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="operator") + ) + property_key: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="property_key") + ) + + @dataclass class CallDTMFEvent(DataClassJsonMixin): call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) @@ -3565,6 +3600,19 @@ class CallRtmpBroadcastStoppedEvent(DataClassJsonMixin): ) +@dataclass +class CallRuleActionSequence(DataClassJsonMixin): + violation_number: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="violation_number") + ) + actions: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="actions") + ) + call_options: "Optional[CallActionOptions]" = dc_field( + default=None, metadata=dc_config(field_name="call_options") + ) + + @dataclass class CallSessionEndedEvent(DataClassJsonMixin): call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) @@ -4306,6 +4354,13 @@ class CallTypeResponse(DataClassJsonMixin): ) +@dataclass +class CallTypeRuleParameters(DataClassJsonMixin): + call_type: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="call_type") + ) + + @dataclass class CallUpdatedEvent(DataClassJsonMixin): call_cid: str = dc_field(metadata=dc_config(field_name="call_cid")) @@ -6115,6 +6170,19 @@ class ClosedCaptionEvent(DataClassJsonMixin): ) +@dataclass +class ClosedCaptionRuleParameters(DataClassJsonMixin): + threshold: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="threshold") + ) + harm_labels: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="harm_labels") + ) + llm_harm_labels: "Optional[Dict[str, str]]" = dc_field( + default=None, metadata=dc_config(field_name="llm_harm_labels") + ) + + @dataclass class CollectUserFeedbackRequest(DataClassJsonMixin): rating: int = dc_field(metadata=dc_config(field_name="rating")) @@ -11236,6 +11304,19 @@ class JoinCallAPIMetrics(DataClassJsonMixin): ) +@dataclass +class KeyframeRuleParameters(DataClassJsonMixin): + min_confidence: Optional[float] = dc_field( + default=None, metadata=dc_config(field_name="min_confidence") + ) + threshold: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="threshold") + ) + harm_labels: Optional[List[str]] = dc_field( + default=None, metadata=dc_config(field_name="harm_labels") + ) + + @dataclass class KickUserRequest(DataClassJsonMixin): user_id: str = dc_field(metadata=dc_config(field_name="user_id")) @@ -13319,6 +13400,14 @@ class ModerationResponse(DataClassJsonMixin): toxic: float = dc_field(metadata=dc_config(field_name="toxic")) +@dataclass +class ModerationRuleInfo(DataClassJsonMixin): + description: str = dc_field(metadata=dc_config(field_name="description")) + id: str = dc_field(metadata=dc_config(field_name="id")) + name: str = dc_field(metadata=dc_config(field_name="name")) + type: str = dc_field(metadata=dc_config(field_name="type")) + + @dataclass class ModerationRuleV2Response(DataClassJsonMixin): created_at: datetime = dc_field( @@ -13344,19 +13433,62 @@ class ModerationRuleV2Response(DataClassJsonMixin): ) ) config_keys: List[str] = dc_field(metadata=dc_config(field_name="config_keys")) - action: "RuleBuilderAction" = dc_field(metadata=dc_config(field_name="action")) cooldown_period: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="cooldown_period") ) logic: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="logic") ) + action_sequences: "Optional[List[CallRuleActionSequence]]" = dc_field( + default=None, metadata=dc_config(field_name="action_sequences") + ) conditions: "Optional[List[RuleBuilderCondition]]" = dc_field( default=None, metadata=dc_config(field_name="conditions") ) groups: "Optional[List[RuleBuilderConditionGroup]]" = dc_field( default=None, metadata=dc_config(field_name="groups") ) + action: "Optional[RuleBuilderAction]" = dc_field( + default=None, metadata=dc_config(field_name="action") + ) + + +@dataclass +class ModerationRulesTriggeredEvent(DataClassJsonMixin): + created_at: datetime = dc_field( + metadata=dc_config( + field_name="created_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ) + ) + entity_id: str = dc_field(metadata=dc_config(field_name="entity_id")) + entity_type: str = dc_field(metadata=dc_config(field_name="entity_type")) + user_id: str = dc_field(metadata=dc_config(field_name="user_id")) + triggered_actions: List[str] = dc_field( + metadata=dc_config(field_name="triggered_actions") + ) + custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) + rule: "ModerationRuleInfo" = dc_field(metadata=dc_config(field_name="rule")) + type: str = dc_field( + default="moderation_rule.triggered", metadata=dc_config(field_name="type") + ) + received_at: Optional[datetime] = dc_field( + default=None, + metadata=dc_config( + field_name="received_at", + encoder=encode_datetime, + decoder=datetime_from_unix_ns, + mm_field=fields.DateTime(format="iso"), + ), + ) + review_queue_item_id: Optional[str] = dc_field( + default=None, metadata=dc_config(field_name="review_queue_item_id") + ) + violation_number: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="violation_number") + ) @dataclass @@ -15152,6 +15284,9 @@ class QualityScoreReportResponse(DataClassJsonMixin): @dataclass class QueryActivitiesRequest(DataClassJsonMixin): + include_expired_activities: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="include_expired_activities") + ) include_private_activities: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="include_private_activities") ) @@ -16122,6 +16257,12 @@ class QueryModerationRulesRequest(DataClassJsonMixin): @dataclass class QueryModerationRulesResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) + closed_caption_labels: List[str] = dc_field( + metadata=dc_config(field_name="closed_caption_labels") + ) + keyframe_labels: List[str] = dc_field( + metadata=dc_config(field_name="keyframe_labels") + ) rules: "List[ModerationRuleV2Response]" = dc_field( metadata=dc_config(field_name="rules") ) @@ -17525,10 +17666,13 @@ class Role(DataClassJsonMixin): @dataclass class RuleBuilderAction(DataClassJsonMixin): - type: str = dc_field(metadata=dc_config(field_name="type")) + type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) ban_options: "Optional[BanOptions]" = dc_field( default=None, metadata=dc_config(field_name="ban_options") ) + call_options: "Optional[CallActionOptions]" = dc_field( + default=None, metadata=dc_config(field_name="call_options") + ) flag_user_options: "Optional[FlagUserOptions]" = dc_field( default=None, metadata=dc_config(field_name="flag_user_options") ) @@ -17540,6 +17684,15 @@ class RuleBuilderCondition(DataClassJsonMixin): default=None, metadata=dc_config(field_name="confidence") ) type: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="type")) + call_custom_property_params: "Optional[CallCustomPropertyParameters]" = dc_field( + default=None, metadata=dc_config(field_name="call_custom_property_params") + ) + call_type_rule_params: "Optional[CallTypeRuleParameters]" = dc_field( + default=None, metadata=dc_config(field_name="call_type_rule_params") + ) + closed_caption_rule_params: "Optional[ClosedCaptionRuleParameters]" = dc_field( + default=None, metadata=dc_config(field_name="closed_caption_rule_params") + ) content_count_rule_params: "Optional[ContentCountRuleParameters]" = dc_field( default=None, metadata=dc_config(field_name="content_count_rule_params") ) @@ -17552,6 +17705,9 @@ class RuleBuilderCondition(DataClassJsonMixin): image_rule_params: "Optional[ImageRuleParameters]" = dc_field( default=None, metadata=dc_config(field_name="image_rule_params") ) + keyframe_rule_params: "Optional[KeyframeRuleParameters]" = dc_field( + default=None, metadata=dc_config(field_name="keyframe_rule_params") + ) text_content_params: "Optional[TextContentParameters]" = dc_field( default=None, metadata=dc_config(field_name="text_content_params") ) @@ -17608,7 +17764,6 @@ class RuleBuilderConfig(DataClassJsonMixin): @dataclass class RuleBuilderRule(DataClassJsonMixin): rule_type: str = dc_field(metadata=dc_config(field_name="rule_type")) - action: "RuleBuilderAction" = dc_field(metadata=dc_config(field_name="action")) cooldown_period: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="cooldown_period") ) @@ -17616,12 +17771,18 @@ class RuleBuilderRule(DataClassJsonMixin): logic: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="logic") ) + action_sequences: "Optional[List[CallRuleActionSequence]]" = dc_field( + default=None, metadata=dc_config(field_name="action_sequences") + ) conditions: "Optional[List[RuleBuilderCondition]]" = dc_field( default=None, metadata=dc_config(field_name="conditions") ) groups: "Optional[List[RuleBuilderConditionGroup]]" = dc_field( default=None, metadata=dc_config(field_name="groups") ) + action: "Optional[RuleBuilderAction]" = dc_field( + default=None, metadata=dc_config(field_name="action") + ) @dataclass @@ -21303,7 +21464,6 @@ class UpsertConfigResponse(DataClassJsonMixin): class UpsertModerationRuleRequest(DataClassJsonMixin): name: str = dc_field(metadata=dc_config(field_name="name")) rule_type: str = dc_field(metadata=dc_config(field_name="rule_type")) - action: "RuleBuilderAction" = dc_field(metadata=dc_config(field_name="action")) cooldown_period: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="cooldown_period") ) @@ -21317,6 +21477,9 @@ class UpsertModerationRuleRequest(DataClassJsonMixin): default=None, metadata=dc_config(field_name="logic") ) team: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="team")) + action_sequences: "Optional[List[CallRuleActionSequence]]" = dc_field( + default=None, metadata=dc_config(field_name="action_sequences") + ) conditions: "Optional[List[RuleBuilderCondition]]" = dc_field( default=None, metadata=dc_config(field_name="conditions") ) @@ -21326,6 +21489,9 @@ class UpsertModerationRuleRequest(DataClassJsonMixin): groups: "Optional[List[RuleBuilderConditionGroup]]" = dc_field( default=None, metadata=dc_config(field_name="groups") ) + action: "Optional[RuleBuilderAction]" = dc_field( + default=None, metadata=dc_config(field_name="action") + ) @dataclass diff --git a/getstream/moderation/async_rest_client.py b/getstream/moderation/async_rest_client.py index d2497e00..75436ee6 100644 --- a/getstream/moderation/async_rest_client.py +++ b/getstream/moderation/async_rest_client.py @@ -377,28 +377,30 @@ async def upsert_moderation_rule( self, name: str, rule_type: str, - action: RuleBuilderAction, cooldown_period: Optional[str] = None, description: Optional[str] = None, enabled: Optional[bool] = None, logic: Optional[str] = None, team: Optional[str] = None, + action_sequences: Optional[List[CallRuleActionSequence]] = None, conditions: Optional[List[RuleBuilderCondition]] = None, config_keys: Optional[List[str]] = None, groups: Optional[List[RuleBuilderConditionGroup]] = None, + action: Optional[RuleBuilderAction] = None, ) -> StreamResponse[UpsertModerationRuleResponse]: json = build_body_dict( name=name, rule_type=rule_type, - action=action, cooldown_period=cooldown_period, description=description, enabled=enabled, logic=logic, team=team, + action_sequences=action_sequences, conditions=conditions, config_keys=config_keys, groups=groups, + action=action, ) return await self.post( "/api/v2/moderation/moderation_rule", diff --git a/getstream/moderation/rest_client.py b/getstream/moderation/rest_client.py index 3378a256..5ab706a2 100644 --- a/getstream/moderation/rest_client.py +++ b/getstream/moderation/rest_client.py @@ -371,28 +371,30 @@ def upsert_moderation_rule( self, name: str, rule_type: str, - action: RuleBuilderAction, cooldown_period: Optional[str] = None, description: Optional[str] = None, enabled: Optional[bool] = None, logic: Optional[str] = None, team: Optional[str] = None, + action_sequences: Optional[List[CallRuleActionSequence]] = None, conditions: Optional[List[RuleBuilderCondition]] = None, config_keys: Optional[List[str]] = None, groups: Optional[List[RuleBuilderConditionGroup]] = None, + action: Optional[RuleBuilderAction] = None, ) -> StreamResponse[UpsertModerationRuleResponse]: json = build_body_dict( name=name, rule_type=rule_type, - action=action, cooldown_period=cooldown_period, description=description, enabled=enabled, logic=logic, team=team, + action_sequences=action_sequences, conditions=conditions, config_keys=config_keys, groups=groups, + action=action, ) return self.post( "/api/v2/moderation/moderation_rule", diff --git a/getstream/tests/test_webhook.py b/getstream/tests/test_webhook.py index 8987a5b8..b5d7ecb9 100644 --- a/getstream/tests/test_webhook.py +++ b/getstream/tests/test_webhook.py @@ -897,6 +897,12 @@ def test_parse_moderation_check_completed(self): event = parse_webhook_event({"type": "moderation_check.completed"}) assert type(event).__name__ == "ModerationCheckCompletedEvent" + def test_parse_moderation_rule_triggered(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", RuntimeWarning) + event = parse_webhook_event({"type": "moderation_rule.triggered"}) + assert type(event).__name__ == "ModerationRulesTriggeredEvent" + def test_parse_notification_mark_unread(self): with warnings.catch_warnings(): warnings.simplefilter("ignore", RuntimeWarning) diff --git a/getstream/webhook.py b/getstream/webhook.py index 057d294e..f7ec289b 100644 --- a/getstream/webhook.py +++ b/getstream/webhook.py @@ -138,6 +138,7 @@ ModerationFlaggedEvent, ModerationMarkReviewedEvent, ModerationCheckCompletedEvent, + ModerationRulesTriggeredEvent, NotificationMarkUnreadEvent, ReminderNotificationEvent, NotificationThreadMessageNewEvent, @@ -303,6 +304,7 @@ EVENT_TYPE_MODERATION_FLAGGED = "moderation.flagged" EVENT_TYPE_MODERATION_MARK_REVIEWED = "moderation.mark_reviewed" EVENT_TYPE_MODERATION_CHECK_COMPLETED = "moderation_check.completed" +EVENT_TYPE_MODERATION_RULE_TRIGGERED = "moderation_rule.triggered" EVENT_TYPE_NOTIFICATION_MARK_UNREAD = "notification.mark_unread" EVENT_TYPE_NOTIFICATION_REMINDER_DUE = "notification.reminder_due" EVENT_TYPE_NOTIFICATION_THREAD_MESSAGE_NEW = "notification.thread_message_new" @@ -526,6 +528,7 @@ def _get_event_class(event_type: str): "moderation.flagged": ModerationFlaggedEvent, "moderation.mark_reviewed": ModerationMarkReviewedEvent, "moderation_check.completed": ModerationCheckCompletedEvent, + "moderation_rule.triggered": ModerationRulesTriggeredEvent, "notification.mark_unread": NotificationMarkUnreadEvent, "notification.reminder_due": ReminderNotificationEvent, "notification.thread_message_new": NotificationThreadMessageNewEvent, From 83583eabe0dde8ae805c3c17d63ffb7d7ecd3e0c Mon Sep 17 00:00:00 2001 From: Yun Wang Date: Tue, 17 Feb 2026 15:40:11 +0100 Subject: [PATCH 6/8] fix: sort serialization, datetime handling and field name mapping --- getstream/chat/async_rest_client.py | 599 ++++++++++-------- getstream/chat/rest_client.py | 599 ++++++++++-------- getstream/common/async_rest_client.py | 444 +++++++------ getstream/common/rest_client.py | 444 +++++++------ getstream/feeds/rest_client.py | 721 +++++++++++++--------- getstream/models/__init__.py | 2 +- getstream/moderation/async_rest_client.py | 327 +++++----- getstream/moderation/rest_client.py | 327 +++++----- getstream/utils/__init__.py | 15 +- getstream/video/async_rest_client.py | 361 ++++++----- getstream/video/rest_client.py | 361 ++++++----- 11 files changed, 2467 insertions(+), 1733 deletions(-) diff --git a/getstream/chat/async_rest_client.py b/getstream/chat/async_rest_client.py index 3c2090fa..1454872a 100644 --- a/getstream/chat/async_rest_client.py +++ b/getstream/chat/async_rest_client.py @@ -42,12 +42,14 @@ async def query_campaigns( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCampaignsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_limit=user_limit, - sort=sort, - filter=filter, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_limit": user_limit, + "sort": sort, + "filter": filter, + } ) return await self.post( "/api/v2/chat/campaigns/query", QueryCampaignsResponse, json=json @@ -61,7 +63,7 @@ async def get_campaign( next: Optional[str] = None, limit: Optional[int] = None, ) -> StreamResponse[GetCampaignResponse]: - query_params = build_query_param(prev=prev, next=next, limit=limit) + query_params = build_query_param(**{"prev": prev, "next": next, "limit": limit}) path_params = { "id": id, } @@ -82,7 +84,7 @@ async def start_campaign( path_params = { "id": id, } - json = build_body_dict(scheduled_for=scheduled_for, stop_at=stop_at) + json = build_body_dict(**{"scheduled_for": scheduled_for, "stop_at": stop_at}) return await self.post( "/api/v2/chat/campaigns/{id}/start", StartCampaignResponse, @@ -98,7 +100,7 @@ async def schedule_campaign( path_params = { "id": id, } - json = build_body_dict() + json = build_body_dict(**{}) return await self.post( "/api/v2/chat/campaigns/{id}/stop", CampaignResponse, @@ -123,18 +125,20 @@ async def query_channels( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryChannelsResponse]: json = build_body_dict( - limit=limit, - member_limit=member_limit, - message_limit=message_limit, - offset=offset, - predefined_filter=predefined_filter, - state=state, - user_id=user_id, - sort=sort, - filter_conditions=filter_conditions, - filter_values=filter_values, - sort_values=sort_values, - user=user, + **{ + "limit": limit, + "member_limit": member_limit, + "message_limit": message_limit, + "offset": offset, + "predefined_filter": predefined_filter, + "state": state, + "user_id": user_id, + "sort": sort, + "filter_conditions": filter_conditions, + "filter_values": filter_values, + "sort_values": sort_values, + "user": user, + } ) return await self.post( "/api/v2/chat/channels", QueryChannelsResponse, json=json @@ -144,7 +148,7 @@ async def query_channels( async def delete_channels( self, cids: List[str], hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteChannelsResponse]: - json = build_body_dict(cids=cids, hard_delete=hard_delete) + json = build_body_dict(**{"cids": cids, "hard_delete": hard_delete}) return await self.post( "/api/v2/chat/channels/delete", DeleteChannelsResponse, json=json ) @@ -155,8 +159,10 @@ async def mark_delivered( user_id: Optional[str] = None, latest_delivered_messages: Optional[List[DeliveredMessagePayload]] = None, ) -> StreamResponse[MarkDeliveredResponse]: - query_params = build_query_param(user_id=user_id) - json = build_body_dict(latest_delivered_messages=latest_delivered_messages) + query_params = build_query_param(**{"user_id": user_id}) + json = build_body_dict( + **{"latest_delivered_messages": latest_delivered_messages} + ) return await self.post( "/api/v2/chat/channels/delivered", MarkDeliveredResponse, @@ -172,7 +178,7 @@ async def mark_channels_read( user: Optional[UserRequest] = None, ) -> StreamResponse[MarkReadResponse]: json = build_body_dict( - user_id=user_id, read_by_channel=read_by_channel, user=user + **{"user_id": user_id, "read_by_channel": read_by_channel, "user": user} ) return await self.post( "/api/v2/chat/channels/read", MarkReadResponse, json=json @@ -194,13 +200,15 @@ async def get_or_create_distinct_channel( "type": type, } json = build_body_dict( - hide_for_creator=hide_for_creator, - state=state, - thread_unread_counts=thread_unread_counts, - data=data, - members=members, - messages=messages, - watchers=watchers, + **{ + "hide_for_creator": hide_for_creator, + "state": state, + "thread_unread_counts": thread_unread_counts, + "data": data, + "members": members, + "messages": messages, + "watchers": watchers, + } ) return await self.post( "/api/v2/chat/channels/{type}/query", @@ -213,7 +221,7 @@ async def get_or_create_distinct_channel( async def delete_channel( self, type: str, id: str, hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteChannelResponse]: - query_params = build_query_param(hard_delete=hard_delete) + query_params = build_query_param(**{"hard_delete": hard_delete}) path_params = { "type": type, "id": id, @@ -239,7 +247,9 @@ async def update_channel_partial( "type": type, "id": id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + **{"user_id": user_id, "unset": unset, "set": set, "user": user} + ) return await self.patch( "/api/v2/chat/channels/{type}/{id}", UpdateChannelPartialResponse, @@ -276,24 +286,26 @@ async def update_channel( "id": id, } json = build_body_dict( - accept_invite=accept_invite, - cooldown=cooldown, - hide_history=hide_history, - hide_history_before=hide_history_before, - reject_invite=reject_invite, - skip_push=skip_push, - user_id=user_id, - add_filter_tags=add_filter_tags, - add_members=add_members, - add_moderators=add_moderators, - assign_roles=assign_roles, - demote_moderators=demote_moderators, - invites=invites, - remove_filter_tags=remove_filter_tags, - remove_members=remove_members, - data=data, - message=message, - user=user, + **{ + "accept_invite": accept_invite, + "cooldown": cooldown, + "hide_history": hide_history, + "hide_history_before": hide_history_before, + "reject_invite": reject_invite, + "skip_push": skip_push, + "user_id": user_id, + "add_filter_tags": add_filter_tags, + "add_members": add_members, + "add_moderators": add_moderators, + "assign_roles": assign_roles, + "demote_moderators": demote_moderators, + "invites": invites, + "remove_filter_tags": remove_filter_tags, + "remove_members": remove_members, + "data": data, + "message": message, + "user": user, + } ) return await self.post( "/api/v2/chat/channels/{type}/{id}", @@ -310,7 +322,7 @@ async def delete_draft( parent_id: Optional[str] = None, user_id: Optional[str] = None, ) -> StreamResponse[Response]: - query_params = build_query_param(parent_id=parent_id, user_id=user_id) + query_params = build_query_param(**{"parent_id": parent_id, "user_id": user_id}) path_params = { "type": type, "id": id, @@ -330,7 +342,7 @@ async def get_draft( parent_id: Optional[str] = None, user_id: Optional[str] = None, ) -> StreamResponse[GetDraftResponse]: - query_params = build_query_param(parent_id=parent_id, user_id=user_id) + query_params = build_query_param(**{"parent_id": parent_id, "user_id": user_id}) path_params = { "type": type, "id": id, @@ -350,7 +362,7 @@ async def send_event( "type": type, "id": id, } - json = build_body_dict(event=event) + json = build_body_dict(**{"event": event}) return await self.post( "/api/v2/chat/channels/{type}/{id}/event", EventResponse, @@ -362,7 +374,7 @@ async def send_event( async def delete_channel_file( self, type: str, id: str, url: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) path_params = { "type": type, "id": id, @@ -386,7 +398,7 @@ async def upload_channel_file( "type": type, "id": id, } - json = build_body_dict(file=file, user=user) + json = build_body_dict(**{"file": file, "user": user}) return await self.post( "/api/v2/chat/channels/{type}/{id}/file", UploadChannelFileResponse, @@ -407,7 +419,9 @@ async def hide_channel( "type": type, "id": id, } - json = build_body_dict(clear_history=clear_history, user_id=user_id, user=user) + json = build_body_dict( + **{"clear_history": clear_history, "user_id": user_id, "user": user} + ) return await self.post( "/api/v2/chat/channels/{type}/{id}/hide", HideChannelResponse, @@ -419,7 +433,7 @@ async def hide_channel( async def delete_channel_image( self, type: str, id: str, url: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) path_params = { "type": type, "id": id, @@ -444,7 +458,9 @@ async def upload_channel_image( "type": type, "id": id, } - json = build_body_dict(file=file, upload_sizes=upload_sizes, user=user) + json = build_body_dict( + **{"file": file, "upload_sizes": upload_sizes, "user": user} + ) return await self.post( "/api/v2/chat/channels/{type}/{id}/image", UploadChannelResponse, @@ -461,12 +477,12 @@ async def update_member_partial( unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, ) -> StreamResponse[UpdateMemberPartialResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "type": type, "id": id, } - json = build_body_dict(unset=unset, set=set) + json = build_body_dict(**{"unset": unset, "set": set}) return await self.patch( "/api/v2/chat/channels/{type}/{id}/member", UpdateMemberPartialResponse, @@ -493,13 +509,15 @@ async def send_message( "id": id, } json = build_body_dict( - message=message, - force_moderation=force_moderation, - keep_channel_hidden=keep_channel_hidden, - pending=pending, - skip_enrich_url=skip_enrich_url, - skip_push=skip_push, - pending_message_metadata=pending_message_metadata, + **{ + "message": message, + "force_moderation": force_moderation, + "keep_channel_hidden": keep_channel_hidden, + "pending": pending, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "pending_message_metadata": pending_message_metadata, + } ) return await self.post( "/api/v2/chat/channels/{type}/{id}/message", @@ -512,7 +530,7 @@ async def send_message( async def get_many_messages( self, type: str, id: str, ids: List[str] ) -> StreamResponse[GetManyMessagesResponse]: - query_params = build_query_param(ids=ids) + query_params = build_query_param(**{"ids": ids}) path_params = { "type": type, "id": id, @@ -542,13 +560,15 @@ async def get_or_create_channel( "id": id, } json = build_body_dict( - hide_for_creator=hide_for_creator, - state=state, - thread_unread_counts=thread_unread_counts, - data=data, - members=members, - messages=messages, - watchers=watchers, + **{ + "hide_for_creator": hide_for_creator, + "state": state, + "thread_unread_counts": thread_unread_counts, + "data": data, + "members": members, + "messages": messages, + "watchers": watchers, + } ) return await self.post( "/api/v2/chat/channels/{type}/{id}/query", @@ -572,7 +592,12 @@ async def mark_read( "id": id, } json = build_body_dict( - message_id=message_id, thread_id=thread_id, user_id=user_id, user=user + **{ + "message_id": message_id, + "thread_id": thread_id, + "user_id": user_id, + "user": user, + } ) return await self.post( "/api/v2/chat/channels/{type}/{id}/read", @@ -593,7 +618,7 @@ async def show_channel( "type": type, "id": id, } - json = build_body_dict(user_id=user_id, user=user) + json = build_body_dict(**{"user_id": user_id, "user": user}) return await self.post( "/api/v2/chat/channels/{type}/{id}/show", ShowChannelResponse, @@ -619,13 +644,15 @@ async def truncate_channel( "id": id, } json = build_body_dict( - hard_delete=hard_delete, - skip_push=skip_push, - truncated_at=truncated_at, - user_id=user_id, - member_ids=member_ids, - message=message, - user=user, + **{ + "hard_delete": hard_delete, + "skip_push": skip_push, + "truncated_at": truncated_at, + "user_id": user_id, + "member_ids": member_ids, + "message": message, + "user": user, + } ) return await self.post( "/api/v2/chat/channels/{type}/{id}/truncate", @@ -650,11 +677,13 @@ async def mark_unread( "id": id, } json = build_body_dict( - message_id=message_id, - message_timestamp=message_timestamp, - thread_id=thread_id, - user_id=user_id, - user=user, + **{ + "message_id": message_id, + "message_timestamp": message_timestamp, + "thread_id": thread_id, + "user_id": user_id, + "user": user, + } ) return await self.post( "/api/v2/chat/channels/{type}/{id}/unread", @@ -704,38 +733,40 @@ async def create_channel_type( grants: Optional[Dict[str, List[str]]] = None, ) -> StreamResponse[CreateChannelTypeResponse]: json = build_body_dict( - automod=automod, - automod_behavior=automod_behavior, - max_message_length=max_message_length, - name=name, - blocklist=blocklist, - blocklist_behavior=blocklist_behavior, - connect_events=connect_events, - count_messages=count_messages, - custom_events=custom_events, - delivery_events=delivery_events, - mark_messages_pending=mark_messages_pending, - message_retention=message_retention, - mutes=mutes, - partition_size=partition_size, - partition_ttl=partition_ttl, - polls=polls, - push_level=push_level, - push_notifications=push_notifications, - reactions=reactions, - read_events=read_events, - replies=replies, - search=search, - shared_locations=shared_locations, - skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, - typing_events=typing_events, - uploads=uploads, - url_enrichment=url_enrichment, - user_message_reminders=user_message_reminders, - blocklists=blocklists, - commands=commands, - permissions=permissions, - grants=grants, + **{ + "automod": automod, + "automod_behavior": automod_behavior, + "max_message_length": max_message_length, + "name": name, + "blocklist": blocklist, + "blocklist_behavior": blocklist_behavior, + "connect_events": connect_events, + "count_messages": count_messages, + "custom_events": custom_events, + "delivery_events": delivery_events, + "mark_messages_pending": mark_messages_pending, + "message_retention": message_retention, + "mutes": mutes, + "partition_size": partition_size, + "partition_ttl": partition_ttl, + "polls": polls, + "push_level": push_level, + "push_notifications": push_notifications, + "reactions": reactions, + "read_events": read_events, + "replies": replies, + "search": search, + "shared_locations": shared_locations, + "skip_last_msg_update_for_system_msgs": skip_last_msg_update_for_system_msgs, + "typing_events": typing_events, + "uploads": uploads, + "url_enrichment": url_enrichment, + "user_message_reminders": user_message_reminders, + "blocklists": blocklists, + "commands": commands, + "permissions": permissions, + "grants": grants, + } ) return await self.post( "/api/v2/chat/channeltypes", CreateChannelTypeResponse, json=json @@ -806,40 +837,42 @@ async def update_channel_type( "name": name, } json = build_body_dict( - automod=automod, - automod_behavior=automod_behavior, - max_message_length=max_message_length, - blocklist=blocklist, - blocklist_behavior=blocklist_behavior, - connect_events=connect_events, - count_messages=count_messages, - custom_events=custom_events, - delivery_events=delivery_events, - mark_messages_pending=mark_messages_pending, - mutes=mutes, - partition_size=partition_size, - partition_ttl=partition_ttl, - polls=polls, - push_level=push_level, - push_notifications=push_notifications, - quotes=quotes, - reactions=reactions, - read_events=read_events, - reminders=reminders, - replies=replies, - search=search, - shared_locations=shared_locations, - skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, - typing_events=typing_events, - uploads=uploads, - url_enrichment=url_enrichment, - user_message_reminders=user_message_reminders, - allowed_flag_reasons=allowed_flag_reasons, - blocklists=blocklists, - commands=commands, - permissions=permissions, - automod_thresholds=automod_thresholds, - grants=grants, + **{ + "automod": automod, + "automod_behavior": automod_behavior, + "max_message_length": max_message_length, + "blocklist": blocklist, + "blocklist_behavior": blocklist_behavior, + "connect_events": connect_events, + "count_messages": count_messages, + "custom_events": custom_events, + "delivery_events": delivery_events, + "mark_messages_pending": mark_messages_pending, + "mutes": mutes, + "partition_size": partition_size, + "partition_ttl": partition_ttl, + "polls": polls, + "push_level": push_level, + "push_notifications": push_notifications, + "quotes": quotes, + "reactions": reactions, + "read_events": read_events, + "reminders": reminders, + "replies": replies, + "search": search, + "shared_locations": shared_locations, + "skip_last_msg_update_for_system_msgs": skip_last_msg_update_for_system_msgs, + "typing_events": typing_events, + "uploads": uploads, + "url_enrichment": url_enrichment, + "user_message_reminders": user_message_reminders, + "allowed_flag_reasons": allowed_flag_reasons, + "blocklists": blocklists, + "commands": commands, + "permissions": permissions, + "automod_thresholds": automod_thresholds, + "grants": grants, + } ) return await self.put( "/api/v2/chat/channeltypes/{name}", @@ -860,7 +893,9 @@ async def create_command( args: Optional[str] = None, set: Optional[str] = None, ) -> StreamResponse[CreateCommandResponse]: - json = build_body_dict(description=description, name=name, args=args, set=set) + json = build_body_dict( + **{"description": description, "name": name, "args": args, "set": set} + ) return await self.post( "/api/v2/chat/commands", CreateCommandResponse, json=json ) @@ -896,7 +931,7 @@ async def update_command( path_params = { "name": name, } - json = build_body_dict(description=description, args=args, set=set) + json = build_body_dict(**{"description": description, "args": args, "set": set}) return await self.put( "/api/v2/chat/commands/{name}", UpdateCommandResponse, @@ -916,13 +951,15 @@ async def query_drafts( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryDraftsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/chat/drafts/query", QueryDraftsResponse, json=json @@ -939,12 +976,14 @@ async def export_channels( version: Optional[str] = None, ) -> StreamResponse[ExportChannelsResponse]: json = build_body_dict( - channels=channels, - clear_deleted_message_text=clear_deleted_message_text, - export_users=export_users, - include_soft_deleted_channels=include_soft_deleted_channels, - include_truncated_messages=include_truncated_messages, - version=version, + **{ + "channels": channels, + "clear_deleted_message_text": clear_deleted_message_text, + "export_users": export_users, + "include_soft_deleted_channels": include_soft_deleted_channels, + "include_truncated_messages": include_truncated_messages, + "version": version, + } ) return await self.post( "/api/v2/chat/export_channels", ExportChannelsResponse, json=json @@ -954,7 +993,7 @@ async def export_channels( async def query_members( self, payload: Optional[QueryMembersPayload] = None ) -> StreamResponse[MembersResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return await self.get( "/api/v2/chat/members", MembersResponse, query_params=query_params ) @@ -969,7 +1008,13 @@ async def query_message_history( sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[QueryMessageHistoryResponse]: json = build_body_dict( - filter=filter, limit=limit, next=next, prev=prev, sort=sort + **{ + "filter": filter, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + } ) return await self.post( "/api/v2/chat/messages/history", QueryMessageHistoryResponse, json=json @@ -984,7 +1029,7 @@ async def delete_message( delete_for_me: Optional[bool] = None, ) -> StreamResponse[DeleteMessageResponse]: query_params = build_query_param( - hard=hard, deleted_by=deleted_by, delete_for_me=delete_for_me + **{"hard": hard, "deleted_by": deleted_by, "delete_for_me": delete_for_me} ) path_params = { "id": id, @@ -1000,7 +1045,9 @@ async def delete_message( async def get_message( self, id: str, show_deleted_message: Optional[bool] = None ) -> StreamResponse[GetMessageResponse]: - query_params = build_query_param(show_deleted_message=show_deleted_message) + query_params = build_query_param( + **{"show_deleted_message": show_deleted_message} + ) path_params = { "id": id, } @@ -1023,7 +1070,11 @@ async def update_message( "id": id, } json = build_body_dict( - message=message, skip_enrich_url=skip_enrich_url, skip_push=skip_push + **{ + "message": message, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + } ) return await self.post( "/api/v2/chat/messages/{id}", @@ -1047,12 +1098,14 @@ async def update_message_partial( "id": id, } json = build_body_dict( - skip_enrich_url=skip_enrich_url, - skip_push=skip_push, - user_id=user_id, - unset=unset, - set=set, - user=user, + **{ + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "user_id": user_id, + "unset": unset, + "set": set, + "user": user, + } ) return await self.put( "/api/v2/chat/messages/{id}", @@ -1072,7 +1125,9 @@ async def run_message_action( path_params = { "id": id, } - json = build_body_dict(form_data=form_data, user_id=user_id, user=user) + json = build_body_dict( + **{"form_data": form_data, "user_id": user_id, "user": user} + ) return await self.post( "/api/v2/chat/messages/{id}/action", MessageActionResponse, @@ -1088,7 +1143,7 @@ async def commit_message( path_params = { "id": id, } - json = build_body_dict() + json = build_body_dict(**{}) return await self.post( "/api/v2/chat/messages/{id}/commit", MessageActionResponse, @@ -1111,12 +1166,14 @@ async def ephemeral_message_update( "id": id, } json = build_body_dict( - skip_enrich_url=skip_enrich_url, - skip_push=skip_push, - user_id=user_id, - unset=unset, - set=set, - user=user, + **{ + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "user_id": user_id, + "unset": unset, + "set": set, + "user": user, + } ) return await self.patch( "/api/v2/chat/messages/{id}/ephemeral", @@ -1137,7 +1194,11 @@ async def send_reaction( "id": id, } json = build_body_dict( - reaction=reaction, enforce_unique=enforce_unique, skip_push=skip_push + **{ + "reaction": reaction, + "enforce_unique": enforce_unique, + "skip_push": skip_push, + } ) return await self.post( "/api/v2/chat/messages/{id}/reaction", @@ -1150,7 +1211,7 @@ async def send_reaction( async def delete_reaction( self, id: str, type: str, user_id: Optional[str] = None ) -> StreamResponse[DeleteReactionResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "id": id, "type": type, @@ -1166,7 +1227,7 @@ async def delete_reaction( async def get_reactions( self, id: str, limit: Optional[int] = None, offset: Optional[int] = None ) -> StreamResponse[GetReactionsResponse]: - query_params = build_query_param(limit=limit, offset=offset) + query_params = build_query_param(**{"limit": limit, "offset": offset}) path_params = { "id": id, } @@ -1193,13 +1254,15 @@ async def query_reactions( "id": id, } json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/chat/messages/{id}/reactions", @@ -1215,7 +1278,7 @@ async def translate_message( path_params = { "id": id, } - json = build_body_dict(language=language) + json = build_body_dict(**{"language": language}) return await self.post( "/api/v2/chat/messages/{id}/translate", MessageActionResponse, @@ -1235,7 +1298,11 @@ async def undelete_message( "id": id, } json = build_body_dict( - message=message, skip_enrich_url=skip_enrich_url, skip_push=skip_push + **{ + "message": message, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + } ) return await self.post( "/api/v2/chat/messages/{id}/undelete", @@ -1257,7 +1324,7 @@ async def cast_poll_vote( "message_id": message_id, "poll_id": poll_id, } - json = build_body_dict(user_id=user_id, user=user, vote=vote) + json = build_body_dict(**{"user_id": user_id, "user": user, "vote": vote}) return await self.post( "/api/v2/chat/messages/{message_id}/polls/{poll_id}/vote", PollVoteResponse, @@ -1269,7 +1336,7 @@ async def cast_poll_vote( async def delete_poll_vote( self, message_id: str, poll_id: str, vote_id: str, user_id: Optional[str] = None ) -> StreamResponse[PollVoteResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "message_id": message_id, "poll_id": poll_id, @@ -1286,7 +1353,7 @@ async def delete_poll_vote( async def delete_reminder( self, message_id: str, user_id: Optional[str] = None ) -> StreamResponse[DeleteReminderResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "message_id": message_id, } @@ -1308,7 +1375,9 @@ async def update_reminder( path_params = { "message_id": message_id, } - json = build_body_dict(remind_at=remind_at, user_id=user_id, user=user) + json = build_body_dict( + **{"remind_at": remind_at, "user_id": user_id, "user": user} + ) return await self.patch( "/api/v2/chat/messages/{message_id}/reminders", UpdateReminderResponse, @@ -1327,7 +1396,9 @@ async def create_reminder( path_params = { "message_id": message_id, } - json = build_body_dict(remind_at=remind_at, user_id=user_id, user=user) + json = build_body_dict( + **{"remind_at": remind_at, "user_id": user_id, "user": user} + ) return await self.post( "/api/v2/chat/messages/{message_id}/reminders", ReminderResponseData, @@ -1348,13 +1419,15 @@ async def get_replies( sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[GetRepliesResponse]: query_params = build_query_param( - limit=limit, - id_gte=id_gte, - id_gt=id_gt, - id_lte=id_lte, - id_lt=id_lt, - id_around=id_around, - sort=sort, + **{ + "limit": limit, + "id_gte": id_gte, + "id_gt": id_gt, + "id_lte": id_lte, + "id_lt": id_lt, + "id_around": id_around, + "sort": sort, + } ) path_params = { "parent_id": parent_id, @@ -1370,7 +1443,7 @@ async def get_replies( async def query_message_flags( self, payload: Optional[QueryMessageFlagsPayload] = None ) -> StreamResponse[QueryMessageFlagsResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return await self.get( "/api/v2/chat/moderation/flags/message", QueryMessageFlagsResponse, @@ -1386,7 +1459,12 @@ async def mute_channel( user: Optional[UserRequest] = None, ) -> StreamResponse[MuteChannelResponse]: json = build_body_dict( - expiration=expiration, user_id=user_id, channel_cids=channel_cids, user=user + **{ + "expiration": expiration, + "user_id": user_id, + "channel_cids": channel_cids, + "user": user, + } ) return await self.post( "/api/v2/chat/moderation/mute/channel", MuteChannelResponse, json=json @@ -1401,7 +1479,12 @@ async def unmute_channel( user: Optional[UserRequest] = None, ) -> StreamResponse[UnmuteResponse]: json = build_body_dict( - expiration=expiration, user_id=user_id, channel_cids=channel_cids, user=user + **{ + "expiration": expiration, + "user_id": user_id, + "channel_cids": channel_cids, + "user": user, + } ) return await self.post( "/api/v2/chat/moderation/unmute/channel", UnmuteResponse, json=json @@ -1411,7 +1494,7 @@ async def unmute_channel( async def query_banned_users( self, payload: Optional[QueryBannedUsersPayload] = None ) -> StreamResponse[QueryBannedUsersResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return await self.get( "/api/v2/chat/query_banned_users", QueryBannedUsersResponse, @@ -1422,7 +1505,7 @@ async def query_banned_users( async def query_future_channel_bans( self, payload: Optional[QueryFutureChannelBansPayload] = None ) -> StreamResponse[QueryFutureChannelBansResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return await self.get( "/api/v2/chat/query_future_channel_bans", QueryFutureChannelBansResponse, @@ -1441,13 +1524,15 @@ async def query_reminders( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryRemindersResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/chat/reminders/query", QueryRemindersResponse, json=json @@ -1457,7 +1542,7 @@ async def query_reminders( async def search( self, payload: Optional[SearchPayload] = None ) -> StreamResponse[SearchResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return await self.get( "/api/v2/chat/search", SearchResponse, query_params=query_params ) @@ -1472,7 +1557,13 @@ async def query_segments( sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[QuerySegmentsResponse]: json = build_body_dict( - filter=filter, limit=limit, next=next, prev=prev, sort=sort + **{ + "filter": filter, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + } ) return await self.post( "/api/v2/chat/segments/query", QuerySegmentsResponse, json=json @@ -1503,7 +1594,7 @@ async def delete_segment_targets( path_params = { "id": id, } - json = build_body_dict(target_ids=target_ids) + json = build_body_dict(**{"target_ids": target_ids}) return await self.post( "/api/v2/chat/segments/{id}/deletetargets", Response, @@ -1539,7 +1630,13 @@ async def query_segment_targets( "id": id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "Sort": sort, + "Filter": filter, + } ) return await self.post( "/api/v2/chat/segments/{id}/targets/query", @@ -1563,16 +1660,18 @@ async def query_threads( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryThreadsResponse]: json = build_body_dict( - limit=limit, - member_limit=member_limit, - next=next, - participant_limit=participant_limit, - prev=prev, - reply_limit=reply_limit, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "member_limit": member_limit, + "next": next, + "participant_limit": participant_limit, + "prev": prev, + "reply_limit": reply_limit, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post("/api/v2/chat/threads", QueryThreadsResponse, json=json) @@ -1585,9 +1684,11 @@ async def get_thread( member_limit: Optional[int] = None, ) -> StreamResponse[GetThreadResponse]: query_params = build_query_param( - reply_limit=reply_limit, - participant_limit=participant_limit, - member_limit=member_limit, + **{ + "reply_limit": reply_limit, + "participant_limit": participant_limit, + "member_limit": member_limit, + } ) path_params = { "message_id": message_id, @@ -1611,7 +1712,9 @@ async def update_thread_partial( path_params = { "message_id": message_id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + **{"user_id": user_id, "unset": unset, "set": set, "user": user} + ) return await self.patch( "/api/v2/chat/threads/{message_id}", UpdateThreadPartialResponse, @@ -1623,7 +1726,7 @@ async def update_thread_partial( async def unread_counts( self, user_id: Optional[str] = None ) -> StreamResponse[WrappedUnreadCountsResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return await self.get( "/api/v2/chat/unread", WrappedUnreadCountsResponse, @@ -1634,7 +1737,7 @@ async def unread_counts( async def unread_counts_batch( self, user_ids: List[str] ) -> StreamResponse[UnreadCountsBatchResponse]: - json = build_body_dict(user_ids=user_ids) + json = build_body_dict(**{"user_ids": user_ids}) return await self.post( "/api/v2/chat/unread_batch", UnreadCountsBatchResponse, json=json ) @@ -1646,7 +1749,7 @@ async def send_user_custom_event( path_params = { "user_id": user_id, } - json = build_body_dict(event=event) + json = build_body_dict(**{"event": event}) return await self.post( "/api/v2/chat/users/{user_id}/event", Response, diff --git a/getstream/chat/rest_client.py b/getstream/chat/rest_client.py index d20ddd72..aaa19c17 100644 --- a/getstream/chat/rest_client.py +++ b/getstream/chat/rest_client.py @@ -42,12 +42,14 @@ def query_campaigns( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCampaignsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_limit=user_limit, - sort=sort, - filter=filter, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_limit": user_limit, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/chat/campaigns/query", QueryCampaignsResponse, json=json @@ -61,7 +63,7 @@ def get_campaign( next: Optional[str] = None, limit: Optional[int] = None, ) -> StreamResponse[GetCampaignResponse]: - query_params = build_query_param(prev=prev, next=next, limit=limit) + query_params = build_query_param(**{"prev": prev, "next": next, "limit": limit}) path_params = { "id": id, } @@ -82,7 +84,7 @@ def start_campaign( path_params = { "id": id, } - json = build_body_dict(scheduled_for=scheduled_for, stop_at=stop_at) + json = build_body_dict(**{"scheduled_for": scheduled_for, "stop_at": stop_at}) return self.post( "/api/v2/chat/campaigns/{id}/start", StartCampaignResponse, @@ -98,7 +100,7 @@ def schedule_campaign( path_params = { "id": id, } - json = build_body_dict() + json = build_body_dict(**{}) return self.post( "/api/v2/chat/campaigns/{id}/stop", CampaignResponse, @@ -123,18 +125,20 @@ def query_channels( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryChannelsResponse]: json = build_body_dict( - limit=limit, - member_limit=member_limit, - message_limit=message_limit, - offset=offset, - predefined_filter=predefined_filter, - state=state, - user_id=user_id, - sort=sort, - filter_conditions=filter_conditions, - filter_values=filter_values, - sort_values=sort_values, - user=user, + **{ + "limit": limit, + "member_limit": member_limit, + "message_limit": message_limit, + "offset": offset, + "predefined_filter": predefined_filter, + "state": state, + "user_id": user_id, + "sort": sort, + "filter_conditions": filter_conditions, + "filter_values": filter_values, + "sort_values": sort_values, + "user": user, + } ) return self.post("/api/v2/chat/channels", QueryChannelsResponse, json=json) @@ -142,7 +146,7 @@ def query_channels( def delete_channels( self, cids: List[str], hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteChannelsResponse]: - json = build_body_dict(cids=cids, hard_delete=hard_delete) + json = build_body_dict(**{"cids": cids, "hard_delete": hard_delete}) return self.post( "/api/v2/chat/channels/delete", DeleteChannelsResponse, json=json ) @@ -153,8 +157,10 @@ def mark_delivered( user_id: Optional[str] = None, latest_delivered_messages: Optional[List[DeliveredMessagePayload]] = None, ) -> StreamResponse[MarkDeliveredResponse]: - query_params = build_query_param(user_id=user_id) - json = build_body_dict(latest_delivered_messages=latest_delivered_messages) + query_params = build_query_param(**{"user_id": user_id}) + json = build_body_dict( + **{"latest_delivered_messages": latest_delivered_messages} + ) return self.post( "/api/v2/chat/channels/delivered", MarkDeliveredResponse, @@ -170,7 +176,7 @@ def mark_channels_read( user: Optional[UserRequest] = None, ) -> StreamResponse[MarkReadResponse]: json = build_body_dict( - user_id=user_id, read_by_channel=read_by_channel, user=user + **{"user_id": user_id, "read_by_channel": read_by_channel, "user": user} ) return self.post("/api/v2/chat/channels/read", MarkReadResponse, json=json) @@ -190,13 +196,15 @@ def get_or_create_distinct_channel( "type": type, } json = build_body_dict( - hide_for_creator=hide_for_creator, - state=state, - thread_unread_counts=thread_unread_counts, - data=data, - members=members, - messages=messages, - watchers=watchers, + **{ + "hide_for_creator": hide_for_creator, + "state": state, + "thread_unread_counts": thread_unread_counts, + "data": data, + "members": members, + "messages": messages, + "watchers": watchers, + } ) return self.post( "/api/v2/chat/channels/{type}/query", @@ -209,7 +217,7 @@ def get_or_create_distinct_channel( def delete_channel( self, type: str, id: str, hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteChannelResponse]: - query_params = build_query_param(hard_delete=hard_delete) + query_params = build_query_param(**{"hard_delete": hard_delete}) path_params = { "type": type, "id": id, @@ -235,7 +243,9 @@ def update_channel_partial( "type": type, "id": id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + **{"user_id": user_id, "unset": unset, "set": set, "user": user} + ) return self.patch( "/api/v2/chat/channels/{type}/{id}", UpdateChannelPartialResponse, @@ -272,24 +282,26 @@ def update_channel( "id": id, } json = build_body_dict( - accept_invite=accept_invite, - cooldown=cooldown, - hide_history=hide_history, - hide_history_before=hide_history_before, - reject_invite=reject_invite, - skip_push=skip_push, - user_id=user_id, - add_filter_tags=add_filter_tags, - add_members=add_members, - add_moderators=add_moderators, - assign_roles=assign_roles, - demote_moderators=demote_moderators, - invites=invites, - remove_filter_tags=remove_filter_tags, - remove_members=remove_members, - data=data, - message=message, - user=user, + **{ + "accept_invite": accept_invite, + "cooldown": cooldown, + "hide_history": hide_history, + "hide_history_before": hide_history_before, + "reject_invite": reject_invite, + "skip_push": skip_push, + "user_id": user_id, + "add_filter_tags": add_filter_tags, + "add_members": add_members, + "add_moderators": add_moderators, + "assign_roles": assign_roles, + "demote_moderators": demote_moderators, + "invites": invites, + "remove_filter_tags": remove_filter_tags, + "remove_members": remove_members, + "data": data, + "message": message, + "user": user, + } ) return self.post( "/api/v2/chat/channels/{type}/{id}", @@ -306,7 +318,7 @@ def delete_draft( parent_id: Optional[str] = None, user_id: Optional[str] = None, ) -> StreamResponse[Response]: - query_params = build_query_param(parent_id=parent_id, user_id=user_id) + query_params = build_query_param(**{"parent_id": parent_id, "user_id": user_id}) path_params = { "type": type, "id": id, @@ -326,7 +338,7 @@ def get_draft( parent_id: Optional[str] = None, user_id: Optional[str] = None, ) -> StreamResponse[GetDraftResponse]: - query_params = build_query_param(parent_id=parent_id, user_id=user_id) + query_params = build_query_param(**{"parent_id": parent_id, "user_id": user_id}) path_params = { "type": type, "id": id, @@ -346,7 +358,7 @@ def send_event( "type": type, "id": id, } - json = build_body_dict(event=event) + json = build_body_dict(**{"event": event}) return self.post( "/api/v2/chat/channels/{type}/{id}/event", EventResponse, @@ -358,7 +370,7 @@ def send_event( def delete_channel_file( self, type: str, id: str, url: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) path_params = { "type": type, "id": id, @@ -382,7 +394,7 @@ def upload_channel_file( "type": type, "id": id, } - json = build_body_dict(file=file, user=user) + json = build_body_dict(**{"file": file, "user": user}) return self.post( "/api/v2/chat/channels/{type}/{id}/file", UploadChannelFileResponse, @@ -403,7 +415,9 @@ def hide_channel( "type": type, "id": id, } - json = build_body_dict(clear_history=clear_history, user_id=user_id, user=user) + json = build_body_dict( + **{"clear_history": clear_history, "user_id": user_id, "user": user} + ) return self.post( "/api/v2/chat/channels/{type}/{id}/hide", HideChannelResponse, @@ -415,7 +429,7 @@ def hide_channel( def delete_channel_image( self, type: str, id: str, url: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) path_params = { "type": type, "id": id, @@ -440,7 +454,9 @@ def upload_channel_image( "type": type, "id": id, } - json = build_body_dict(file=file, upload_sizes=upload_sizes, user=user) + json = build_body_dict( + **{"file": file, "upload_sizes": upload_sizes, "user": user} + ) return self.post( "/api/v2/chat/channels/{type}/{id}/image", UploadChannelResponse, @@ -457,12 +473,12 @@ def update_member_partial( unset: Optional[List[str]] = None, set: Optional[Dict[str, object]] = None, ) -> StreamResponse[UpdateMemberPartialResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "type": type, "id": id, } - json = build_body_dict(unset=unset, set=set) + json = build_body_dict(**{"unset": unset, "set": set}) return self.patch( "/api/v2/chat/channels/{type}/{id}/member", UpdateMemberPartialResponse, @@ -489,13 +505,15 @@ def send_message( "id": id, } json = build_body_dict( - message=message, - force_moderation=force_moderation, - keep_channel_hidden=keep_channel_hidden, - pending=pending, - skip_enrich_url=skip_enrich_url, - skip_push=skip_push, - pending_message_metadata=pending_message_metadata, + **{ + "message": message, + "force_moderation": force_moderation, + "keep_channel_hidden": keep_channel_hidden, + "pending": pending, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "pending_message_metadata": pending_message_metadata, + } ) return self.post( "/api/v2/chat/channels/{type}/{id}/message", @@ -508,7 +526,7 @@ def send_message( def get_many_messages( self, type: str, id: str, ids: List[str] ) -> StreamResponse[GetManyMessagesResponse]: - query_params = build_query_param(ids=ids) + query_params = build_query_param(**{"ids": ids}) path_params = { "type": type, "id": id, @@ -538,13 +556,15 @@ def get_or_create_channel( "id": id, } json = build_body_dict( - hide_for_creator=hide_for_creator, - state=state, - thread_unread_counts=thread_unread_counts, - data=data, - members=members, - messages=messages, - watchers=watchers, + **{ + "hide_for_creator": hide_for_creator, + "state": state, + "thread_unread_counts": thread_unread_counts, + "data": data, + "members": members, + "messages": messages, + "watchers": watchers, + } ) return self.post( "/api/v2/chat/channels/{type}/{id}/query", @@ -568,7 +588,12 @@ def mark_read( "id": id, } json = build_body_dict( - message_id=message_id, thread_id=thread_id, user_id=user_id, user=user + **{ + "message_id": message_id, + "thread_id": thread_id, + "user_id": user_id, + "user": user, + } ) return self.post( "/api/v2/chat/channels/{type}/{id}/read", @@ -589,7 +614,7 @@ def show_channel( "type": type, "id": id, } - json = build_body_dict(user_id=user_id, user=user) + json = build_body_dict(**{"user_id": user_id, "user": user}) return self.post( "/api/v2/chat/channels/{type}/{id}/show", ShowChannelResponse, @@ -615,13 +640,15 @@ def truncate_channel( "id": id, } json = build_body_dict( - hard_delete=hard_delete, - skip_push=skip_push, - truncated_at=truncated_at, - user_id=user_id, - member_ids=member_ids, - message=message, - user=user, + **{ + "hard_delete": hard_delete, + "skip_push": skip_push, + "truncated_at": truncated_at, + "user_id": user_id, + "member_ids": member_ids, + "message": message, + "user": user, + } ) return self.post( "/api/v2/chat/channels/{type}/{id}/truncate", @@ -646,11 +673,13 @@ def mark_unread( "id": id, } json = build_body_dict( - message_id=message_id, - message_timestamp=message_timestamp, - thread_id=thread_id, - user_id=user_id, - user=user, + **{ + "message_id": message_id, + "message_timestamp": message_timestamp, + "thread_id": thread_id, + "user_id": user_id, + "user": user, + } ) return self.post( "/api/v2/chat/channels/{type}/{id}/unread", @@ -700,38 +729,40 @@ def create_channel_type( grants: Optional[Dict[str, List[str]]] = None, ) -> StreamResponse[CreateChannelTypeResponse]: json = build_body_dict( - automod=automod, - automod_behavior=automod_behavior, - max_message_length=max_message_length, - name=name, - blocklist=blocklist, - blocklist_behavior=blocklist_behavior, - connect_events=connect_events, - count_messages=count_messages, - custom_events=custom_events, - delivery_events=delivery_events, - mark_messages_pending=mark_messages_pending, - message_retention=message_retention, - mutes=mutes, - partition_size=partition_size, - partition_ttl=partition_ttl, - polls=polls, - push_level=push_level, - push_notifications=push_notifications, - reactions=reactions, - read_events=read_events, - replies=replies, - search=search, - shared_locations=shared_locations, - skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, - typing_events=typing_events, - uploads=uploads, - url_enrichment=url_enrichment, - user_message_reminders=user_message_reminders, - blocklists=blocklists, - commands=commands, - permissions=permissions, - grants=grants, + **{ + "automod": automod, + "automod_behavior": automod_behavior, + "max_message_length": max_message_length, + "name": name, + "blocklist": blocklist, + "blocklist_behavior": blocklist_behavior, + "connect_events": connect_events, + "count_messages": count_messages, + "custom_events": custom_events, + "delivery_events": delivery_events, + "mark_messages_pending": mark_messages_pending, + "message_retention": message_retention, + "mutes": mutes, + "partition_size": partition_size, + "partition_ttl": partition_ttl, + "polls": polls, + "push_level": push_level, + "push_notifications": push_notifications, + "reactions": reactions, + "read_events": read_events, + "replies": replies, + "search": search, + "shared_locations": shared_locations, + "skip_last_msg_update_for_system_msgs": skip_last_msg_update_for_system_msgs, + "typing_events": typing_events, + "uploads": uploads, + "url_enrichment": url_enrichment, + "user_message_reminders": user_message_reminders, + "blocklists": blocklists, + "commands": commands, + "permissions": permissions, + "grants": grants, + } ) return self.post( "/api/v2/chat/channeltypes", CreateChannelTypeResponse, json=json @@ -800,40 +831,42 @@ def update_channel_type( "name": name, } json = build_body_dict( - automod=automod, - automod_behavior=automod_behavior, - max_message_length=max_message_length, - blocklist=blocklist, - blocklist_behavior=blocklist_behavior, - connect_events=connect_events, - count_messages=count_messages, - custom_events=custom_events, - delivery_events=delivery_events, - mark_messages_pending=mark_messages_pending, - mutes=mutes, - partition_size=partition_size, - partition_ttl=partition_ttl, - polls=polls, - push_level=push_level, - push_notifications=push_notifications, - quotes=quotes, - reactions=reactions, - read_events=read_events, - reminders=reminders, - replies=replies, - search=search, - shared_locations=shared_locations, - skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, - typing_events=typing_events, - uploads=uploads, - url_enrichment=url_enrichment, - user_message_reminders=user_message_reminders, - allowed_flag_reasons=allowed_flag_reasons, - blocklists=blocklists, - commands=commands, - permissions=permissions, - automod_thresholds=automod_thresholds, - grants=grants, + **{ + "automod": automod, + "automod_behavior": automod_behavior, + "max_message_length": max_message_length, + "blocklist": blocklist, + "blocklist_behavior": blocklist_behavior, + "connect_events": connect_events, + "count_messages": count_messages, + "custom_events": custom_events, + "delivery_events": delivery_events, + "mark_messages_pending": mark_messages_pending, + "mutes": mutes, + "partition_size": partition_size, + "partition_ttl": partition_ttl, + "polls": polls, + "push_level": push_level, + "push_notifications": push_notifications, + "quotes": quotes, + "reactions": reactions, + "read_events": read_events, + "reminders": reminders, + "replies": replies, + "search": search, + "shared_locations": shared_locations, + "skip_last_msg_update_for_system_msgs": skip_last_msg_update_for_system_msgs, + "typing_events": typing_events, + "uploads": uploads, + "url_enrichment": url_enrichment, + "user_message_reminders": user_message_reminders, + "allowed_flag_reasons": allowed_flag_reasons, + "blocklists": blocklists, + "commands": commands, + "permissions": permissions, + "automod_thresholds": automod_thresholds, + "grants": grants, + } ) return self.put( "/api/v2/chat/channeltypes/{name}", @@ -854,7 +887,9 @@ def create_command( args: Optional[str] = None, set: Optional[str] = None, ) -> StreamResponse[CreateCommandResponse]: - json = build_body_dict(description=description, name=name, args=args, set=set) + json = build_body_dict( + **{"description": description, "name": name, "args": args, "set": set} + ) return self.post("/api/v2/chat/commands", CreateCommandResponse, json=json) @telemetry.operation_name("getstream.api.chat.delete_command") @@ -888,7 +923,7 @@ def update_command( path_params = { "name": name, } - json = build_body_dict(description=description, args=args, set=set) + json = build_body_dict(**{"description": description, "args": args, "set": set}) return self.put( "/api/v2/chat/commands/{name}", UpdateCommandResponse, @@ -908,13 +943,15 @@ def query_drafts( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryDraftsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post("/api/v2/chat/drafts/query", QueryDraftsResponse, json=json) @@ -929,12 +966,14 @@ def export_channels( version: Optional[str] = None, ) -> StreamResponse[ExportChannelsResponse]: json = build_body_dict( - channels=channels, - clear_deleted_message_text=clear_deleted_message_text, - export_users=export_users, - include_soft_deleted_channels=include_soft_deleted_channels, - include_truncated_messages=include_truncated_messages, - version=version, + **{ + "channels": channels, + "clear_deleted_message_text": clear_deleted_message_text, + "export_users": export_users, + "include_soft_deleted_channels": include_soft_deleted_channels, + "include_truncated_messages": include_truncated_messages, + "version": version, + } ) return self.post( "/api/v2/chat/export_channels", ExportChannelsResponse, json=json @@ -944,7 +983,7 @@ def export_channels( def query_members( self, payload: Optional[QueryMembersPayload] = None ) -> StreamResponse[MembersResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return self.get( "/api/v2/chat/members", MembersResponse, query_params=query_params ) @@ -959,7 +998,13 @@ def query_message_history( sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[QueryMessageHistoryResponse]: json = build_body_dict( - filter=filter, limit=limit, next=next, prev=prev, sort=sort + **{ + "filter": filter, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + } ) return self.post( "/api/v2/chat/messages/history", QueryMessageHistoryResponse, json=json @@ -974,7 +1019,7 @@ def delete_message( delete_for_me: Optional[bool] = None, ) -> StreamResponse[DeleteMessageResponse]: query_params = build_query_param( - hard=hard, deleted_by=deleted_by, delete_for_me=delete_for_me + **{"hard": hard, "deleted_by": deleted_by, "delete_for_me": delete_for_me} ) path_params = { "id": id, @@ -990,7 +1035,9 @@ def delete_message( def get_message( self, id: str, show_deleted_message: Optional[bool] = None ) -> StreamResponse[GetMessageResponse]: - query_params = build_query_param(show_deleted_message=show_deleted_message) + query_params = build_query_param( + **{"show_deleted_message": show_deleted_message} + ) path_params = { "id": id, } @@ -1013,7 +1060,11 @@ def update_message( "id": id, } json = build_body_dict( - message=message, skip_enrich_url=skip_enrich_url, skip_push=skip_push + **{ + "message": message, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + } ) return self.post( "/api/v2/chat/messages/{id}", @@ -1037,12 +1088,14 @@ def update_message_partial( "id": id, } json = build_body_dict( - skip_enrich_url=skip_enrich_url, - skip_push=skip_push, - user_id=user_id, - unset=unset, - set=set, - user=user, + **{ + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "user_id": user_id, + "unset": unset, + "set": set, + "user": user, + } ) return self.put( "/api/v2/chat/messages/{id}", @@ -1062,7 +1115,9 @@ def run_message_action( path_params = { "id": id, } - json = build_body_dict(form_data=form_data, user_id=user_id, user=user) + json = build_body_dict( + **{"form_data": form_data, "user_id": user_id, "user": user} + ) return self.post( "/api/v2/chat/messages/{id}/action", MessageActionResponse, @@ -1078,7 +1133,7 @@ def commit_message( path_params = { "id": id, } - json = build_body_dict() + json = build_body_dict(**{}) return self.post( "/api/v2/chat/messages/{id}/commit", MessageActionResponse, @@ -1101,12 +1156,14 @@ def ephemeral_message_update( "id": id, } json = build_body_dict( - skip_enrich_url=skip_enrich_url, - skip_push=skip_push, - user_id=user_id, - unset=unset, - set=set, - user=user, + **{ + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "user_id": user_id, + "unset": unset, + "set": set, + "user": user, + } ) return self.patch( "/api/v2/chat/messages/{id}/ephemeral", @@ -1127,7 +1184,11 @@ def send_reaction( "id": id, } json = build_body_dict( - reaction=reaction, enforce_unique=enforce_unique, skip_push=skip_push + **{ + "reaction": reaction, + "enforce_unique": enforce_unique, + "skip_push": skip_push, + } ) return self.post( "/api/v2/chat/messages/{id}/reaction", @@ -1140,7 +1201,7 @@ def send_reaction( def delete_reaction( self, id: str, type: str, user_id: Optional[str] = None ) -> StreamResponse[DeleteReactionResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "id": id, "type": type, @@ -1156,7 +1217,7 @@ def delete_reaction( def get_reactions( self, id: str, limit: Optional[int] = None, offset: Optional[int] = None ) -> StreamResponse[GetReactionsResponse]: - query_params = build_query_param(limit=limit, offset=offset) + query_params = build_query_param(**{"limit": limit, "offset": offset}) path_params = { "id": id, } @@ -1183,13 +1244,15 @@ def query_reactions( "id": id, } json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post( "/api/v2/chat/messages/{id}/reactions", @@ -1205,7 +1268,7 @@ def translate_message( path_params = { "id": id, } - json = build_body_dict(language=language) + json = build_body_dict(**{"language": language}) return self.post( "/api/v2/chat/messages/{id}/translate", MessageActionResponse, @@ -1225,7 +1288,11 @@ def undelete_message( "id": id, } json = build_body_dict( - message=message, skip_enrich_url=skip_enrich_url, skip_push=skip_push + **{ + "message": message, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + } ) return self.post( "/api/v2/chat/messages/{id}/undelete", @@ -1247,7 +1314,7 @@ def cast_poll_vote( "message_id": message_id, "poll_id": poll_id, } - json = build_body_dict(user_id=user_id, user=user, vote=vote) + json = build_body_dict(**{"user_id": user_id, "user": user, "vote": vote}) return self.post( "/api/v2/chat/messages/{message_id}/polls/{poll_id}/vote", PollVoteResponse, @@ -1259,7 +1326,7 @@ def cast_poll_vote( def delete_poll_vote( self, message_id: str, poll_id: str, vote_id: str, user_id: Optional[str] = None ) -> StreamResponse[PollVoteResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "message_id": message_id, "poll_id": poll_id, @@ -1276,7 +1343,7 @@ def delete_poll_vote( def delete_reminder( self, message_id: str, user_id: Optional[str] = None ) -> StreamResponse[DeleteReminderResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "message_id": message_id, } @@ -1298,7 +1365,9 @@ def update_reminder( path_params = { "message_id": message_id, } - json = build_body_dict(remind_at=remind_at, user_id=user_id, user=user) + json = build_body_dict( + **{"remind_at": remind_at, "user_id": user_id, "user": user} + ) return self.patch( "/api/v2/chat/messages/{message_id}/reminders", UpdateReminderResponse, @@ -1317,7 +1386,9 @@ def create_reminder( path_params = { "message_id": message_id, } - json = build_body_dict(remind_at=remind_at, user_id=user_id, user=user) + json = build_body_dict( + **{"remind_at": remind_at, "user_id": user_id, "user": user} + ) return self.post( "/api/v2/chat/messages/{message_id}/reminders", ReminderResponseData, @@ -1338,13 +1409,15 @@ def get_replies( sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[GetRepliesResponse]: query_params = build_query_param( - limit=limit, - id_gte=id_gte, - id_gt=id_gt, - id_lte=id_lte, - id_lt=id_lt, - id_around=id_around, - sort=sort, + **{ + "limit": limit, + "id_gte": id_gte, + "id_gt": id_gt, + "id_lte": id_lte, + "id_lt": id_lt, + "id_around": id_around, + "sort": sort, + } ) path_params = { "parent_id": parent_id, @@ -1360,7 +1433,7 @@ def get_replies( def query_message_flags( self, payload: Optional[QueryMessageFlagsPayload] = None ) -> StreamResponse[QueryMessageFlagsResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return self.get( "/api/v2/chat/moderation/flags/message", QueryMessageFlagsResponse, @@ -1376,7 +1449,12 @@ def mute_channel( user: Optional[UserRequest] = None, ) -> StreamResponse[MuteChannelResponse]: json = build_body_dict( - expiration=expiration, user_id=user_id, channel_cids=channel_cids, user=user + **{ + "expiration": expiration, + "user_id": user_id, + "channel_cids": channel_cids, + "user": user, + } ) return self.post( "/api/v2/chat/moderation/mute/channel", MuteChannelResponse, json=json @@ -1391,7 +1469,12 @@ def unmute_channel( user: Optional[UserRequest] = None, ) -> StreamResponse[UnmuteResponse]: json = build_body_dict( - expiration=expiration, user_id=user_id, channel_cids=channel_cids, user=user + **{ + "expiration": expiration, + "user_id": user_id, + "channel_cids": channel_cids, + "user": user, + } ) return self.post( "/api/v2/chat/moderation/unmute/channel", UnmuteResponse, json=json @@ -1401,7 +1484,7 @@ def unmute_channel( def query_banned_users( self, payload: Optional[QueryBannedUsersPayload] = None ) -> StreamResponse[QueryBannedUsersResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return self.get( "/api/v2/chat/query_banned_users", QueryBannedUsersResponse, @@ -1412,7 +1495,7 @@ def query_banned_users( def query_future_channel_bans( self, payload: Optional[QueryFutureChannelBansPayload] = None ) -> StreamResponse[QueryFutureChannelBansResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return self.get( "/api/v2/chat/query_future_channel_bans", QueryFutureChannelBansResponse, @@ -1431,13 +1514,15 @@ def query_reminders( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryRemindersResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post( "/api/v2/chat/reminders/query", QueryRemindersResponse, json=json @@ -1447,7 +1532,7 @@ def query_reminders( def search( self, payload: Optional[SearchPayload] = None ) -> StreamResponse[SearchResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return self.get( "/api/v2/chat/search", SearchResponse, query_params=query_params ) @@ -1462,7 +1547,13 @@ def query_segments( sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[QuerySegmentsResponse]: json = build_body_dict( - filter=filter, limit=limit, next=next, prev=prev, sort=sort + **{ + "filter": filter, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + } ) return self.post( "/api/v2/chat/segments/query", QuerySegmentsResponse, json=json @@ -1493,7 +1584,7 @@ def delete_segment_targets( path_params = { "id": id, } - json = build_body_dict(target_ids=target_ids) + json = build_body_dict(**{"target_ids": target_ids}) return self.post( "/api/v2/chat/segments/{id}/deletetargets", Response, @@ -1529,7 +1620,13 @@ def query_segment_targets( "id": id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "Sort": sort, + "Filter": filter, + } ) return self.post( "/api/v2/chat/segments/{id}/targets/query", @@ -1553,16 +1650,18 @@ def query_threads( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryThreadsResponse]: json = build_body_dict( - limit=limit, - member_limit=member_limit, - next=next, - participant_limit=participant_limit, - prev=prev, - reply_limit=reply_limit, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "member_limit": member_limit, + "next": next, + "participant_limit": participant_limit, + "prev": prev, + "reply_limit": reply_limit, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post("/api/v2/chat/threads", QueryThreadsResponse, json=json) @@ -1575,9 +1674,11 @@ def get_thread( member_limit: Optional[int] = None, ) -> StreamResponse[GetThreadResponse]: query_params = build_query_param( - reply_limit=reply_limit, - participant_limit=participant_limit, - member_limit=member_limit, + **{ + "reply_limit": reply_limit, + "participant_limit": participant_limit, + "member_limit": member_limit, + } ) path_params = { "message_id": message_id, @@ -1601,7 +1702,9 @@ def update_thread_partial( path_params = { "message_id": message_id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + **{"user_id": user_id, "unset": unset, "set": set, "user": user} + ) return self.patch( "/api/v2/chat/threads/{message_id}", UpdateThreadPartialResponse, @@ -1613,7 +1716,7 @@ def update_thread_partial( def unread_counts( self, user_id: Optional[str] = None ) -> StreamResponse[WrappedUnreadCountsResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return self.get( "/api/v2/chat/unread", WrappedUnreadCountsResponse, @@ -1624,7 +1727,7 @@ def unread_counts( def unread_counts_batch( self, user_ids: List[str] ) -> StreamResponse[UnreadCountsBatchResponse]: - json = build_body_dict(user_ids=user_ids) + json = build_body_dict(**{"user_ids": user_ids}) return self.post( "/api/v2/chat/unread_batch", UnreadCountsBatchResponse, json=json ) @@ -1636,7 +1739,7 @@ def send_user_custom_event( path_params = { "user_id": user_id, } - json = build_body_dict(event=event) + json = build_body_dict(**{"event": event}) return self.post( "/api/v2/chat/users/{user_id}/event", Response, diff --git a/getstream/common/async_rest_client.py b/getstream/common/async_rest_client.py index 1b4f9211..a71f281e 100644 --- a/getstream/common/async_rest_client.py +++ b/getstream/common/async_rest_client.py @@ -89,53 +89,55 @@ async def update_app( xiaomi_config: Optional[XiaomiConfig] = None, ) -> StreamResponse[Response]: json = build_body_dict( - async_url_enrich_enabled=async_url_enrich_enabled, - auto_translation_enabled=auto_translation_enabled, - before_message_send_hook_url=before_message_send_hook_url, - cdn_expiration_seconds=cdn_expiration_seconds, - channel_hide_members_only=channel_hide_members_only, - custom_action_handler_url=custom_action_handler_url, - disable_auth_checks=disable_auth_checks, - disable_permissions_checks=disable_permissions_checks, - enforce_unique_usernames=enforce_unique_usernames, - feeds_moderation_enabled=feeds_moderation_enabled, - feeds_v2_region=feeds_v2_region, - guest_user_creation_disabled=guest_user_creation_disabled, - image_moderation_enabled=image_moderation_enabled, - max_aggregated_activities_length=max_aggregated_activities_length, - migrate_permissions_to_v2=migrate_permissions_to_v2, - moderation_enabled=moderation_enabled, - moderation_webhook_url=moderation_webhook_url, - multi_tenant_enabled=multi_tenant_enabled, - permission_version=permission_version, - reminders_interval=reminders_interval, - reminders_max_members=reminders_max_members, - revoke_tokens_issued_before=revoke_tokens_issued_before, - sns_key=sns_key, - sns_secret=sns_secret, - sns_topic_arn=sns_topic_arn, - sqs_key=sqs_key, - sqs_secret=sqs_secret, - sqs_url=sqs_url, - user_response_time_enabled=user_response_time_enabled, - webhook_url=webhook_url, - allowed_flag_reasons=allowed_flag_reasons, - event_hooks=event_hooks, - image_moderation_block_labels=image_moderation_block_labels, - image_moderation_labels=image_moderation_labels, - user_search_disallowed_roles=user_search_disallowed_roles, - webhook_events=webhook_events, - apn_config=apn_config, - async_moderation_config=async_moderation_config, - datadog_info=datadog_info, - file_upload_config=file_upload_config, - firebase_config=firebase_config, - grants=grants, - huawei_config=huawei_config, - image_upload_config=image_upload_config, - moderation_dashboard_preferences=moderation_dashboard_preferences, - push_config=push_config, - xiaomi_config=xiaomi_config, + **{ + "async_url_enrich_enabled": async_url_enrich_enabled, + "auto_translation_enabled": auto_translation_enabled, + "before_message_send_hook_url": before_message_send_hook_url, + "cdn_expiration_seconds": cdn_expiration_seconds, + "channel_hide_members_only": channel_hide_members_only, + "custom_action_handler_url": custom_action_handler_url, + "disable_auth_checks": disable_auth_checks, + "disable_permissions_checks": disable_permissions_checks, + "enforce_unique_usernames": enforce_unique_usernames, + "feeds_moderation_enabled": feeds_moderation_enabled, + "feeds_v2_region": feeds_v2_region, + "guest_user_creation_disabled": guest_user_creation_disabled, + "image_moderation_enabled": image_moderation_enabled, + "max_aggregated_activities_length": max_aggregated_activities_length, + "migrate_permissions_to_v2": migrate_permissions_to_v2, + "moderation_enabled": moderation_enabled, + "moderation_webhook_url": moderation_webhook_url, + "multi_tenant_enabled": multi_tenant_enabled, + "permission_version": permission_version, + "reminders_interval": reminders_interval, + "reminders_max_members": reminders_max_members, + "revoke_tokens_issued_before": revoke_tokens_issued_before, + "sns_key": sns_key, + "sns_secret": sns_secret, + "sns_topic_arn": sns_topic_arn, + "sqs_key": sqs_key, + "sqs_secret": sqs_secret, + "sqs_url": sqs_url, + "user_response_time_enabled": user_response_time_enabled, + "webhook_url": webhook_url, + "allowed_flag_reasons": allowed_flag_reasons, + "event_hooks": event_hooks, + "image_moderation_block_labels": image_moderation_block_labels, + "image_moderation_labels": image_moderation_labels, + "user_search_disallowed_roles": user_search_disallowed_roles, + "webhook_events": webhook_events, + "apn_config": apn_config, + "async_moderation_config": async_moderation_config, + "datadog_info": datadog_info, + "file_upload_config": file_upload_config, + "firebase_config": firebase_config, + "grants": grants, + "huawei_config": huawei_config, + "image_upload_config": image_upload_config, + "moderation_dashboard_preferences": moderation_dashboard_preferences, + "push_config": push_config, + "xiaomi_config": xiaomi_config, + } ) return await self.patch("/api/v2/app", Response, json=json) @@ -143,7 +145,7 @@ async def update_app( async def list_block_lists( self, team: Optional[str] = None ) -> StreamResponse[ListBlockListResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) return await self.get( "/api/v2/blocklists", ListBlockListResponse, query_params=query_params ) @@ -159,12 +161,14 @@ async def create_block_list( type: Optional[str] = None, ) -> StreamResponse[CreateBlockListResponse]: json = build_body_dict( - name=name, - words=words, - is_leet_check_enabled=is_leet_check_enabled, - is_plural_check_enabled=is_plural_check_enabled, - team=team, - type=type, + **{ + "name": name, + "words": words, + "is_leet_check_enabled": is_leet_check_enabled, + "is_plural_check_enabled": is_plural_check_enabled, + "team": team, + "type": type, + } ) return await self.post("/api/v2/blocklists", CreateBlockListResponse, json=json) @@ -172,7 +176,7 @@ async def create_block_list( async def delete_block_list( self, name: str, team: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "name": name, } @@ -187,7 +191,7 @@ async def delete_block_list( async def get_block_list( self, name: str, team: Optional[str] = None ) -> StreamResponse[GetBlockListResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "name": name, } @@ -211,10 +215,12 @@ async def update_block_list( "name": name, } json = build_body_dict( - is_leet_check_enabled=is_leet_check_enabled, - is_plural_check_enabled=is_plural_check_enabled, - team=team, - words=words, + **{ + "is_leet_check_enabled": is_leet_check_enabled, + "is_plural_check_enabled": is_plural_check_enabled, + "team": team, + "words": words, + } ) return await self.put( "/api/v2/blocklists/{name}", @@ -238,16 +244,18 @@ async def check_push( user: Optional[UserRequest] = None, ) -> StreamResponse[CheckPushResponse]: json = build_body_dict( - apn_template=apn_template, - event_type=event_type, - firebase_data_template=firebase_data_template, - firebase_template=firebase_template, - message_id=message_id, - push_provider_name=push_provider_name, - push_provider_type=push_provider_type, - skip_devices=skip_devices, - user_id=user_id, - user=user, + **{ + "apn_template": apn_template, + "event_type": event_type, + "firebase_data_template": firebase_data_template, + "firebase_template": firebase_template, + "message_id": message_id, + "push_provider_name": push_provider_name, + "push_provider_type": push_provider_type, + "skip_devices": skip_devices, + "user_id": user_id, + "user": user, + } ) return await self.post("/api/v2/check_push", CheckPushResponse, json=json) @@ -259,7 +267,11 @@ async def check_sns( sns_topic_arn: Optional[str] = None, ) -> StreamResponse[CheckSNSResponse]: json = build_body_dict( - sns_key=sns_key, sns_secret=sns_secret, sns_topic_arn=sns_topic_arn + **{ + "sns_key": sns_key, + "sns_secret": sns_secret, + "sns_topic_arn": sns_topic_arn, + } ) return await self.post("/api/v2/check_sns", CheckSNSResponse, json=json) @@ -270,21 +282,23 @@ async def check_sqs( sqs_secret: Optional[str] = None, sqs_url: Optional[str] = None, ) -> StreamResponse[CheckSQSResponse]: - json = build_body_dict(sqs_key=sqs_key, sqs_secret=sqs_secret, sqs_url=sqs_url) + json = build_body_dict( + **{"sqs_key": sqs_key, "sqs_secret": sqs_secret, "sqs_url": sqs_url} + ) return await self.post("/api/v2/check_sqs", CheckSQSResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_device") async def delete_device( self, id: str, user_id: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(id=id, user_id=user_id) + query_params = build_query_param(**{"id": id, "user_id": user_id}) return await self.delete("/api/v2/devices", Response, query_params=query_params) @telemetry.operation_name("getstream.api.common.list_devices") async def list_devices( self, user_id: Optional[str] = None ) -> StreamResponse[ListDevicesResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return await self.get( "/api/v2/devices", ListDevicesResponse, query_params=query_params ) @@ -300,12 +314,14 @@ async def create_device( user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: json = build_body_dict( - id=id, - push_provider=push_provider, - push_provider_name=push_provider_name, - user_id=user_id, - voip_token=voip_token, - user=user, + **{ + "id": id, + "push_provider": push_provider, + "push_provider_name": push_provider_name, + "user_id": user_id, + "voip_token": voip_token, + "user": user, + } ) return await self.post("/api/v2/devices", Response, json=json) @@ -313,7 +329,7 @@ async def create_device( async def export_users( self, user_ids: List[str] ) -> StreamResponse[ExportUsersResponse]: - json = build_body_dict(user_ids=user_ids) + json = build_body_dict(**{"user_ids": user_ids}) return await self.post("/api/v2/export/users", ExportUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.list_external_storage") @@ -334,13 +350,15 @@ async def create_external_storage( azure_blob: Optional[AzureRequest] = None, ) -> StreamResponse[CreateExternalStorageResponse]: json = build_body_dict( - bucket=bucket, - name=name, - storage_type=storage_type, - gcs_credentials=gcs_credentials, - path=path, - aws_s3=aws_s3, - azure_blob=azure_blob, + **{ + "bucket": bucket, + "name": name, + "storage_type": storage_type, + "gcs_credentials": gcs_credentials, + "path": path, + "aws_s3": aws_s3, + "azure_blob": azure_blob, + } ) return await self.post( "/api/v2/external_storage", CreateExternalStorageResponse, json=json @@ -374,12 +392,14 @@ async def update_external_storage( "name": name, } json = build_body_dict( - bucket=bucket, - storage_type=storage_type, - gcs_credentials=gcs_credentials, - path=path, - aws_s3=aws_s3, - azure_blob=azure_blob, + **{ + "bucket": bucket, + "storage_type": storage_type, + "gcs_credentials": gcs_credentials, + "path": path, + "aws_s3": aws_s3, + "azure_blob": azure_blob, + } ) return await self.put( "/api/v2/external_storage/{name}", @@ -405,14 +425,14 @@ async def check_external_storage( async def create_guest( self, user: UserRequest ) -> StreamResponse[CreateGuestResponse]: - json = build_body_dict(user=user) + json = build_body_dict(**{"user": user}) return await self.post("/api/v2/guest", CreateGuestResponse, json=json) @telemetry.operation_name("getstream.api.common.create_import_url") async def create_import_url( self, filename: Optional[str] = None ) -> StreamResponse[CreateImportURLResponse]: - json = build_body_dict(filename=filename) + json = build_body_dict(**{"filename": filename}) return await self.post( "/api/v2/import_urls", CreateImportURLResponse, json=json ) @@ -425,14 +445,14 @@ async def list_imports(self) -> StreamResponse[ListImportsResponse]: async def create_import( self, mode: str, path: str ) -> StreamResponse[CreateImportResponse]: - json = build_body_dict(mode=mode, path=path) + json = build_body_dict(**{"mode": mode, "path": path}) return await self.post("/api/v2/imports", CreateImportResponse, json=json) @telemetry.operation_name("getstream.api.common.list_import_v2_tasks") async def list_import_v2_tasks( self, state: Optional[int] = None ) -> StreamResponse[ListImportV2TasksResponse]: - query_params = build_query_param(state=state) + query_params = build_query_param(**{"state": state}) return await self.get( "/api/v2/imports/v2", ListImportV2TasksResponse, query_params=query_params ) @@ -446,7 +466,12 @@ async def create_import_v2_task( user: Optional[UserRequest] = None, ) -> StreamResponse[CreateImportV2TaskResponse]: json = build_body_dict( - product=product, settings=settings, user_id=user_id, user=user + **{ + "product": product, + "settings": settings, + "user_id": user_id, + "user": user, + } ) return await self.post( "/api/v2/imports/v2", CreateImportV2TaskResponse, json=json @@ -487,7 +512,7 @@ async def get_import(self, id: str) -> StreamResponse[GetImportResponse]: @telemetry.operation_name("getstream.api.common.get_og") async def get_og(self, url: str) -> StreamResponse[GetOGResponse]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) return await self.get("/api/v2/og", GetOGResponse, query_params=query_params) @telemetry.operation_name("getstream.api.common.list_permissions") @@ -525,19 +550,21 @@ async def create_poll( user: Optional[UserRequest] = None, ) -> StreamResponse[PollResponse]: json = build_body_dict( - name=name, - allow_answers=allow_answers, - allow_user_suggested_options=allow_user_suggested_options, - description=description, - enforce_unique_vote=enforce_unique_vote, - id=id, - is_closed=is_closed, - max_votes_allowed=max_votes_allowed, - user_id=user_id, - voting_visibility=voting_visibility, - options=options, - custom=custom, - user=user, + **{ + "name": name, + "allow_answers": allow_answers, + "allow_user_suggested_options": allow_user_suggested_options, + "description": description, + "enforce_unique_vote": enforce_unique_vote, + "id": id, + "is_closed": is_closed, + "max_votes_allowed": max_votes_allowed, + "user_id": user_id, + "voting_visibility": voting_visibility, + "options": options, + "Custom": custom, + "user": user, + } ) return await self.post("/api/v2/polls", PollResponse, json=json) @@ -559,19 +586,21 @@ async def update_poll( user: Optional[UserRequest] = None, ) -> StreamResponse[PollResponse]: json = build_body_dict( - id=id, - name=name, - allow_answers=allow_answers, - allow_user_suggested_options=allow_user_suggested_options, - description=description, - enforce_unique_vote=enforce_unique_vote, - is_closed=is_closed, - max_votes_allowed=max_votes_allowed, - user_id=user_id, - voting_visibility=voting_visibility, - options=options, - custom=custom, - user=user, + **{ + "id": id, + "name": name, + "allow_answers": allow_answers, + "allow_user_suggested_options": allow_user_suggested_options, + "description": description, + "enforce_unique_vote": enforce_unique_vote, + "is_closed": is_closed, + "max_votes_allowed": max_votes_allowed, + "user_id": user_id, + "voting_visibility": voting_visibility, + "options": options, + "Custom": custom, + "user": user, + } ) return await self.put("/api/v2/polls", PollResponse, json=json) @@ -585,9 +614,15 @@ async def query_polls( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryPollsResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return await self.post( "/api/v2/polls/query", @@ -600,7 +635,7 @@ async def query_polls( async def delete_poll( self, poll_id: str, user_id: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, } @@ -615,7 +650,7 @@ async def delete_poll( async def get_poll( self, poll_id: str, user_id: Optional[str] = None ) -> StreamResponse[PollResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, } @@ -638,7 +673,9 @@ async def update_poll_partial( path_params = { "poll_id": poll_id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + **{"user_id": user_id, "unset": unset, "set": set, "user": user} + ) return await self.patch( "/api/v2/polls/{poll_id}", PollResponse, path_params=path_params, json=json ) @@ -655,7 +692,9 @@ async def create_poll_option( path_params = { "poll_id": poll_id, } - json = build_body_dict(text=text, user_id=user_id, custom=custom, user=user) + json = build_body_dict( + **{"text": text, "user_id": user_id, "Custom": custom, "user": user} + ) return await self.post( "/api/v2/polls/{poll_id}/options", PollOptionResponse, @@ -677,7 +716,13 @@ async def update_poll_option( "poll_id": poll_id, } json = build_body_dict( - id=id, text=text, user_id=user_id, custom=custom, user=user + **{ + "id": id, + "text": text, + "user_id": user_id, + "Custom": custom, + "user": user, + } ) return await self.put( "/api/v2/polls/{poll_id}/options", @@ -690,7 +735,7 @@ async def update_poll_option( async def delete_poll_option( self, poll_id: str, option_id: str, user_id: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, "option_id": option_id, @@ -706,7 +751,7 @@ async def delete_poll_option( async def get_poll_option( self, poll_id: str, option_id: str, user_id: Optional[str] = None ) -> StreamResponse[PollOptionResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, "option_id": option_id, @@ -729,12 +774,18 @@ async def query_poll_votes( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[PollVotesResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return await self.post( "/api/v2/polls/{poll_id}/votes", @@ -750,7 +801,7 @@ async def query_poll_votes( async def update_push_notification_preferences( self, preferences: List[PushPreferenceInput] ) -> StreamResponse[UpsertPushPreferencesResponse]: - json = build_body_dict(preferences=preferences) + json = build_body_dict(**{"preferences": preferences}) return await self.post( "/api/v2/push_preferences", UpsertPushPreferencesResponse, json=json ) @@ -763,7 +814,7 @@ async def list_push_providers(self) -> StreamResponse[ListPushProvidersResponse] async def upsert_push_provider( self, push_provider: Optional[PushProviderRequest] = None ) -> StreamResponse[UpsertPushProviderResponse]: - json = build_body_dict(push_provider=push_provider) + json = build_body_dict(**{"push_provider": push_provider}) return await self.post( "/api/v2/push_providers", UpsertPushProviderResponse, json=json ) @@ -785,7 +836,10 @@ async def get_push_templates( self, push_provider_type: str, push_provider_name: Optional[str] = None ) -> StreamResponse[GetPushTemplatesResponse]: query_params = build_query_param( - push_provider_type=push_provider_type, push_provider_name=push_provider_name + **{ + "push_provider_type": push_provider_type, + "push_provider_name": push_provider_name, + } ) return await self.get( "/api/v2/push_templates", @@ -803,11 +857,13 @@ async def upsert_push_template( template: Optional[str] = None, ) -> StreamResponse[UpsertPushTemplateResponse]: json = build_body_dict( - event_type=event_type, - push_provider_type=push_provider_type, - enable_push=enable_push, - push_provider_name=push_provider_name, - template=template, + **{ + "event_type": event_type, + "push_provider_type": push_provider_type, + "enable_push": enable_push, + "push_provider_name": push_provider_name, + "template": template, + } ) return await self.post( "/api/v2/push_templates", UpsertPushTemplateResponse, json=json @@ -823,11 +879,13 @@ async def get_rate_limits( endpoints: Optional[str] = None, ) -> StreamResponse[GetRateLimitsResponse]: query_params = build_query_param( - server_side=server_side, - android=android, - ios=ios, - web=web, - endpoints=endpoints, + **{ + "server_side": server_side, + "android": android, + "ios": ios, + "web": web, + "endpoints": endpoints, + } ) return await self.get( "/api/v2/rate_limits", GetRateLimitsResponse, query_params=query_params @@ -839,7 +897,7 @@ async def list_roles(self) -> StreamResponse[ListRolesResponse]: @telemetry.operation_name("getstream.api.common.create_role") async def create_role(self, name: str) -> StreamResponse[CreateRoleResponse]: - json = build_body_dict(name=name) + json = build_body_dict(**{"name": name}) return await self.post("/api/v2/roles", CreateRoleResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_role") @@ -862,7 +920,7 @@ async def get_task(self, id: str) -> StreamResponse[GetTaskResponse]: @telemetry.operation_name("getstream.api.common.delete_file") async def delete_file(self, url: Optional[str] = None) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) return await self.delete( "/api/v2/uploads/file", Response, query_params=query_params ) @@ -871,12 +929,12 @@ async def delete_file(self, url: Optional[str] = None) -> StreamResponse[Respons async def upload_file( self, file: Optional[str] = None, user: Optional[OnlyUserID] = None ) -> StreamResponse[FileUploadResponse]: - json = build_body_dict(file=file, user=user) + json = build_body_dict(**{"file": file, "user": user}) return await self.post("/api/v2/uploads/file", FileUploadResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_image") async def delete_image(self, url: Optional[str] = None) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) return await self.delete( "/api/v2/uploads/image", Response, query_params=query_params ) @@ -888,14 +946,16 @@ async def upload_image( upload_sizes: Optional[List[ImageSize]] = None, user: Optional[OnlyUserID] = None, ) -> StreamResponse[ImageUploadResponse]: - json = build_body_dict(file=file, upload_sizes=upload_sizes, user=user) + json = build_body_dict( + **{"file": file, "upload_sizes": upload_sizes, "user": user} + ) return await self.post("/api/v2/uploads/image", ImageUploadResponse, json=json) @telemetry.operation_name("getstream.api.common.query_users") async def query_users( self, payload: Optional[QueryUsersPayload] = None ) -> StreamResponse[QueryUsersResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return await self.get( "/api/v2/users", QueryUsersResponse, query_params=query_params ) @@ -904,21 +964,21 @@ async def query_users( async def update_users_partial( self, users: List[UpdateUserPartialRequest] ) -> StreamResponse[UpdateUsersResponse]: - json = build_body_dict(users=users) + json = build_body_dict(**{"users": users}) return await self.patch("/api/v2/users", UpdateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.update_users") async def update_users( self, users: Dict[str, UserRequest] ) -> StreamResponse[UpdateUsersResponse]: - json = build_body_dict(users=users) + json = build_body_dict(**{"users": users}) return await self.post("/api/v2/users", UpdateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.get_blocked_users") async def get_blocked_users( self, user_id: Optional[str] = None ) -> StreamResponse[GetBlockedUsersResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return await self.get( "/api/v2/users/block", GetBlockedUsersResponse, query_params=query_params ) @@ -931,7 +991,7 @@ async def block_users( user: Optional[UserRequest] = None, ) -> StreamResponse[BlockUsersResponse]: json = build_body_dict( - blocked_user_id=blocked_user_id, user_id=user_id, user=user + **{"blocked_user_id": blocked_user_id, "user_id": user_id, "user": user} ) return await self.post("/api/v2/users/block", BlockUsersResponse, json=json) @@ -944,10 +1004,12 @@ async def deactivate_users( mark_messages_deleted: Optional[bool] = None, ) -> StreamResponse[DeactivateUsersResponse]: json = build_body_dict( - user_ids=user_ids, - created_by_id=created_by_id, - mark_channels_deleted=mark_channels_deleted, - mark_messages_deleted=mark_messages_deleted, + **{ + "user_ids": user_ids, + "created_by_id": created_by_id, + "mark_channels_deleted": mark_channels_deleted, + "mark_messages_deleted": mark_messages_deleted, + } ) return await self.post( "/api/v2/users/deactivate", DeactivateUsersResponse, json=json @@ -966,14 +1028,16 @@ async def delete_users( user: Optional[str] = None, ) -> StreamResponse[DeleteUsersResponse]: json = build_body_dict( - user_ids=user_ids, - calls=calls, - conversations=conversations, - files=files, - messages=messages, - new_call_owner_id=new_call_owner_id, - new_channel_owner_id=new_channel_owner_id, - user=user, + **{ + "user_ids": user_ids, + "calls": calls, + "conversations": conversations, + "files": files, + "messages": messages, + "new_call_owner_id": new_call_owner_id, + "new_channel_owner_id": new_channel_owner_id, + "user": user, + } ) return await self.post("/api/v2/users/delete", DeleteUsersResponse, json=json) @@ -981,7 +1045,7 @@ async def delete_users( async def get_user_live_locations( self, user_id: Optional[str] = None ) -> StreamResponse[SharedLocationsResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return await self.get( "/api/v2/users/live_locations", SharedLocationsResponse, @@ -997,9 +1061,14 @@ async def update_live_location( longitude: Optional[float] = None, user_id: Optional[str] = None, ) -> StreamResponse[SharedLocationResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) json = build_body_dict( - message_id=message_id, end_at=end_at, latitude=latitude, longitude=longitude + **{ + "message_id": message_id, + "end_at": end_at, + "latitude": latitude, + "longitude": longitude, + } ) return await self.put( "/api/v2/users/live_locations", @@ -1017,10 +1086,12 @@ async def reactivate_users( restore_messages: Optional[bool] = None, ) -> StreamResponse[ReactivateUsersResponse]: json = build_body_dict( - user_ids=user_ids, - created_by_id=created_by_id, - restore_channels=restore_channels, - restore_messages=restore_messages, + **{ + "user_ids": user_ids, + "created_by_id": created_by_id, + "restore_channels": restore_channels, + "restore_messages": restore_messages, + } ) return await self.post( "/api/v2/users/reactivate", ReactivateUsersResponse, json=json @@ -1028,7 +1099,7 @@ async def reactivate_users( @telemetry.operation_name("getstream.api.common.restore_users") async def restore_users(self, user_ids: List[str]) -> StreamResponse[Response]: - json = build_body_dict(user_ids=user_ids) + json = build_body_dict(**{"user_ids": user_ids}) return await self.post("/api/v2/users/restore", Response, json=json) @telemetry.operation_name("getstream.api.common.unblock_users") @@ -1039,7 +1110,7 @@ async def unblock_users( user: Optional[UserRequest] = None, ) -> StreamResponse[UnblockUsersResponse]: json = build_body_dict( - blocked_user_id=blocked_user_id, user_id=user_id, user=user + **{"blocked_user_id": blocked_user_id, "user_id": user_id, "user": user} ) return await self.post("/api/v2/users/unblock", UnblockUsersResponse, json=json) @@ -1054,7 +1125,10 @@ async def deactivate_user( "user_id": user_id, } json = build_body_dict( - created_by_id=created_by_id, mark_messages_deleted=mark_messages_deleted + **{ + "created_by_id": created_by_id, + "mark_messages_deleted": mark_messages_deleted, + } ) return await self.post( "/api/v2/users/{user_id}/deactivate", @@ -1086,7 +1160,11 @@ async def reactivate_user( "user_id": user_id, } json = build_body_dict( - created_by_id=created_by_id, name=name, restore_messages=restore_messages + **{ + "created_by_id": created_by_id, + "name": name, + "restore_messages": restore_messages, + } ) return await self.post( "/api/v2/users/{user_id}/reactivate", diff --git a/getstream/common/rest_client.py b/getstream/common/rest_client.py index d134c70f..90b8660e 100644 --- a/getstream/common/rest_client.py +++ b/getstream/common/rest_client.py @@ -89,53 +89,55 @@ def update_app( xiaomi_config: Optional[XiaomiConfig] = None, ) -> StreamResponse[Response]: json = build_body_dict( - async_url_enrich_enabled=async_url_enrich_enabled, - auto_translation_enabled=auto_translation_enabled, - before_message_send_hook_url=before_message_send_hook_url, - cdn_expiration_seconds=cdn_expiration_seconds, - channel_hide_members_only=channel_hide_members_only, - custom_action_handler_url=custom_action_handler_url, - disable_auth_checks=disable_auth_checks, - disable_permissions_checks=disable_permissions_checks, - enforce_unique_usernames=enforce_unique_usernames, - feeds_moderation_enabled=feeds_moderation_enabled, - feeds_v2_region=feeds_v2_region, - guest_user_creation_disabled=guest_user_creation_disabled, - image_moderation_enabled=image_moderation_enabled, - max_aggregated_activities_length=max_aggregated_activities_length, - migrate_permissions_to_v2=migrate_permissions_to_v2, - moderation_enabled=moderation_enabled, - moderation_webhook_url=moderation_webhook_url, - multi_tenant_enabled=multi_tenant_enabled, - permission_version=permission_version, - reminders_interval=reminders_interval, - reminders_max_members=reminders_max_members, - revoke_tokens_issued_before=revoke_tokens_issued_before, - sns_key=sns_key, - sns_secret=sns_secret, - sns_topic_arn=sns_topic_arn, - sqs_key=sqs_key, - sqs_secret=sqs_secret, - sqs_url=sqs_url, - user_response_time_enabled=user_response_time_enabled, - webhook_url=webhook_url, - allowed_flag_reasons=allowed_flag_reasons, - event_hooks=event_hooks, - image_moderation_block_labels=image_moderation_block_labels, - image_moderation_labels=image_moderation_labels, - user_search_disallowed_roles=user_search_disallowed_roles, - webhook_events=webhook_events, - apn_config=apn_config, - async_moderation_config=async_moderation_config, - datadog_info=datadog_info, - file_upload_config=file_upload_config, - firebase_config=firebase_config, - grants=grants, - huawei_config=huawei_config, - image_upload_config=image_upload_config, - moderation_dashboard_preferences=moderation_dashboard_preferences, - push_config=push_config, - xiaomi_config=xiaomi_config, + **{ + "async_url_enrich_enabled": async_url_enrich_enabled, + "auto_translation_enabled": auto_translation_enabled, + "before_message_send_hook_url": before_message_send_hook_url, + "cdn_expiration_seconds": cdn_expiration_seconds, + "channel_hide_members_only": channel_hide_members_only, + "custom_action_handler_url": custom_action_handler_url, + "disable_auth_checks": disable_auth_checks, + "disable_permissions_checks": disable_permissions_checks, + "enforce_unique_usernames": enforce_unique_usernames, + "feeds_moderation_enabled": feeds_moderation_enabled, + "feeds_v2_region": feeds_v2_region, + "guest_user_creation_disabled": guest_user_creation_disabled, + "image_moderation_enabled": image_moderation_enabled, + "max_aggregated_activities_length": max_aggregated_activities_length, + "migrate_permissions_to_v2": migrate_permissions_to_v2, + "moderation_enabled": moderation_enabled, + "moderation_webhook_url": moderation_webhook_url, + "multi_tenant_enabled": multi_tenant_enabled, + "permission_version": permission_version, + "reminders_interval": reminders_interval, + "reminders_max_members": reminders_max_members, + "revoke_tokens_issued_before": revoke_tokens_issued_before, + "sns_key": sns_key, + "sns_secret": sns_secret, + "sns_topic_arn": sns_topic_arn, + "sqs_key": sqs_key, + "sqs_secret": sqs_secret, + "sqs_url": sqs_url, + "user_response_time_enabled": user_response_time_enabled, + "webhook_url": webhook_url, + "allowed_flag_reasons": allowed_flag_reasons, + "event_hooks": event_hooks, + "image_moderation_block_labels": image_moderation_block_labels, + "image_moderation_labels": image_moderation_labels, + "user_search_disallowed_roles": user_search_disallowed_roles, + "webhook_events": webhook_events, + "apn_config": apn_config, + "async_moderation_config": async_moderation_config, + "datadog_info": datadog_info, + "file_upload_config": file_upload_config, + "firebase_config": firebase_config, + "grants": grants, + "huawei_config": huawei_config, + "image_upload_config": image_upload_config, + "moderation_dashboard_preferences": moderation_dashboard_preferences, + "push_config": push_config, + "xiaomi_config": xiaomi_config, + } ) return self.patch("/api/v2/app", Response, json=json) @@ -143,7 +145,7 @@ def update_app( def list_block_lists( self, team: Optional[str] = None ) -> StreamResponse[ListBlockListResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) return self.get( "/api/v2/blocklists", ListBlockListResponse, query_params=query_params ) @@ -159,12 +161,14 @@ def create_block_list( type: Optional[str] = None, ) -> StreamResponse[CreateBlockListResponse]: json = build_body_dict( - name=name, - words=words, - is_leet_check_enabled=is_leet_check_enabled, - is_plural_check_enabled=is_plural_check_enabled, - team=team, - type=type, + **{ + "name": name, + "words": words, + "is_leet_check_enabled": is_leet_check_enabled, + "is_plural_check_enabled": is_plural_check_enabled, + "team": team, + "type": type, + } ) return self.post("/api/v2/blocklists", CreateBlockListResponse, json=json) @@ -172,7 +176,7 @@ def create_block_list( def delete_block_list( self, name: str, team: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "name": name, } @@ -187,7 +191,7 @@ def delete_block_list( def get_block_list( self, name: str, team: Optional[str] = None ) -> StreamResponse[GetBlockListResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "name": name, } @@ -211,10 +215,12 @@ def update_block_list( "name": name, } json = build_body_dict( - is_leet_check_enabled=is_leet_check_enabled, - is_plural_check_enabled=is_plural_check_enabled, - team=team, - words=words, + **{ + "is_leet_check_enabled": is_leet_check_enabled, + "is_plural_check_enabled": is_plural_check_enabled, + "team": team, + "words": words, + } ) return self.put( "/api/v2/blocklists/{name}", @@ -238,16 +244,18 @@ def check_push( user: Optional[UserRequest] = None, ) -> StreamResponse[CheckPushResponse]: json = build_body_dict( - apn_template=apn_template, - event_type=event_type, - firebase_data_template=firebase_data_template, - firebase_template=firebase_template, - message_id=message_id, - push_provider_name=push_provider_name, - push_provider_type=push_provider_type, - skip_devices=skip_devices, - user_id=user_id, - user=user, + **{ + "apn_template": apn_template, + "event_type": event_type, + "firebase_data_template": firebase_data_template, + "firebase_template": firebase_template, + "message_id": message_id, + "push_provider_name": push_provider_name, + "push_provider_type": push_provider_type, + "skip_devices": skip_devices, + "user_id": user_id, + "user": user, + } ) return self.post("/api/v2/check_push", CheckPushResponse, json=json) @@ -259,7 +267,11 @@ def check_sns( sns_topic_arn: Optional[str] = None, ) -> StreamResponse[CheckSNSResponse]: json = build_body_dict( - sns_key=sns_key, sns_secret=sns_secret, sns_topic_arn=sns_topic_arn + **{ + "sns_key": sns_key, + "sns_secret": sns_secret, + "sns_topic_arn": sns_topic_arn, + } ) return self.post("/api/v2/check_sns", CheckSNSResponse, json=json) @@ -270,21 +282,23 @@ def check_sqs( sqs_secret: Optional[str] = None, sqs_url: Optional[str] = None, ) -> StreamResponse[CheckSQSResponse]: - json = build_body_dict(sqs_key=sqs_key, sqs_secret=sqs_secret, sqs_url=sqs_url) + json = build_body_dict( + **{"sqs_key": sqs_key, "sqs_secret": sqs_secret, "sqs_url": sqs_url} + ) return self.post("/api/v2/check_sqs", CheckSQSResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_device") def delete_device( self, id: str, user_id: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(id=id, user_id=user_id) + query_params = build_query_param(**{"id": id, "user_id": user_id}) return self.delete("/api/v2/devices", Response, query_params=query_params) @telemetry.operation_name("getstream.api.common.list_devices") def list_devices( self, user_id: Optional[str] = None ) -> StreamResponse[ListDevicesResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return self.get( "/api/v2/devices", ListDevicesResponse, query_params=query_params ) @@ -300,18 +314,20 @@ def create_device( user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: json = build_body_dict( - id=id, - push_provider=push_provider, - push_provider_name=push_provider_name, - user_id=user_id, - voip_token=voip_token, - user=user, + **{ + "id": id, + "push_provider": push_provider, + "push_provider_name": push_provider_name, + "user_id": user_id, + "voip_token": voip_token, + "user": user, + } ) return self.post("/api/v2/devices", Response, json=json) @telemetry.operation_name("getstream.api.common.export_users") def export_users(self, user_ids: List[str]) -> StreamResponse[ExportUsersResponse]: - json = build_body_dict(user_ids=user_ids) + json = build_body_dict(**{"user_ids": user_ids}) return self.post("/api/v2/export/users", ExportUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.list_external_storage") @@ -330,13 +346,15 @@ def create_external_storage( azure_blob: Optional[AzureRequest] = None, ) -> StreamResponse[CreateExternalStorageResponse]: json = build_body_dict( - bucket=bucket, - name=name, - storage_type=storage_type, - gcs_credentials=gcs_credentials, - path=path, - aws_s3=aws_s3, - azure_blob=azure_blob, + **{ + "bucket": bucket, + "name": name, + "storage_type": storage_type, + "gcs_credentials": gcs_credentials, + "path": path, + "aws_s3": aws_s3, + "azure_blob": azure_blob, + } ) return self.post( "/api/v2/external_storage", CreateExternalStorageResponse, json=json @@ -370,12 +388,14 @@ def update_external_storage( "name": name, } json = build_body_dict( - bucket=bucket, - storage_type=storage_type, - gcs_credentials=gcs_credentials, - path=path, - aws_s3=aws_s3, - azure_blob=azure_blob, + **{ + "bucket": bucket, + "storage_type": storage_type, + "gcs_credentials": gcs_credentials, + "path": path, + "aws_s3": aws_s3, + "azure_blob": azure_blob, + } ) return self.put( "/api/v2/external_storage/{name}", @@ -399,14 +419,14 @@ def check_external_storage( @telemetry.operation_name("getstream.api.common.create_guest") def create_guest(self, user: UserRequest) -> StreamResponse[CreateGuestResponse]: - json = build_body_dict(user=user) + json = build_body_dict(**{"user": user}) return self.post("/api/v2/guest", CreateGuestResponse, json=json) @telemetry.operation_name("getstream.api.common.create_import_url") def create_import_url( self, filename: Optional[str] = None ) -> StreamResponse[CreateImportURLResponse]: - json = build_body_dict(filename=filename) + json = build_body_dict(**{"filename": filename}) return self.post("/api/v2/import_urls", CreateImportURLResponse, json=json) @telemetry.operation_name("getstream.api.common.list_imports") @@ -417,14 +437,14 @@ def list_imports(self) -> StreamResponse[ListImportsResponse]: def create_import( self, mode: str, path: str ) -> StreamResponse[CreateImportResponse]: - json = build_body_dict(mode=mode, path=path) + json = build_body_dict(**{"mode": mode, "path": path}) return self.post("/api/v2/imports", CreateImportResponse, json=json) @telemetry.operation_name("getstream.api.common.list_import_v2_tasks") def list_import_v2_tasks( self, state: Optional[int] = None ) -> StreamResponse[ListImportV2TasksResponse]: - query_params = build_query_param(state=state) + query_params = build_query_param(**{"state": state}) return self.get( "/api/v2/imports/v2", ListImportV2TasksResponse, query_params=query_params ) @@ -438,7 +458,12 @@ def create_import_v2_task( user: Optional[UserRequest] = None, ) -> StreamResponse[CreateImportV2TaskResponse]: json = build_body_dict( - product=product, settings=settings, user_id=user_id, user=user + **{ + "product": product, + "settings": settings, + "user_id": user_id, + "user": user, + } ) return self.post("/api/v2/imports/v2", CreateImportV2TaskResponse, json=json) @@ -475,7 +500,7 @@ def get_import(self, id: str) -> StreamResponse[GetImportResponse]: @telemetry.operation_name("getstream.api.common.get_og") def get_og(self, url: str) -> StreamResponse[GetOGResponse]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) return self.get("/api/v2/og", GetOGResponse, query_params=query_params) @telemetry.operation_name("getstream.api.common.list_permissions") @@ -511,19 +536,21 @@ def create_poll( user: Optional[UserRequest] = None, ) -> StreamResponse[PollResponse]: json = build_body_dict( - name=name, - allow_answers=allow_answers, - allow_user_suggested_options=allow_user_suggested_options, - description=description, - enforce_unique_vote=enforce_unique_vote, - id=id, - is_closed=is_closed, - max_votes_allowed=max_votes_allowed, - user_id=user_id, - voting_visibility=voting_visibility, - options=options, - custom=custom, - user=user, + **{ + "name": name, + "allow_answers": allow_answers, + "allow_user_suggested_options": allow_user_suggested_options, + "description": description, + "enforce_unique_vote": enforce_unique_vote, + "id": id, + "is_closed": is_closed, + "max_votes_allowed": max_votes_allowed, + "user_id": user_id, + "voting_visibility": voting_visibility, + "options": options, + "Custom": custom, + "user": user, + } ) return self.post("/api/v2/polls", PollResponse, json=json) @@ -545,19 +572,21 @@ def update_poll( user: Optional[UserRequest] = None, ) -> StreamResponse[PollResponse]: json = build_body_dict( - id=id, - name=name, - allow_answers=allow_answers, - allow_user_suggested_options=allow_user_suggested_options, - description=description, - enforce_unique_vote=enforce_unique_vote, - is_closed=is_closed, - max_votes_allowed=max_votes_allowed, - user_id=user_id, - voting_visibility=voting_visibility, - options=options, - custom=custom, - user=user, + **{ + "id": id, + "name": name, + "allow_answers": allow_answers, + "allow_user_suggested_options": allow_user_suggested_options, + "description": description, + "enforce_unique_vote": enforce_unique_vote, + "is_closed": is_closed, + "max_votes_allowed": max_votes_allowed, + "user_id": user_id, + "voting_visibility": voting_visibility, + "options": options, + "Custom": custom, + "user": user, + } ) return self.put("/api/v2/polls", PollResponse, json=json) @@ -571,9 +600,15 @@ def query_polls( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryPollsResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/polls/query", @@ -586,7 +621,7 @@ def query_polls( def delete_poll( self, poll_id: str, user_id: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, } @@ -601,7 +636,7 @@ def delete_poll( def get_poll( self, poll_id: str, user_id: Optional[str] = None ) -> StreamResponse[PollResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, } @@ -624,7 +659,9 @@ def update_poll_partial( path_params = { "poll_id": poll_id, } - json = build_body_dict(user_id=user_id, unset=unset, set=set, user=user) + json = build_body_dict( + **{"user_id": user_id, "unset": unset, "set": set, "user": user} + ) return self.patch( "/api/v2/polls/{poll_id}", PollResponse, path_params=path_params, json=json ) @@ -641,7 +678,9 @@ def create_poll_option( path_params = { "poll_id": poll_id, } - json = build_body_dict(text=text, user_id=user_id, custom=custom, user=user) + json = build_body_dict( + **{"text": text, "user_id": user_id, "Custom": custom, "user": user} + ) return self.post( "/api/v2/polls/{poll_id}/options", PollOptionResponse, @@ -663,7 +702,13 @@ def update_poll_option( "poll_id": poll_id, } json = build_body_dict( - id=id, text=text, user_id=user_id, custom=custom, user=user + **{ + "id": id, + "text": text, + "user_id": user_id, + "Custom": custom, + "user": user, + } ) return self.put( "/api/v2/polls/{poll_id}/options", @@ -676,7 +721,7 @@ def update_poll_option( def delete_poll_option( self, poll_id: str, option_id: str, user_id: Optional[str] = None ) -> StreamResponse[Response]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, "option_id": option_id, @@ -692,7 +737,7 @@ def delete_poll_option( def get_poll_option( self, poll_id: str, option_id: str, user_id: Optional[str] = None ) -> StreamResponse[PollOptionResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, "option_id": option_id, @@ -715,12 +760,18 @@ def query_poll_votes( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[PollVotesResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "poll_id": poll_id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/polls/{poll_id}/votes", @@ -736,7 +787,7 @@ def query_poll_votes( def update_push_notification_preferences( self, preferences: List[PushPreferenceInput] ) -> StreamResponse[UpsertPushPreferencesResponse]: - json = build_body_dict(preferences=preferences) + json = build_body_dict(**{"preferences": preferences}) return self.post( "/api/v2/push_preferences", UpsertPushPreferencesResponse, json=json ) @@ -749,7 +800,7 @@ def list_push_providers(self) -> StreamResponse[ListPushProvidersResponse]: def upsert_push_provider( self, push_provider: Optional[PushProviderRequest] = None ) -> StreamResponse[UpsertPushProviderResponse]: - json = build_body_dict(push_provider=push_provider) + json = build_body_dict(**{"push_provider": push_provider}) return self.post( "/api/v2/push_providers", UpsertPushProviderResponse, json=json ) @@ -769,7 +820,10 @@ def get_push_templates( self, push_provider_type: str, push_provider_name: Optional[str] = None ) -> StreamResponse[GetPushTemplatesResponse]: query_params = build_query_param( - push_provider_type=push_provider_type, push_provider_name=push_provider_name + **{ + "push_provider_type": push_provider_type, + "push_provider_name": push_provider_name, + } ) return self.get( "/api/v2/push_templates", @@ -787,11 +841,13 @@ def upsert_push_template( template: Optional[str] = None, ) -> StreamResponse[UpsertPushTemplateResponse]: json = build_body_dict( - event_type=event_type, - push_provider_type=push_provider_type, - enable_push=enable_push, - push_provider_name=push_provider_name, - template=template, + **{ + "event_type": event_type, + "push_provider_type": push_provider_type, + "enable_push": enable_push, + "push_provider_name": push_provider_name, + "template": template, + } ) return self.post( "/api/v2/push_templates", UpsertPushTemplateResponse, json=json @@ -807,11 +863,13 @@ def get_rate_limits( endpoints: Optional[str] = None, ) -> StreamResponse[GetRateLimitsResponse]: query_params = build_query_param( - server_side=server_side, - android=android, - ios=ios, - web=web, - endpoints=endpoints, + **{ + "server_side": server_side, + "android": android, + "ios": ios, + "web": web, + "endpoints": endpoints, + } ) return self.get( "/api/v2/rate_limits", GetRateLimitsResponse, query_params=query_params @@ -823,7 +881,7 @@ def list_roles(self) -> StreamResponse[ListRolesResponse]: @telemetry.operation_name("getstream.api.common.create_role") def create_role(self, name: str) -> StreamResponse[CreateRoleResponse]: - json = build_body_dict(name=name) + json = build_body_dict(**{"name": name}) return self.post("/api/v2/roles", CreateRoleResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_role") @@ -842,19 +900,19 @@ def get_task(self, id: str) -> StreamResponse[GetTaskResponse]: @telemetry.operation_name("getstream.api.common.delete_file") def delete_file(self, url: Optional[str] = None) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) return self.delete("/api/v2/uploads/file", Response, query_params=query_params) @telemetry.operation_name("getstream.api.common.upload_file") def upload_file( self, file: Optional[str] = None, user: Optional[OnlyUserID] = None ) -> StreamResponse[FileUploadResponse]: - json = build_body_dict(file=file, user=user) + json = build_body_dict(**{"file": file, "user": user}) return self.post("/api/v2/uploads/file", FileUploadResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_image") def delete_image(self, url: Optional[str] = None) -> StreamResponse[Response]: - query_params = build_query_param(url=url) + query_params = build_query_param(**{"url": url}) return self.delete("/api/v2/uploads/image", Response, query_params=query_params) @telemetry.operation_name("getstream.api.common.upload_image") @@ -864,35 +922,37 @@ def upload_image( upload_sizes: Optional[List[ImageSize]] = None, user: Optional[OnlyUserID] = None, ) -> StreamResponse[ImageUploadResponse]: - json = build_body_dict(file=file, upload_sizes=upload_sizes, user=user) + json = build_body_dict( + **{"file": file, "upload_sizes": upload_sizes, "user": user} + ) return self.post("/api/v2/uploads/image", ImageUploadResponse, json=json) @telemetry.operation_name("getstream.api.common.query_users") def query_users( self, payload: Optional[QueryUsersPayload] = None ) -> StreamResponse[QueryUsersResponse]: - query_params = build_query_param(payload=payload) + query_params = build_query_param(**{"payload": payload}) return self.get("/api/v2/users", QueryUsersResponse, query_params=query_params) @telemetry.operation_name("getstream.api.common.update_users_partial") def update_users_partial( self, users: List[UpdateUserPartialRequest] ) -> StreamResponse[UpdateUsersResponse]: - json = build_body_dict(users=users) + json = build_body_dict(**{"users": users}) return self.patch("/api/v2/users", UpdateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.update_users") def update_users( self, users: Dict[str, UserRequest] ) -> StreamResponse[UpdateUsersResponse]: - json = build_body_dict(users=users) + json = build_body_dict(**{"users": users}) return self.post("/api/v2/users", UpdateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.get_blocked_users") def get_blocked_users( self, user_id: Optional[str] = None ) -> StreamResponse[GetBlockedUsersResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return self.get( "/api/v2/users/block", GetBlockedUsersResponse, query_params=query_params ) @@ -905,7 +965,7 @@ def block_users( user: Optional[UserRequest] = None, ) -> StreamResponse[BlockUsersResponse]: json = build_body_dict( - blocked_user_id=blocked_user_id, user_id=user_id, user=user + **{"blocked_user_id": blocked_user_id, "user_id": user_id, "user": user} ) return self.post("/api/v2/users/block", BlockUsersResponse, json=json) @@ -918,10 +978,12 @@ def deactivate_users( mark_messages_deleted: Optional[bool] = None, ) -> StreamResponse[DeactivateUsersResponse]: json = build_body_dict( - user_ids=user_ids, - created_by_id=created_by_id, - mark_channels_deleted=mark_channels_deleted, - mark_messages_deleted=mark_messages_deleted, + **{ + "user_ids": user_ids, + "created_by_id": created_by_id, + "mark_channels_deleted": mark_channels_deleted, + "mark_messages_deleted": mark_messages_deleted, + } ) return self.post("/api/v2/users/deactivate", DeactivateUsersResponse, json=json) @@ -938,14 +1000,16 @@ def delete_users( user: Optional[str] = None, ) -> StreamResponse[DeleteUsersResponse]: json = build_body_dict( - user_ids=user_ids, - calls=calls, - conversations=conversations, - files=files, - messages=messages, - new_call_owner_id=new_call_owner_id, - new_channel_owner_id=new_channel_owner_id, - user=user, + **{ + "user_ids": user_ids, + "calls": calls, + "conversations": conversations, + "files": files, + "messages": messages, + "new_call_owner_id": new_call_owner_id, + "new_channel_owner_id": new_channel_owner_id, + "user": user, + } ) return self.post("/api/v2/users/delete", DeleteUsersResponse, json=json) @@ -953,7 +1017,7 @@ def delete_users( def get_user_live_locations( self, user_id: Optional[str] = None ) -> StreamResponse[SharedLocationsResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) return self.get( "/api/v2/users/live_locations", SharedLocationsResponse, @@ -969,9 +1033,14 @@ def update_live_location( longitude: Optional[float] = None, user_id: Optional[str] = None, ) -> StreamResponse[SharedLocationResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) json = build_body_dict( - message_id=message_id, end_at=end_at, latitude=latitude, longitude=longitude + **{ + "message_id": message_id, + "end_at": end_at, + "latitude": latitude, + "longitude": longitude, + } ) return self.put( "/api/v2/users/live_locations", @@ -989,16 +1058,18 @@ def reactivate_users( restore_messages: Optional[bool] = None, ) -> StreamResponse[ReactivateUsersResponse]: json = build_body_dict( - user_ids=user_ids, - created_by_id=created_by_id, - restore_channels=restore_channels, - restore_messages=restore_messages, + **{ + "user_ids": user_ids, + "created_by_id": created_by_id, + "restore_channels": restore_channels, + "restore_messages": restore_messages, + } ) return self.post("/api/v2/users/reactivate", ReactivateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.restore_users") def restore_users(self, user_ids: List[str]) -> StreamResponse[Response]: - json = build_body_dict(user_ids=user_ids) + json = build_body_dict(**{"user_ids": user_ids}) return self.post("/api/v2/users/restore", Response, json=json) @telemetry.operation_name("getstream.api.common.unblock_users") @@ -1009,7 +1080,7 @@ def unblock_users( user: Optional[UserRequest] = None, ) -> StreamResponse[UnblockUsersResponse]: json = build_body_dict( - blocked_user_id=blocked_user_id, user_id=user_id, user=user + **{"blocked_user_id": blocked_user_id, "user_id": user_id, "user": user} ) return self.post("/api/v2/users/unblock", UnblockUsersResponse, json=json) @@ -1024,7 +1095,10 @@ def deactivate_user( "user_id": user_id, } json = build_body_dict( - created_by_id=created_by_id, mark_messages_deleted=mark_messages_deleted + **{ + "created_by_id": created_by_id, + "mark_messages_deleted": mark_messages_deleted, + } ) return self.post( "/api/v2/users/{user_id}/deactivate", @@ -1056,7 +1130,11 @@ def reactivate_user( "user_id": user_id, } json = build_body_dict( - created_by_id=created_by_id, name=name, restore_messages=restore_messages + **{ + "created_by_id": created_by_id, + "name": name, + "restore_messages": restore_messages, + } ) return self.post( "/api/v2/users/{user_id}/reactivate", diff --git a/getstream/feeds/rest_client.py b/getstream/feeds/rest_client.py index 1e3cad80..b316ef2e 100644 --- a/getstream/feeds/rest_client.py +++ b/getstream/feeds/rest_client.py @@ -59,29 +59,31 @@ def add_activity( search_data: Optional[Dict[str, object]] = None, ) -> StreamResponse[AddActivityResponse]: json = build_body_dict( - type=type, - feeds=feeds, - copy_custom_to_notification=copy_custom_to_notification, - create_notification_activity=create_notification_activity, - expires_at=expires_at, - id=id, - parent_id=parent_id, - poll_id=poll_id, - restrict_replies=restrict_replies, - skip_enrich_url=skip_enrich_url, - skip_push=skip_push, - text=text, - user_id=user_id, - visibility=visibility, - visibility_tag=visibility_tag, - attachments=attachments, - collection_refs=collection_refs, - filter_tags=filter_tags, - interest_tags=interest_tags, - mentioned_user_ids=mentioned_user_ids, - custom=custom, - location=location, - search_data=search_data, + **{ + "type": type, + "feeds": feeds, + "copy_custom_to_notification": copy_custom_to_notification, + "create_notification_activity": create_notification_activity, + "expires_at": expires_at, + "id": id, + "parent_id": parent_id, + "poll_id": poll_id, + "restrict_replies": restrict_replies, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "text": text, + "user_id": user_id, + "visibility": visibility, + "visibility_tag": visibility_tag, + "attachments": attachments, + "collection_refs": collection_refs, + "filter_tags": filter_tags, + "interest_tags": interest_tags, + "mentioned_user_ids": mentioned_user_ids, + "custom": custom, + "location": location, + "search_data": search_data, + } ) return self.post("/api/v2/feeds/activities", AddActivityResponse, json=json) @@ -89,7 +91,7 @@ def add_activity( def upsert_activities( self, activities: List[ActivityRequest] ) -> StreamResponse[UpsertActivitiesResponse]: - json = build_body_dict(activities=activities) + json = build_body_dict(**{"activities": activities}) return self.post( "/api/v2/feeds/activities/batch", UpsertActivitiesResponse, json=json ) @@ -98,7 +100,7 @@ def upsert_activities( def update_activities_partial_batch( self, changes: List[UpdateActivityPartialChangeRequest] ) -> StreamResponse[UpdateActivitiesPartialBatchResponse]: - json = build_body_dict(changes=changes) + json = build_body_dict(**{"changes": changes}) return self.patch( "/api/v2/feeds/activities/batch/partial", UpdateActivitiesPartialBatchResponse, @@ -115,11 +117,13 @@ def delete_activities( user: Optional[UserRequest] = None, ) -> StreamResponse[DeleteActivitiesResponse]: json = build_body_dict( - ids=ids, - delete_notification_activity=delete_notification_activity, - hard_delete=hard_delete, - user_id=user_id, - user=user, + **{ + "ids": ids, + "delete_notification_activity": delete_notification_activity, + "hard_delete": hard_delete, + "user_id": user_id, + "user": user, + } ) return self.post( "/api/v2/feeds/activities/delete", DeleteActivitiesResponse, json=json @@ -139,15 +143,17 @@ def query_activities( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryActivitiesResponse]: json = build_body_dict( - include_expired_activities=include_expired_activities, - include_private_activities=include_private_activities, - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "include_expired_activities": include_expired_activities, + "include_private_activities": include_private_activities, + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post( "/api/v2/feeds/activities/query", QueryActivitiesResponse, json=json @@ -160,7 +166,7 @@ def delete_bookmark( folder_id: Optional[str] = None, user_id: Optional[str] = None, ) -> StreamResponse[DeleteBookmarkResponse]: - query_params = build_query_param(folder_id=folder_id, user_id=user_id) + query_params = build_query_param(**{"folder_id": folder_id, "user_id": user_id}) path_params = { "activity_id": activity_id, } @@ -186,12 +192,14 @@ def update_bookmark( "activity_id": activity_id, } json = build_body_dict( - folder_id=folder_id, - new_folder_id=new_folder_id, - user_id=user_id, - custom=custom, - new_folder=new_folder, - user=user, + **{ + "folder_id": folder_id, + "new_folder_id": new_folder_id, + "user_id": user_id, + "custom": custom, + "new_folder": new_folder, + "user": user, + } ) return self.patch( "/api/v2/feeds/activities/{activity_id}/bookmarks", @@ -214,11 +222,13 @@ def add_bookmark( "activity_id": activity_id, } json = build_body_dict( - folder_id=folder_id, - user_id=user_id, - custom=custom, - new_folder=new_folder, - user=user, + **{ + "folder_id": folder_id, + "user_id": user_id, + "custom": custom, + "new_folder": new_folder, + "user": user, + } ) return self.post( "/api/v2/feeds/activities/{activity_id}/bookmarks", @@ -241,11 +251,13 @@ def activity_feedback( "activity_id": activity_id, } json = build_body_dict( - hide=hide, - show_less=show_less, - show_more=show_more, - user_id=user_id, - user=user, + **{ + "hide": hide, + "show_less": show_less, + "show_more": show_more, + "user_id": user_id, + "user": user, + } ) return self.post( "/api/v2/feeds/activities/{activity_id}/feedback", @@ -267,7 +279,7 @@ def cast_poll_vote( "activity_id": activity_id, "poll_id": poll_id, } - json = build_body_dict(user_id=user_id, user=user, vote=vote) + json = build_body_dict(**{"user_id": user_id, "user": user, "vote": vote}) return self.post( "/api/v2/feeds/activities/{activity_id}/polls/{poll_id}/vote", PollVoteResponse, @@ -283,7 +295,7 @@ def delete_poll_vote( vote_id: str, user_id: Optional[str] = None, ) -> StreamResponse[PollVoteResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "activity_id": activity_id, "poll_id": poll_id, @@ -313,14 +325,16 @@ def add_activity_reaction( "activity_id": activity_id, } json = build_body_dict( - type=type, - copy_custom_to_notification=copy_custom_to_notification, - create_notification_activity=create_notification_activity, - enforce_unique=enforce_unique, - skip_push=skip_push, - user_id=user_id, - custom=custom, - user=user, + **{ + "type": type, + "copy_custom_to_notification": copy_custom_to_notification, + "create_notification_activity": create_notification_activity, + "enforce_unique": enforce_unique, + "skip_push": skip_push, + "user_id": user_id, + "custom": custom, + "user": user, + } ) return self.post( "/api/v2/feeds/activities/{activity_id}/reactions", @@ -343,7 +357,13 @@ def query_activity_reactions( "activity_id": activity_id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/feeds/activities/{activity_id}/reactions/query", @@ -361,7 +381,10 @@ def delete_activity_reaction( user_id: Optional[str] = None, ) -> StreamResponse[DeleteActivityReactionResponse]: query_params = build_query_param( - delete_notification_activity=delete_notification_activity, user_id=user_id + **{ + "delete_notification_activity": delete_notification_activity, + "user_id": user_id, + } ) path_params = { "activity_id": activity_id, @@ -382,8 +405,10 @@ def delete_activity( delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[DeleteActivityResponse]: query_params = build_query_param( - hard_delete=hard_delete, - delete_notification_activity=delete_notification_activity, + **{ + "hard_delete": hard_delete, + "delete_notification_activity": delete_notification_activity, + } ) path_params = { "id": id, @@ -422,13 +447,15 @@ def update_activity_partial( "id": id, } json = build_body_dict( - copy_custom_to_notification=copy_custom_to_notification, - handle_mention_notifications=handle_mention_notifications, - run_activity_processors=run_activity_processors, - user_id=user_id, - unset=unset, - set=set, - user=user, + **{ + "copy_custom_to_notification": copy_custom_to_notification, + "handle_mention_notifications": handle_mention_notifications, + "run_activity_processors": run_activity_processors, + "user_id": user_id, + "unset": unset, + "set": set, + "user": user, + } ) return self.patch( "/api/v2/feeds/activities/{id}", @@ -467,27 +494,29 @@ def update_activity( "id": id, } json = build_body_dict( - copy_custom_to_notification=copy_custom_to_notification, - expires_at=expires_at, - handle_mention_notifications=handle_mention_notifications, - poll_id=poll_id, - restrict_replies=restrict_replies, - run_activity_processors=run_activity_processors, - skip_enrich_url=skip_enrich_url, - text=text, - user_id=user_id, - visibility=visibility, - visibility_tag=visibility_tag, - attachments=attachments, - collection_refs=collection_refs, - feeds=feeds, - filter_tags=filter_tags, - interest_tags=interest_tags, - mentioned_user_ids=mentioned_user_ids, - custom=custom, - location=location, - search_data=search_data, - user=user, + **{ + "copy_custom_to_notification": copy_custom_to_notification, + "expires_at": expires_at, + "handle_mention_notifications": handle_mention_notifications, + "poll_id": poll_id, + "restrict_replies": restrict_replies, + "run_activity_processors": run_activity_processors, + "skip_enrich_url": skip_enrich_url, + "text": text, + "user_id": user_id, + "visibility": visibility, + "visibility_tag": visibility_tag, + "attachments": attachments, + "collection_refs": collection_refs, + "feeds": feeds, + "filter_tags": filter_tags, + "interest_tags": interest_tags, + "mentioned_user_ids": mentioned_user_ids, + "custom": custom, + "location": location, + "search_data": search_data, + "user": user, + } ) return self.put( "/api/v2/feeds/activities/{id}", @@ -503,7 +532,7 @@ def restore_activity( path_params = { "id": id, } - json = build_body_dict(user_id=user_id, user=user) + json = build_body_dict(**{"user_id": user_id, "user": user}) return self.post( "/api/v2/feeds/activities/{id}/restore", RestoreActivityResponse, @@ -521,7 +550,13 @@ def query_bookmark_folders( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryBookmarkFoldersResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/feeds/bookmark_folders/query", @@ -554,7 +589,9 @@ def update_bookmark_folder( path_params = { "folder_id": folder_id, } - json = build_body_dict(name=name, user_id=user_id, custom=custom, user=user) + json = build_body_dict( + **{"name": name, "user_id": user_id, "custom": custom, "user": user} + ) return self.patch( "/api/v2/feeds/bookmark_folders/{folder_id}", UpdateBookmarkFolderResponse, @@ -572,7 +609,13 @@ def query_bookmarks( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryBookmarksResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/feeds/bookmarks/query", QueryBookmarksResponse, json=json @@ -582,7 +625,7 @@ def query_bookmarks( def delete_collections( self, collection_refs: List[str] ) -> StreamResponse[DeleteCollectionsResponse]: - query_params = build_query_param(collection_refs=collection_refs) + query_params = build_query_param(**{"collection_refs": collection_refs}) return self.delete( "/api/v2/feeds/collections", DeleteCollectionsResponse, @@ -594,7 +637,7 @@ def read_collections( self, collection_refs: List[str], user_id: Optional[str] = None ) -> StreamResponse[ReadCollectionsResponse]: query_params = build_query_param( - collection_refs=collection_refs, user_id=user_id + **{"collection_refs": collection_refs, "user_id": user_id} ) return self.get( "/api/v2/feeds/collections", @@ -609,7 +652,9 @@ def update_collections( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UpdateCollectionsResponse]: - json = build_body_dict(collections=collections, user_id=user_id, user=user) + json = build_body_dict( + **{"collections": collections, "user_id": user_id, "user": user} + ) return self.patch( "/api/v2/feeds/collections", UpdateCollectionsResponse, json=json ) @@ -621,7 +666,9 @@ def create_collections( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CreateCollectionsResponse]: - json = build_body_dict(collections=collections, user_id=user_id, user=user) + json = build_body_dict( + **{"collections": collections, "user_id": user_id, "user": user} + ) return self.post( "/api/v2/feeds/collections", CreateCollectionsResponse, json=json ) @@ -630,7 +677,7 @@ def create_collections( def upsert_collections( self, collections: List[CollectionRequest] ) -> StreamResponse[UpsertCollectionsResponse]: - json = build_body_dict(collections=collections) + json = build_body_dict(**{"collections": collections}) return self.put( "/api/v2/feeds/collections", UpsertCollectionsResponse, json=json ) @@ -649,15 +696,17 @@ def get_comments( next: Optional[str] = None, ) -> StreamResponse[GetCommentsResponse]: query_params = build_query_param( - object_id=object_id, - object_type=object_type, - depth=depth, - sort=sort, - replies_limit=replies_limit, - user_id=user_id, - limit=limit, - prev=prev, - next=next, + **{ + "object_id": object_id, + "object_type": object_type, + "depth": depth, + "sort": sort, + "replies_limit": replies_limit, + "user_id": user_id, + "limit": limit, + "prev": prev, + "next": next, + } ) return self.get( "/api/v2/feeds/comments", GetCommentsResponse, query_params=query_params @@ -682,20 +731,22 @@ def add_comment( user: Optional[UserRequest] = None, ) -> StreamResponse[AddCommentResponse]: json = build_body_dict( - comment=comment, - copy_custom_to_notification=copy_custom_to_notification, - create_notification_activity=create_notification_activity, - id=id, - object_id=object_id, - object_type=object_type, - parent_id=parent_id, - skip_enrich_url=skip_enrich_url, - skip_push=skip_push, - user_id=user_id, - attachments=attachments, - mentioned_user_ids=mentioned_user_ids, - custom=custom, - user=user, + **{ + "comment": comment, + "copy_custom_to_notification": copy_custom_to_notification, + "create_notification_activity": create_notification_activity, + "id": id, + "object_id": object_id, + "object_type": object_type, + "parent_id": parent_id, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "user_id": user_id, + "attachments": attachments, + "mentioned_user_ids": mentioned_user_ids, + "custom": custom, + "user": user, + } ) return self.post("/api/v2/feeds/comments", AddCommentResponse, json=json) @@ -703,7 +754,7 @@ def add_comment( def add_comments_batch( self, comments: List[AddCommentRequest] ) -> StreamResponse[AddCommentsBatchResponse]: - json = build_body_dict(comments=comments) + json = build_body_dict(**{"comments": comments}) return self.post( "/api/v2/feeds/comments/batch", AddCommentsBatchResponse, json=json ) @@ -718,7 +769,13 @@ def query_comments( sort: Optional[str] = None, ) -> StreamResponse[QueryCommentsResponse]: json = build_body_dict( - filter=filter, limit=limit, next=next, prev=prev, sort=sort + **{ + "filter": filter, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + } ) return self.post( "/api/v2/feeds/comments/query", QueryCommentsResponse, json=json @@ -732,8 +789,10 @@ def delete_comment( delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[DeleteCommentResponse]: query_params = build_query_param( - hard_delete=hard_delete, - delete_notification_activity=delete_notification_activity, + **{ + "hard_delete": hard_delete, + "delete_notification_activity": delete_notification_activity, + } ) path_params = { "id": id, @@ -773,16 +832,18 @@ def update_comment( "id": id, } json = build_body_dict( - comment=comment, - copy_custom_to_notification=copy_custom_to_notification, - handle_mention_notifications=handle_mention_notifications, - skip_enrich_url=skip_enrich_url, - skip_push=skip_push, - user_id=user_id, - attachments=attachments, - mentioned_user_ids=mentioned_user_ids, - custom=custom, - user=user, + **{ + "comment": comment, + "copy_custom_to_notification": copy_custom_to_notification, + "handle_mention_notifications": handle_mention_notifications, + "skip_enrich_url": skip_enrich_url, + "skip_push": skip_push, + "user_id": user_id, + "attachments": attachments, + "mentioned_user_ids": mentioned_user_ids, + "custom": custom, + "user": user, + } ) return self.patch( "/api/v2/feeds/comments/{id}", @@ -808,14 +869,16 @@ def add_comment_reaction( "id": id, } json = build_body_dict( - type=type, - copy_custom_to_notification=copy_custom_to_notification, - create_notification_activity=create_notification_activity, - enforce_unique=enforce_unique, - skip_push=skip_push, - user_id=user_id, - custom=custom, - user=user, + **{ + "type": type, + "copy_custom_to_notification": copy_custom_to_notification, + "create_notification_activity": create_notification_activity, + "enforce_unique": enforce_unique, + "skip_push": skip_push, + "user_id": user_id, + "custom": custom, + "user": user, + } ) return self.post( "/api/v2/feeds/comments/{id}/reactions", @@ -838,7 +901,13 @@ def query_comment_reactions( "id": id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/feeds/comments/{id}/reactions/query", @@ -856,7 +925,10 @@ def delete_comment_reaction( user_id: Optional[str] = None, ) -> StreamResponse[DeleteCommentReactionResponse]: query_params = build_query_param( - delete_notification_activity=delete_notification_activity, user_id=user_id + **{ + "delete_notification_activity": delete_notification_activity, + "user_id": user_id, + } ) path_params = { "id": id, @@ -882,13 +954,15 @@ def get_comment_replies( next: Optional[str] = None, ) -> StreamResponse[GetCommentRepliesResponse]: query_params = build_query_param( - depth=depth, - sort=sort, - replies_limit=replies_limit, - user_id=user_id, - limit=limit, - prev=prev, - next=next, + **{ + "depth": depth, + "sort": sort, + "replies_limit": replies_limit, + "user_id": user_id, + "limit": limit, + "prev": prev, + "next": next, + } ) path_params = { "id": id, @@ -904,7 +978,9 @@ def get_comment_replies( def list_feed_groups( self, include_soft_deleted: Optional[bool] = None ) -> StreamResponse[ListFeedGroupsResponse]: - query_params = build_query_param(include_soft_deleted=include_soft_deleted) + query_params = build_query_param( + **{"include_soft_deleted": include_soft_deleted} + ) return self.get( "/api/v2/feeds/feed_groups", ListFeedGroupsResponse, @@ -926,16 +1002,18 @@ def create_feed_group( stories: Optional[StoriesConfig] = None, ) -> StreamResponse[CreateFeedGroupResponse]: json = build_body_dict( - id=id, - default_visibility=default_visibility, - activity_processors=activity_processors, - activity_selectors=activity_selectors, - aggregation=aggregation, - custom=custom, - notification=notification, - push_notification=push_notification, - ranking=ranking, - stories=stories, + **{ + "id": id, + "default_visibility": default_visibility, + "activity_processors": activity_processors, + "activity_selectors": activity_selectors, + "aggregation": aggregation, + "custom": custom, + "notification": notification, + "push_notification": push_notification, + "ranking": ranking, + "stories": stories, + } ) return self.post( "/api/v2/feeds/feed_groups", CreateFeedGroupResponse, json=json @@ -945,7 +1023,7 @@ def create_feed_group( def delete_feed( self, feed_group_id: str, feed_id: str, hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteFeedResponse]: - query_params = build_query_param(hard_delete=hard_delete) + query_params = build_query_param(**{"hard_delete": hard_delete}) path_params = { "feed_group_id": feed_group_id, "feed_id": feed_id, @@ -985,23 +1063,25 @@ def get_or_create_feed( "feed_id": feed_id, } json = build_body_dict( - id_around=id_around, - limit=limit, - next=next, - prev=prev, - user_id=user_id, - view=view, - watch=watch, - data=data, - enrichment_options=enrichment_options, - external_ranking=external_ranking, - filter=filter, - followers_pagination=followers_pagination, - following_pagination=following_pagination, - friend_reactions_options=friend_reactions_options, - interest_weights=interest_weights, - member_pagination=member_pagination, - user=user, + **{ + "id_around": id_around, + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "view": view, + "watch": watch, + "data": data, + "enrichment_options": enrichment_options, + "external_ranking": external_ranking, + "filter": filter, + "followers_pagination": followers_pagination, + "following_pagination": following_pagination, + "friend_reactions_options": friend_reactions_options, + "interest_weights": interest_weights, + "member_pagination": member_pagination, + "user": user, + } ) return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}", @@ -1026,11 +1106,13 @@ def update_feed( "feed_id": feed_id, } json = build_body_dict( - created_by_id=created_by_id, - description=description, - name=name, - filter_tags=filter_tags, - custom=custom, + **{ + "created_by_id": created_by_id, + "description": description, + "name": name, + "filter_tags": filter_tags, + "custom": custom, + } ) return self.put( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}", @@ -1057,13 +1139,15 @@ def mark_activity( "feed_id": feed_id, } json = build_body_dict( - mark_all_read=mark_all_read, - mark_all_seen=mark_all_seen, - user_id=user_id, - mark_read=mark_read, - mark_seen=mark_seen, - mark_watched=mark_watched, - user=user, + **{ + "mark_all_read": mark_all_read, + "mark_all_seen": mark_all_seen, + "user_id": user_id, + "mark_read": mark_read, + "mark_seen": mark_seen, + "mark_watched": mark_watched, + "user": user, + } ) return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/activities/mark/batch", @@ -1080,7 +1164,7 @@ def unpin_activity( activity_id: str, user_id: Optional[str] = None, ) -> StreamResponse[UnpinActivityResponse]: - query_params = build_query_param(user_id=user_id) + query_params = build_query_param(**{"user_id": user_id}) path_params = { "feed_group_id": feed_group_id, "feed_id": feed_id, @@ -1107,7 +1191,7 @@ def pin_activity( "feed_id": feed_id, "activity_id": activity_id, } - json = build_body_dict(user_id=user_id, user=user) + json = build_body_dict(**{"user_id": user_id, "user": user}) return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/activities/{activity_id}/pin", PinActivityResponse, @@ -1131,7 +1215,13 @@ def update_feed_members( "feed_id": feed_id, } json = build_body_dict( - operation=operation, limit=limit, next=next, prev=prev, members=members + **{ + "operation": operation, + "limit": limit, + "next": next, + "prev": prev, + "members": members, + } ) return self.patch( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members", @@ -1152,7 +1242,7 @@ def accept_feed_member_invite( "feed_id": feed_id, "feed_group_id": feed_group_id, } - json = build_body_dict(user_id=user_id, user=user) + json = build_body_dict(**{"user_id": user_id, "user": user}) return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members/accept", AcceptFeedMemberInviteResponse, @@ -1176,7 +1266,13 @@ def query_feed_members( "feed_id": feed_id, } json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members/query", @@ -1197,7 +1293,7 @@ def reject_feed_member_invite( "feed_group_id": feed_group_id, "feed_id": feed_id, } - json = build_body_dict(user_id=user_id, user=user) + json = build_body_dict(**{"user_id": user_id, "user": user}) return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members/reject", RejectFeedMemberInviteResponse, @@ -1212,7 +1308,7 @@ def get_follow_suggestions( limit: Optional[int] = None, user_id: Optional[str] = None, ) -> StreamResponse[GetFollowSuggestionsResponse]: - query_params = build_query_param(limit=limit, user_id=user_id) + query_params = build_query_param(**{"limit": limit, "user_id": user_id}) path_params = { "feed_group_id": feed_group_id, } @@ -1227,7 +1323,7 @@ def get_follow_suggestions( def delete_feed_group( self, id: str, hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteFeedGroupResponse]: - query_params = build_query_param(hard_delete=hard_delete) + query_params = build_query_param(**{"hard_delete": hard_delete}) path_params = { "id": id, } @@ -1242,7 +1338,9 @@ def delete_feed_group( def get_feed_group( self, id: str, include_soft_deleted: Optional[bool] = None ) -> StreamResponse[GetFeedGroupResponse]: - query_params = build_query_param(include_soft_deleted=include_soft_deleted) + query_params = build_query_param( + **{"include_soft_deleted": include_soft_deleted} + ) path_params = { "id": id, } @@ -1271,15 +1369,17 @@ def get_or_create_feed_group( "id": id, } json = build_body_dict( - default_visibility=default_visibility, - activity_processors=activity_processors, - activity_selectors=activity_selectors, - aggregation=aggregation, - custom=custom, - notification=notification, - push_notification=push_notification, - ranking=ranking, - stories=stories, + **{ + "default_visibility": default_visibility, + "activity_processors": activity_processors, + "activity_selectors": activity_selectors, + "aggregation": aggregation, + "custom": custom, + "notification": notification, + "push_notification": push_notification, + "ranking": ranking, + "stories": stories, + } ) return self.post( "/api/v2/feeds/feed_groups/{id}", @@ -1306,15 +1406,17 @@ def update_feed_group( "id": id, } json = build_body_dict( - default_visibility=default_visibility, - activity_processors=activity_processors, - activity_selectors=activity_selectors, - aggregation=aggregation, - custom=custom, - notification=notification, - push_notification=push_notification, - ranking=ranking, - stories=stories, + **{ + "default_visibility": default_visibility, + "activity_processors": activity_processors, + "activity_selectors": activity_selectors, + "aggregation": aggregation, + "custom": custom, + "notification": notification, + "push_notification": push_notification, + "ranking": ranking, + "stories": stories, + } ) return self.put( "/api/v2/feeds/feed_groups/{id}", @@ -1336,10 +1438,12 @@ def create_feed_view( ranking: Optional[RankingConfig] = None, ) -> StreamResponse[CreateFeedViewResponse]: json = build_body_dict( - id=id, - activity_selectors=activity_selectors, - aggregation=aggregation, - ranking=ranking, + **{ + "id": id, + "activity_selectors": activity_selectors, + "aggregation": aggregation, + "ranking": ranking, + } ) return self.post("/api/v2/feeds/feed_views", CreateFeedViewResponse, json=json) @@ -1377,9 +1481,11 @@ def get_or_create_feed_view( "id": id, } json = build_body_dict( - activity_selectors=activity_selectors, - aggregation=aggregation, - ranking=ranking, + **{ + "activity_selectors": activity_selectors, + "aggregation": aggregation, + "ranking": ranking, + } ) return self.post( "/api/v2/feeds/feed_views/{id}", @@ -1400,9 +1506,11 @@ def update_feed_view( "id": id, } json = build_body_dict( - activity_selectors=activity_selectors, - aggregation=aggregation, - ranking=ranking, + **{ + "activity_selectors": activity_selectors, + "aggregation": aggregation, + "ranking": ranking, + } ) return self.put( "/api/v2/feeds/feed_views/{id}", @@ -1435,7 +1543,7 @@ def update_feed_visibility( path_params = { "name": name, } - json = build_body_dict(grants=grants) + json = build_body_dict(**{"grants": grants}) return self.put( "/api/v2/feeds/feed_visibilities/{name}", UpdateFeedVisibilityResponse, @@ -1447,7 +1555,7 @@ def update_feed_visibility( def create_feeds_batch( self, feeds: List[FeedRequest] ) -> StreamResponse[CreateFeedsBatchResponse]: - json = build_body_dict(feeds=feeds) + json = build_body_dict(**{"feeds": feeds}) return self.post( "/api/v2/feeds/feeds/batch", CreateFeedsBatchResponse, json=json ) @@ -1456,7 +1564,7 @@ def create_feeds_batch( def delete_feeds_batch( self, feeds: List[str], hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteFeedsBatchResponse]: - json = build_body_dict(feeds=feeds, hard_delete=hard_delete) + json = build_body_dict(**{"feeds": feeds, "hard_delete": hard_delete}) return self.post( "/api/v2/feeds/feeds/delete", DeleteFeedsBatchResponse, json=json ) @@ -1469,7 +1577,9 @@ def own_batch( fields: Optional[List[str]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[OwnBatchResponse]: - json = build_body_dict(feeds=feeds, user_id=user_id, fields=fields, user=user) + json = build_body_dict( + **{"feeds": feeds, "user_id": user_id, "fields": fields, "user": user} + ) return self.post("/api/v2/feeds/feeds/own/batch", OwnBatchResponse, json=json) @telemetry.operation_name("getstream.api.feeds.query_feeds") @@ -1483,7 +1593,14 @@ def query_feeds( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryFeedsResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, watch=watch, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "watch": watch, + "sort": sort, + "filter": filter, + } ) return self.post("/api/v2/feeds/feeds/query", QueryFeedsResponse, json=json) @@ -1497,11 +1614,13 @@ def get_feeds_rate_limits( server_side: Optional[bool] = None, ) -> StreamResponse[GetFeedsRateLimitsResponse]: query_params = build_query_param( - endpoints=endpoints, - android=android, - ios=ios, - web=web, - server_side=server_side, + **{ + "endpoints": endpoints, + "android": android, + "ios": ios, + "web": web, + "server_side": server_side, + } ) return self.get( "/api/v2/feeds/feeds/rate_limits", @@ -1523,15 +1642,17 @@ def update_follow( custom: Optional[Dict[str, object]] = None, ) -> StreamResponse[UpdateFollowResponse]: json = build_body_dict( - source=source, - target=target, - copy_custom_to_notification=copy_custom_to_notification, - create_notification_activity=create_notification_activity, - follower_role=follower_role, - push_preference=push_preference, - skip_push=skip_push, - status=status, - custom=custom, + **{ + "source": source, + "target": target, + "copy_custom_to_notification": copy_custom_to_notification, + "create_notification_activity": create_notification_activity, + "follower_role": follower_role, + "push_preference": push_preference, + "skip_push": skip_push, + "status": status, + "custom": custom, + } ) return self.patch("/api/v2/feeds/follows", UpdateFollowResponse, json=json) @@ -1548,14 +1669,16 @@ def follow( custom: Optional[Dict[str, object]] = None, ) -> StreamResponse[SingleFollowResponse]: json = build_body_dict( - source=source, - target=target, - copy_custom_to_notification=copy_custom_to_notification, - create_notification_activity=create_notification_activity, - push_preference=push_preference, - skip_push=skip_push, - status=status, - custom=custom, + **{ + "source": source, + "target": target, + "copy_custom_to_notification": copy_custom_to_notification, + "create_notification_activity": create_notification_activity, + "push_preference": push_preference, + "skip_push": skip_push, + "status": status, + "custom": custom, + } ) return self.post("/api/v2/feeds/follows", SingleFollowResponse, json=json) @@ -1564,7 +1687,7 @@ def accept_follow( self, source: str, target: str, follower_role: Optional[str] = None ) -> StreamResponse[AcceptFollowResponse]: json = build_body_dict( - source=source, target=target, follower_role=follower_role + **{"source": source, "target": target, "follower_role": follower_role} ) return self.post( "/api/v2/feeds/follows/accept", AcceptFollowResponse, json=json @@ -1574,14 +1697,14 @@ def accept_follow( def follow_batch( self, follows: List[FollowRequest] ) -> StreamResponse[FollowBatchResponse]: - json = build_body_dict(follows=follows) + json = build_body_dict(**{"follows": follows}) return self.post("/api/v2/feeds/follows/batch", FollowBatchResponse, json=json) @telemetry.operation_name("getstream.api.feeds.get_or_create_follows") def get_or_create_follows( self, follows: List[FollowRequest] ) -> StreamResponse[FollowBatchResponse]: - json = build_body_dict(follows=follows) + json = build_body_dict(**{"follows": follows}) return self.post( "/api/v2/feeds/follows/batch/upsert", FollowBatchResponse, json=json ) @@ -1596,7 +1719,13 @@ def query_follows( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryFollowsResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post("/api/v2/feeds/follows/query", QueryFollowsResponse, json=json) @@ -1604,7 +1733,7 @@ def query_follows( def reject_follow( self, source: str, target: str ) -> StreamResponse[RejectFollowResponse]: - json = build_body_dict(source=source, target=target) + json = build_body_dict(**{"source": source, "target": target}) return self.post( "/api/v2/feeds/follows/reject", RejectFollowResponse, json=json ) @@ -1617,7 +1746,7 @@ def unfollow( delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[UnfollowResponse]: query_params = build_query_param( - delete_notification_activity=delete_notification_activity + **{"delete_notification_activity": delete_notification_activity} ) path_params = { "source": source, @@ -1641,12 +1770,14 @@ def create_membership_level( custom: Optional[Dict[str, object]] = None, ) -> StreamResponse[CreateMembershipLevelResponse]: json = build_body_dict( - id=id, - name=name, - description=description, - priority=priority, - tags=tags, - custom=custom, + **{ + "id": id, + "name": name, + "description": description, + "priority": priority, + "tags": tags, + "custom": custom, + } ) return self.post( "/api/v2/feeds/membership_levels", CreateMembershipLevelResponse, json=json @@ -1662,7 +1793,13 @@ def query_membership_levels( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryMembershipLevelsResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/feeds/membership_levels/query", @@ -1693,11 +1830,13 @@ def update_membership_level( "id": id, } json = build_body_dict( - description=description, - name=name, - priority=priority, - tags=tags, - custom=custom, + **{ + "description": description, + "name": name, + "priority": priority, + "tags": tags, + "custom": custom, + } ) return self.patch( "/api/v2/feeds/membership_levels/{id}", @@ -1710,7 +1849,7 @@ def update_membership_level( def query_feeds_usage_stats( self, _from: Optional[str] = None, to: Optional[str] = None ) -> StreamResponse[QueryFeedsUsageStatsResponse]: - json = build_body_dict(_from=_from, to=to) + json = build_body_dict(**{"from": _from, "to": to}) return self.post( "/api/v2/feeds/stats/usage", QueryFeedsUsageStatsResponse, json=json ) @@ -1722,7 +1861,10 @@ def unfollow_batch( delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[UnfollowBatchResponse]: json = build_body_dict( - follows=follows, delete_notification_activity=delete_notification_activity + **{ + "follows": follows, + "delete_notification_activity": delete_notification_activity, + } ) return self.post( "/api/v2/feeds/unfollow/batch", UnfollowBatchResponse, json=json @@ -1735,7 +1877,10 @@ def get_or_create_unfollows( delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[UnfollowBatchResponse]: json = build_body_dict( - follows=follows, delete_notification_activity=delete_notification_activity + **{ + "follows": follows, + "delete_notification_activity": delete_notification_activity, + } ) return self.post( "/api/v2/feeds/unfollow/batch/upsert", UnfollowBatchResponse, json=json @@ -1748,7 +1893,7 @@ def delete_feed_user_data( path_params = { "user_id": user_id, } - json = build_body_dict(hard_delete=hard_delete) + json = build_body_dict(**{"hard_delete": hard_delete}) return self.post( "/api/v2/feeds/users/{user_id}/delete", DeleteFeedUserDataResponse, diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index 48569d5c..2f0dacb0 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -1762,7 +1762,7 @@ class AsyncExportErrorEvent(DataClassJsonMixin): task_id: str = dc_field(metadata=dc_config(field_name="task_id")) custom: Dict[str, object] = dc_field(metadata=dc_config(field_name="custom")) type: str = dc_field( - default="export.users.error", metadata=dc_config(field_name="type") + default="export.moderation_logs.error", metadata=dc_config(field_name="type") ) received_at: Optional[datetime] = dc_field( default=None, diff --git a/getstream/moderation/async_rest_client.py b/getstream/moderation/async_rest_client.py index 75436ee6..fcb9bbb4 100644 --- a/getstream/moderation/async_rest_client.py +++ b/getstream/moderation/async_rest_client.py @@ -42,12 +42,14 @@ async def appeal( user: Optional[UserRequest] = None, ) -> StreamResponse[AppealResponse]: json = build_body_dict( - appeal_reason=appeal_reason, - entity_id=entity_id, - entity_type=entity_type, - user_id=user_id, - attachments=attachments, - user=user, + **{ + "appeal_reason": appeal_reason, + "entity_id": entity_id, + "entity_type": entity_type, + "user_id": user_id, + "attachments": attachments, + "user": user, + } ) return await self.post("/api/v2/moderation/appeal", AppealResponse, json=json) @@ -72,13 +74,15 @@ async def query_appeals( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryAppealsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/moderation/appeals", QueryAppealsResponse, json=json @@ -98,15 +102,17 @@ async def ban( banned_by: Optional[UserRequest] = None, ) -> StreamResponse[BanResponse]: json = build_body_dict( - target_user_id=target_user_id, - banned_by_id=banned_by_id, - channel_cid=channel_cid, - delete_messages=delete_messages, - ip_ban=ip_ban, - reason=reason, - shadow=shadow, - timeout=timeout, - banned_by=banned_by, + **{ + "target_user_id": target_user_id, + "banned_by_id": banned_by_id, + "channel_cid": channel_cid, + "delete_messages": delete_messages, + "ip_ban": ip_ban, + "reason": reason, + "shadow": shadow, + "timeout": timeout, + "banned_by": banned_by, + } ) return await self.post("/api/v2/moderation/ban", BanResponse, json=json) @@ -114,7 +120,7 @@ async def ban( async def bulk_image_moderation( self, csv_file: str ) -> StreamResponse[BulkImageModerationResponse]: - json = build_body_dict(csv_file=csv_file) + json = build_body_dict(**{"csv_file": csv_file}) return await self.post( "/api/v2/moderation/bulk_image_moderation", BulkImageModerationResponse, @@ -137,17 +143,19 @@ async def check( user: Optional[UserRequest] = None, ) -> StreamResponse[CheckResponse]: json = build_body_dict( - entity_creator_id=entity_creator_id, - entity_id=entity_id, - entity_type=entity_type, - config_key=config_key, - config_team=config_team, - test_mode=test_mode, - user_id=user_id, - config=config, - moderation_payload=moderation_payload, - options=options, - user=user, + **{ + "entity_creator_id": entity_creator_id, + "entity_id": entity_id, + "entity_type": entity_type, + "config_key": config_key, + "config_team": config_team, + "test_mode": test_mode, + "user_id": user_id, + "config": config, + "moderation_payload": moderation_payload, + "options": options, + "user": user, + } ) return await self.post("/api/v2/moderation/check", CheckResponse, json=json) @@ -177,25 +185,27 @@ async def upsert_config( video_call_rule_config: Optional[VideoCallRuleConfig] = None, ) -> StreamResponse[UpsertConfigResponse]: json = build_body_dict( - key=key, - _async=_async, - team=team, - user_id=user_id, - ai_image_config=ai_image_config, - ai_text_config=ai_text_config, - ai_video_config=ai_video_config, - automod_platform_circumvention_config=automod_platform_circumvention_config, - automod_semantic_filters_config=automod_semantic_filters_config, - automod_toxicity_config=automod_toxicity_config, - aws_rekognition_config=aws_rekognition_config, - block_list_config=block_list_config, - bodyguard_config=bodyguard_config, - google_vision_config=google_vision_config, - llm_config=llm_config, - rule_builder_config=rule_builder_config, - user=user, - velocity_filter_config=velocity_filter_config, - video_call_rule_config=video_call_rule_config, + **{ + "key": key, + "async": _async, + "team": team, + "user_id": user_id, + "ai_image_config": ai_image_config, + "ai_text_config": ai_text_config, + "ai_video_config": ai_video_config, + "automod_platform_circumvention_config": automod_platform_circumvention_config, + "automod_semantic_filters_config": automod_semantic_filters_config, + "automod_toxicity_config": automod_toxicity_config, + "aws_rekognition_config": aws_rekognition_config, + "block_list_config": block_list_config, + "bodyguard_config": bodyguard_config, + "google_vision_config": google_vision_config, + "llm_config": llm_config, + "rule_builder_config": rule_builder_config, + "user": user, + "velocity_filter_config": velocity_filter_config, + "video_call_rule_config": video_call_rule_config, + } ) return await self.post( "/api/v2/moderation/config", UpsertConfigResponse, json=json @@ -205,7 +215,7 @@ async def upsert_config( async def delete_config( self, key: str, team: Optional[str] = None ) -> StreamResponse[DeleteModerationConfigResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "key": key, } @@ -220,7 +230,7 @@ async def delete_config( async def get_config( self, key: str, team: Optional[str] = None ) -> StreamResponse[GetConfigResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "key": key, } @@ -243,13 +253,15 @@ async def query_moderation_configs( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationConfigsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/moderation/configs", QueryModerationConfigsResponse, json=json @@ -267,13 +279,15 @@ async def custom_check( user: Optional[UserRequest] = None, ) -> StreamResponse[CustomCheckResponse]: json = build_body_dict( - entity_id=entity_id, - entity_type=entity_type, - flags=flags, - entity_creator_id=entity_creator_id, - user_id=user_id, - moderation_payload=moderation_payload, - user=user, + **{ + "entity_id": entity_id, + "entity_type": entity_type, + "flags": flags, + "entity_creator_id": entity_creator_id, + "user_id": user_id, + "moderation_payload": moderation_payload, + "user": user, + } ) return await self.post( "/api/v2/moderation/custom_check", CustomCheckResponse, json=json @@ -301,7 +315,7 @@ async def v2_query_templates( async def v2_upsert_template( self, name: str, config: FeedsModerationTemplateConfigPayload ) -> StreamResponse[UpsertModerationTemplateResponse]: - json = build_body_dict(name=name, config=config) + json = build_body_dict(**{"name": name, "config": config}) return await self.post( "/api/v2/moderation/feeds_moderation_template", UpsertModerationTemplateResponse, @@ -321,14 +335,16 @@ async def flag( user: Optional[UserRequest] = None, ) -> StreamResponse[FlagResponse]: json = build_body_dict( - entity_id=entity_id, - entity_type=entity_type, - entity_creator_id=entity_creator_id, - reason=reason, - user_id=user_id, - custom=custom, - moderation_payload=moderation_payload, - user=user, + **{ + "entity_id": entity_id, + "entity_type": entity_type, + "entity_creator_id": entity_creator_id, + "reason": reason, + "user_id": user_id, + "custom": custom, + "moderation_payload": moderation_payload, + "user": user, + } ) return await self.post("/api/v2/moderation/flag", FlagResponse, json=json) @@ -342,7 +358,13 @@ async def query_moderation_flags( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryModerationFlagsResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return await self.post( "/api/v2/moderation/flags", QueryModerationFlagsResponse, json=json @@ -360,13 +382,15 @@ async def query_moderation_logs( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationLogsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/moderation/logs", QueryModerationLogsResponse, json=json @@ -389,18 +413,20 @@ async def upsert_moderation_rule( action: Optional[RuleBuilderAction] = None, ) -> StreamResponse[UpsertModerationRuleResponse]: json = build_body_dict( - name=name, - rule_type=rule_type, - cooldown_period=cooldown_period, - description=description, - enabled=enabled, - logic=logic, - team=team, - action_sequences=action_sequences, - conditions=conditions, - config_keys=config_keys, - groups=groups, - action=action, + **{ + "name": name, + "rule_type": rule_type, + "cooldown_period": cooldown_period, + "description": description, + "enabled": enabled, + "logic": logic, + "team": team, + "action_sequences": action_sequences, + "conditions": conditions, + "config_keys": config_keys, + "groups": groups, + "action": action, + } ) return await self.post( "/api/v2/moderation/moderation_rule", @@ -434,13 +460,15 @@ async def query_moderation_rules( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationRulesResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/moderation/moderation_rules", @@ -457,7 +485,12 @@ async def mute( user: Optional[UserRequest] = None, ) -> StreamResponse[MuteResponse]: json = build_body_dict( - target_ids=target_ids, timeout=timeout, user_id=user_id, user=user + **{ + "target_ids": target_ids, + "timeout": timeout, + "user_id": user_id, + "user": user, + } ) return await self.post("/api/v2/moderation/mute", MuteResponse, json=json) @@ -477,17 +510,19 @@ async def query_review_queue( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryReviewQueueResponse]: json = build_body_dict( - limit=limit, - lock_count=lock_count, - lock_duration=lock_duration, - lock_items=lock_items, - next=next, - prev=prev, - stats_only=stats_only, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "lock_count": lock_count, + "lock_duration": lock_duration, + "lock_items": lock_items, + "next": next, + "prev": prev, + "stats_only": stats_only, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return await self.post( "/api/v2/moderation/review_queue", QueryReviewQueueResponse, json=json @@ -531,26 +566,28 @@ async def submit_action( user: Optional[UserRequest] = None, ) -> StreamResponse[SubmitActionResponse]: json = build_body_dict( - action_type=action_type, - appeal_id=appeal_id, - item_id=item_id, - user_id=user_id, - ban=ban, - block=block, - custom=custom, - delete_activity=delete_activity, - delete_comment=delete_comment, - delete_message=delete_message, - delete_reaction=delete_reaction, - delete_user=delete_user, - flag=flag, - mark_reviewed=mark_reviewed, - reject_appeal=reject_appeal, - restore=restore, - shadow_block=shadow_block, - unban=unban, - unblock=unblock, - user=user, + **{ + "action_type": action_type, + "appeal_id": appeal_id, + "item_id": item_id, + "user_id": user_id, + "ban": ban, + "block": block, + "custom": custom, + "delete_activity": delete_activity, + "delete_comment": delete_comment, + "delete_message": delete_message, + "delete_reaction": delete_reaction, + "delete_user": delete_user, + "flag": flag, + "mark_reviewed": mark_reviewed, + "reject_appeal": reject_appeal, + "restore": restore, + "shadow_block": shadow_block, + "unban": unban, + "unblock": unblock, + "user": user, + } ) return await self.post( "/api/v2/moderation/submit_action", SubmitActionResponse, json=json @@ -566,11 +603,15 @@ async def unban( unbanned_by: Optional[UserRequest] = None, ) -> StreamResponse[UnbanResponse]: query_params = build_query_param( - target_user_id=target_user_id, - channel_cid=channel_cid, - created_by=created_by, + **{ + "target_user_id": target_user_id, + "channel_cid": channel_cid, + "created_by": created_by, + } + ) + json = build_body_dict( + **{"unbanned_by_id": unbanned_by_id, "unbanned_by": unbanned_by} ) - json = build_body_dict(unbanned_by_id=unbanned_by_id, unbanned_by=unbanned_by) return await self.post( "/api/v2/moderation/unban", UnbanResponse, @@ -585,5 +626,7 @@ async def unmute( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UnmuteResponse]: - json = build_body_dict(target_ids=target_ids, user_id=user_id, user=user) + json = build_body_dict( + **{"target_ids": target_ids, "user_id": user_id, "user": user} + ) return await self.post("/api/v2/moderation/unmute", UnmuteResponse, json=json) diff --git a/getstream/moderation/rest_client.py b/getstream/moderation/rest_client.py index 5ab706a2..f76fd4a4 100644 --- a/getstream/moderation/rest_client.py +++ b/getstream/moderation/rest_client.py @@ -42,12 +42,14 @@ def appeal( user: Optional[UserRequest] = None, ) -> StreamResponse[AppealResponse]: json = build_body_dict( - appeal_reason=appeal_reason, - entity_id=entity_id, - entity_type=entity_type, - user_id=user_id, - attachments=attachments, - user=user, + **{ + "appeal_reason": appeal_reason, + "entity_id": entity_id, + "entity_type": entity_type, + "user_id": user_id, + "attachments": attachments, + "user": user, + } ) return self.post("/api/v2/moderation/appeal", AppealResponse, json=json) @@ -72,13 +74,15 @@ def query_appeals( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryAppealsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post("/api/v2/moderation/appeals", QueryAppealsResponse, json=json) @@ -96,15 +100,17 @@ def ban( banned_by: Optional[UserRequest] = None, ) -> StreamResponse[BanResponse]: json = build_body_dict( - target_user_id=target_user_id, - banned_by_id=banned_by_id, - channel_cid=channel_cid, - delete_messages=delete_messages, - ip_ban=ip_ban, - reason=reason, - shadow=shadow, - timeout=timeout, - banned_by=banned_by, + **{ + "target_user_id": target_user_id, + "banned_by_id": banned_by_id, + "channel_cid": channel_cid, + "delete_messages": delete_messages, + "ip_ban": ip_ban, + "reason": reason, + "shadow": shadow, + "timeout": timeout, + "banned_by": banned_by, + } ) return self.post("/api/v2/moderation/ban", BanResponse, json=json) @@ -112,7 +118,7 @@ def ban( def bulk_image_moderation( self, csv_file: str ) -> StreamResponse[BulkImageModerationResponse]: - json = build_body_dict(csv_file=csv_file) + json = build_body_dict(**{"csv_file": csv_file}) return self.post( "/api/v2/moderation/bulk_image_moderation", BulkImageModerationResponse, @@ -135,17 +141,19 @@ def check( user: Optional[UserRequest] = None, ) -> StreamResponse[CheckResponse]: json = build_body_dict( - entity_creator_id=entity_creator_id, - entity_id=entity_id, - entity_type=entity_type, - config_key=config_key, - config_team=config_team, - test_mode=test_mode, - user_id=user_id, - config=config, - moderation_payload=moderation_payload, - options=options, - user=user, + **{ + "entity_creator_id": entity_creator_id, + "entity_id": entity_id, + "entity_type": entity_type, + "config_key": config_key, + "config_team": config_team, + "test_mode": test_mode, + "user_id": user_id, + "config": config, + "moderation_payload": moderation_payload, + "options": options, + "user": user, + } ) return self.post("/api/v2/moderation/check", CheckResponse, json=json) @@ -175,25 +183,27 @@ def upsert_config( video_call_rule_config: Optional[VideoCallRuleConfig] = None, ) -> StreamResponse[UpsertConfigResponse]: json = build_body_dict( - key=key, - _async=_async, - team=team, - user_id=user_id, - ai_image_config=ai_image_config, - ai_text_config=ai_text_config, - ai_video_config=ai_video_config, - automod_platform_circumvention_config=automod_platform_circumvention_config, - automod_semantic_filters_config=automod_semantic_filters_config, - automod_toxicity_config=automod_toxicity_config, - aws_rekognition_config=aws_rekognition_config, - block_list_config=block_list_config, - bodyguard_config=bodyguard_config, - google_vision_config=google_vision_config, - llm_config=llm_config, - rule_builder_config=rule_builder_config, - user=user, - velocity_filter_config=velocity_filter_config, - video_call_rule_config=video_call_rule_config, + **{ + "key": key, + "async": _async, + "team": team, + "user_id": user_id, + "ai_image_config": ai_image_config, + "ai_text_config": ai_text_config, + "ai_video_config": ai_video_config, + "automod_platform_circumvention_config": automod_platform_circumvention_config, + "automod_semantic_filters_config": automod_semantic_filters_config, + "automod_toxicity_config": automod_toxicity_config, + "aws_rekognition_config": aws_rekognition_config, + "block_list_config": block_list_config, + "bodyguard_config": bodyguard_config, + "google_vision_config": google_vision_config, + "llm_config": llm_config, + "rule_builder_config": rule_builder_config, + "user": user, + "velocity_filter_config": velocity_filter_config, + "video_call_rule_config": video_call_rule_config, + } ) return self.post("/api/v2/moderation/config", UpsertConfigResponse, json=json) @@ -201,7 +211,7 @@ def upsert_config( def delete_config( self, key: str, team: Optional[str] = None ) -> StreamResponse[DeleteModerationConfigResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "key": key, } @@ -216,7 +226,7 @@ def delete_config( def get_config( self, key: str, team: Optional[str] = None ) -> StreamResponse[GetConfigResponse]: - query_params = build_query_param(team=team) + query_params = build_query_param(**{"team": team}) path_params = { "key": key, } @@ -239,13 +249,15 @@ def query_moderation_configs( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationConfigsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post( "/api/v2/moderation/configs", QueryModerationConfigsResponse, json=json @@ -263,13 +275,15 @@ def custom_check( user: Optional[UserRequest] = None, ) -> StreamResponse[CustomCheckResponse]: json = build_body_dict( - entity_id=entity_id, - entity_type=entity_type, - flags=flags, - entity_creator_id=entity_creator_id, - user_id=user_id, - moderation_payload=moderation_payload, - user=user, + **{ + "entity_id": entity_id, + "entity_type": entity_type, + "flags": flags, + "entity_creator_id": entity_creator_id, + "user_id": user_id, + "moderation_payload": moderation_payload, + "user": user, + } ) return self.post( "/api/v2/moderation/custom_check", CustomCheckResponse, json=json @@ -295,7 +309,7 @@ def v2_query_templates( def v2_upsert_template( self, name: str, config: FeedsModerationTemplateConfigPayload ) -> StreamResponse[UpsertModerationTemplateResponse]: - json = build_body_dict(name=name, config=config) + json = build_body_dict(**{"name": name, "config": config}) return self.post( "/api/v2/moderation/feeds_moderation_template", UpsertModerationTemplateResponse, @@ -315,14 +329,16 @@ def flag( user: Optional[UserRequest] = None, ) -> StreamResponse[FlagResponse]: json = build_body_dict( - entity_id=entity_id, - entity_type=entity_type, - entity_creator_id=entity_creator_id, - reason=reason, - user_id=user_id, - custom=custom, - moderation_payload=moderation_payload, - user=user, + **{ + "entity_id": entity_id, + "entity_type": entity_type, + "entity_creator_id": entity_creator_id, + "reason": reason, + "user_id": user_id, + "custom": custom, + "moderation_payload": moderation_payload, + "user": user, + } ) return self.post("/api/v2/moderation/flag", FlagResponse, json=json) @@ -336,7 +352,13 @@ def query_moderation_flags( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryModerationFlagsResponse]: json = build_body_dict( - limit=limit, next=next, prev=prev, sort=sort, filter=filter + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter": filter, + } ) return self.post( "/api/v2/moderation/flags", QueryModerationFlagsResponse, json=json @@ -354,13 +376,15 @@ def query_moderation_logs( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationLogsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post( "/api/v2/moderation/logs", QueryModerationLogsResponse, json=json @@ -383,18 +407,20 @@ def upsert_moderation_rule( action: Optional[RuleBuilderAction] = None, ) -> StreamResponse[UpsertModerationRuleResponse]: json = build_body_dict( - name=name, - rule_type=rule_type, - cooldown_period=cooldown_period, - description=description, - enabled=enabled, - logic=logic, - team=team, - action_sequences=action_sequences, - conditions=conditions, - config_keys=config_keys, - groups=groups, - action=action, + **{ + "name": name, + "rule_type": rule_type, + "cooldown_period": cooldown_period, + "description": description, + "enabled": enabled, + "logic": logic, + "team": team, + "action_sequences": action_sequences, + "conditions": conditions, + "config_keys": config_keys, + "groups": groups, + "action": action, + } ) return self.post( "/api/v2/moderation/moderation_rule", @@ -426,13 +452,15 @@ def query_moderation_rules( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationRulesResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "next": next, + "prev": prev, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post( "/api/v2/moderation/moderation_rules", @@ -449,7 +477,12 @@ def mute( user: Optional[UserRequest] = None, ) -> StreamResponse[MuteResponse]: json = build_body_dict( - target_ids=target_ids, timeout=timeout, user_id=user_id, user=user + **{ + "target_ids": target_ids, + "timeout": timeout, + "user_id": user_id, + "user": user, + } ) return self.post("/api/v2/moderation/mute", MuteResponse, json=json) @@ -469,17 +502,19 @@ def query_review_queue( user: Optional[UserRequest] = None, ) -> StreamResponse[QueryReviewQueueResponse]: json = build_body_dict( - limit=limit, - lock_count=lock_count, - lock_duration=lock_duration, - lock_items=lock_items, - next=next, - prev=prev, - stats_only=stats_only, - user_id=user_id, - sort=sort, - filter=filter, - user=user, + **{ + "limit": limit, + "lock_count": lock_count, + "lock_duration": lock_duration, + "lock_items": lock_items, + "next": next, + "prev": prev, + "stats_only": stats_only, + "user_id": user_id, + "sort": sort, + "filter": filter, + "user": user, + } ) return self.post( "/api/v2/moderation/review_queue", QueryReviewQueueResponse, json=json @@ -523,26 +558,28 @@ def submit_action( user: Optional[UserRequest] = None, ) -> StreamResponse[SubmitActionResponse]: json = build_body_dict( - action_type=action_type, - appeal_id=appeal_id, - item_id=item_id, - user_id=user_id, - ban=ban, - block=block, - custom=custom, - delete_activity=delete_activity, - delete_comment=delete_comment, - delete_message=delete_message, - delete_reaction=delete_reaction, - delete_user=delete_user, - flag=flag, - mark_reviewed=mark_reviewed, - reject_appeal=reject_appeal, - restore=restore, - shadow_block=shadow_block, - unban=unban, - unblock=unblock, - user=user, + **{ + "action_type": action_type, + "appeal_id": appeal_id, + "item_id": item_id, + "user_id": user_id, + "ban": ban, + "block": block, + "custom": custom, + "delete_activity": delete_activity, + "delete_comment": delete_comment, + "delete_message": delete_message, + "delete_reaction": delete_reaction, + "delete_user": delete_user, + "flag": flag, + "mark_reviewed": mark_reviewed, + "reject_appeal": reject_appeal, + "restore": restore, + "shadow_block": shadow_block, + "unban": unban, + "unblock": unblock, + "user": user, + } ) return self.post( "/api/v2/moderation/submit_action", SubmitActionResponse, json=json @@ -558,11 +595,15 @@ def unban( unbanned_by: Optional[UserRequest] = None, ) -> StreamResponse[UnbanResponse]: query_params = build_query_param( - target_user_id=target_user_id, - channel_cid=channel_cid, - created_by=created_by, + **{ + "target_user_id": target_user_id, + "channel_cid": channel_cid, + "created_by": created_by, + } + ) + json = build_body_dict( + **{"unbanned_by_id": unbanned_by_id, "unbanned_by": unbanned_by} ) - json = build_body_dict(unbanned_by_id=unbanned_by_id, unbanned_by=unbanned_by) return self.post( "/api/v2/moderation/unban", UnbanResponse, @@ -577,5 +618,7 @@ def unmute( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UnmuteResponse]: - json = build_body_dict(target_ids=target_ids, user_id=user_id, user=user) + json = build_body_dict( + **{"target_ids": target_ids, "user_id": user_id, "user": user} + ) return self.post("/api/v2/moderation/unmute", UnmuteResponse, json=json) diff --git a/getstream/utils/__init__.py b/getstream/utils/__init__.py index 25756ecd..13ddfcbe 100644 --- a/getstream/utils/__init__.py +++ b/getstream/utils/__init__.py @@ -93,12 +93,22 @@ def datetime_from_unix_ns( raise TypeError(f"Unsupported type for ts: {type(ts)}") +def _serialize_query_value(value) -> str: + """Serialize a single value for use in a query parameter.""" + if hasattr(value, "to_json") and callable(value.to_json): + return value.to_json() + if isinstance(value, datetime): + return value.isoformat() + return str(value) + + def build_query_param(**kwargs): """ Constructs a dictionary of query parameters from keyword arguments. This function handles various data types: - JSON-serializable objects with a `to_json` method will be serialized using that method. + - datetime objects are converted to ISO 8601 strings. - Booleans are converted to lowercase strings. - Lists are converted to comma-separated strings with URL-encoded values. - Other types (strings, integers, dictionaries) are handled appropriately. @@ -115,13 +125,14 @@ def build_query_param(**kwargs): continue if hasattr(value, "to_json") and callable(value.to_json): params[key] = value.to_json() + elif isinstance(value, datetime): + params[key] = encode_datetime(value) elif isinstance(value, bool): params[key] = str(value).lower() elif isinstance(value, (str, int)): params[key] = str(value) elif isinstance(value, list): - # Process each element, escaping commas in the string representation - params[key] = ",".join(quote(str(v)) for v in value) + params[key] = ",".join(quote(_serialize_query_value(v)) for v in value) else: # For dictionaries or any other types of objects params[key] = json.dumps(value) diff --git a/getstream/video/async_rest_client.py b/getstream/video/async_rest_client.py index 82d36489..6a3580ed 100644 --- a/getstream/video/async_rest_client.py +++ b/getstream/video/async_rest_client.py @@ -49,13 +49,15 @@ async def query_user_feedback( sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryUserFeedbackResponse]: - query_params = build_query_param(full=full) + query_params = build_query_param(**{"full": full}) json = build_body_dict( - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return await self.post( "/api/v2/video/call/feedback", @@ -76,13 +78,15 @@ async def query_call_members( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallMembersResponse]: json = build_body_dict( - id=id, - type=type, - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "id": id, + "type": type, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return await self.post( "/api/v2/video/call/members", QueryCallMembersResponse, json=json @@ -98,11 +102,13 @@ async def query_call_stats( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallStatsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return await self.post( "/api/v2/video/call/stats", QueryCallStatsResponse, json=json @@ -119,7 +125,12 @@ async def get_call( video: Optional[bool] = None, ) -> StreamResponse[GetCallResponse]: query_params = build_query_param( - members_limit=members_limit, ring=ring, notify=notify, video=video + **{ + "members_limit": members_limit, + "ring": ring, + "notify": notify, + "video": video, + } ) path_params = { "type": type, @@ -146,7 +157,11 @@ async def update_call( "id": id, } json = build_body_dict( - starts_at=starts_at, custom=custom, settings_override=settings_override + **{ + "starts_at": starts_at, + "custom": custom, + "settings_override": settings_override, + } ) return await self.patch( "/api/v2/video/call/{type}/{id}", @@ -171,11 +186,13 @@ async def get_or_create_call( "id": id, } json = build_body_dict( - members_limit=members_limit, - notify=notify, - ring=ring, - video=video, - data=data, + **{ + "members_limit": members_limit, + "notify": notify, + "ring": ring, + "video": video, + "data": data, + } ) return await self.post( "/api/v2/video/call/{type}/{id}", @@ -192,7 +209,7 @@ async def block_user( "type": type, "id": id, } - json = build_body_dict(user_id=user_id) + json = build_body_dict(**{"user_id": user_id}) return await self.post( "/api/v2/video/call/{type}/{id}/block", BlockUserResponse, @@ -220,15 +237,17 @@ async def send_closed_caption( "id": id, } json = build_body_dict( - speaker_id=speaker_id, - text=text, - end_time=end_time, - language=language, - service=service, - start_time=start_time, - translated=translated, - user_id=user_id, - user=user, + **{ + "speaker_id": speaker_id, + "text": text, + "end_time": end_time, + "language": language, + "service": service, + "start_time": start_time, + "translated": translated, + "user_id": user_id, + "user": user, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/closed_captions", @@ -245,7 +264,7 @@ async def delete_call( "type": type, "id": id, } - json = build_body_dict(hard=hard) + json = build_body_dict(**{"hard": hard}) return await self.post( "/api/v2/video/call/{type}/{id}/delete", DeleteCallResponse, @@ -266,7 +285,7 @@ async def send_call_event( "type": type, "id": id, } - json = build_body_dict(user_id=user_id, custom=custom, user=user) + json = build_body_dict(**{"user_id": user_id, "custom": custom, "user": user}) return await self.post( "/api/v2/video/call/{type}/{id}/event", SendCallEventResponse, @@ -291,12 +310,14 @@ async def collect_user_feedback( "id": id, } json = build_body_dict( - rating=rating, - sdk=sdk, - sdk_version=sdk_version, - reason=reason, - user_session_id=user_session_id, - custom=custom, + **{ + "rating": rating, + "sdk": sdk, + "sdk_version": sdk_version, + "reason": reason, + "user_session_id": user_session_id, + "custom": custom, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/feedback", @@ -325,15 +346,17 @@ async def go_live( "id": id, } json = build_body_dict( - recording_storage_name=recording_storage_name, - start_closed_caption=start_closed_caption, - start_composite_recording=start_composite_recording, - start_hls=start_hls, - start_individual_recording=start_individual_recording, - start_raw_recording=start_raw_recording, - start_recording=start_recording, - start_transcription=start_transcription, - transcription_storage_name=transcription_storage_name, + **{ + "recording_storage_name": recording_storage_name, + "start_closed_caption": start_closed_caption, + "start_composite_recording": start_composite_recording, + "start_hls": start_hls, + "start_individual_recording": start_individual_recording, + "start_raw_recording": start_raw_recording, + "start_recording": start_recording, + "start_transcription": start_transcription, + "transcription_storage_name": transcription_storage_name, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/go_live", @@ -357,7 +380,12 @@ async def kick_user( "id": id, } json = build_body_dict( - user_id=user_id, block=block, kicked_by_id=kicked_by_id, kicked_by=kicked_by + **{ + "user_id": user_id, + "block": block, + "kicked_by_id": kicked_by_id, + "kicked_by": kicked_by, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/kick", @@ -391,7 +419,7 @@ async def update_call_members( "id": id, } json = build_body_dict( - remove_members=remove_members, update_members=update_members + **{"remove_members": remove_members, "update_members": update_members} ) return await self.post( "/api/v2/video/call/{type}/{id}/members", @@ -419,14 +447,16 @@ async def mute_users( "id": id, } json = build_body_dict( - audio=audio, - mute_all_users=mute_all_users, - muted_by_id=muted_by_id, - screenshare=screenshare, - screenshare_audio=screenshare_audio, - video=video, - user_ids=user_ids, - muted_by=muted_by, + **{ + "audio": audio, + "mute_all_users": mute_all_users, + "muted_by_id": muted_by_id, + "screenshare": screenshare, + "screenshare_audio": screenshare_audio, + "video": video, + "user_ids": user_ids, + "muted_by": muted_by, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/mute_users", @@ -443,12 +473,12 @@ async def query_call_participants( limit: Optional[int] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallParticipantsResponse]: - query_params = build_query_param(limit=limit) + query_params = build_query_param(**{"limit": limit}) path_params = { "id": id, "type": type, } - json = build_body_dict(filter_conditions=filter_conditions) + json = build_body_dict(**{"filter_conditions": filter_conditions}) return await self.post( "/api/v2/video/call/{type}/{id}/participants", QueryCallParticipantsResponse, @@ -465,7 +495,7 @@ async def video_pin( "type": type, "id": id, } - json = build_body_dict(session_id=session_id, user_id=user_id) + json = build_body_dict(**{"session_id": session_id, "user_id": user_id}) return await self.post( "/api/v2/video/call/{type}/{id}/pin", PinResponse, @@ -500,7 +530,9 @@ async def start_recording( "id": id, "recording_type": recording_type, } - json = build_body_dict(recording_external_storage=recording_external_storage) + json = build_body_dict( + **{"recording_external_storage": recording_external_storage} + ) return await self.post( "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/start", StartRecordingResponse, @@ -520,7 +552,7 @@ async def stop_recording( "id": id, "recording_type": recording_type, } - json = build_body_dict() + json = build_body_dict(**{}) return await self.post( "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/stop", StopRecordingResponse, @@ -532,7 +564,7 @@ async def stop_recording( async def get_call_report( self, type: str, id: str, session_id: Optional[str] = None ) -> StreamResponse[GetCallReportResponse]: - query_params = build_query_param(session_id=session_id) + query_params = build_query_param(**{"session_id": session_id}) path_params = { "type": type, "id": id, @@ -556,7 +588,7 @@ async def ring_call( "type": type, "id": id, } - json = build_body_dict(video=video, members_ids=members_ids) + json = build_body_dict(**{"video": video, "members_ids": members_ids}) return await self.post( "/api/v2/video/call/{type}/{id}/ring", RingCallResponse, @@ -572,7 +604,7 @@ async def start_rtmp_broadcasts( "type": type, "id": id, } - json = build_body_dict(broadcasts=broadcasts) + json = build_body_dict(**{"broadcasts": broadcasts}) return await self.post( "/api/v2/video/call/{type}/{id}/rtmp_broadcasts", StartRTMPBroadcastsResponse, @@ -606,7 +638,7 @@ async def stop_rtmp_broadcast( "id": id, "name": name, } - json = build_body_dict() + json = build_body_dict(**{}) return await self.post( "/api/v2/video/call/{type}/{id}/rtmp_broadcasts/{name}/stop", StopRTMPBroadcastsResponse, @@ -627,7 +659,7 @@ async def get_call_participant_session_metrics( since: Optional[datetime] = None, until: Optional[datetime] = None, ) -> StreamResponse[GetCallParticipantSessionMetricsResponse]: - query_params = build_query_param(since=since, until=until) + query_params = build_query_param(**{"since": since, "until": until}) path_params = { "type": type, "id": id, @@ -654,7 +686,12 @@ async def query_call_participant_sessions( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallParticipantSessionsResponse]: query_params = build_query_param( - limit=limit, prev=prev, next=next, filter_conditions=filter_conditions + **{ + "limit": limit, + "prev": prev, + "next": next, + "filter_conditions": filter_conditions, + } ) path_params = { "type": type, @@ -697,10 +734,12 @@ async def start_closed_captions( "id": id, } json = build_body_dict( - enable_transcription=enable_transcription, - external_storage=external_storage, - language=language, - speech_segment_config=speech_segment_config, + **{ + "enable_transcription": enable_transcription, + "external_storage": external_storage, + "language": language, + "speech_segment_config": speech_segment_config, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/start_closed_captions", @@ -717,7 +756,9 @@ async def start_frame_recording( "type": type, "id": id, } - json = build_body_dict(recording_external_storage=recording_external_storage) + json = build_body_dict( + **{"recording_external_storage": recording_external_storage} + ) return await self.post( "/api/v2/video/call/{type}/{id}/start_frame_recording", StartFrameRecordingResponse, @@ -739,9 +780,11 @@ async def start_transcription( "id": id, } json = build_body_dict( - enable_closed_captions=enable_closed_captions, - language=language, - transcription_external_storage=transcription_external_storage, + **{ + "enable_closed_captions": enable_closed_captions, + "language": language, + "transcription_external_storage": transcription_external_storage, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/start_transcription", @@ -772,7 +815,7 @@ async def stop_closed_captions( "type": type, "id": id, } - json = build_body_dict(stop_transcription=stop_transcription) + json = build_body_dict(**{"stop_transcription": stop_transcription}) return await self.post( "/api/v2/video/call/{type}/{id}/stop_closed_captions", StopClosedCaptionsResponse, @@ -813,14 +856,16 @@ async def stop_live( "id": id, } json = build_body_dict( - continue_closed_caption=continue_closed_caption, - continue_composite_recording=continue_composite_recording, - continue_hls=continue_hls, - continue_individual_recording=continue_individual_recording, - continue_raw_recording=continue_raw_recording, - continue_recording=continue_recording, - continue_rtmp_broadcasts=continue_rtmp_broadcasts, - continue_transcription=continue_transcription, + **{ + "continue_closed_caption": continue_closed_caption, + "continue_composite_recording": continue_composite_recording, + "continue_hls": continue_hls, + "continue_individual_recording": continue_individual_recording, + "continue_raw_recording": continue_raw_recording, + "continue_recording": continue_recording, + "continue_rtmp_broadcasts": continue_rtmp_broadcasts, + "continue_transcription": continue_transcription, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/stop_live", @@ -837,7 +882,7 @@ async def stop_transcription( "type": type, "id": id, } - json = build_body_dict(stop_closed_captions=stop_closed_captions) + json = build_body_dict(**{"stop_closed_captions": stop_closed_captions}) return await self.post( "/api/v2/video/call/{type}/{id}/stop_transcription", StopTranscriptionResponse, @@ -867,7 +912,7 @@ async def unblock_user( "type": type, "id": id, } - json = build_body_dict(user_id=user_id) + json = build_body_dict(**{"user_id": user_id}) return await self.post( "/api/v2/video/call/{type}/{id}/unblock", UnblockUserResponse, @@ -883,7 +928,7 @@ async def video_unpin( "type": type, "id": id, } - json = build_body_dict(session_id=session_id, user_id=user_id) + json = build_body_dict(**{"session_id": session_id, "user_id": user_id}) return await self.post( "/api/v2/video/call/{type}/{id}/unpin", UnpinResponse, @@ -905,9 +950,11 @@ async def update_user_permissions( "id": id, } json = build_body_dict( - user_id=user_id, - grant_permissions=grant_permissions, - revoke_permissions=revoke_permissions, + **{ + "user_id": user_id, + "grant_permissions": grant_permissions, + "revoke_permissions": revoke_permissions, + } ) return await self.post( "/api/v2/video/call/{type}/{id}/user_permissions", @@ -961,11 +1008,13 @@ async def get_call_stats_map( exclude_sfus: Optional[bool] = None, ) -> StreamResponse[QueryCallStatsMapResponse]: query_params = build_query_param( - start_time=start_time, - end_time=end_time, - exclude_publishers=exclude_publishers, - exclude_subscribers=exclude_subscribers, - exclude_sfus=exclude_sfus, + **{ + "start_time": start_time, + "end_time": end_time, + "exclude_publishers": exclude_publishers, + "exclude_subscribers": exclude_subscribers, + "exclude_sfus": exclude_sfus, + } ) path_params = { "call_type": call_type, @@ -994,7 +1043,7 @@ async def get_call_session_participant_stats_details( max_points: Optional[int] = None, ) -> StreamResponse[GetCallSessionParticipantStatsDetailsResponse]: query_params = build_query_param( - since=since, until=until, max_points=max_points + **{"since": since, "until": until, "max_points": max_points} ) path_params = { "call_type": call_type, @@ -1025,11 +1074,13 @@ async def query_call_session_participant_stats( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallSessionParticipantStatsResponse]: query_params = build_query_param( - limit=limit, - prev=prev, - next=next, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "prev": prev, + "next": next, + "sort": sort, + "filter_conditions": filter_conditions, + } ) path_params = { "call_type": call_type, @@ -1058,7 +1109,7 @@ async def get_call_session_participant_stats_timeline( severity: Optional[List[str]] = None, ) -> StreamResponse[QueryCallSessionParticipantStatsTimelineResponse]: query_params = build_query_param( - start_time=start_time, end_time=end_time, severity=severity + **{"start_time": start_time, "end_time": end_time, "severity": severity} ) path_params = { "call_type": call_type, @@ -1084,11 +1135,13 @@ async def query_calls( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return await self.post("/api/v2/video/calls", QueryCallsResponse, json=json) @@ -1106,11 +1159,13 @@ async def create_call_type( settings: Optional[CallSettingsRequest] = None, ) -> StreamResponse[CreateCallTypeResponse]: json = build_body_dict( - name=name, - external_storage=external_storage, - grants=grants, - notification_settings=notification_settings, - settings=settings, + **{ + "name": name, + "external_storage": external_storage, + "grants": grants, + "notification_settings": notification_settings, + "settings": settings, + } ) return await self.post( "/api/v2/video/calltypes", CreateCallTypeResponse, json=json @@ -1149,10 +1204,12 @@ async def update_call_type( "name": name, } json = build_body_dict( - external_storage=external_storage, - grants=grants, - notification_settings=notification_settings, - settings=settings, + **{ + "external_storage": external_storage, + "grants": grants, + "notification_settings": notification_settings, + "settings": settings, + } ) return await self.put( "/api/v2/video/calltypes/{name}", @@ -1187,15 +1244,17 @@ async def create_sip_inbound_routing_rule( pin_routing_configs: Optional[SIPInboundRoutingRulePinConfigsRequest] = None, ) -> StreamResponse[SIPInboundRoutingRuleResponse]: json = build_body_dict( - name=name, - trunk_ids=trunk_ids, - caller_configs=caller_configs, - called_numbers=called_numbers, - caller_numbers=caller_numbers, - call_configs=call_configs, - direct_routing_configs=direct_routing_configs, - pin_protection_configs=pin_protection_configs, - pin_routing_configs=pin_routing_configs, + **{ + "name": name, + "trunk_ids": trunk_ids, + "caller_configs": caller_configs, + "called_numbers": called_numbers, + "caller_numbers": caller_numbers, + "call_configs": call_configs, + "direct_routing_configs": direct_routing_configs, + "pin_protection_configs": pin_protection_configs, + "pin_routing_configs": pin_routing_configs, + } ) return await self.post( "/api/v2/video/sip/inbound_routing_rules", @@ -1234,15 +1293,17 @@ async def update_sip_inbound_routing_rule( "id": id, } json = build_body_dict( - name=name, - called_numbers=called_numbers, - trunk_ids=trunk_ids, - caller_configs=caller_configs, - caller_numbers=caller_numbers, - call_configs=call_configs, - direct_routing_configs=direct_routing_configs, - pin_protection_configs=pin_protection_configs, - pin_routing_configs=pin_routing_configs, + **{ + "name": name, + "called_numbers": called_numbers, + "trunk_ids": trunk_ids, + "caller_configs": caller_configs, + "caller_numbers": caller_numbers, + "call_configs": call_configs, + "direct_routing_configs": direct_routing_configs, + "pin_protection_configs": pin_protection_configs, + "pin_routing_configs": pin_routing_configs, + } ) return await self.put( "/api/v2/video/sip/inbound_routing_rules/{id}", @@ -1259,7 +1320,7 @@ async def list_sip_trunks(self) -> StreamResponse[ListSIPTrunksResponse]: async def create_sip_trunk( self, name: str, numbers: List[str] ) -> StreamResponse[CreateSIPTrunkResponse]: - json = build_body_dict(name=name, numbers=numbers) + json = build_body_dict(**{"name": name, "numbers": numbers}) return await self.post( "/api/v2/video/sip/inbound_trunks", CreateSIPTrunkResponse, json=json ) @@ -1282,7 +1343,7 @@ async def update_sip_trunk( path_params = { "id": id, } - json = build_body_dict(name=name, numbers=numbers) + json = build_body_dict(**{"name": name, "numbers": numbers}) return await self.put( "/api/v2/video/sip/inbound_trunks/{id}", UpdateSIPTrunkResponse, @@ -1300,11 +1361,13 @@ async def resolve_sip_inbound( sip_headers: Optional[Dict[str, str]] = None, ) -> StreamResponse[ResolveSipInboundResponse]: json = build_body_dict( - sip_caller_number=sip_caller_number, - sip_trunk_number=sip_trunk_number, - challenge=challenge, - routing_number=routing_number, - sip_headers=sip_headers, + **{ + "sip_caller_number": sip_caller_number, + "sip_trunk_number": sip_trunk_number, + "challenge": challenge, + "routing_number": routing_number, + "sip_headers": sip_headers, + } ) return await self.post( "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json @@ -1317,7 +1380,9 @@ async def query_aggregate_call_stats( to: Optional[str] = None, report_types: Optional[List[str]] = None, ) -> StreamResponse[QueryAggregateCallStatsResponse]: - json = build_body_dict(_from=_from, to=to, report_types=report_types) + json = build_body_dict( + **{"from": _from, "to": to, "report_types": report_types} + ) return await self.post( "/api/v2/video/stats", QueryAggregateCallStatsResponse, json=json ) diff --git a/getstream/video/rest_client.py b/getstream/video/rest_client.py index 45e46e3b..c13881e3 100644 --- a/getstream/video/rest_client.py +++ b/getstream/video/rest_client.py @@ -47,13 +47,15 @@ def query_user_feedback( sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryUserFeedbackResponse]: - query_params = build_query_param(full=full) + query_params = build_query_param(**{"full": full}) json = build_body_dict( - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return self.post( "/api/v2/video/call/feedback", @@ -74,13 +76,15 @@ def query_call_members( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallMembersResponse]: json = build_body_dict( - id=id, - type=type, - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "id": id, + "type": type, + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return self.post( "/api/v2/video/call/members", QueryCallMembersResponse, json=json @@ -96,11 +100,13 @@ def query_call_stats( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallStatsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return self.post("/api/v2/video/call/stats", QueryCallStatsResponse, json=json) @@ -115,7 +121,12 @@ def get_call( video: Optional[bool] = None, ) -> StreamResponse[GetCallResponse]: query_params = build_query_param( - members_limit=members_limit, ring=ring, notify=notify, video=video + **{ + "members_limit": members_limit, + "ring": ring, + "notify": notify, + "video": video, + } ) path_params = { "type": type, @@ -142,7 +153,11 @@ def update_call( "id": id, } json = build_body_dict( - starts_at=starts_at, custom=custom, settings_override=settings_override + **{ + "starts_at": starts_at, + "custom": custom, + "settings_override": settings_override, + } ) return self.patch( "/api/v2/video/call/{type}/{id}", @@ -167,11 +182,13 @@ def get_or_create_call( "id": id, } json = build_body_dict( - members_limit=members_limit, - notify=notify, - ring=ring, - video=video, - data=data, + **{ + "members_limit": members_limit, + "notify": notify, + "ring": ring, + "video": video, + "data": data, + } ) return self.post( "/api/v2/video/call/{type}/{id}", @@ -188,7 +205,7 @@ def block_user( "type": type, "id": id, } - json = build_body_dict(user_id=user_id) + json = build_body_dict(**{"user_id": user_id}) return self.post( "/api/v2/video/call/{type}/{id}/block", BlockUserResponse, @@ -216,15 +233,17 @@ def send_closed_caption( "id": id, } json = build_body_dict( - speaker_id=speaker_id, - text=text, - end_time=end_time, - language=language, - service=service, - start_time=start_time, - translated=translated, - user_id=user_id, - user=user, + **{ + "speaker_id": speaker_id, + "text": text, + "end_time": end_time, + "language": language, + "service": service, + "start_time": start_time, + "translated": translated, + "user_id": user_id, + "user": user, + } ) return self.post( "/api/v2/video/call/{type}/{id}/closed_captions", @@ -241,7 +260,7 @@ def delete_call( "type": type, "id": id, } - json = build_body_dict(hard=hard) + json = build_body_dict(**{"hard": hard}) return self.post( "/api/v2/video/call/{type}/{id}/delete", DeleteCallResponse, @@ -262,7 +281,7 @@ def send_call_event( "type": type, "id": id, } - json = build_body_dict(user_id=user_id, custom=custom, user=user) + json = build_body_dict(**{"user_id": user_id, "custom": custom, "user": user}) return self.post( "/api/v2/video/call/{type}/{id}/event", SendCallEventResponse, @@ -287,12 +306,14 @@ def collect_user_feedback( "id": id, } json = build_body_dict( - rating=rating, - sdk=sdk, - sdk_version=sdk_version, - reason=reason, - user_session_id=user_session_id, - custom=custom, + **{ + "rating": rating, + "sdk": sdk, + "sdk_version": sdk_version, + "reason": reason, + "user_session_id": user_session_id, + "custom": custom, + } ) return self.post( "/api/v2/video/call/{type}/{id}/feedback", @@ -321,15 +342,17 @@ def go_live( "id": id, } json = build_body_dict( - recording_storage_name=recording_storage_name, - start_closed_caption=start_closed_caption, - start_composite_recording=start_composite_recording, - start_hls=start_hls, - start_individual_recording=start_individual_recording, - start_raw_recording=start_raw_recording, - start_recording=start_recording, - start_transcription=start_transcription, - transcription_storage_name=transcription_storage_name, + **{ + "recording_storage_name": recording_storage_name, + "start_closed_caption": start_closed_caption, + "start_composite_recording": start_composite_recording, + "start_hls": start_hls, + "start_individual_recording": start_individual_recording, + "start_raw_recording": start_raw_recording, + "start_recording": start_recording, + "start_transcription": start_transcription, + "transcription_storage_name": transcription_storage_name, + } ) return self.post( "/api/v2/video/call/{type}/{id}/go_live", @@ -353,7 +376,12 @@ def kick_user( "id": id, } json = build_body_dict( - user_id=user_id, block=block, kicked_by_id=kicked_by_id, kicked_by=kicked_by + **{ + "user_id": user_id, + "block": block, + "kicked_by_id": kicked_by_id, + "kicked_by": kicked_by, + } ) return self.post( "/api/v2/video/call/{type}/{id}/kick", @@ -387,7 +415,7 @@ def update_call_members( "id": id, } json = build_body_dict( - remove_members=remove_members, update_members=update_members + **{"remove_members": remove_members, "update_members": update_members} ) return self.post( "/api/v2/video/call/{type}/{id}/members", @@ -415,14 +443,16 @@ def mute_users( "id": id, } json = build_body_dict( - audio=audio, - mute_all_users=mute_all_users, - muted_by_id=muted_by_id, - screenshare=screenshare, - screenshare_audio=screenshare_audio, - video=video, - user_ids=user_ids, - muted_by=muted_by, + **{ + "audio": audio, + "mute_all_users": mute_all_users, + "muted_by_id": muted_by_id, + "screenshare": screenshare, + "screenshare_audio": screenshare_audio, + "video": video, + "user_ids": user_ids, + "muted_by": muted_by, + } ) return self.post( "/api/v2/video/call/{type}/{id}/mute_users", @@ -439,12 +469,12 @@ def query_call_participants( limit: Optional[int] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallParticipantsResponse]: - query_params = build_query_param(limit=limit) + query_params = build_query_param(**{"limit": limit}) path_params = { "id": id, "type": type, } - json = build_body_dict(filter_conditions=filter_conditions) + json = build_body_dict(**{"filter_conditions": filter_conditions}) return self.post( "/api/v2/video/call/{type}/{id}/participants", QueryCallParticipantsResponse, @@ -461,7 +491,7 @@ def video_pin( "type": type, "id": id, } - json = build_body_dict(session_id=session_id, user_id=user_id) + json = build_body_dict(**{"session_id": session_id, "user_id": user_id}) return self.post( "/api/v2/video/call/{type}/{id}/pin", PinResponse, @@ -496,7 +526,9 @@ def start_recording( "id": id, "recording_type": recording_type, } - json = build_body_dict(recording_external_storage=recording_external_storage) + json = build_body_dict( + **{"recording_external_storage": recording_external_storage} + ) return self.post( "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/start", StartRecordingResponse, @@ -516,7 +548,7 @@ def stop_recording( "id": id, "recording_type": recording_type, } - json = build_body_dict() + json = build_body_dict(**{}) return self.post( "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/stop", StopRecordingResponse, @@ -528,7 +560,7 @@ def stop_recording( def get_call_report( self, type: str, id: str, session_id: Optional[str] = None ) -> StreamResponse[GetCallReportResponse]: - query_params = build_query_param(session_id=session_id) + query_params = build_query_param(**{"session_id": session_id}) path_params = { "type": type, "id": id, @@ -552,7 +584,7 @@ def ring_call( "type": type, "id": id, } - json = build_body_dict(video=video, members_ids=members_ids) + json = build_body_dict(**{"video": video, "members_ids": members_ids}) return self.post( "/api/v2/video/call/{type}/{id}/ring", RingCallResponse, @@ -568,7 +600,7 @@ def start_rtmp_broadcasts( "type": type, "id": id, } - json = build_body_dict(broadcasts=broadcasts) + json = build_body_dict(**{"broadcasts": broadcasts}) return self.post( "/api/v2/video/call/{type}/{id}/rtmp_broadcasts", StartRTMPBroadcastsResponse, @@ -602,7 +634,7 @@ def stop_rtmp_broadcast( "id": id, "name": name, } - json = build_body_dict() + json = build_body_dict(**{}) return self.post( "/api/v2/video/call/{type}/{id}/rtmp_broadcasts/{name}/stop", StopRTMPBroadcastsResponse, @@ -623,7 +655,7 @@ def get_call_participant_session_metrics( since: Optional[datetime] = None, until: Optional[datetime] = None, ) -> StreamResponse[GetCallParticipantSessionMetricsResponse]: - query_params = build_query_param(since=since, until=until) + query_params = build_query_param(**{"since": since, "until": until}) path_params = { "type": type, "id": id, @@ -650,7 +682,12 @@ def query_call_participant_sessions( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallParticipantSessionsResponse]: query_params = build_query_param( - limit=limit, prev=prev, next=next, filter_conditions=filter_conditions + **{ + "limit": limit, + "prev": prev, + "next": next, + "filter_conditions": filter_conditions, + } ) path_params = { "type": type, @@ -693,10 +730,12 @@ def start_closed_captions( "id": id, } json = build_body_dict( - enable_transcription=enable_transcription, - external_storage=external_storage, - language=language, - speech_segment_config=speech_segment_config, + **{ + "enable_transcription": enable_transcription, + "external_storage": external_storage, + "language": language, + "speech_segment_config": speech_segment_config, + } ) return self.post( "/api/v2/video/call/{type}/{id}/start_closed_captions", @@ -713,7 +752,9 @@ def start_frame_recording( "type": type, "id": id, } - json = build_body_dict(recording_external_storage=recording_external_storage) + json = build_body_dict( + **{"recording_external_storage": recording_external_storage} + ) return self.post( "/api/v2/video/call/{type}/{id}/start_frame_recording", StartFrameRecordingResponse, @@ -735,9 +776,11 @@ def start_transcription( "id": id, } json = build_body_dict( - enable_closed_captions=enable_closed_captions, - language=language, - transcription_external_storage=transcription_external_storage, + **{ + "enable_closed_captions": enable_closed_captions, + "language": language, + "transcription_external_storage": transcription_external_storage, + } ) return self.post( "/api/v2/video/call/{type}/{id}/start_transcription", @@ -768,7 +811,7 @@ def stop_closed_captions( "type": type, "id": id, } - json = build_body_dict(stop_transcription=stop_transcription) + json = build_body_dict(**{"stop_transcription": stop_transcription}) return self.post( "/api/v2/video/call/{type}/{id}/stop_closed_captions", StopClosedCaptionsResponse, @@ -809,14 +852,16 @@ def stop_live( "id": id, } json = build_body_dict( - continue_closed_caption=continue_closed_caption, - continue_composite_recording=continue_composite_recording, - continue_hls=continue_hls, - continue_individual_recording=continue_individual_recording, - continue_raw_recording=continue_raw_recording, - continue_recording=continue_recording, - continue_rtmp_broadcasts=continue_rtmp_broadcasts, - continue_transcription=continue_transcription, + **{ + "continue_closed_caption": continue_closed_caption, + "continue_composite_recording": continue_composite_recording, + "continue_hls": continue_hls, + "continue_individual_recording": continue_individual_recording, + "continue_raw_recording": continue_raw_recording, + "continue_recording": continue_recording, + "continue_rtmp_broadcasts": continue_rtmp_broadcasts, + "continue_transcription": continue_transcription, + } ) return self.post( "/api/v2/video/call/{type}/{id}/stop_live", @@ -833,7 +878,7 @@ def stop_transcription( "type": type, "id": id, } - json = build_body_dict(stop_closed_captions=stop_closed_captions) + json = build_body_dict(**{"stop_closed_captions": stop_closed_captions}) return self.post( "/api/v2/video/call/{type}/{id}/stop_transcription", StopTranscriptionResponse, @@ -863,7 +908,7 @@ def unblock_user( "type": type, "id": id, } - json = build_body_dict(user_id=user_id) + json = build_body_dict(**{"user_id": user_id}) return self.post( "/api/v2/video/call/{type}/{id}/unblock", UnblockUserResponse, @@ -879,7 +924,7 @@ def video_unpin( "type": type, "id": id, } - json = build_body_dict(session_id=session_id, user_id=user_id) + json = build_body_dict(**{"session_id": session_id, "user_id": user_id}) return self.post( "/api/v2/video/call/{type}/{id}/unpin", UnpinResponse, @@ -901,9 +946,11 @@ def update_user_permissions( "id": id, } json = build_body_dict( - user_id=user_id, - grant_permissions=grant_permissions, - revoke_permissions=revoke_permissions, + **{ + "user_id": user_id, + "grant_permissions": grant_permissions, + "revoke_permissions": revoke_permissions, + } ) return self.post( "/api/v2/video/call/{type}/{id}/user_permissions", @@ -957,11 +1004,13 @@ def get_call_stats_map( exclude_sfus: Optional[bool] = None, ) -> StreamResponse[QueryCallStatsMapResponse]: query_params = build_query_param( - start_time=start_time, - end_time=end_time, - exclude_publishers=exclude_publishers, - exclude_subscribers=exclude_subscribers, - exclude_sfus=exclude_sfus, + **{ + "start_time": start_time, + "end_time": end_time, + "exclude_publishers": exclude_publishers, + "exclude_subscribers": exclude_subscribers, + "exclude_sfus": exclude_sfus, + } ) path_params = { "call_type": call_type, @@ -990,7 +1039,7 @@ def get_call_session_participant_stats_details( max_points: Optional[int] = None, ) -> StreamResponse[GetCallSessionParticipantStatsDetailsResponse]: query_params = build_query_param( - since=since, until=until, max_points=max_points + **{"since": since, "until": until, "max_points": max_points} ) path_params = { "call_type": call_type, @@ -1021,11 +1070,13 @@ def query_call_session_participant_stats( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallSessionParticipantStatsResponse]: query_params = build_query_param( - limit=limit, - prev=prev, - next=next, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "prev": prev, + "next": next, + "sort": sort, + "filter_conditions": filter_conditions, + } ) path_params = { "call_type": call_type, @@ -1054,7 +1105,7 @@ def get_call_session_participant_stats_timeline( severity: Optional[List[str]] = None, ) -> StreamResponse[QueryCallSessionParticipantStatsTimelineResponse]: query_params = build_query_param( - start_time=start_time, end_time=end_time, severity=severity + **{"start_time": start_time, "end_time": end_time, "severity": severity} ) path_params = { "call_type": call_type, @@ -1080,11 +1131,13 @@ def query_calls( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallsResponse]: json = build_body_dict( - limit=limit, - next=next, - prev=prev, - sort=sort, - filter_conditions=filter_conditions, + **{ + "limit": limit, + "next": next, + "prev": prev, + "sort": sort, + "filter_conditions": filter_conditions, + } ) return self.post("/api/v2/video/calls", QueryCallsResponse, json=json) @@ -1102,11 +1155,13 @@ def create_call_type( settings: Optional[CallSettingsRequest] = None, ) -> StreamResponse[CreateCallTypeResponse]: json = build_body_dict( - name=name, - external_storage=external_storage, - grants=grants, - notification_settings=notification_settings, - settings=settings, + **{ + "name": name, + "external_storage": external_storage, + "grants": grants, + "notification_settings": notification_settings, + "settings": settings, + } ) return self.post("/api/v2/video/calltypes", CreateCallTypeResponse, json=json) @@ -1143,10 +1198,12 @@ def update_call_type( "name": name, } json = build_body_dict( - external_storage=external_storage, - grants=grants, - notification_settings=notification_settings, - settings=settings, + **{ + "external_storage": external_storage, + "grants": grants, + "notification_settings": notification_settings, + "settings": settings, + } ) return self.put( "/api/v2/video/calltypes/{name}", @@ -1181,15 +1238,17 @@ def create_sip_inbound_routing_rule( pin_routing_configs: Optional[SIPInboundRoutingRulePinConfigsRequest] = None, ) -> StreamResponse[SIPInboundRoutingRuleResponse]: json = build_body_dict( - name=name, - trunk_ids=trunk_ids, - caller_configs=caller_configs, - called_numbers=called_numbers, - caller_numbers=caller_numbers, - call_configs=call_configs, - direct_routing_configs=direct_routing_configs, - pin_protection_configs=pin_protection_configs, - pin_routing_configs=pin_routing_configs, + **{ + "name": name, + "trunk_ids": trunk_ids, + "caller_configs": caller_configs, + "called_numbers": called_numbers, + "caller_numbers": caller_numbers, + "call_configs": call_configs, + "direct_routing_configs": direct_routing_configs, + "pin_protection_configs": pin_protection_configs, + "pin_routing_configs": pin_routing_configs, + } ) return self.post( "/api/v2/video/sip/inbound_routing_rules", @@ -1228,15 +1287,17 @@ def update_sip_inbound_routing_rule( "id": id, } json = build_body_dict( - name=name, - called_numbers=called_numbers, - trunk_ids=trunk_ids, - caller_configs=caller_configs, - caller_numbers=caller_numbers, - call_configs=call_configs, - direct_routing_configs=direct_routing_configs, - pin_protection_configs=pin_protection_configs, - pin_routing_configs=pin_routing_configs, + **{ + "name": name, + "called_numbers": called_numbers, + "trunk_ids": trunk_ids, + "caller_configs": caller_configs, + "caller_numbers": caller_numbers, + "call_configs": call_configs, + "direct_routing_configs": direct_routing_configs, + "pin_protection_configs": pin_protection_configs, + "pin_routing_configs": pin_routing_configs, + } ) return self.put( "/api/v2/video/sip/inbound_routing_rules/{id}", @@ -1253,7 +1314,7 @@ def list_sip_trunks(self) -> StreamResponse[ListSIPTrunksResponse]: def create_sip_trunk( self, name: str, numbers: List[str] ) -> StreamResponse[CreateSIPTrunkResponse]: - json = build_body_dict(name=name, numbers=numbers) + json = build_body_dict(**{"name": name, "numbers": numbers}) return self.post( "/api/v2/video/sip/inbound_trunks", CreateSIPTrunkResponse, json=json ) @@ -1276,7 +1337,7 @@ def update_sip_trunk( path_params = { "id": id, } - json = build_body_dict(name=name, numbers=numbers) + json = build_body_dict(**{"name": name, "numbers": numbers}) return self.put( "/api/v2/video/sip/inbound_trunks/{id}", UpdateSIPTrunkResponse, @@ -1294,11 +1355,13 @@ def resolve_sip_inbound( sip_headers: Optional[Dict[str, str]] = None, ) -> StreamResponse[ResolveSipInboundResponse]: json = build_body_dict( - sip_caller_number=sip_caller_number, - sip_trunk_number=sip_trunk_number, - challenge=challenge, - routing_number=routing_number, - sip_headers=sip_headers, + **{ + "sip_caller_number": sip_caller_number, + "sip_trunk_number": sip_trunk_number, + "challenge": challenge, + "routing_number": routing_number, + "sip_headers": sip_headers, + } ) return self.post( "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json @@ -1311,7 +1374,9 @@ def query_aggregate_call_stats( to: Optional[str] = None, report_types: Optional[List[str]] = None, ) -> StreamResponse[QueryAggregateCallStatsResponse]: - json = build_body_dict(_from=_from, to=to, report_types=report_types) + json = build_body_dict( + **{"from": _from, "to": to, "report_types": report_types} + ) return self.post( "/api/v2/video/stats", QueryAggregateCallStatsResponse, json=json ) From 557deafbbcb0e696398effed598e4b74d6a07787 Mon Sep 17 00:00:00 2001 From: Yun Wang Date: Wed, 18 Feb 2026 16:24:05 +0100 Subject: [PATCH 7/8] feat: request body to use to_dict() --- getstream/chat/async_rest_client.py | 663 ++++++++---------- getstream/chat/rest_client.py | 663 ++++++++---------- getstream/common/async_rest_client.py | 491 ++++++------- getstream/common/rest_client.py | 491 ++++++------- getstream/feeds/feeds.py | 20 + getstream/feeds/rest_client.py | 812 ++++++++++------------ getstream/models/__init__.py | 33 + getstream/moderation/async_rest_client.py | 381 +++++----- getstream/moderation/rest_client.py | 381 +++++----- getstream/video/async_rest_client.py | 409 +++++------ getstream/video/rest_client.py | 409 +++++------ 11 files changed, 2141 insertions(+), 2612 deletions(-) diff --git a/getstream/chat/async_rest_client.py b/getstream/chat/async_rest_client.py index 1454872a..9d9584c9 100644 --- a/getstream/chat/async_rest_client.py +++ b/getstream/chat/async_rest_client.py @@ -3,7 +3,7 @@ from getstream.common import telemetry from getstream.models import * from getstream.stream_response import StreamResponse -from getstream.utils import build_query_param, build_body_dict +from getstream.utils import build_query_param class ChatRestClient(AsyncBaseClient): @@ -41,16 +41,14 @@ async def query_campaigns( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCampaignsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_limit": user_limit, - "sort": sort, - "filter": filter, - } - ) + json = QueryCampaignsRequest( + limit=limit, + next=next, + prev=prev, + user_limit=user_limit, + sort=sort, + filter=filter, + ).to_dict() return await self.post( "/api/v2/chat/campaigns/query", QueryCampaignsResponse, json=json ) @@ -84,7 +82,9 @@ async def start_campaign( path_params = { "id": id, } - json = build_body_dict(**{"scheduled_for": scheduled_for, "stop_at": stop_at}) + json = StartCampaignRequest( + scheduled_for=scheduled_for, stop_at=stop_at + ).to_dict() return await self.post( "/api/v2/chat/campaigns/{id}/start", StartCampaignResponse, @@ -100,7 +100,7 @@ async def schedule_campaign( path_params = { "id": id, } - json = build_body_dict(**{}) + json = StopCampaignRequest().to_dict() return await self.post( "/api/v2/chat/campaigns/{id}/stop", CampaignResponse, @@ -124,22 +124,20 @@ async def query_channels( sort_values: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryChannelsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "member_limit": member_limit, - "message_limit": message_limit, - "offset": offset, - "predefined_filter": predefined_filter, - "state": state, - "user_id": user_id, - "sort": sort, - "filter_conditions": filter_conditions, - "filter_values": filter_values, - "sort_values": sort_values, - "user": user, - } - ) + json = QueryChannelsRequest( + limit=limit, + member_limit=member_limit, + message_limit=message_limit, + offset=offset, + predefined_filter=predefined_filter, + state=state, + user_id=user_id, + sort=sort, + filter_conditions=filter_conditions, + filter_values=filter_values, + sort_values=sort_values, + user=user, + ).to_dict() return await self.post( "/api/v2/chat/channels", QueryChannelsResponse, json=json ) @@ -148,7 +146,7 @@ async def query_channels( async def delete_channels( self, cids: List[str], hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteChannelsResponse]: - json = build_body_dict(**{"cids": cids, "hard_delete": hard_delete}) + json = DeleteChannelsRequest(cids=cids, hard_delete=hard_delete).to_dict() return await self.post( "/api/v2/chat/channels/delete", DeleteChannelsResponse, json=json ) @@ -160,9 +158,9 @@ async def mark_delivered( latest_delivered_messages: Optional[List[DeliveredMessagePayload]] = None, ) -> StreamResponse[MarkDeliveredResponse]: query_params = build_query_param(**{"user_id": user_id}) - json = build_body_dict( - **{"latest_delivered_messages": latest_delivered_messages} - ) + json = MarkDeliveredRequest( + latest_delivered_messages=latest_delivered_messages + ).to_dict() return await self.post( "/api/v2/chat/channels/delivered", MarkDeliveredResponse, @@ -177,9 +175,9 @@ async def mark_channels_read( read_by_channel: Optional[Dict[str, str]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[MarkReadResponse]: - json = build_body_dict( - **{"user_id": user_id, "read_by_channel": read_by_channel, "user": user} - ) + json = MarkChannelsReadRequest( + user_id=user_id, read_by_channel=read_by_channel, user=user + ).to_dict() return await self.post( "/api/v2/chat/channels/read", MarkReadResponse, json=json ) @@ -199,17 +197,15 @@ async def get_or_create_distinct_channel( path_params = { "type": type, } - json = build_body_dict( - **{ - "hide_for_creator": hide_for_creator, - "state": state, - "thread_unread_counts": thread_unread_counts, - "data": data, - "members": members, - "messages": messages, - "watchers": watchers, - } - ) + json = ChannelGetOrCreateRequest( + hide_for_creator=hide_for_creator, + state=state, + thread_unread_counts=thread_unread_counts, + data=data, + members=members, + messages=messages, + watchers=watchers, + ).to_dict() return await self.post( "/api/v2/chat/channels/{type}/query", ChannelStateResponse, @@ -247,9 +243,9 @@ async def update_channel_partial( "type": type, "id": id, } - json = build_body_dict( - **{"user_id": user_id, "unset": unset, "set": set, "user": user} - ) + json = UpdateChannelPartialRequest( + user_id=user_id, unset=unset, set=set, user=user + ).to_dict() return await self.patch( "/api/v2/chat/channels/{type}/{id}", UpdateChannelPartialResponse, @@ -285,28 +281,26 @@ async def update_channel( "type": type, "id": id, } - json = build_body_dict( - **{ - "accept_invite": accept_invite, - "cooldown": cooldown, - "hide_history": hide_history, - "hide_history_before": hide_history_before, - "reject_invite": reject_invite, - "skip_push": skip_push, - "user_id": user_id, - "add_filter_tags": add_filter_tags, - "add_members": add_members, - "add_moderators": add_moderators, - "assign_roles": assign_roles, - "demote_moderators": demote_moderators, - "invites": invites, - "remove_filter_tags": remove_filter_tags, - "remove_members": remove_members, - "data": data, - "message": message, - "user": user, - } - ) + json = UpdateChannelRequest( + accept_invite=accept_invite, + cooldown=cooldown, + hide_history=hide_history, + hide_history_before=hide_history_before, + reject_invite=reject_invite, + skip_push=skip_push, + user_id=user_id, + add_filter_tags=add_filter_tags, + add_members=add_members, + add_moderators=add_moderators, + assign_roles=assign_roles, + demote_moderators=demote_moderators, + invites=invites, + remove_filter_tags=remove_filter_tags, + remove_members=remove_members, + data=data, + message=message, + user=user, + ).to_dict() return await self.post( "/api/v2/chat/channels/{type}/{id}", UpdateChannelResponse, @@ -362,7 +356,7 @@ async def send_event( "type": type, "id": id, } - json = build_body_dict(**{"event": event}) + json = SendEventRequest(event=event).to_dict() return await self.post( "/api/v2/chat/channels/{type}/{id}/event", EventResponse, @@ -398,7 +392,7 @@ async def upload_channel_file( "type": type, "id": id, } - json = build_body_dict(**{"file": file, "user": user}) + json = UploadChannelFileRequest(file=file, user=user).to_dict() return await self.post( "/api/v2/chat/channels/{type}/{id}/file", UploadChannelFileResponse, @@ -419,9 +413,9 @@ async def hide_channel( "type": type, "id": id, } - json = build_body_dict( - **{"clear_history": clear_history, "user_id": user_id, "user": user} - ) + json = HideChannelRequest( + clear_history=clear_history, user_id=user_id, user=user + ).to_dict() return await self.post( "/api/v2/chat/channels/{type}/{id}/hide", HideChannelResponse, @@ -458,9 +452,9 @@ async def upload_channel_image( "type": type, "id": id, } - json = build_body_dict( - **{"file": file, "upload_sizes": upload_sizes, "user": user} - ) + json = UploadChannelRequest( + file=file, upload_sizes=upload_sizes, user=user + ).to_dict() return await self.post( "/api/v2/chat/channels/{type}/{id}/image", UploadChannelResponse, @@ -482,7 +476,7 @@ async def update_member_partial( "type": type, "id": id, } - json = build_body_dict(**{"unset": unset, "set": set}) + json = UpdateMemberPartialRequest(unset=unset, set=set).to_dict() return await self.patch( "/api/v2/chat/channels/{type}/{id}/member", UpdateMemberPartialResponse, @@ -508,17 +502,15 @@ async def send_message( "type": type, "id": id, } - json = build_body_dict( - **{ - "message": message, - "force_moderation": force_moderation, - "keep_channel_hidden": keep_channel_hidden, - "pending": pending, - "skip_enrich_url": skip_enrich_url, - "skip_push": skip_push, - "pending_message_metadata": pending_message_metadata, - } - ) + json = SendMessageRequest( + message=message, + force_moderation=force_moderation, + keep_channel_hidden=keep_channel_hidden, + pending=pending, + skip_enrich_url=skip_enrich_url, + skip_push=skip_push, + pending_message_metadata=pending_message_metadata, + ).to_dict() return await self.post( "/api/v2/chat/channels/{type}/{id}/message", SendMessageResponse, @@ -559,17 +551,15 @@ async def get_or_create_channel( "type": type, "id": id, } - json = build_body_dict( - **{ - "hide_for_creator": hide_for_creator, - "state": state, - "thread_unread_counts": thread_unread_counts, - "data": data, - "members": members, - "messages": messages, - "watchers": watchers, - } - ) + json = ChannelGetOrCreateRequest( + hide_for_creator=hide_for_creator, + state=state, + thread_unread_counts=thread_unread_counts, + data=data, + members=members, + messages=messages, + watchers=watchers, + ).to_dict() return await self.post( "/api/v2/chat/channels/{type}/{id}/query", ChannelStateResponse, @@ -591,14 +581,9 @@ async def mark_read( "type": type, "id": id, } - json = build_body_dict( - **{ - "message_id": message_id, - "thread_id": thread_id, - "user_id": user_id, - "user": user, - } - ) + json = MarkReadRequest( + message_id=message_id, thread_id=thread_id, user_id=user_id, user=user + ).to_dict() return await self.post( "/api/v2/chat/channels/{type}/{id}/read", MarkReadResponse, @@ -618,7 +603,7 @@ async def show_channel( "type": type, "id": id, } - json = build_body_dict(**{"user_id": user_id, "user": user}) + json = ShowChannelRequest(user_id=user_id, user=user).to_dict() return await self.post( "/api/v2/chat/channels/{type}/{id}/show", ShowChannelResponse, @@ -643,17 +628,15 @@ async def truncate_channel( "type": type, "id": id, } - json = build_body_dict( - **{ - "hard_delete": hard_delete, - "skip_push": skip_push, - "truncated_at": truncated_at, - "user_id": user_id, - "member_ids": member_ids, - "message": message, - "user": user, - } - ) + json = TruncateChannelRequest( + hard_delete=hard_delete, + skip_push=skip_push, + truncated_at=truncated_at, + user_id=user_id, + member_ids=member_ids, + message=message, + user=user, + ).to_dict() return await self.post( "/api/v2/chat/channels/{type}/{id}/truncate", TruncateChannelResponse, @@ -676,15 +659,13 @@ async def mark_unread( "type": type, "id": id, } - json = build_body_dict( - **{ - "message_id": message_id, - "message_timestamp": message_timestamp, - "thread_id": thread_id, - "user_id": user_id, - "user": user, - } - ) + json = MarkUnreadRequest( + message_id=message_id, + message_timestamp=message_timestamp, + thread_id=thread_id, + user_id=user_id, + user=user, + ).to_dict() return await self.post( "/api/v2/chat/channels/{type}/{id}/unread", Response, @@ -732,42 +713,40 @@ async def create_channel_type( permissions: Optional[List[PolicyRequest]] = None, grants: Optional[Dict[str, List[str]]] = None, ) -> StreamResponse[CreateChannelTypeResponse]: - json = build_body_dict( - **{ - "automod": automod, - "automod_behavior": automod_behavior, - "max_message_length": max_message_length, - "name": name, - "blocklist": blocklist, - "blocklist_behavior": blocklist_behavior, - "connect_events": connect_events, - "count_messages": count_messages, - "custom_events": custom_events, - "delivery_events": delivery_events, - "mark_messages_pending": mark_messages_pending, - "message_retention": message_retention, - "mutes": mutes, - "partition_size": partition_size, - "partition_ttl": partition_ttl, - "polls": polls, - "push_level": push_level, - "push_notifications": push_notifications, - "reactions": reactions, - "read_events": read_events, - "replies": replies, - "search": search, - "shared_locations": shared_locations, - "skip_last_msg_update_for_system_msgs": skip_last_msg_update_for_system_msgs, - "typing_events": typing_events, - "uploads": uploads, - "url_enrichment": url_enrichment, - "user_message_reminders": user_message_reminders, - "blocklists": blocklists, - "commands": commands, - "permissions": permissions, - "grants": grants, - } - ) + json = CreateChannelTypeRequest( + automod=automod, + automod_behavior=automod_behavior, + max_message_length=max_message_length, + name=name, + blocklist=blocklist, + blocklist_behavior=blocklist_behavior, + connect_events=connect_events, + count_messages=count_messages, + custom_events=custom_events, + delivery_events=delivery_events, + mark_messages_pending=mark_messages_pending, + message_retention=message_retention, + mutes=mutes, + partition_size=partition_size, + partition_ttl=partition_ttl, + polls=polls, + push_level=push_level, + push_notifications=push_notifications, + reactions=reactions, + read_events=read_events, + replies=replies, + search=search, + shared_locations=shared_locations, + skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, + typing_events=typing_events, + uploads=uploads, + url_enrichment=url_enrichment, + user_message_reminders=user_message_reminders, + blocklists=blocklists, + commands=commands, + permissions=permissions, + grants=grants, + ).to_dict() return await self.post( "/api/v2/chat/channeltypes", CreateChannelTypeResponse, json=json ) @@ -836,44 +815,42 @@ async def update_channel_type( path_params = { "name": name, } - json = build_body_dict( - **{ - "automod": automod, - "automod_behavior": automod_behavior, - "max_message_length": max_message_length, - "blocklist": blocklist, - "blocklist_behavior": blocklist_behavior, - "connect_events": connect_events, - "count_messages": count_messages, - "custom_events": custom_events, - "delivery_events": delivery_events, - "mark_messages_pending": mark_messages_pending, - "mutes": mutes, - "partition_size": partition_size, - "partition_ttl": partition_ttl, - "polls": polls, - "push_level": push_level, - "push_notifications": push_notifications, - "quotes": quotes, - "reactions": reactions, - "read_events": read_events, - "reminders": reminders, - "replies": replies, - "search": search, - "shared_locations": shared_locations, - "skip_last_msg_update_for_system_msgs": skip_last_msg_update_for_system_msgs, - "typing_events": typing_events, - "uploads": uploads, - "url_enrichment": url_enrichment, - "user_message_reminders": user_message_reminders, - "allowed_flag_reasons": allowed_flag_reasons, - "blocklists": blocklists, - "commands": commands, - "permissions": permissions, - "automod_thresholds": automod_thresholds, - "grants": grants, - } - ) + json = UpdateChannelTypeRequest( + automod=automod, + automod_behavior=automod_behavior, + max_message_length=max_message_length, + blocklist=blocklist, + blocklist_behavior=blocklist_behavior, + connect_events=connect_events, + count_messages=count_messages, + custom_events=custom_events, + delivery_events=delivery_events, + mark_messages_pending=mark_messages_pending, + mutes=mutes, + partition_size=partition_size, + partition_ttl=partition_ttl, + polls=polls, + push_level=push_level, + push_notifications=push_notifications, + quotes=quotes, + reactions=reactions, + read_events=read_events, + reminders=reminders, + replies=replies, + search=search, + shared_locations=shared_locations, + skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, + typing_events=typing_events, + uploads=uploads, + url_enrichment=url_enrichment, + user_message_reminders=user_message_reminders, + allowed_flag_reasons=allowed_flag_reasons, + blocklists=blocklists, + commands=commands, + permissions=permissions, + automod_thresholds=automod_thresholds, + grants=grants, + ).to_dict() return await self.put( "/api/v2/chat/channeltypes/{name}", UpdateChannelTypeResponse, @@ -893,9 +870,9 @@ async def create_command( args: Optional[str] = None, set: Optional[str] = None, ) -> StreamResponse[CreateCommandResponse]: - json = build_body_dict( - **{"description": description, "name": name, "args": args, "set": set} - ) + json = CreateCommandRequest( + description=description, name=name, args=args, set=set + ).to_dict() return await self.post( "/api/v2/chat/commands", CreateCommandResponse, json=json ) @@ -931,7 +908,9 @@ async def update_command( path_params = { "name": name, } - json = build_body_dict(**{"description": description, "args": args, "set": set}) + json = UpdateCommandRequest( + description=description, args=args, set=set + ).to_dict() return await self.put( "/api/v2/chat/commands/{name}", UpdateCommandResponse, @@ -950,17 +929,15 @@ async def query_drafts( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryDraftsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryDraftsRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return await self.post( "/api/v2/chat/drafts/query", QueryDraftsResponse, json=json ) @@ -975,16 +952,14 @@ async def export_channels( include_truncated_messages: Optional[bool] = None, version: Optional[str] = None, ) -> StreamResponse[ExportChannelsResponse]: - json = build_body_dict( - **{ - "channels": channels, - "clear_deleted_message_text": clear_deleted_message_text, - "export_users": export_users, - "include_soft_deleted_channels": include_soft_deleted_channels, - "include_truncated_messages": include_truncated_messages, - "version": version, - } - ) + json = ExportChannelsRequest( + channels=channels, + clear_deleted_message_text=clear_deleted_message_text, + export_users=export_users, + include_soft_deleted_channels=include_soft_deleted_channels, + include_truncated_messages=include_truncated_messages, + version=version, + ).to_dict() return await self.post( "/api/v2/chat/export_channels", ExportChannelsResponse, json=json ) @@ -1007,15 +982,9 @@ async def query_message_history( prev: Optional[str] = None, sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[QueryMessageHistoryResponse]: - json = build_body_dict( - **{ - "filter": filter, - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - } - ) + json = QueryMessageHistoryRequest( + filter=filter, limit=limit, next=next, prev=prev, sort=sort + ).to_dict() return await self.post( "/api/v2/chat/messages/history", QueryMessageHistoryResponse, json=json ) @@ -1069,13 +1038,9 @@ async def update_message( path_params = { "id": id, } - json = build_body_dict( - **{ - "message": message, - "skip_enrich_url": skip_enrich_url, - "skip_push": skip_push, - } - ) + json = UpdateMessageRequest( + message=message, skip_enrich_url=skip_enrich_url, skip_push=skip_push + ).to_dict() return await self.post( "/api/v2/chat/messages/{id}", UpdateMessageResponse, @@ -1097,16 +1062,14 @@ async def update_message_partial( path_params = { "id": id, } - json = build_body_dict( - **{ - "skip_enrich_url": skip_enrich_url, - "skip_push": skip_push, - "user_id": user_id, - "unset": unset, - "set": set, - "user": user, - } - ) + json = UpdateMessagePartialRequest( + skip_enrich_url=skip_enrich_url, + skip_push=skip_push, + user_id=user_id, + unset=unset, + set=set, + user=user, + ).to_dict() return await self.put( "/api/v2/chat/messages/{id}", UpdateMessagePartialResponse, @@ -1125,9 +1088,9 @@ async def run_message_action( path_params = { "id": id, } - json = build_body_dict( - **{"form_data": form_data, "user_id": user_id, "user": user} - ) + json = MessageActionRequest( + form_data=form_data, user_id=user_id, user=user + ).to_dict() return await self.post( "/api/v2/chat/messages/{id}/action", MessageActionResponse, @@ -1143,7 +1106,7 @@ async def commit_message( path_params = { "id": id, } - json = build_body_dict(**{}) + json = CommitMessageRequest().to_dict() return await self.post( "/api/v2/chat/messages/{id}/commit", MessageActionResponse, @@ -1165,16 +1128,14 @@ async def ephemeral_message_update( path_params = { "id": id, } - json = build_body_dict( - **{ - "skip_enrich_url": skip_enrich_url, - "skip_push": skip_push, - "user_id": user_id, - "unset": unset, - "set": set, - "user": user, - } - ) + json = UpdateMessagePartialRequest( + skip_enrich_url=skip_enrich_url, + skip_push=skip_push, + user_id=user_id, + unset=unset, + set=set, + user=user, + ).to_dict() return await self.patch( "/api/v2/chat/messages/{id}/ephemeral", UpdateMessagePartialResponse, @@ -1193,13 +1154,9 @@ async def send_reaction( path_params = { "id": id, } - json = build_body_dict( - **{ - "reaction": reaction, - "enforce_unique": enforce_unique, - "skip_push": skip_push, - } - ) + json = SendReactionRequest( + reaction=reaction, enforce_unique=enforce_unique, skip_push=skip_push + ).to_dict() return await self.post( "/api/v2/chat/messages/{id}/reaction", SendReactionResponse, @@ -1253,17 +1210,15 @@ async def query_reactions( path_params = { "id": id, } - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryReactionsRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return await self.post( "/api/v2/chat/messages/{id}/reactions", QueryReactionsResponse, @@ -1278,7 +1233,7 @@ async def translate_message( path_params = { "id": id, } - json = build_body_dict(**{"language": language}) + json = TranslateMessageRequest(language=language).to_dict() return await self.post( "/api/v2/chat/messages/{id}/translate", MessageActionResponse, @@ -1297,13 +1252,9 @@ async def undelete_message( path_params = { "id": id, } - json = build_body_dict( - **{ - "message": message, - "skip_enrich_url": skip_enrich_url, - "skip_push": skip_push, - } - ) + json = UpdateMessageRequest( + message=message, skip_enrich_url=skip_enrich_url, skip_push=skip_push + ).to_dict() return await self.post( "/api/v2/chat/messages/{id}/undelete", UpdateMessageResponse, @@ -1324,7 +1275,7 @@ async def cast_poll_vote( "message_id": message_id, "poll_id": poll_id, } - json = build_body_dict(**{"user_id": user_id, "user": user, "vote": vote}) + json = CastPollVoteRequest(user_id=user_id, user=user, vote=vote).to_dict() return await self.post( "/api/v2/chat/messages/{message_id}/polls/{poll_id}/vote", PollVoteResponse, @@ -1375,9 +1326,9 @@ async def update_reminder( path_params = { "message_id": message_id, } - json = build_body_dict( - **{"remind_at": remind_at, "user_id": user_id, "user": user} - ) + json = UpdateReminderRequest( + remind_at=remind_at, user_id=user_id, user=user + ).to_dict() return await self.patch( "/api/v2/chat/messages/{message_id}/reminders", UpdateReminderResponse, @@ -1396,9 +1347,9 @@ async def create_reminder( path_params = { "message_id": message_id, } - json = build_body_dict( - **{"remind_at": remind_at, "user_id": user_id, "user": user} - ) + json = CreateReminderRequest( + remind_at=remind_at, user_id=user_id, user=user + ).to_dict() return await self.post( "/api/v2/chat/messages/{message_id}/reminders", ReminderResponseData, @@ -1458,14 +1409,9 @@ async def mute_channel( channel_cids: Optional[List[str]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[MuteChannelResponse]: - json = build_body_dict( - **{ - "expiration": expiration, - "user_id": user_id, - "channel_cids": channel_cids, - "user": user, - } - ) + json = MuteChannelRequest( + expiration=expiration, user_id=user_id, channel_cids=channel_cids, user=user + ).to_dict() return await self.post( "/api/v2/chat/moderation/mute/channel", MuteChannelResponse, json=json ) @@ -1478,14 +1424,9 @@ async def unmute_channel( channel_cids: Optional[List[str]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UnmuteResponse]: - json = build_body_dict( - **{ - "expiration": expiration, - "user_id": user_id, - "channel_cids": channel_cids, - "user": user, - } - ) + json = UnmuteChannelRequest( + expiration=expiration, user_id=user_id, channel_cids=channel_cids, user=user + ).to_dict() return await self.post( "/api/v2/chat/moderation/unmute/channel", UnmuteResponse, json=json ) @@ -1523,17 +1464,15 @@ async def query_reminders( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryRemindersResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryRemindersRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return await self.post( "/api/v2/chat/reminders/query", QueryRemindersResponse, json=json ) @@ -1556,15 +1495,9 @@ async def query_segments( prev: Optional[str] = None, sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[QuerySegmentsResponse]: - json = build_body_dict( - **{ - "filter": filter, - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - } - ) + json = QuerySegmentsRequest( + filter=filter, limit=limit, next=next, prev=prev, sort=sort + ).to_dict() return await self.post( "/api/v2/chat/segments/query", QuerySegmentsResponse, json=json ) @@ -1594,7 +1527,7 @@ async def delete_segment_targets( path_params = { "id": id, } - json = build_body_dict(**{"target_ids": target_ids}) + json = DeleteSegmentTargetsRequest(target_ids=target_ids).to_dict() return await self.post( "/api/v2/chat/segments/{id}/deletetargets", Response, @@ -1629,15 +1562,9 @@ async def query_segment_targets( path_params = { "id": id, } - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "Sort": sort, - "Filter": filter, - } - ) + json = QuerySegmentTargetsRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return await self.post( "/api/v2/chat/segments/{id}/targets/query", QuerySegmentTargetsResponse, @@ -1659,20 +1586,18 @@ async def query_threads( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryThreadsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "member_limit": member_limit, - "next": next, - "participant_limit": participant_limit, - "prev": prev, - "reply_limit": reply_limit, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryThreadsRequest( + limit=limit, + member_limit=member_limit, + next=next, + participant_limit=participant_limit, + prev=prev, + reply_limit=reply_limit, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return await self.post("/api/v2/chat/threads", QueryThreadsResponse, json=json) @telemetry.operation_name("getstream.api.chat.get_thread") @@ -1712,9 +1637,9 @@ async def update_thread_partial( path_params = { "message_id": message_id, } - json = build_body_dict( - **{"user_id": user_id, "unset": unset, "set": set, "user": user} - ) + json = UpdateThreadPartialRequest( + user_id=user_id, unset=unset, set=set, user=user + ).to_dict() return await self.patch( "/api/v2/chat/threads/{message_id}", UpdateThreadPartialResponse, @@ -1737,7 +1662,7 @@ async def unread_counts( async def unread_counts_batch( self, user_ids: List[str] ) -> StreamResponse[UnreadCountsBatchResponse]: - json = build_body_dict(**{"user_ids": user_ids}) + json = UnreadCountsBatchRequest(user_ids=user_ids).to_dict() return await self.post( "/api/v2/chat/unread_batch", UnreadCountsBatchResponse, json=json ) @@ -1749,7 +1674,7 @@ async def send_user_custom_event( path_params = { "user_id": user_id, } - json = build_body_dict(**{"event": event}) + json = SendUserCustomEventRequest(event=event).to_dict() return await self.post( "/api/v2/chat/users/{user_id}/event", Response, diff --git a/getstream/chat/rest_client.py b/getstream/chat/rest_client.py index aaa19c17..f3f48009 100644 --- a/getstream/chat/rest_client.py +++ b/getstream/chat/rest_client.py @@ -3,7 +3,7 @@ from getstream.common import telemetry from getstream.models import * from getstream.stream_response import StreamResponse -from getstream.utils import build_query_param, build_body_dict +from getstream.utils import build_query_param class ChatRestClient(BaseClient): @@ -41,16 +41,14 @@ def query_campaigns( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCampaignsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_limit": user_limit, - "sort": sort, - "filter": filter, - } - ) + json = QueryCampaignsRequest( + limit=limit, + next=next, + prev=prev, + user_limit=user_limit, + sort=sort, + filter=filter, + ).to_dict() return self.post( "/api/v2/chat/campaigns/query", QueryCampaignsResponse, json=json ) @@ -84,7 +82,9 @@ def start_campaign( path_params = { "id": id, } - json = build_body_dict(**{"scheduled_for": scheduled_for, "stop_at": stop_at}) + json = StartCampaignRequest( + scheduled_for=scheduled_for, stop_at=stop_at + ).to_dict() return self.post( "/api/v2/chat/campaigns/{id}/start", StartCampaignResponse, @@ -100,7 +100,7 @@ def schedule_campaign( path_params = { "id": id, } - json = build_body_dict(**{}) + json = StopCampaignRequest().to_dict() return self.post( "/api/v2/chat/campaigns/{id}/stop", CampaignResponse, @@ -124,29 +124,27 @@ def query_channels( sort_values: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryChannelsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "member_limit": member_limit, - "message_limit": message_limit, - "offset": offset, - "predefined_filter": predefined_filter, - "state": state, - "user_id": user_id, - "sort": sort, - "filter_conditions": filter_conditions, - "filter_values": filter_values, - "sort_values": sort_values, - "user": user, - } - ) + json = QueryChannelsRequest( + limit=limit, + member_limit=member_limit, + message_limit=message_limit, + offset=offset, + predefined_filter=predefined_filter, + state=state, + user_id=user_id, + sort=sort, + filter_conditions=filter_conditions, + filter_values=filter_values, + sort_values=sort_values, + user=user, + ).to_dict() return self.post("/api/v2/chat/channels", QueryChannelsResponse, json=json) @telemetry.operation_name("getstream.api.chat.delete_channels") def delete_channels( self, cids: List[str], hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteChannelsResponse]: - json = build_body_dict(**{"cids": cids, "hard_delete": hard_delete}) + json = DeleteChannelsRequest(cids=cids, hard_delete=hard_delete).to_dict() return self.post( "/api/v2/chat/channels/delete", DeleteChannelsResponse, json=json ) @@ -158,9 +156,9 @@ def mark_delivered( latest_delivered_messages: Optional[List[DeliveredMessagePayload]] = None, ) -> StreamResponse[MarkDeliveredResponse]: query_params = build_query_param(**{"user_id": user_id}) - json = build_body_dict( - **{"latest_delivered_messages": latest_delivered_messages} - ) + json = MarkDeliveredRequest( + latest_delivered_messages=latest_delivered_messages + ).to_dict() return self.post( "/api/v2/chat/channels/delivered", MarkDeliveredResponse, @@ -175,9 +173,9 @@ def mark_channels_read( read_by_channel: Optional[Dict[str, str]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[MarkReadResponse]: - json = build_body_dict( - **{"user_id": user_id, "read_by_channel": read_by_channel, "user": user} - ) + json = MarkChannelsReadRequest( + user_id=user_id, read_by_channel=read_by_channel, user=user + ).to_dict() return self.post("/api/v2/chat/channels/read", MarkReadResponse, json=json) @telemetry.operation_name("getstream.api.chat.get_or_create_distinct_channel") @@ -195,17 +193,15 @@ def get_or_create_distinct_channel( path_params = { "type": type, } - json = build_body_dict( - **{ - "hide_for_creator": hide_for_creator, - "state": state, - "thread_unread_counts": thread_unread_counts, - "data": data, - "members": members, - "messages": messages, - "watchers": watchers, - } - ) + json = ChannelGetOrCreateRequest( + hide_for_creator=hide_for_creator, + state=state, + thread_unread_counts=thread_unread_counts, + data=data, + members=members, + messages=messages, + watchers=watchers, + ).to_dict() return self.post( "/api/v2/chat/channels/{type}/query", ChannelStateResponse, @@ -243,9 +239,9 @@ def update_channel_partial( "type": type, "id": id, } - json = build_body_dict( - **{"user_id": user_id, "unset": unset, "set": set, "user": user} - ) + json = UpdateChannelPartialRequest( + user_id=user_id, unset=unset, set=set, user=user + ).to_dict() return self.patch( "/api/v2/chat/channels/{type}/{id}", UpdateChannelPartialResponse, @@ -281,28 +277,26 @@ def update_channel( "type": type, "id": id, } - json = build_body_dict( - **{ - "accept_invite": accept_invite, - "cooldown": cooldown, - "hide_history": hide_history, - "hide_history_before": hide_history_before, - "reject_invite": reject_invite, - "skip_push": skip_push, - "user_id": user_id, - "add_filter_tags": add_filter_tags, - "add_members": add_members, - "add_moderators": add_moderators, - "assign_roles": assign_roles, - "demote_moderators": demote_moderators, - "invites": invites, - "remove_filter_tags": remove_filter_tags, - "remove_members": remove_members, - "data": data, - "message": message, - "user": user, - } - ) + json = UpdateChannelRequest( + accept_invite=accept_invite, + cooldown=cooldown, + hide_history=hide_history, + hide_history_before=hide_history_before, + reject_invite=reject_invite, + skip_push=skip_push, + user_id=user_id, + add_filter_tags=add_filter_tags, + add_members=add_members, + add_moderators=add_moderators, + assign_roles=assign_roles, + demote_moderators=demote_moderators, + invites=invites, + remove_filter_tags=remove_filter_tags, + remove_members=remove_members, + data=data, + message=message, + user=user, + ).to_dict() return self.post( "/api/v2/chat/channels/{type}/{id}", UpdateChannelResponse, @@ -358,7 +352,7 @@ def send_event( "type": type, "id": id, } - json = build_body_dict(**{"event": event}) + json = SendEventRequest(event=event).to_dict() return self.post( "/api/v2/chat/channels/{type}/{id}/event", EventResponse, @@ -394,7 +388,7 @@ def upload_channel_file( "type": type, "id": id, } - json = build_body_dict(**{"file": file, "user": user}) + json = UploadChannelFileRequest(file=file, user=user).to_dict() return self.post( "/api/v2/chat/channels/{type}/{id}/file", UploadChannelFileResponse, @@ -415,9 +409,9 @@ def hide_channel( "type": type, "id": id, } - json = build_body_dict( - **{"clear_history": clear_history, "user_id": user_id, "user": user} - ) + json = HideChannelRequest( + clear_history=clear_history, user_id=user_id, user=user + ).to_dict() return self.post( "/api/v2/chat/channels/{type}/{id}/hide", HideChannelResponse, @@ -454,9 +448,9 @@ def upload_channel_image( "type": type, "id": id, } - json = build_body_dict( - **{"file": file, "upload_sizes": upload_sizes, "user": user} - ) + json = UploadChannelRequest( + file=file, upload_sizes=upload_sizes, user=user + ).to_dict() return self.post( "/api/v2/chat/channels/{type}/{id}/image", UploadChannelResponse, @@ -478,7 +472,7 @@ def update_member_partial( "type": type, "id": id, } - json = build_body_dict(**{"unset": unset, "set": set}) + json = UpdateMemberPartialRequest(unset=unset, set=set).to_dict() return self.patch( "/api/v2/chat/channels/{type}/{id}/member", UpdateMemberPartialResponse, @@ -504,17 +498,15 @@ def send_message( "type": type, "id": id, } - json = build_body_dict( - **{ - "message": message, - "force_moderation": force_moderation, - "keep_channel_hidden": keep_channel_hidden, - "pending": pending, - "skip_enrich_url": skip_enrich_url, - "skip_push": skip_push, - "pending_message_metadata": pending_message_metadata, - } - ) + json = SendMessageRequest( + message=message, + force_moderation=force_moderation, + keep_channel_hidden=keep_channel_hidden, + pending=pending, + skip_enrich_url=skip_enrich_url, + skip_push=skip_push, + pending_message_metadata=pending_message_metadata, + ).to_dict() return self.post( "/api/v2/chat/channels/{type}/{id}/message", SendMessageResponse, @@ -555,17 +547,15 @@ def get_or_create_channel( "type": type, "id": id, } - json = build_body_dict( - **{ - "hide_for_creator": hide_for_creator, - "state": state, - "thread_unread_counts": thread_unread_counts, - "data": data, - "members": members, - "messages": messages, - "watchers": watchers, - } - ) + json = ChannelGetOrCreateRequest( + hide_for_creator=hide_for_creator, + state=state, + thread_unread_counts=thread_unread_counts, + data=data, + members=members, + messages=messages, + watchers=watchers, + ).to_dict() return self.post( "/api/v2/chat/channels/{type}/{id}/query", ChannelStateResponse, @@ -587,14 +577,9 @@ def mark_read( "type": type, "id": id, } - json = build_body_dict( - **{ - "message_id": message_id, - "thread_id": thread_id, - "user_id": user_id, - "user": user, - } - ) + json = MarkReadRequest( + message_id=message_id, thread_id=thread_id, user_id=user_id, user=user + ).to_dict() return self.post( "/api/v2/chat/channels/{type}/{id}/read", MarkReadResponse, @@ -614,7 +599,7 @@ def show_channel( "type": type, "id": id, } - json = build_body_dict(**{"user_id": user_id, "user": user}) + json = ShowChannelRequest(user_id=user_id, user=user).to_dict() return self.post( "/api/v2/chat/channels/{type}/{id}/show", ShowChannelResponse, @@ -639,17 +624,15 @@ def truncate_channel( "type": type, "id": id, } - json = build_body_dict( - **{ - "hard_delete": hard_delete, - "skip_push": skip_push, - "truncated_at": truncated_at, - "user_id": user_id, - "member_ids": member_ids, - "message": message, - "user": user, - } - ) + json = TruncateChannelRequest( + hard_delete=hard_delete, + skip_push=skip_push, + truncated_at=truncated_at, + user_id=user_id, + member_ids=member_ids, + message=message, + user=user, + ).to_dict() return self.post( "/api/v2/chat/channels/{type}/{id}/truncate", TruncateChannelResponse, @@ -672,15 +655,13 @@ def mark_unread( "type": type, "id": id, } - json = build_body_dict( - **{ - "message_id": message_id, - "message_timestamp": message_timestamp, - "thread_id": thread_id, - "user_id": user_id, - "user": user, - } - ) + json = MarkUnreadRequest( + message_id=message_id, + message_timestamp=message_timestamp, + thread_id=thread_id, + user_id=user_id, + user=user, + ).to_dict() return self.post( "/api/v2/chat/channels/{type}/{id}/unread", Response, @@ -728,42 +709,40 @@ def create_channel_type( permissions: Optional[List[PolicyRequest]] = None, grants: Optional[Dict[str, List[str]]] = None, ) -> StreamResponse[CreateChannelTypeResponse]: - json = build_body_dict( - **{ - "automod": automod, - "automod_behavior": automod_behavior, - "max_message_length": max_message_length, - "name": name, - "blocklist": blocklist, - "blocklist_behavior": blocklist_behavior, - "connect_events": connect_events, - "count_messages": count_messages, - "custom_events": custom_events, - "delivery_events": delivery_events, - "mark_messages_pending": mark_messages_pending, - "message_retention": message_retention, - "mutes": mutes, - "partition_size": partition_size, - "partition_ttl": partition_ttl, - "polls": polls, - "push_level": push_level, - "push_notifications": push_notifications, - "reactions": reactions, - "read_events": read_events, - "replies": replies, - "search": search, - "shared_locations": shared_locations, - "skip_last_msg_update_for_system_msgs": skip_last_msg_update_for_system_msgs, - "typing_events": typing_events, - "uploads": uploads, - "url_enrichment": url_enrichment, - "user_message_reminders": user_message_reminders, - "blocklists": blocklists, - "commands": commands, - "permissions": permissions, - "grants": grants, - } - ) + json = CreateChannelTypeRequest( + automod=automod, + automod_behavior=automod_behavior, + max_message_length=max_message_length, + name=name, + blocklist=blocklist, + blocklist_behavior=blocklist_behavior, + connect_events=connect_events, + count_messages=count_messages, + custom_events=custom_events, + delivery_events=delivery_events, + mark_messages_pending=mark_messages_pending, + message_retention=message_retention, + mutes=mutes, + partition_size=partition_size, + partition_ttl=partition_ttl, + polls=polls, + push_level=push_level, + push_notifications=push_notifications, + reactions=reactions, + read_events=read_events, + replies=replies, + search=search, + shared_locations=shared_locations, + skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, + typing_events=typing_events, + uploads=uploads, + url_enrichment=url_enrichment, + user_message_reminders=user_message_reminders, + blocklists=blocklists, + commands=commands, + permissions=permissions, + grants=grants, + ).to_dict() return self.post( "/api/v2/chat/channeltypes", CreateChannelTypeResponse, json=json ) @@ -830,44 +809,42 @@ def update_channel_type( path_params = { "name": name, } - json = build_body_dict( - **{ - "automod": automod, - "automod_behavior": automod_behavior, - "max_message_length": max_message_length, - "blocklist": blocklist, - "blocklist_behavior": blocklist_behavior, - "connect_events": connect_events, - "count_messages": count_messages, - "custom_events": custom_events, - "delivery_events": delivery_events, - "mark_messages_pending": mark_messages_pending, - "mutes": mutes, - "partition_size": partition_size, - "partition_ttl": partition_ttl, - "polls": polls, - "push_level": push_level, - "push_notifications": push_notifications, - "quotes": quotes, - "reactions": reactions, - "read_events": read_events, - "reminders": reminders, - "replies": replies, - "search": search, - "shared_locations": shared_locations, - "skip_last_msg_update_for_system_msgs": skip_last_msg_update_for_system_msgs, - "typing_events": typing_events, - "uploads": uploads, - "url_enrichment": url_enrichment, - "user_message_reminders": user_message_reminders, - "allowed_flag_reasons": allowed_flag_reasons, - "blocklists": blocklists, - "commands": commands, - "permissions": permissions, - "automod_thresholds": automod_thresholds, - "grants": grants, - } - ) + json = UpdateChannelTypeRequest( + automod=automod, + automod_behavior=automod_behavior, + max_message_length=max_message_length, + blocklist=blocklist, + blocklist_behavior=blocklist_behavior, + connect_events=connect_events, + count_messages=count_messages, + custom_events=custom_events, + delivery_events=delivery_events, + mark_messages_pending=mark_messages_pending, + mutes=mutes, + partition_size=partition_size, + partition_ttl=partition_ttl, + polls=polls, + push_level=push_level, + push_notifications=push_notifications, + quotes=quotes, + reactions=reactions, + read_events=read_events, + reminders=reminders, + replies=replies, + search=search, + shared_locations=shared_locations, + skip_last_msg_update_for_system_msgs=skip_last_msg_update_for_system_msgs, + typing_events=typing_events, + uploads=uploads, + url_enrichment=url_enrichment, + user_message_reminders=user_message_reminders, + allowed_flag_reasons=allowed_flag_reasons, + blocklists=blocklists, + commands=commands, + permissions=permissions, + automod_thresholds=automod_thresholds, + grants=grants, + ).to_dict() return self.put( "/api/v2/chat/channeltypes/{name}", UpdateChannelTypeResponse, @@ -887,9 +864,9 @@ def create_command( args: Optional[str] = None, set: Optional[str] = None, ) -> StreamResponse[CreateCommandResponse]: - json = build_body_dict( - **{"description": description, "name": name, "args": args, "set": set} - ) + json = CreateCommandRequest( + description=description, name=name, args=args, set=set + ).to_dict() return self.post("/api/v2/chat/commands", CreateCommandResponse, json=json) @telemetry.operation_name("getstream.api.chat.delete_command") @@ -923,7 +900,9 @@ def update_command( path_params = { "name": name, } - json = build_body_dict(**{"description": description, "args": args, "set": set}) + json = UpdateCommandRequest( + description=description, args=args, set=set + ).to_dict() return self.put( "/api/v2/chat/commands/{name}", UpdateCommandResponse, @@ -942,17 +921,15 @@ def query_drafts( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryDraftsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryDraftsRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return self.post("/api/v2/chat/drafts/query", QueryDraftsResponse, json=json) @telemetry.operation_name("getstream.api.chat.export_channels") @@ -965,16 +942,14 @@ def export_channels( include_truncated_messages: Optional[bool] = None, version: Optional[str] = None, ) -> StreamResponse[ExportChannelsResponse]: - json = build_body_dict( - **{ - "channels": channels, - "clear_deleted_message_text": clear_deleted_message_text, - "export_users": export_users, - "include_soft_deleted_channels": include_soft_deleted_channels, - "include_truncated_messages": include_truncated_messages, - "version": version, - } - ) + json = ExportChannelsRequest( + channels=channels, + clear_deleted_message_text=clear_deleted_message_text, + export_users=export_users, + include_soft_deleted_channels=include_soft_deleted_channels, + include_truncated_messages=include_truncated_messages, + version=version, + ).to_dict() return self.post( "/api/v2/chat/export_channels", ExportChannelsResponse, json=json ) @@ -997,15 +972,9 @@ def query_message_history( prev: Optional[str] = None, sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[QueryMessageHistoryResponse]: - json = build_body_dict( - **{ - "filter": filter, - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - } - ) + json = QueryMessageHistoryRequest( + filter=filter, limit=limit, next=next, prev=prev, sort=sort + ).to_dict() return self.post( "/api/v2/chat/messages/history", QueryMessageHistoryResponse, json=json ) @@ -1059,13 +1028,9 @@ def update_message( path_params = { "id": id, } - json = build_body_dict( - **{ - "message": message, - "skip_enrich_url": skip_enrich_url, - "skip_push": skip_push, - } - ) + json = UpdateMessageRequest( + message=message, skip_enrich_url=skip_enrich_url, skip_push=skip_push + ).to_dict() return self.post( "/api/v2/chat/messages/{id}", UpdateMessageResponse, @@ -1087,16 +1052,14 @@ def update_message_partial( path_params = { "id": id, } - json = build_body_dict( - **{ - "skip_enrich_url": skip_enrich_url, - "skip_push": skip_push, - "user_id": user_id, - "unset": unset, - "set": set, - "user": user, - } - ) + json = UpdateMessagePartialRequest( + skip_enrich_url=skip_enrich_url, + skip_push=skip_push, + user_id=user_id, + unset=unset, + set=set, + user=user, + ).to_dict() return self.put( "/api/v2/chat/messages/{id}", UpdateMessagePartialResponse, @@ -1115,9 +1078,9 @@ def run_message_action( path_params = { "id": id, } - json = build_body_dict( - **{"form_data": form_data, "user_id": user_id, "user": user} - ) + json = MessageActionRequest( + form_data=form_data, user_id=user_id, user=user + ).to_dict() return self.post( "/api/v2/chat/messages/{id}/action", MessageActionResponse, @@ -1133,7 +1096,7 @@ def commit_message( path_params = { "id": id, } - json = build_body_dict(**{}) + json = CommitMessageRequest().to_dict() return self.post( "/api/v2/chat/messages/{id}/commit", MessageActionResponse, @@ -1155,16 +1118,14 @@ def ephemeral_message_update( path_params = { "id": id, } - json = build_body_dict( - **{ - "skip_enrich_url": skip_enrich_url, - "skip_push": skip_push, - "user_id": user_id, - "unset": unset, - "set": set, - "user": user, - } - ) + json = UpdateMessagePartialRequest( + skip_enrich_url=skip_enrich_url, + skip_push=skip_push, + user_id=user_id, + unset=unset, + set=set, + user=user, + ).to_dict() return self.patch( "/api/v2/chat/messages/{id}/ephemeral", UpdateMessagePartialResponse, @@ -1183,13 +1144,9 @@ def send_reaction( path_params = { "id": id, } - json = build_body_dict( - **{ - "reaction": reaction, - "enforce_unique": enforce_unique, - "skip_push": skip_push, - } - ) + json = SendReactionRequest( + reaction=reaction, enforce_unique=enforce_unique, skip_push=skip_push + ).to_dict() return self.post( "/api/v2/chat/messages/{id}/reaction", SendReactionResponse, @@ -1243,17 +1200,15 @@ def query_reactions( path_params = { "id": id, } - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryReactionsRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return self.post( "/api/v2/chat/messages/{id}/reactions", QueryReactionsResponse, @@ -1268,7 +1223,7 @@ def translate_message( path_params = { "id": id, } - json = build_body_dict(**{"language": language}) + json = TranslateMessageRequest(language=language).to_dict() return self.post( "/api/v2/chat/messages/{id}/translate", MessageActionResponse, @@ -1287,13 +1242,9 @@ def undelete_message( path_params = { "id": id, } - json = build_body_dict( - **{ - "message": message, - "skip_enrich_url": skip_enrich_url, - "skip_push": skip_push, - } - ) + json = UpdateMessageRequest( + message=message, skip_enrich_url=skip_enrich_url, skip_push=skip_push + ).to_dict() return self.post( "/api/v2/chat/messages/{id}/undelete", UpdateMessageResponse, @@ -1314,7 +1265,7 @@ def cast_poll_vote( "message_id": message_id, "poll_id": poll_id, } - json = build_body_dict(**{"user_id": user_id, "user": user, "vote": vote}) + json = CastPollVoteRequest(user_id=user_id, user=user, vote=vote).to_dict() return self.post( "/api/v2/chat/messages/{message_id}/polls/{poll_id}/vote", PollVoteResponse, @@ -1365,9 +1316,9 @@ def update_reminder( path_params = { "message_id": message_id, } - json = build_body_dict( - **{"remind_at": remind_at, "user_id": user_id, "user": user} - ) + json = UpdateReminderRequest( + remind_at=remind_at, user_id=user_id, user=user + ).to_dict() return self.patch( "/api/v2/chat/messages/{message_id}/reminders", UpdateReminderResponse, @@ -1386,9 +1337,9 @@ def create_reminder( path_params = { "message_id": message_id, } - json = build_body_dict( - **{"remind_at": remind_at, "user_id": user_id, "user": user} - ) + json = CreateReminderRequest( + remind_at=remind_at, user_id=user_id, user=user + ).to_dict() return self.post( "/api/v2/chat/messages/{message_id}/reminders", ReminderResponseData, @@ -1448,14 +1399,9 @@ def mute_channel( channel_cids: Optional[List[str]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[MuteChannelResponse]: - json = build_body_dict( - **{ - "expiration": expiration, - "user_id": user_id, - "channel_cids": channel_cids, - "user": user, - } - ) + json = MuteChannelRequest( + expiration=expiration, user_id=user_id, channel_cids=channel_cids, user=user + ).to_dict() return self.post( "/api/v2/chat/moderation/mute/channel", MuteChannelResponse, json=json ) @@ -1468,14 +1414,9 @@ def unmute_channel( channel_cids: Optional[List[str]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UnmuteResponse]: - json = build_body_dict( - **{ - "expiration": expiration, - "user_id": user_id, - "channel_cids": channel_cids, - "user": user, - } - ) + json = UnmuteChannelRequest( + expiration=expiration, user_id=user_id, channel_cids=channel_cids, user=user + ).to_dict() return self.post( "/api/v2/chat/moderation/unmute/channel", UnmuteResponse, json=json ) @@ -1513,17 +1454,15 @@ def query_reminders( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryRemindersResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryRemindersRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return self.post( "/api/v2/chat/reminders/query", QueryRemindersResponse, json=json ) @@ -1546,15 +1485,9 @@ def query_segments( prev: Optional[str] = None, sort: Optional[List[SortParamRequest]] = None, ) -> StreamResponse[QuerySegmentsResponse]: - json = build_body_dict( - **{ - "filter": filter, - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - } - ) + json = QuerySegmentsRequest( + filter=filter, limit=limit, next=next, prev=prev, sort=sort + ).to_dict() return self.post( "/api/v2/chat/segments/query", QuerySegmentsResponse, json=json ) @@ -1584,7 +1517,7 @@ def delete_segment_targets( path_params = { "id": id, } - json = build_body_dict(**{"target_ids": target_ids}) + json = DeleteSegmentTargetsRequest(target_ids=target_ids).to_dict() return self.post( "/api/v2/chat/segments/{id}/deletetargets", Response, @@ -1619,15 +1552,9 @@ def query_segment_targets( path_params = { "id": id, } - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "Sort": sort, - "Filter": filter, - } - ) + json = QuerySegmentTargetsRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return self.post( "/api/v2/chat/segments/{id}/targets/query", QuerySegmentTargetsResponse, @@ -1649,20 +1576,18 @@ def query_threads( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryThreadsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "member_limit": member_limit, - "next": next, - "participant_limit": participant_limit, - "prev": prev, - "reply_limit": reply_limit, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryThreadsRequest( + limit=limit, + member_limit=member_limit, + next=next, + participant_limit=participant_limit, + prev=prev, + reply_limit=reply_limit, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return self.post("/api/v2/chat/threads", QueryThreadsResponse, json=json) @telemetry.operation_name("getstream.api.chat.get_thread") @@ -1702,9 +1627,9 @@ def update_thread_partial( path_params = { "message_id": message_id, } - json = build_body_dict( - **{"user_id": user_id, "unset": unset, "set": set, "user": user} - ) + json = UpdateThreadPartialRequest( + user_id=user_id, unset=unset, set=set, user=user + ).to_dict() return self.patch( "/api/v2/chat/threads/{message_id}", UpdateThreadPartialResponse, @@ -1727,7 +1652,7 @@ def unread_counts( def unread_counts_batch( self, user_ids: List[str] ) -> StreamResponse[UnreadCountsBatchResponse]: - json = build_body_dict(**{"user_ids": user_ids}) + json = UnreadCountsBatchRequest(user_ids=user_ids).to_dict() return self.post( "/api/v2/chat/unread_batch", UnreadCountsBatchResponse, json=json ) @@ -1739,7 +1664,7 @@ def send_user_custom_event( path_params = { "user_id": user_id, } - json = build_body_dict(**{"event": event}) + json = SendUserCustomEventRequest(event=event).to_dict() return self.post( "/api/v2/chat/users/{user_id}/event", Response, diff --git a/getstream/common/async_rest_client.py b/getstream/common/async_rest_client.py index a71f281e..1c33a41f 100644 --- a/getstream/common/async_rest_client.py +++ b/getstream/common/async_rest_client.py @@ -3,7 +3,7 @@ from getstream.common import telemetry from getstream.models import * from getstream.stream_response import StreamResponse -from getstream.utils import build_query_param, build_body_dict +from getstream.utils import build_query_param class CommonRestClient(AsyncBaseClient): @@ -88,57 +88,55 @@ async def update_app( push_config: Optional[PushConfig] = None, xiaomi_config: Optional[XiaomiConfig] = None, ) -> StreamResponse[Response]: - json = build_body_dict( - **{ - "async_url_enrich_enabled": async_url_enrich_enabled, - "auto_translation_enabled": auto_translation_enabled, - "before_message_send_hook_url": before_message_send_hook_url, - "cdn_expiration_seconds": cdn_expiration_seconds, - "channel_hide_members_only": channel_hide_members_only, - "custom_action_handler_url": custom_action_handler_url, - "disable_auth_checks": disable_auth_checks, - "disable_permissions_checks": disable_permissions_checks, - "enforce_unique_usernames": enforce_unique_usernames, - "feeds_moderation_enabled": feeds_moderation_enabled, - "feeds_v2_region": feeds_v2_region, - "guest_user_creation_disabled": guest_user_creation_disabled, - "image_moderation_enabled": image_moderation_enabled, - "max_aggregated_activities_length": max_aggregated_activities_length, - "migrate_permissions_to_v2": migrate_permissions_to_v2, - "moderation_enabled": moderation_enabled, - "moderation_webhook_url": moderation_webhook_url, - "multi_tenant_enabled": multi_tenant_enabled, - "permission_version": permission_version, - "reminders_interval": reminders_interval, - "reminders_max_members": reminders_max_members, - "revoke_tokens_issued_before": revoke_tokens_issued_before, - "sns_key": sns_key, - "sns_secret": sns_secret, - "sns_topic_arn": sns_topic_arn, - "sqs_key": sqs_key, - "sqs_secret": sqs_secret, - "sqs_url": sqs_url, - "user_response_time_enabled": user_response_time_enabled, - "webhook_url": webhook_url, - "allowed_flag_reasons": allowed_flag_reasons, - "event_hooks": event_hooks, - "image_moderation_block_labels": image_moderation_block_labels, - "image_moderation_labels": image_moderation_labels, - "user_search_disallowed_roles": user_search_disallowed_roles, - "webhook_events": webhook_events, - "apn_config": apn_config, - "async_moderation_config": async_moderation_config, - "datadog_info": datadog_info, - "file_upload_config": file_upload_config, - "firebase_config": firebase_config, - "grants": grants, - "huawei_config": huawei_config, - "image_upload_config": image_upload_config, - "moderation_dashboard_preferences": moderation_dashboard_preferences, - "push_config": push_config, - "xiaomi_config": xiaomi_config, - } - ) + json = UpdateAppRequest( + async_url_enrich_enabled=async_url_enrich_enabled, + auto_translation_enabled=auto_translation_enabled, + before_message_send_hook_url=before_message_send_hook_url, + cdn_expiration_seconds=cdn_expiration_seconds, + channel_hide_members_only=channel_hide_members_only, + custom_action_handler_url=custom_action_handler_url, + disable_auth_checks=disable_auth_checks, + disable_permissions_checks=disable_permissions_checks, + enforce_unique_usernames=enforce_unique_usernames, + feeds_moderation_enabled=feeds_moderation_enabled, + feeds_v2_region=feeds_v2_region, + guest_user_creation_disabled=guest_user_creation_disabled, + image_moderation_enabled=image_moderation_enabled, + max_aggregated_activities_length=max_aggregated_activities_length, + migrate_permissions_to_v2=migrate_permissions_to_v2, + moderation_enabled=moderation_enabled, + moderation_webhook_url=moderation_webhook_url, + multi_tenant_enabled=multi_tenant_enabled, + permission_version=permission_version, + reminders_interval=reminders_interval, + reminders_max_members=reminders_max_members, + revoke_tokens_issued_before=revoke_tokens_issued_before, + sns_key=sns_key, + sns_secret=sns_secret, + sns_topic_arn=sns_topic_arn, + sqs_key=sqs_key, + sqs_secret=sqs_secret, + sqs_url=sqs_url, + user_response_time_enabled=user_response_time_enabled, + webhook_url=webhook_url, + allowed_flag_reasons=allowed_flag_reasons, + event_hooks=event_hooks, + image_moderation_block_labels=image_moderation_block_labels, + image_moderation_labels=image_moderation_labels, + user_search_disallowed_roles=user_search_disallowed_roles, + webhook_events=webhook_events, + apn_config=apn_config, + async_moderation_config=async_moderation_config, + datadog_info=datadog_info, + file_upload_config=file_upload_config, + firebase_config=firebase_config, + grants=grants, + huawei_config=huawei_config, + image_upload_config=image_upload_config, + moderation_dashboard_preferences=moderation_dashboard_preferences, + push_config=push_config, + xiaomi_config=xiaomi_config, + ).to_dict() return await self.patch("/api/v2/app", Response, json=json) @telemetry.operation_name("getstream.api.common.list_block_lists") @@ -160,16 +158,14 @@ async def create_block_list( team: Optional[str] = None, type: Optional[str] = None, ) -> StreamResponse[CreateBlockListResponse]: - json = build_body_dict( - **{ - "name": name, - "words": words, - "is_leet_check_enabled": is_leet_check_enabled, - "is_plural_check_enabled": is_plural_check_enabled, - "team": team, - "type": type, - } - ) + json = CreateBlockListRequest( + name=name, + words=words, + is_leet_check_enabled=is_leet_check_enabled, + is_plural_check_enabled=is_plural_check_enabled, + team=team, + type=type, + ).to_dict() return await self.post("/api/v2/blocklists", CreateBlockListResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_block_list") @@ -214,14 +210,12 @@ async def update_block_list( path_params = { "name": name, } - json = build_body_dict( - **{ - "is_leet_check_enabled": is_leet_check_enabled, - "is_plural_check_enabled": is_plural_check_enabled, - "team": team, - "words": words, - } - ) + json = UpdateBlockListRequest( + is_leet_check_enabled=is_leet_check_enabled, + is_plural_check_enabled=is_plural_check_enabled, + team=team, + words=words, + ).to_dict() return await self.put( "/api/v2/blocklists/{name}", UpdateBlockListResponse, @@ -243,20 +237,18 @@ async def check_push( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CheckPushResponse]: - json = build_body_dict( - **{ - "apn_template": apn_template, - "event_type": event_type, - "firebase_data_template": firebase_data_template, - "firebase_template": firebase_template, - "message_id": message_id, - "push_provider_name": push_provider_name, - "push_provider_type": push_provider_type, - "skip_devices": skip_devices, - "user_id": user_id, - "user": user, - } - ) + json = CheckPushRequest( + apn_template=apn_template, + event_type=event_type, + firebase_data_template=firebase_data_template, + firebase_template=firebase_template, + message_id=message_id, + push_provider_name=push_provider_name, + push_provider_type=push_provider_type, + skip_devices=skip_devices, + user_id=user_id, + user=user, + ).to_dict() return await self.post("/api/v2/check_push", CheckPushResponse, json=json) @telemetry.operation_name("getstream.api.common.check_sns") @@ -266,13 +258,9 @@ async def check_sns( sns_secret: Optional[str] = None, sns_topic_arn: Optional[str] = None, ) -> StreamResponse[CheckSNSResponse]: - json = build_body_dict( - **{ - "sns_key": sns_key, - "sns_secret": sns_secret, - "sns_topic_arn": sns_topic_arn, - } - ) + json = CheckSNSRequest( + sns_key=sns_key, sns_secret=sns_secret, sns_topic_arn=sns_topic_arn + ).to_dict() return await self.post("/api/v2/check_sns", CheckSNSResponse, json=json) @telemetry.operation_name("getstream.api.common.check_sqs") @@ -282,9 +270,9 @@ async def check_sqs( sqs_secret: Optional[str] = None, sqs_url: Optional[str] = None, ) -> StreamResponse[CheckSQSResponse]: - json = build_body_dict( - **{"sqs_key": sqs_key, "sqs_secret": sqs_secret, "sqs_url": sqs_url} - ) + json = CheckSQSRequest( + sqs_key=sqs_key, sqs_secret=sqs_secret, sqs_url=sqs_url + ).to_dict() return await self.post("/api/v2/check_sqs", CheckSQSResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_device") @@ -313,23 +301,21 @@ async def create_device( voip_token: Optional[bool] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: - json = build_body_dict( - **{ - "id": id, - "push_provider": push_provider, - "push_provider_name": push_provider_name, - "user_id": user_id, - "voip_token": voip_token, - "user": user, - } - ) + json = CreateDeviceRequest( + id=id, + push_provider=push_provider, + push_provider_name=push_provider_name, + user_id=user_id, + voip_token=voip_token, + user=user, + ).to_dict() return await self.post("/api/v2/devices", Response, json=json) @telemetry.operation_name("getstream.api.common.export_users") async def export_users( self, user_ids: List[str] ) -> StreamResponse[ExportUsersResponse]: - json = build_body_dict(**{"user_ids": user_ids}) + json = ExportUsersRequest(user_ids=user_ids).to_dict() return await self.post("/api/v2/export/users", ExportUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.list_external_storage") @@ -349,17 +335,15 @@ async def create_external_storage( aws_s3: Optional[S3Request] = None, azure_blob: Optional[AzureRequest] = None, ) -> StreamResponse[CreateExternalStorageResponse]: - json = build_body_dict( - **{ - "bucket": bucket, - "name": name, - "storage_type": storage_type, - "gcs_credentials": gcs_credentials, - "path": path, - "aws_s3": aws_s3, - "azure_blob": azure_blob, - } - ) + json = CreateExternalStorageRequest( + bucket=bucket, + name=name, + storage_type=storage_type, + gcs_credentials=gcs_credentials, + path=path, + aws_s3=aws_s3, + azure_blob=azure_blob, + ).to_dict() return await self.post( "/api/v2/external_storage", CreateExternalStorageResponse, json=json ) @@ -391,16 +375,14 @@ async def update_external_storage( path_params = { "name": name, } - json = build_body_dict( - **{ - "bucket": bucket, - "storage_type": storage_type, - "gcs_credentials": gcs_credentials, - "path": path, - "aws_s3": aws_s3, - "azure_blob": azure_blob, - } - ) + json = UpdateExternalStorageRequest( + bucket=bucket, + storage_type=storage_type, + gcs_credentials=gcs_credentials, + path=path, + aws_s3=aws_s3, + azure_blob=azure_blob, + ).to_dict() return await self.put( "/api/v2/external_storage/{name}", UpdateExternalStorageResponse, @@ -425,14 +407,14 @@ async def check_external_storage( async def create_guest( self, user: UserRequest ) -> StreamResponse[CreateGuestResponse]: - json = build_body_dict(**{"user": user}) + json = CreateGuestRequest(user=user).to_dict() return await self.post("/api/v2/guest", CreateGuestResponse, json=json) @telemetry.operation_name("getstream.api.common.create_import_url") async def create_import_url( self, filename: Optional[str] = None ) -> StreamResponse[CreateImportURLResponse]: - json = build_body_dict(**{"filename": filename}) + json = CreateImportURLRequest(filename=filename).to_dict() return await self.post( "/api/v2/import_urls", CreateImportURLResponse, json=json ) @@ -445,7 +427,7 @@ async def list_imports(self) -> StreamResponse[ListImportsResponse]: async def create_import( self, mode: str, path: str ) -> StreamResponse[CreateImportResponse]: - json = build_body_dict(**{"mode": mode, "path": path}) + json = CreateImportRequest(mode=mode, path=path).to_dict() return await self.post("/api/v2/imports", CreateImportResponse, json=json) @telemetry.operation_name("getstream.api.common.list_import_v2_tasks") @@ -465,14 +447,9 @@ async def create_import_v2_task( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CreateImportV2TaskResponse]: - json = build_body_dict( - **{ - "product": product, - "settings": settings, - "user_id": user_id, - "user": user, - } - ) + json = CreateImportV2TaskRequest( + product=product, settings=settings, user_id=user_id, user=user + ).to_dict() return await self.post( "/api/v2/imports/v2", CreateImportV2TaskResponse, json=json ) @@ -549,23 +526,21 @@ async def create_poll( custom: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[PollResponse]: - json = build_body_dict( - **{ - "name": name, - "allow_answers": allow_answers, - "allow_user_suggested_options": allow_user_suggested_options, - "description": description, - "enforce_unique_vote": enforce_unique_vote, - "id": id, - "is_closed": is_closed, - "max_votes_allowed": max_votes_allowed, - "user_id": user_id, - "voting_visibility": voting_visibility, - "options": options, - "Custom": custom, - "user": user, - } - ) + json = CreatePollRequest( + name=name, + allow_answers=allow_answers, + allow_user_suggested_options=allow_user_suggested_options, + description=description, + enforce_unique_vote=enforce_unique_vote, + id=id, + is_closed=is_closed, + max_votes_allowed=max_votes_allowed, + user_id=user_id, + voting_visibility=voting_visibility, + options=options, + custom=custom, + user=user, + ).to_dict() return await self.post("/api/v2/polls", PollResponse, json=json) @telemetry.operation_name("getstream.api.common.update_poll") @@ -585,23 +560,21 @@ async def update_poll( custom: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[PollResponse]: - json = build_body_dict( - **{ - "id": id, - "name": name, - "allow_answers": allow_answers, - "allow_user_suggested_options": allow_user_suggested_options, - "description": description, - "enforce_unique_vote": enforce_unique_vote, - "is_closed": is_closed, - "max_votes_allowed": max_votes_allowed, - "user_id": user_id, - "voting_visibility": voting_visibility, - "options": options, - "Custom": custom, - "user": user, - } - ) + json = UpdatePollRequest( + id=id, + name=name, + allow_answers=allow_answers, + allow_user_suggested_options=allow_user_suggested_options, + description=description, + enforce_unique_vote=enforce_unique_vote, + is_closed=is_closed, + max_votes_allowed=max_votes_allowed, + user_id=user_id, + voting_visibility=voting_visibility, + options=options, + custom=custom, + user=user, + ).to_dict() return await self.put("/api/v2/polls", PollResponse, json=json) @telemetry.operation_name("getstream.api.common.query_polls") @@ -615,15 +588,9 @@ async def query_polls( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryPollsResponse]: query_params = build_query_param(**{"user_id": user_id}) - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter": filter, - } - ) + json = QueryPollsRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return await self.post( "/api/v2/polls/query", QueryPollsResponse, @@ -673,9 +640,9 @@ async def update_poll_partial( path_params = { "poll_id": poll_id, } - json = build_body_dict( - **{"user_id": user_id, "unset": unset, "set": set, "user": user} - ) + json = UpdatePollPartialRequest( + user_id=user_id, unset=unset, set=set, user=user + ).to_dict() return await self.patch( "/api/v2/polls/{poll_id}", PollResponse, path_params=path_params, json=json ) @@ -692,9 +659,9 @@ async def create_poll_option( path_params = { "poll_id": poll_id, } - json = build_body_dict( - **{"text": text, "user_id": user_id, "Custom": custom, "user": user} - ) + json = CreatePollOptionRequest( + text=text, user_id=user_id, custom=custom, user=user + ).to_dict() return await self.post( "/api/v2/polls/{poll_id}/options", PollOptionResponse, @@ -715,15 +682,9 @@ async def update_poll_option( path_params = { "poll_id": poll_id, } - json = build_body_dict( - **{ - "id": id, - "text": text, - "user_id": user_id, - "Custom": custom, - "user": user, - } - ) + json = UpdatePollOptionRequest( + id=id, text=text, user_id=user_id, custom=custom, user=user + ).to_dict() return await self.put( "/api/v2/polls/{poll_id}/options", PollOptionResponse, @@ -778,15 +739,9 @@ async def query_poll_votes( path_params = { "poll_id": poll_id, } - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter": filter, - } - ) + json = QueryPollVotesRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return await self.post( "/api/v2/polls/{poll_id}/votes", PollVotesResponse, @@ -801,7 +756,7 @@ async def query_poll_votes( async def update_push_notification_preferences( self, preferences: List[PushPreferenceInput] ) -> StreamResponse[UpsertPushPreferencesResponse]: - json = build_body_dict(**{"preferences": preferences}) + json = UpsertPushPreferencesRequest(preferences=preferences).to_dict() return await self.post( "/api/v2/push_preferences", UpsertPushPreferencesResponse, json=json ) @@ -814,7 +769,7 @@ async def list_push_providers(self) -> StreamResponse[ListPushProvidersResponse] async def upsert_push_provider( self, push_provider: Optional[PushProviderRequest] = None ) -> StreamResponse[UpsertPushProviderResponse]: - json = build_body_dict(**{"push_provider": push_provider}) + json = UpsertPushProviderRequest(push_provider=push_provider).to_dict() return await self.post( "/api/v2/push_providers", UpsertPushProviderResponse, json=json ) @@ -856,15 +811,13 @@ async def upsert_push_template( push_provider_name: Optional[str] = None, template: Optional[str] = None, ) -> StreamResponse[UpsertPushTemplateResponse]: - json = build_body_dict( - **{ - "event_type": event_type, - "push_provider_type": push_provider_type, - "enable_push": enable_push, - "push_provider_name": push_provider_name, - "template": template, - } - ) + json = UpsertPushTemplateRequest( + event_type=event_type, + push_provider_type=push_provider_type, + enable_push=enable_push, + push_provider_name=push_provider_name, + template=template, + ).to_dict() return await self.post( "/api/v2/push_templates", UpsertPushTemplateResponse, json=json ) @@ -897,7 +850,7 @@ async def list_roles(self) -> StreamResponse[ListRolesResponse]: @telemetry.operation_name("getstream.api.common.create_role") async def create_role(self, name: str) -> StreamResponse[CreateRoleResponse]: - json = build_body_dict(**{"name": name}) + json = CreateRoleRequest(name=name).to_dict() return await self.post("/api/v2/roles", CreateRoleResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_role") @@ -929,7 +882,7 @@ async def delete_file(self, url: Optional[str] = None) -> StreamResponse[Respons async def upload_file( self, file: Optional[str] = None, user: Optional[OnlyUserID] = None ) -> StreamResponse[FileUploadResponse]: - json = build_body_dict(**{"file": file, "user": user}) + json = FileUploadRequest(file=file, user=user).to_dict() return await self.post("/api/v2/uploads/file", FileUploadResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_image") @@ -946,9 +899,9 @@ async def upload_image( upload_sizes: Optional[List[ImageSize]] = None, user: Optional[OnlyUserID] = None, ) -> StreamResponse[ImageUploadResponse]: - json = build_body_dict( - **{"file": file, "upload_sizes": upload_sizes, "user": user} - ) + json = ImageUploadRequest( + file=file, upload_sizes=upload_sizes, user=user + ).to_dict() return await self.post("/api/v2/uploads/image", ImageUploadResponse, json=json) @telemetry.operation_name("getstream.api.common.query_users") @@ -964,14 +917,14 @@ async def query_users( async def update_users_partial( self, users: List[UpdateUserPartialRequest] ) -> StreamResponse[UpdateUsersResponse]: - json = build_body_dict(**{"users": users}) + json = UpdateUsersPartialRequest(users=users).to_dict() return await self.patch("/api/v2/users", UpdateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.update_users") async def update_users( self, users: Dict[str, UserRequest] ) -> StreamResponse[UpdateUsersResponse]: - json = build_body_dict(**{"users": users}) + json = UpdateUsersRequest(users=users).to_dict() return await self.post("/api/v2/users", UpdateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.get_blocked_users") @@ -990,9 +943,9 @@ async def block_users( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[BlockUsersResponse]: - json = build_body_dict( - **{"blocked_user_id": blocked_user_id, "user_id": user_id, "user": user} - ) + json = BlockUsersRequest( + blocked_user_id=blocked_user_id, user_id=user_id, user=user + ).to_dict() return await self.post("/api/v2/users/block", BlockUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.deactivate_users") @@ -1003,14 +956,12 @@ async def deactivate_users( mark_channels_deleted: Optional[bool] = None, mark_messages_deleted: Optional[bool] = None, ) -> StreamResponse[DeactivateUsersResponse]: - json = build_body_dict( - **{ - "user_ids": user_ids, - "created_by_id": created_by_id, - "mark_channels_deleted": mark_channels_deleted, - "mark_messages_deleted": mark_messages_deleted, - } - ) + json = DeactivateUsersRequest( + user_ids=user_ids, + created_by_id=created_by_id, + mark_channels_deleted=mark_channels_deleted, + mark_messages_deleted=mark_messages_deleted, + ).to_dict() return await self.post( "/api/v2/users/deactivate", DeactivateUsersResponse, json=json ) @@ -1027,18 +978,16 @@ async def delete_users( new_channel_owner_id: Optional[str] = None, user: Optional[str] = None, ) -> StreamResponse[DeleteUsersResponse]: - json = build_body_dict( - **{ - "user_ids": user_ids, - "calls": calls, - "conversations": conversations, - "files": files, - "messages": messages, - "new_call_owner_id": new_call_owner_id, - "new_channel_owner_id": new_channel_owner_id, - "user": user, - } - ) + json = DeleteUsersRequest( + user_ids=user_ids, + calls=calls, + conversations=conversations, + files=files, + messages=messages, + new_call_owner_id=new_call_owner_id, + new_channel_owner_id=new_channel_owner_id, + user=user, + ).to_dict() return await self.post("/api/v2/users/delete", DeleteUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.get_user_live_locations") @@ -1062,14 +1011,9 @@ async def update_live_location( user_id: Optional[str] = None, ) -> StreamResponse[SharedLocationResponse]: query_params = build_query_param(**{"user_id": user_id}) - json = build_body_dict( - **{ - "message_id": message_id, - "end_at": end_at, - "latitude": latitude, - "longitude": longitude, - } - ) + json = UpdateLiveLocationRequest( + message_id=message_id, end_at=end_at, latitude=latitude, longitude=longitude + ).to_dict() return await self.put( "/api/v2/users/live_locations", SharedLocationResponse, @@ -1085,21 +1029,19 @@ async def reactivate_users( restore_channels: Optional[bool] = None, restore_messages: Optional[bool] = None, ) -> StreamResponse[ReactivateUsersResponse]: - json = build_body_dict( - **{ - "user_ids": user_ids, - "created_by_id": created_by_id, - "restore_channels": restore_channels, - "restore_messages": restore_messages, - } - ) + json = ReactivateUsersRequest( + user_ids=user_ids, + created_by_id=created_by_id, + restore_channels=restore_channels, + restore_messages=restore_messages, + ).to_dict() return await self.post( "/api/v2/users/reactivate", ReactivateUsersResponse, json=json ) @telemetry.operation_name("getstream.api.common.restore_users") async def restore_users(self, user_ids: List[str]) -> StreamResponse[Response]: - json = build_body_dict(**{"user_ids": user_ids}) + json = RestoreUsersRequest(user_ids=user_ids).to_dict() return await self.post("/api/v2/users/restore", Response, json=json) @telemetry.operation_name("getstream.api.common.unblock_users") @@ -1109,9 +1051,9 @@ async def unblock_users( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UnblockUsersResponse]: - json = build_body_dict( - **{"blocked_user_id": blocked_user_id, "user_id": user_id, "user": user} - ) + json = UnblockUsersRequest( + blocked_user_id=blocked_user_id, user_id=user_id, user=user + ).to_dict() return await self.post("/api/v2/users/unblock", UnblockUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.deactivate_user") @@ -1124,12 +1066,9 @@ async def deactivate_user( path_params = { "user_id": user_id, } - json = build_body_dict( - **{ - "created_by_id": created_by_id, - "mark_messages_deleted": mark_messages_deleted, - } - ) + json = DeactivateUserRequest( + created_by_id=created_by_id, mark_messages_deleted=mark_messages_deleted + ).to_dict() return await self.post( "/api/v2/users/{user_id}/deactivate", DeactivateUserResponse, @@ -1159,13 +1098,9 @@ async def reactivate_user( path_params = { "user_id": user_id, } - json = build_body_dict( - **{ - "created_by_id": created_by_id, - "name": name, - "restore_messages": restore_messages, - } - ) + json = ReactivateUserRequest( + created_by_id=created_by_id, name=name, restore_messages=restore_messages + ).to_dict() return await self.post( "/api/v2/users/{user_id}/reactivate", ReactivateUserResponse, diff --git a/getstream/common/rest_client.py b/getstream/common/rest_client.py index 90b8660e..a093ce7b 100644 --- a/getstream/common/rest_client.py +++ b/getstream/common/rest_client.py @@ -3,7 +3,7 @@ from getstream.common import telemetry from getstream.models import * from getstream.stream_response import StreamResponse -from getstream.utils import build_query_param, build_body_dict +from getstream.utils import build_query_param class CommonRestClient(BaseClient): @@ -88,57 +88,55 @@ def update_app( push_config: Optional[PushConfig] = None, xiaomi_config: Optional[XiaomiConfig] = None, ) -> StreamResponse[Response]: - json = build_body_dict( - **{ - "async_url_enrich_enabled": async_url_enrich_enabled, - "auto_translation_enabled": auto_translation_enabled, - "before_message_send_hook_url": before_message_send_hook_url, - "cdn_expiration_seconds": cdn_expiration_seconds, - "channel_hide_members_only": channel_hide_members_only, - "custom_action_handler_url": custom_action_handler_url, - "disable_auth_checks": disable_auth_checks, - "disable_permissions_checks": disable_permissions_checks, - "enforce_unique_usernames": enforce_unique_usernames, - "feeds_moderation_enabled": feeds_moderation_enabled, - "feeds_v2_region": feeds_v2_region, - "guest_user_creation_disabled": guest_user_creation_disabled, - "image_moderation_enabled": image_moderation_enabled, - "max_aggregated_activities_length": max_aggregated_activities_length, - "migrate_permissions_to_v2": migrate_permissions_to_v2, - "moderation_enabled": moderation_enabled, - "moderation_webhook_url": moderation_webhook_url, - "multi_tenant_enabled": multi_tenant_enabled, - "permission_version": permission_version, - "reminders_interval": reminders_interval, - "reminders_max_members": reminders_max_members, - "revoke_tokens_issued_before": revoke_tokens_issued_before, - "sns_key": sns_key, - "sns_secret": sns_secret, - "sns_topic_arn": sns_topic_arn, - "sqs_key": sqs_key, - "sqs_secret": sqs_secret, - "sqs_url": sqs_url, - "user_response_time_enabled": user_response_time_enabled, - "webhook_url": webhook_url, - "allowed_flag_reasons": allowed_flag_reasons, - "event_hooks": event_hooks, - "image_moderation_block_labels": image_moderation_block_labels, - "image_moderation_labels": image_moderation_labels, - "user_search_disallowed_roles": user_search_disallowed_roles, - "webhook_events": webhook_events, - "apn_config": apn_config, - "async_moderation_config": async_moderation_config, - "datadog_info": datadog_info, - "file_upload_config": file_upload_config, - "firebase_config": firebase_config, - "grants": grants, - "huawei_config": huawei_config, - "image_upload_config": image_upload_config, - "moderation_dashboard_preferences": moderation_dashboard_preferences, - "push_config": push_config, - "xiaomi_config": xiaomi_config, - } - ) + json = UpdateAppRequest( + async_url_enrich_enabled=async_url_enrich_enabled, + auto_translation_enabled=auto_translation_enabled, + before_message_send_hook_url=before_message_send_hook_url, + cdn_expiration_seconds=cdn_expiration_seconds, + channel_hide_members_only=channel_hide_members_only, + custom_action_handler_url=custom_action_handler_url, + disable_auth_checks=disable_auth_checks, + disable_permissions_checks=disable_permissions_checks, + enforce_unique_usernames=enforce_unique_usernames, + feeds_moderation_enabled=feeds_moderation_enabled, + feeds_v2_region=feeds_v2_region, + guest_user_creation_disabled=guest_user_creation_disabled, + image_moderation_enabled=image_moderation_enabled, + max_aggregated_activities_length=max_aggregated_activities_length, + migrate_permissions_to_v2=migrate_permissions_to_v2, + moderation_enabled=moderation_enabled, + moderation_webhook_url=moderation_webhook_url, + multi_tenant_enabled=multi_tenant_enabled, + permission_version=permission_version, + reminders_interval=reminders_interval, + reminders_max_members=reminders_max_members, + revoke_tokens_issued_before=revoke_tokens_issued_before, + sns_key=sns_key, + sns_secret=sns_secret, + sns_topic_arn=sns_topic_arn, + sqs_key=sqs_key, + sqs_secret=sqs_secret, + sqs_url=sqs_url, + user_response_time_enabled=user_response_time_enabled, + webhook_url=webhook_url, + allowed_flag_reasons=allowed_flag_reasons, + event_hooks=event_hooks, + image_moderation_block_labels=image_moderation_block_labels, + image_moderation_labels=image_moderation_labels, + user_search_disallowed_roles=user_search_disallowed_roles, + webhook_events=webhook_events, + apn_config=apn_config, + async_moderation_config=async_moderation_config, + datadog_info=datadog_info, + file_upload_config=file_upload_config, + firebase_config=firebase_config, + grants=grants, + huawei_config=huawei_config, + image_upload_config=image_upload_config, + moderation_dashboard_preferences=moderation_dashboard_preferences, + push_config=push_config, + xiaomi_config=xiaomi_config, + ).to_dict() return self.patch("/api/v2/app", Response, json=json) @telemetry.operation_name("getstream.api.common.list_block_lists") @@ -160,16 +158,14 @@ def create_block_list( team: Optional[str] = None, type: Optional[str] = None, ) -> StreamResponse[CreateBlockListResponse]: - json = build_body_dict( - **{ - "name": name, - "words": words, - "is_leet_check_enabled": is_leet_check_enabled, - "is_plural_check_enabled": is_plural_check_enabled, - "team": team, - "type": type, - } - ) + json = CreateBlockListRequest( + name=name, + words=words, + is_leet_check_enabled=is_leet_check_enabled, + is_plural_check_enabled=is_plural_check_enabled, + team=team, + type=type, + ).to_dict() return self.post("/api/v2/blocklists", CreateBlockListResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_block_list") @@ -214,14 +210,12 @@ def update_block_list( path_params = { "name": name, } - json = build_body_dict( - **{ - "is_leet_check_enabled": is_leet_check_enabled, - "is_plural_check_enabled": is_plural_check_enabled, - "team": team, - "words": words, - } - ) + json = UpdateBlockListRequest( + is_leet_check_enabled=is_leet_check_enabled, + is_plural_check_enabled=is_plural_check_enabled, + team=team, + words=words, + ).to_dict() return self.put( "/api/v2/blocklists/{name}", UpdateBlockListResponse, @@ -243,20 +237,18 @@ def check_push( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CheckPushResponse]: - json = build_body_dict( - **{ - "apn_template": apn_template, - "event_type": event_type, - "firebase_data_template": firebase_data_template, - "firebase_template": firebase_template, - "message_id": message_id, - "push_provider_name": push_provider_name, - "push_provider_type": push_provider_type, - "skip_devices": skip_devices, - "user_id": user_id, - "user": user, - } - ) + json = CheckPushRequest( + apn_template=apn_template, + event_type=event_type, + firebase_data_template=firebase_data_template, + firebase_template=firebase_template, + message_id=message_id, + push_provider_name=push_provider_name, + push_provider_type=push_provider_type, + skip_devices=skip_devices, + user_id=user_id, + user=user, + ).to_dict() return self.post("/api/v2/check_push", CheckPushResponse, json=json) @telemetry.operation_name("getstream.api.common.check_sns") @@ -266,13 +258,9 @@ def check_sns( sns_secret: Optional[str] = None, sns_topic_arn: Optional[str] = None, ) -> StreamResponse[CheckSNSResponse]: - json = build_body_dict( - **{ - "sns_key": sns_key, - "sns_secret": sns_secret, - "sns_topic_arn": sns_topic_arn, - } - ) + json = CheckSNSRequest( + sns_key=sns_key, sns_secret=sns_secret, sns_topic_arn=sns_topic_arn + ).to_dict() return self.post("/api/v2/check_sns", CheckSNSResponse, json=json) @telemetry.operation_name("getstream.api.common.check_sqs") @@ -282,9 +270,9 @@ def check_sqs( sqs_secret: Optional[str] = None, sqs_url: Optional[str] = None, ) -> StreamResponse[CheckSQSResponse]: - json = build_body_dict( - **{"sqs_key": sqs_key, "sqs_secret": sqs_secret, "sqs_url": sqs_url} - ) + json = CheckSQSRequest( + sqs_key=sqs_key, sqs_secret=sqs_secret, sqs_url=sqs_url + ).to_dict() return self.post("/api/v2/check_sqs", CheckSQSResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_device") @@ -313,21 +301,19 @@ def create_device( voip_token: Optional[bool] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[Response]: - json = build_body_dict( - **{ - "id": id, - "push_provider": push_provider, - "push_provider_name": push_provider_name, - "user_id": user_id, - "voip_token": voip_token, - "user": user, - } - ) + json = CreateDeviceRequest( + id=id, + push_provider=push_provider, + push_provider_name=push_provider_name, + user_id=user_id, + voip_token=voip_token, + user=user, + ).to_dict() return self.post("/api/v2/devices", Response, json=json) @telemetry.operation_name("getstream.api.common.export_users") def export_users(self, user_ids: List[str]) -> StreamResponse[ExportUsersResponse]: - json = build_body_dict(**{"user_ids": user_ids}) + json = ExportUsersRequest(user_ids=user_ids).to_dict() return self.post("/api/v2/export/users", ExportUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.list_external_storage") @@ -345,17 +331,15 @@ def create_external_storage( aws_s3: Optional[S3Request] = None, azure_blob: Optional[AzureRequest] = None, ) -> StreamResponse[CreateExternalStorageResponse]: - json = build_body_dict( - **{ - "bucket": bucket, - "name": name, - "storage_type": storage_type, - "gcs_credentials": gcs_credentials, - "path": path, - "aws_s3": aws_s3, - "azure_blob": azure_blob, - } - ) + json = CreateExternalStorageRequest( + bucket=bucket, + name=name, + storage_type=storage_type, + gcs_credentials=gcs_credentials, + path=path, + aws_s3=aws_s3, + azure_blob=azure_blob, + ).to_dict() return self.post( "/api/v2/external_storage", CreateExternalStorageResponse, json=json ) @@ -387,16 +371,14 @@ def update_external_storage( path_params = { "name": name, } - json = build_body_dict( - **{ - "bucket": bucket, - "storage_type": storage_type, - "gcs_credentials": gcs_credentials, - "path": path, - "aws_s3": aws_s3, - "azure_blob": azure_blob, - } - ) + json = UpdateExternalStorageRequest( + bucket=bucket, + storage_type=storage_type, + gcs_credentials=gcs_credentials, + path=path, + aws_s3=aws_s3, + azure_blob=azure_blob, + ).to_dict() return self.put( "/api/v2/external_storage/{name}", UpdateExternalStorageResponse, @@ -419,14 +401,14 @@ def check_external_storage( @telemetry.operation_name("getstream.api.common.create_guest") def create_guest(self, user: UserRequest) -> StreamResponse[CreateGuestResponse]: - json = build_body_dict(**{"user": user}) + json = CreateGuestRequest(user=user).to_dict() return self.post("/api/v2/guest", CreateGuestResponse, json=json) @telemetry.operation_name("getstream.api.common.create_import_url") def create_import_url( self, filename: Optional[str] = None ) -> StreamResponse[CreateImportURLResponse]: - json = build_body_dict(**{"filename": filename}) + json = CreateImportURLRequest(filename=filename).to_dict() return self.post("/api/v2/import_urls", CreateImportURLResponse, json=json) @telemetry.operation_name("getstream.api.common.list_imports") @@ -437,7 +419,7 @@ def list_imports(self) -> StreamResponse[ListImportsResponse]: def create_import( self, mode: str, path: str ) -> StreamResponse[CreateImportResponse]: - json = build_body_dict(**{"mode": mode, "path": path}) + json = CreateImportRequest(mode=mode, path=path).to_dict() return self.post("/api/v2/imports", CreateImportResponse, json=json) @telemetry.operation_name("getstream.api.common.list_import_v2_tasks") @@ -457,14 +439,9 @@ def create_import_v2_task( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CreateImportV2TaskResponse]: - json = build_body_dict( - **{ - "product": product, - "settings": settings, - "user_id": user_id, - "user": user, - } - ) + json = CreateImportV2TaskRequest( + product=product, settings=settings, user_id=user_id, user=user + ).to_dict() return self.post("/api/v2/imports/v2", CreateImportV2TaskResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_import_v2_task") @@ -535,23 +512,21 @@ def create_poll( custom: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[PollResponse]: - json = build_body_dict( - **{ - "name": name, - "allow_answers": allow_answers, - "allow_user_suggested_options": allow_user_suggested_options, - "description": description, - "enforce_unique_vote": enforce_unique_vote, - "id": id, - "is_closed": is_closed, - "max_votes_allowed": max_votes_allowed, - "user_id": user_id, - "voting_visibility": voting_visibility, - "options": options, - "Custom": custom, - "user": user, - } - ) + json = CreatePollRequest( + name=name, + allow_answers=allow_answers, + allow_user_suggested_options=allow_user_suggested_options, + description=description, + enforce_unique_vote=enforce_unique_vote, + id=id, + is_closed=is_closed, + max_votes_allowed=max_votes_allowed, + user_id=user_id, + voting_visibility=voting_visibility, + options=options, + custom=custom, + user=user, + ).to_dict() return self.post("/api/v2/polls", PollResponse, json=json) @telemetry.operation_name("getstream.api.common.update_poll") @@ -571,23 +546,21 @@ def update_poll( custom: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[PollResponse]: - json = build_body_dict( - **{ - "id": id, - "name": name, - "allow_answers": allow_answers, - "allow_user_suggested_options": allow_user_suggested_options, - "description": description, - "enforce_unique_vote": enforce_unique_vote, - "is_closed": is_closed, - "max_votes_allowed": max_votes_allowed, - "user_id": user_id, - "voting_visibility": voting_visibility, - "options": options, - "Custom": custom, - "user": user, - } - ) + json = UpdatePollRequest( + id=id, + name=name, + allow_answers=allow_answers, + allow_user_suggested_options=allow_user_suggested_options, + description=description, + enforce_unique_vote=enforce_unique_vote, + is_closed=is_closed, + max_votes_allowed=max_votes_allowed, + user_id=user_id, + voting_visibility=voting_visibility, + options=options, + custom=custom, + user=user, + ).to_dict() return self.put("/api/v2/polls", PollResponse, json=json) @telemetry.operation_name("getstream.api.common.query_polls") @@ -601,15 +574,9 @@ def query_polls( filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryPollsResponse]: query_params = build_query_param(**{"user_id": user_id}) - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter": filter, - } - ) + json = QueryPollsRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return self.post( "/api/v2/polls/query", QueryPollsResponse, @@ -659,9 +626,9 @@ def update_poll_partial( path_params = { "poll_id": poll_id, } - json = build_body_dict( - **{"user_id": user_id, "unset": unset, "set": set, "user": user} - ) + json = UpdatePollPartialRequest( + user_id=user_id, unset=unset, set=set, user=user + ).to_dict() return self.patch( "/api/v2/polls/{poll_id}", PollResponse, path_params=path_params, json=json ) @@ -678,9 +645,9 @@ def create_poll_option( path_params = { "poll_id": poll_id, } - json = build_body_dict( - **{"text": text, "user_id": user_id, "Custom": custom, "user": user} - ) + json = CreatePollOptionRequest( + text=text, user_id=user_id, custom=custom, user=user + ).to_dict() return self.post( "/api/v2/polls/{poll_id}/options", PollOptionResponse, @@ -701,15 +668,9 @@ def update_poll_option( path_params = { "poll_id": poll_id, } - json = build_body_dict( - **{ - "id": id, - "text": text, - "user_id": user_id, - "Custom": custom, - "user": user, - } - ) + json = UpdatePollOptionRequest( + id=id, text=text, user_id=user_id, custom=custom, user=user + ).to_dict() return self.put( "/api/v2/polls/{poll_id}/options", PollOptionResponse, @@ -764,15 +725,9 @@ def query_poll_votes( path_params = { "poll_id": poll_id, } - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter": filter, - } - ) + json = QueryPollVotesRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return self.post( "/api/v2/polls/{poll_id}/votes", PollVotesResponse, @@ -787,7 +742,7 @@ def query_poll_votes( def update_push_notification_preferences( self, preferences: List[PushPreferenceInput] ) -> StreamResponse[UpsertPushPreferencesResponse]: - json = build_body_dict(**{"preferences": preferences}) + json = UpsertPushPreferencesRequest(preferences=preferences).to_dict() return self.post( "/api/v2/push_preferences", UpsertPushPreferencesResponse, json=json ) @@ -800,7 +755,7 @@ def list_push_providers(self) -> StreamResponse[ListPushProvidersResponse]: def upsert_push_provider( self, push_provider: Optional[PushProviderRequest] = None ) -> StreamResponse[UpsertPushProviderResponse]: - json = build_body_dict(**{"push_provider": push_provider}) + json = UpsertPushProviderRequest(push_provider=push_provider).to_dict() return self.post( "/api/v2/push_providers", UpsertPushProviderResponse, json=json ) @@ -840,15 +795,13 @@ def upsert_push_template( push_provider_name: Optional[str] = None, template: Optional[str] = None, ) -> StreamResponse[UpsertPushTemplateResponse]: - json = build_body_dict( - **{ - "event_type": event_type, - "push_provider_type": push_provider_type, - "enable_push": enable_push, - "push_provider_name": push_provider_name, - "template": template, - } - ) + json = UpsertPushTemplateRequest( + event_type=event_type, + push_provider_type=push_provider_type, + enable_push=enable_push, + push_provider_name=push_provider_name, + template=template, + ).to_dict() return self.post( "/api/v2/push_templates", UpsertPushTemplateResponse, json=json ) @@ -881,7 +834,7 @@ def list_roles(self) -> StreamResponse[ListRolesResponse]: @telemetry.operation_name("getstream.api.common.create_role") def create_role(self, name: str) -> StreamResponse[CreateRoleResponse]: - json = build_body_dict(**{"name": name}) + json = CreateRoleRequest(name=name).to_dict() return self.post("/api/v2/roles", CreateRoleResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_role") @@ -907,7 +860,7 @@ def delete_file(self, url: Optional[str] = None) -> StreamResponse[Response]: def upload_file( self, file: Optional[str] = None, user: Optional[OnlyUserID] = None ) -> StreamResponse[FileUploadResponse]: - json = build_body_dict(**{"file": file, "user": user}) + json = FileUploadRequest(file=file, user=user).to_dict() return self.post("/api/v2/uploads/file", FileUploadResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_image") @@ -922,9 +875,9 @@ def upload_image( upload_sizes: Optional[List[ImageSize]] = None, user: Optional[OnlyUserID] = None, ) -> StreamResponse[ImageUploadResponse]: - json = build_body_dict( - **{"file": file, "upload_sizes": upload_sizes, "user": user} - ) + json = ImageUploadRequest( + file=file, upload_sizes=upload_sizes, user=user + ).to_dict() return self.post("/api/v2/uploads/image", ImageUploadResponse, json=json) @telemetry.operation_name("getstream.api.common.query_users") @@ -938,14 +891,14 @@ def query_users( def update_users_partial( self, users: List[UpdateUserPartialRequest] ) -> StreamResponse[UpdateUsersResponse]: - json = build_body_dict(**{"users": users}) + json = UpdateUsersPartialRequest(users=users).to_dict() return self.patch("/api/v2/users", UpdateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.update_users") def update_users( self, users: Dict[str, UserRequest] ) -> StreamResponse[UpdateUsersResponse]: - json = build_body_dict(**{"users": users}) + json = UpdateUsersRequest(users=users).to_dict() return self.post("/api/v2/users", UpdateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.get_blocked_users") @@ -964,9 +917,9 @@ def block_users( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[BlockUsersResponse]: - json = build_body_dict( - **{"blocked_user_id": blocked_user_id, "user_id": user_id, "user": user} - ) + json = BlockUsersRequest( + blocked_user_id=blocked_user_id, user_id=user_id, user=user + ).to_dict() return self.post("/api/v2/users/block", BlockUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.deactivate_users") @@ -977,14 +930,12 @@ def deactivate_users( mark_channels_deleted: Optional[bool] = None, mark_messages_deleted: Optional[bool] = None, ) -> StreamResponse[DeactivateUsersResponse]: - json = build_body_dict( - **{ - "user_ids": user_ids, - "created_by_id": created_by_id, - "mark_channels_deleted": mark_channels_deleted, - "mark_messages_deleted": mark_messages_deleted, - } - ) + json = DeactivateUsersRequest( + user_ids=user_ids, + created_by_id=created_by_id, + mark_channels_deleted=mark_channels_deleted, + mark_messages_deleted=mark_messages_deleted, + ).to_dict() return self.post("/api/v2/users/deactivate", DeactivateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.delete_users") @@ -999,18 +950,16 @@ def delete_users( new_channel_owner_id: Optional[str] = None, user: Optional[str] = None, ) -> StreamResponse[DeleteUsersResponse]: - json = build_body_dict( - **{ - "user_ids": user_ids, - "calls": calls, - "conversations": conversations, - "files": files, - "messages": messages, - "new_call_owner_id": new_call_owner_id, - "new_channel_owner_id": new_channel_owner_id, - "user": user, - } - ) + json = DeleteUsersRequest( + user_ids=user_ids, + calls=calls, + conversations=conversations, + files=files, + messages=messages, + new_call_owner_id=new_call_owner_id, + new_channel_owner_id=new_channel_owner_id, + user=user, + ).to_dict() return self.post("/api/v2/users/delete", DeleteUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.get_user_live_locations") @@ -1034,14 +983,9 @@ def update_live_location( user_id: Optional[str] = None, ) -> StreamResponse[SharedLocationResponse]: query_params = build_query_param(**{"user_id": user_id}) - json = build_body_dict( - **{ - "message_id": message_id, - "end_at": end_at, - "latitude": latitude, - "longitude": longitude, - } - ) + json = UpdateLiveLocationRequest( + message_id=message_id, end_at=end_at, latitude=latitude, longitude=longitude + ).to_dict() return self.put( "/api/v2/users/live_locations", SharedLocationResponse, @@ -1057,19 +1001,17 @@ def reactivate_users( restore_channels: Optional[bool] = None, restore_messages: Optional[bool] = None, ) -> StreamResponse[ReactivateUsersResponse]: - json = build_body_dict( - **{ - "user_ids": user_ids, - "created_by_id": created_by_id, - "restore_channels": restore_channels, - "restore_messages": restore_messages, - } - ) + json = ReactivateUsersRequest( + user_ids=user_ids, + created_by_id=created_by_id, + restore_channels=restore_channels, + restore_messages=restore_messages, + ).to_dict() return self.post("/api/v2/users/reactivate", ReactivateUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.restore_users") def restore_users(self, user_ids: List[str]) -> StreamResponse[Response]: - json = build_body_dict(**{"user_ids": user_ids}) + json = RestoreUsersRequest(user_ids=user_ids).to_dict() return self.post("/api/v2/users/restore", Response, json=json) @telemetry.operation_name("getstream.api.common.unblock_users") @@ -1079,9 +1021,9 @@ def unblock_users( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UnblockUsersResponse]: - json = build_body_dict( - **{"blocked_user_id": blocked_user_id, "user_id": user_id, "user": user} - ) + json = UnblockUsersRequest( + blocked_user_id=blocked_user_id, user_id=user_id, user=user + ).to_dict() return self.post("/api/v2/users/unblock", UnblockUsersResponse, json=json) @telemetry.operation_name("getstream.api.common.deactivate_user") @@ -1094,12 +1036,9 @@ def deactivate_user( path_params = { "user_id": user_id, } - json = build_body_dict( - **{ - "created_by_id": created_by_id, - "mark_messages_deleted": mark_messages_deleted, - } - ) + json = DeactivateUserRequest( + created_by_id=created_by_id, mark_messages_deleted=mark_messages_deleted + ).to_dict() return self.post( "/api/v2/users/{user_id}/deactivate", DeactivateUserResponse, @@ -1129,13 +1068,9 @@ def reactivate_user( path_params = { "user_id": user_id, } - json = build_body_dict( - **{ - "created_by_id": created_by_id, - "name": name, - "restore_messages": restore_messages, - } - ) + json = ReactivateUserRequest( + created_by_id=created_by_id, name=name, restore_messages=restore_messages + ).to_dict() return self.post( "/api/v2/users/{user_id}/reactivate", ReactivateUserResponse, diff --git a/getstream/feeds/feeds.py b/getstream/feeds/feeds.py index 4378e8c5..bd7e2f5b 100644 --- a/getstream/feeds/feeds.py +++ b/getstream/feeds/feeds.py @@ -197,6 +197,26 @@ def reject_feed_member_invite( self._sync_from_response(response.data) return response + def query_pinned_activities( + self, + limit: Optional[int] = None, + next: Optional[str] = None, + prev: Optional[str] = None, + sort: Optional[List[SortParamRequest]] = None, + filter: Optional[Dict[str, object]] = None, + ) -> StreamResponse[QueryPinnedActivitiesResponse]: + response = self.client.query_pinned_activities( + feed_group_id=self.feed_group, + feed_id=self.id, + limit=limit, + next=next, + prev=prev, + sort=sort, + filter=filter, + ) + self._sync_from_response(response.data) + return response + def get_feed_identifier(self): return self.feed_group + ":" + self.id diff --git a/getstream/feeds/rest_client.py b/getstream/feeds/rest_client.py index b316ef2e..9b423d38 100644 --- a/getstream/feeds/rest_client.py +++ b/getstream/feeds/rest_client.py @@ -3,7 +3,7 @@ from getstream.common import telemetry from getstream.models import * from getstream.stream_response import StreamResponse -from getstream.utils import build_query_param, build_body_dict +from getstream.utils import build_query_param class FeedsRestClient(BaseClient): @@ -58,40 +58,38 @@ def add_activity( location: Optional[ActivityLocation] = None, search_data: Optional[Dict[str, object]] = None, ) -> StreamResponse[AddActivityResponse]: - json = build_body_dict( - **{ - "type": type, - "feeds": feeds, - "copy_custom_to_notification": copy_custom_to_notification, - "create_notification_activity": create_notification_activity, - "expires_at": expires_at, - "id": id, - "parent_id": parent_id, - "poll_id": poll_id, - "restrict_replies": restrict_replies, - "skip_enrich_url": skip_enrich_url, - "skip_push": skip_push, - "text": text, - "user_id": user_id, - "visibility": visibility, - "visibility_tag": visibility_tag, - "attachments": attachments, - "collection_refs": collection_refs, - "filter_tags": filter_tags, - "interest_tags": interest_tags, - "mentioned_user_ids": mentioned_user_ids, - "custom": custom, - "location": location, - "search_data": search_data, - } - ) + json = AddActivityRequest( + type=type, + feeds=feeds, + copy_custom_to_notification=copy_custom_to_notification, + create_notification_activity=create_notification_activity, + expires_at=expires_at, + id=id, + parent_id=parent_id, + poll_id=poll_id, + restrict_replies=restrict_replies, + skip_enrich_url=skip_enrich_url, + skip_push=skip_push, + text=text, + user_id=user_id, + visibility=visibility, + visibility_tag=visibility_tag, + attachments=attachments, + collection_refs=collection_refs, + filter_tags=filter_tags, + interest_tags=interest_tags, + mentioned_user_ids=mentioned_user_ids, + custom=custom, + location=location, + search_data=search_data, + ).to_dict() return self.post("/api/v2/feeds/activities", AddActivityResponse, json=json) @telemetry.operation_name("getstream.api.feeds.upsert_activities") def upsert_activities( self, activities: List[ActivityRequest] ) -> StreamResponse[UpsertActivitiesResponse]: - json = build_body_dict(**{"activities": activities}) + json = UpsertActivitiesRequest(activities=activities).to_dict() return self.post( "/api/v2/feeds/activities/batch", UpsertActivitiesResponse, json=json ) @@ -100,7 +98,7 @@ def upsert_activities( def update_activities_partial_batch( self, changes: List[UpdateActivityPartialChangeRequest] ) -> StreamResponse[UpdateActivitiesPartialBatchResponse]: - json = build_body_dict(**{"changes": changes}) + json = UpdateActivitiesPartialBatchRequest(changes=changes).to_dict() return self.patch( "/api/v2/feeds/activities/batch/partial", UpdateActivitiesPartialBatchResponse, @@ -116,15 +114,13 @@ def delete_activities( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[DeleteActivitiesResponse]: - json = build_body_dict( - **{ - "ids": ids, - "delete_notification_activity": delete_notification_activity, - "hard_delete": hard_delete, - "user_id": user_id, - "user": user, - } - ) + json = DeleteActivitiesRequest( + ids=ids, + delete_notification_activity=delete_notification_activity, + hard_delete=hard_delete, + user_id=user_id, + user=user, + ).to_dict() return self.post( "/api/v2/feeds/activities/delete", DeleteActivitiesResponse, json=json ) @@ -142,19 +138,17 @@ def query_activities( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryActivitiesResponse]: - json = build_body_dict( - **{ - "include_expired_activities": include_expired_activities, - "include_private_activities": include_private_activities, - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryActivitiesRequest( + include_expired_activities=include_expired_activities, + include_private_activities=include_private_activities, + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return self.post( "/api/v2/feeds/activities/query", QueryActivitiesResponse, json=json ) @@ -191,16 +185,14 @@ def update_bookmark( path_params = { "activity_id": activity_id, } - json = build_body_dict( - **{ - "folder_id": folder_id, - "new_folder_id": new_folder_id, - "user_id": user_id, - "custom": custom, - "new_folder": new_folder, - "user": user, - } - ) + json = UpdateBookmarkRequest( + folder_id=folder_id, + new_folder_id=new_folder_id, + user_id=user_id, + custom=custom, + new_folder=new_folder, + user=user, + ).to_dict() return self.patch( "/api/v2/feeds/activities/{activity_id}/bookmarks", UpdateBookmarkResponse, @@ -221,15 +213,13 @@ def add_bookmark( path_params = { "activity_id": activity_id, } - json = build_body_dict( - **{ - "folder_id": folder_id, - "user_id": user_id, - "custom": custom, - "new_folder": new_folder, - "user": user, - } - ) + json = AddBookmarkRequest( + folder_id=folder_id, + user_id=user_id, + custom=custom, + new_folder=new_folder, + user=user, + ).to_dict() return self.post( "/api/v2/feeds/activities/{activity_id}/bookmarks", AddBookmarkResponse, @@ -250,15 +240,13 @@ def activity_feedback( path_params = { "activity_id": activity_id, } - json = build_body_dict( - **{ - "hide": hide, - "show_less": show_less, - "show_more": show_more, - "user_id": user_id, - "user": user, - } - ) + json = ActivityFeedbackRequest( + hide=hide, + show_less=show_less, + show_more=show_more, + user_id=user_id, + user=user, + ).to_dict() return self.post( "/api/v2/feeds/activities/{activity_id}/feedback", ActivityFeedbackResponse, @@ -279,7 +267,7 @@ def cast_poll_vote( "activity_id": activity_id, "poll_id": poll_id, } - json = build_body_dict(**{"user_id": user_id, "user": user, "vote": vote}) + json = CastPollVoteRequest(user_id=user_id, user=user, vote=vote).to_dict() return self.post( "/api/v2/feeds/activities/{activity_id}/polls/{poll_id}/vote", PollVoteResponse, @@ -324,18 +312,16 @@ def add_activity_reaction( path_params = { "activity_id": activity_id, } - json = build_body_dict( - **{ - "type": type, - "copy_custom_to_notification": copy_custom_to_notification, - "create_notification_activity": create_notification_activity, - "enforce_unique": enforce_unique, - "skip_push": skip_push, - "user_id": user_id, - "custom": custom, - "user": user, - } - ) + json = AddReactionRequest( + type=type, + copy_custom_to_notification=copy_custom_to_notification, + create_notification_activity=create_notification_activity, + enforce_unique=enforce_unique, + skip_push=skip_push, + user_id=user_id, + custom=custom, + user=user, + ).to_dict() return self.post( "/api/v2/feeds/activities/{activity_id}/reactions", AddReactionResponse, @@ -356,15 +342,9 @@ def query_activity_reactions( path_params = { "activity_id": activity_id, } - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter": filter, - } - ) + json = QueryActivityReactionsRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return self.post( "/api/v2/feeds/activities/{activity_id}/reactions/query", QueryActivityReactionsResponse, @@ -446,17 +426,15 @@ def update_activity_partial( path_params = { "id": id, } - json = build_body_dict( - **{ - "copy_custom_to_notification": copy_custom_to_notification, - "handle_mention_notifications": handle_mention_notifications, - "run_activity_processors": run_activity_processors, - "user_id": user_id, - "unset": unset, - "set": set, - "user": user, - } - ) + json = UpdateActivityPartialRequest( + copy_custom_to_notification=copy_custom_to_notification, + handle_mention_notifications=handle_mention_notifications, + run_activity_processors=run_activity_processors, + user_id=user_id, + unset=unset, + set=set, + user=user, + ).to_dict() return self.patch( "/api/v2/feeds/activities/{id}", UpdateActivityPartialResponse, @@ -493,31 +471,29 @@ def update_activity( path_params = { "id": id, } - json = build_body_dict( - **{ - "copy_custom_to_notification": copy_custom_to_notification, - "expires_at": expires_at, - "handle_mention_notifications": handle_mention_notifications, - "poll_id": poll_id, - "restrict_replies": restrict_replies, - "run_activity_processors": run_activity_processors, - "skip_enrich_url": skip_enrich_url, - "text": text, - "user_id": user_id, - "visibility": visibility, - "visibility_tag": visibility_tag, - "attachments": attachments, - "collection_refs": collection_refs, - "feeds": feeds, - "filter_tags": filter_tags, - "interest_tags": interest_tags, - "mentioned_user_ids": mentioned_user_ids, - "custom": custom, - "location": location, - "search_data": search_data, - "user": user, - } - ) + json = UpdateActivityRequest( + copy_custom_to_notification=copy_custom_to_notification, + expires_at=expires_at, + handle_mention_notifications=handle_mention_notifications, + poll_id=poll_id, + restrict_replies=restrict_replies, + run_activity_processors=run_activity_processors, + skip_enrich_url=skip_enrich_url, + text=text, + user_id=user_id, + visibility=visibility, + visibility_tag=visibility_tag, + attachments=attachments, + collection_refs=collection_refs, + feeds=feeds, + filter_tags=filter_tags, + interest_tags=interest_tags, + mentioned_user_ids=mentioned_user_ids, + custom=custom, + location=location, + search_data=search_data, + user=user, + ).to_dict() return self.put( "/api/v2/feeds/activities/{id}", UpdateActivityResponse, @@ -532,7 +508,7 @@ def restore_activity( path_params = { "id": id, } - json = build_body_dict(**{"user_id": user_id, "user": user}) + json = RestoreActivityRequest(user_id=user_id, user=user).to_dict() return self.post( "/api/v2/feeds/activities/{id}/restore", RestoreActivityResponse, @@ -549,15 +525,9 @@ def query_bookmark_folders( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryBookmarkFoldersResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter": filter, - } - ) + json = QueryBookmarkFoldersRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return self.post( "/api/v2/feeds/bookmark_folders/query", QueryBookmarkFoldersResponse, @@ -589,9 +559,9 @@ def update_bookmark_folder( path_params = { "folder_id": folder_id, } - json = build_body_dict( - **{"name": name, "user_id": user_id, "custom": custom, "user": user} - ) + json = UpdateBookmarkFolderRequest( + name=name, user_id=user_id, custom=custom, user=user + ).to_dict() return self.patch( "/api/v2/feeds/bookmark_folders/{folder_id}", UpdateBookmarkFolderResponse, @@ -608,15 +578,9 @@ def query_bookmarks( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryBookmarksResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter": filter, - } - ) + json = QueryBookmarksRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return self.post( "/api/v2/feeds/bookmarks/query", QueryBookmarksResponse, json=json ) @@ -652,9 +616,9 @@ def update_collections( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UpdateCollectionsResponse]: - json = build_body_dict( - **{"collections": collections, "user_id": user_id, "user": user} - ) + json = UpdateCollectionsRequest( + collections=collections, user_id=user_id, user=user + ).to_dict() return self.patch( "/api/v2/feeds/collections", UpdateCollectionsResponse, json=json ) @@ -666,9 +630,9 @@ def create_collections( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CreateCollectionsResponse]: - json = build_body_dict( - **{"collections": collections, "user_id": user_id, "user": user} - ) + json = CreateCollectionsRequest( + collections=collections, user_id=user_id, user=user + ).to_dict() return self.post( "/api/v2/feeds/collections", CreateCollectionsResponse, json=json ) @@ -677,7 +641,7 @@ def create_collections( def upsert_collections( self, collections: List[CollectionRequest] ) -> StreamResponse[UpsertCollectionsResponse]: - json = build_body_dict(**{"collections": collections}) + json = UpsertCollectionsRequest(collections=collections).to_dict() return self.put( "/api/v2/feeds/collections", UpsertCollectionsResponse, json=json ) @@ -730,31 +694,29 @@ def add_comment( custom: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[AddCommentResponse]: - json = build_body_dict( - **{ - "comment": comment, - "copy_custom_to_notification": copy_custom_to_notification, - "create_notification_activity": create_notification_activity, - "id": id, - "object_id": object_id, - "object_type": object_type, - "parent_id": parent_id, - "skip_enrich_url": skip_enrich_url, - "skip_push": skip_push, - "user_id": user_id, - "attachments": attachments, - "mentioned_user_ids": mentioned_user_ids, - "custom": custom, - "user": user, - } - ) + json = AddCommentRequest( + comment=comment, + copy_custom_to_notification=copy_custom_to_notification, + create_notification_activity=create_notification_activity, + id=id, + object_id=object_id, + object_type=object_type, + parent_id=parent_id, + skip_enrich_url=skip_enrich_url, + skip_push=skip_push, + user_id=user_id, + attachments=attachments, + mentioned_user_ids=mentioned_user_ids, + custom=custom, + user=user, + ).to_dict() return self.post("/api/v2/feeds/comments", AddCommentResponse, json=json) @telemetry.operation_name("getstream.api.feeds.add_comments_batch") def add_comments_batch( self, comments: List[AddCommentRequest] ) -> StreamResponse[AddCommentsBatchResponse]: - json = build_body_dict(**{"comments": comments}) + json = AddCommentsBatchRequest(comments=comments).to_dict() return self.post( "/api/v2/feeds/comments/batch", AddCommentsBatchResponse, json=json ) @@ -768,15 +730,9 @@ def query_comments( prev: Optional[str] = None, sort: Optional[str] = None, ) -> StreamResponse[QueryCommentsResponse]: - json = build_body_dict( - **{ - "filter": filter, - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - } - ) + json = QueryCommentsRequest( + filter=filter, limit=limit, next=next, prev=prev, sort=sort + ).to_dict() return self.post( "/api/v2/feeds/comments/query", QueryCommentsResponse, json=json ) @@ -831,20 +787,18 @@ def update_comment( path_params = { "id": id, } - json = build_body_dict( - **{ - "comment": comment, - "copy_custom_to_notification": copy_custom_to_notification, - "handle_mention_notifications": handle_mention_notifications, - "skip_enrich_url": skip_enrich_url, - "skip_push": skip_push, - "user_id": user_id, - "attachments": attachments, - "mentioned_user_ids": mentioned_user_ids, - "custom": custom, - "user": user, - } - ) + json = UpdateCommentRequest( + comment=comment, + copy_custom_to_notification=copy_custom_to_notification, + handle_mention_notifications=handle_mention_notifications, + skip_enrich_url=skip_enrich_url, + skip_push=skip_push, + user_id=user_id, + attachments=attachments, + mentioned_user_ids=mentioned_user_ids, + custom=custom, + user=user, + ).to_dict() return self.patch( "/api/v2/feeds/comments/{id}", UpdateCommentResponse, @@ -868,18 +822,16 @@ def add_comment_reaction( path_params = { "id": id, } - json = build_body_dict( - **{ - "type": type, - "copy_custom_to_notification": copy_custom_to_notification, - "create_notification_activity": create_notification_activity, - "enforce_unique": enforce_unique, - "skip_push": skip_push, - "user_id": user_id, - "custom": custom, - "user": user, - } - ) + json = AddCommentReactionRequest( + type=type, + copy_custom_to_notification=copy_custom_to_notification, + create_notification_activity=create_notification_activity, + enforce_unique=enforce_unique, + skip_push=skip_push, + user_id=user_id, + custom=custom, + user=user, + ).to_dict() return self.post( "/api/v2/feeds/comments/{id}/reactions", AddCommentReactionResponse, @@ -900,15 +852,9 @@ def query_comment_reactions( path_params = { "id": id, } - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter": filter, - } - ) + json = QueryCommentReactionsRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return self.post( "/api/v2/feeds/comments/{id}/reactions/query", QueryCommentReactionsResponse, @@ -1001,20 +947,18 @@ def create_feed_group( ranking: Optional[RankingConfig] = None, stories: Optional[StoriesConfig] = None, ) -> StreamResponse[CreateFeedGroupResponse]: - json = build_body_dict( - **{ - "id": id, - "default_visibility": default_visibility, - "activity_processors": activity_processors, - "activity_selectors": activity_selectors, - "aggregation": aggregation, - "custom": custom, - "notification": notification, - "push_notification": push_notification, - "ranking": ranking, - "stories": stories, - } - ) + json = CreateFeedGroupRequest( + id=id, + default_visibility=default_visibility, + activity_processors=activity_processors, + activity_selectors=activity_selectors, + aggregation=aggregation, + custom=custom, + notification=notification, + push_notification=push_notification, + ranking=ranking, + stories=stories, + ).to_dict() return self.post( "/api/v2/feeds/feed_groups", CreateFeedGroupResponse, json=json ) @@ -1062,27 +1006,25 @@ def get_or_create_feed( "feed_group_id": feed_group_id, "feed_id": feed_id, } - json = build_body_dict( - **{ - "id_around": id_around, - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "view": view, - "watch": watch, - "data": data, - "enrichment_options": enrichment_options, - "external_ranking": external_ranking, - "filter": filter, - "followers_pagination": followers_pagination, - "following_pagination": following_pagination, - "friend_reactions_options": friend_reactions_options, - "interest_weights": interest_weights, - "member_pagination": member_pagination, - "user": user, - } - ) + json = GetOrCreateFeedRequest( + id_around=id_around, + limit=limit, + next=next, + prev=prev, + user_id=user_id, + view=view, + watch=watch, + data=data, + enrichment_options=enrichment_options, + external_ranking=external_ranking, + filter=filter, + followers_pagination=followers_pagination, + following_pagination=following_pagination, + friend_reactions_options=friend_reactions_options, + interest_weights=interest_weights, + member_pagination=member_pagination, + user=user, + ).to_dict() return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}", GetOrCreateFeedResponse, @@ -1105,15 +1047,13 @@ def update_feed( "feed_group_id": feed_group_id, "feed_id": feed_id, } - json = build_body_dict( - **{ - "created_by_id": created_by_id, - "description": description, - "name": name, - "filter_tags": filter_tags, - "custom": custom, - } - ) + json = UpdateFeedRequest( + created_by_id=created_by_id, + description=description, + name=name, + filter_tags=filter_tags, + custom=custom, + ).to_dict() return self.put( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}", UpdateFeedResponse, @@ -1138,17 +1078,15 @@ def mark_activity( "feed_group_id": feed_group_id, "feed_id": feed_id, } - json = build_body_dict( - **{ - "mark_all_read": mark_all_read, - "mark_all_seen": mark_all_seen, - "user_id": user_id, - "mark_read": mark_read, - "mark_seen": mark_seen, - "mark_watched": mark_watched, - "user": user, - } - ) + json = MarkActivityRequest( + mark_all_read=mark_all_read, + mark_all_seen=mark_all_seen, + user_id=user_id, + mark_read=mark_read, + mark_seen=mark_seen, + mark_watched=mark_watched, + user=user, + ).to_dict() return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/activities/mark/batch", Response, @@ -1191,7 +1129,7 @@ def pin_activity( "feed_id": feed_id, "activity_id": activity_id, } - json = build_body_dict(**{"user_id": user_id, "user": user}) + json = PinActivityRequest(user_id=user_id, user=user).to_dict() return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/activities/{activity_id}/pin", PinActivityResponse, @@ -1214,15 +1152,9 @@ def update_feed_members( "feed_group_id": feed_group_id, "feed_id": feed_id, } - json = build_body_dict( - **{ - "operation": operation, - "limit": limit, - "next": next, - "prev": prev, - "members": members, - } - ) + json = UpdateFeedMembersRequest( + operation=operation, limit=limit, next=next, prev=prev, members=members + ).to_dict() return self.patch( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members", UpdateFeedMembersResponse, @@ -1242,7 +1174,7 @@ def accept_feed_member_invite( "feed_id": feed_id, "feed_group_id": feed_group_id, } - json = build_body_dict(**{"user_id": user_id, "user": user}) + json = AcceptFeedMemberInviteRequest(user_id=user_id, user=user).to_dict() return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members/accept", AcceptFeedMemberInviteResponse, @@ -1265,15 +1197,9 @@ def query_feed_members( "feed_group_id": feed_group_id, "feed_id": feed_id, } - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter": filter, - } - ) + json = QueryFeedMembersRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members/query", QueryFeedMembersResponse, @@ -1293,7 +1219,7 @@ def reject_feed_member_invite( "feed_group_id": feed_group_id, "feed_id": feed_id, } - json = build_body_dict(**{"user_id": user_id, "user": user}) + json = RejectFeedMemberInviteRequest(user_id=user_id, user=user).to_dict() return self.post( "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members/reject", RejectFeedMemberInviteResponse, @@ -1301,6 +1227,31 @@ def reject_feed_member_invite( json=json, ) + @telemetry.operation_name("getstream.api.feeds.query_pinned_activities") + def query_pinned_activities( + self, + feed_group_id: str, + feed_id: str, + limit: Optional[int] = None, + next: Optional[str] = None, + prev: Optional[str] = None, + sort: Optional[List[SortParamRequest]] = None, + filter: Optional[Dict[str, object]] = None, + ) -> StreamResponse[QueryPinnedActivitiesResponse]: + path_params = { + "feed_group_id": feed_group_id, + "feed_id": feed_id, + } + json = QueryPinnedActivitiesRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() + return self.post( + "/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/pinned_activities/query", + QueryPinnedActivitiesResponse, + path_params=path_params, + json=json, + ) + @telemetry.operation_name("getstream.api.feeds.get_follow_suggestions") def get_follow_suggestions( self, @@ -1368,19 +1319,17 @@ def get_or_create_feed_group( path_params = { "id": id, } - json = build_body_dict( - **{ - "default_visibility": default_visibility, - "activity_processors": activity_processors, - "activity_selectors": activity_selectors, - "aggregation": aggregation, - "custom": custom, - "notification": notification, - "push_notification": push_notification, - "ranking": ranking, - "stories": stories, - } - ) + json = GetOrCreateFeedGroupRequest( + default_visibility=default_visibility, + activity_processors=activity_processors, + activity_selectors=activity_selectors, + aggregation=aggregation, + custom=custom, + notification=notification, + push_notification=push_notification, + ranking=ranking, + stories=stories, + ).to_dict() return self.post( "/api/v2/feeds/feed_groups/{id}", GetOrCreateFeedGroupResponse, @@ -1405,19 +1354,17 @@ def update_feed_group( path_params = { "id": id, } - json = build_body_dict( - **{ - "default_visibility": default_visibility, - "activity_processors": activity_processors, - "activity_selectors": activity_selectors, - "aggregation": aggregation, - "custom": custom, - "notification": notification, - "push_notification": push_notification, - "ranking": ranking, - "stories": stories, - } - ) + json = UpdateFeedGroupRequest( + default_visibility=default_visibility, + activity_processors=activity_processors, + activity_selectors=activity_selectors, + aggregation=aggregation, + custom=custom, + notification=notification, + push_notification=push_notification, + ranking=ranking, + stories=stories, + ).to_dict() return self.put( "/api/v2/feeds/feed_groups/{id}", UpdateFeedGroupResponse, @@ -1437,14 +1384,12 @@ def create_feed_view( aggregation: Optional[AggregationConfig] = None, ranking: Optional[RankingConfig] = None, ) -> StreamResponse[CreateFeedViewResponse]: - json = build_body_dict( - **{ - "id": id, - "activity_selectors": activity_selectors, - "aggregation": aggregation, - "ranking": ranking, - } - ) + json = CreateFeedViewRequest( + id=id, + activity_selectors=activity_selectors, + aggregation=aggregation, + ranking=ranking, + ).to_dict() return self.post("/api/v2/feeds/feed_views", CreateFeedViewResponse, json=json) @telemetry.operation_name("getstream.api.feeds.delete_feed_view") @@ -1480,13 +1425,11 @@ def get_or_create_feed_view( path_params = { "id": id, } - json = build_body_dict( - **{ - "activity_selectors": activity_selectors, - "aggregation": aggregation, - "ranking": ranking, - } - ) + json = GetOrCreateFeedViewRequest( + activity_selectors=activity_selectors, + aggregation=aggregation, + ranking=ranking, + ).to_dict() return self.post( "/api/v2/feeds/feed_views/{id}", GetOrCreateFeedViewResponse, @@ -1505,13 +1448,11 @@ def update_feed_view( path_params = { "id": id, } - json = build_body_dict( - **{ - "activity_selectors": activity_selectors, - "aggregation": aggregation, - "ranking": ranking, - } - ) + json = UpdateFeedViewRequest( + activity_selectors=activity_selectors, + aggregation=aggregation, + ranking=ranking, + ).to_dict() return self.put( "/api/v2/feeds/feed_views/{id}", UpdateFeedViewResponse, @@ -1543,7 +1484,7 @@ def update_feed_visibility( path_params = { "name": name, } - json = build_body_dict(**{"grants": grants}) + json = UpdateFeedVisibilityRequest(grants=grants).to_dict() return self.put( "/api/v2/feeds/feed_visibilities/{name}", UpdateFeedVisibilityResponse, @@ -1555,7 +1496,7 @@ def update_feed_visibility( def create_feeds_batch( self, feeds: List[FeedRequest] ) -> StreamResponse[CreateFeedsBatchResponse]: - json = build_body_dict(**{"feeds": feeds}) + json = CreateFeedsBatchRequest(feeds=feeds).to_dict() return self.post( "/api/v2/feeds/feeds/batch", CreateFeedsBatchResponse, json=json ) @@ -1564,7 +1505,7 @@ def create_feeds_batch( def delete_feeds_batch( self, feeds: List[str], hard_delete: Optional[bool] = None ) -> StreamResponse[DeleteFeedsBatchResponse]: - json = build_body_dict(**{"feeds": feeds, "hard_delete": hard_delete}) + json = DeleteFeedsBatchRequest(feeds=feeds, hard_delete=hard_delete).to_dict() return self.post( "/api/v2/feeds/feeds/delete", DeleteFeedsBatchResponse, json=json ) @@ -1577,9 +1518,9 @@ def own_batch( fields: Optional[List[str]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[OwnBatchResponse]: - json = build_body_dict( - **{"feeds": feeds, "user_id": user_id, "fields": fields, "user": user} - ) + json = OwnBatchRequest( + feeds=feeds, user_id=user_id, fields=fields, user=user + ).to_dict() return self.post("/api/v2/feeds/feeds/own/batch", OwnBatchResponse, json=json) @telemetry.operation_name("getstream.api.feeds.query_feeds") @@ -1592,16 +1533,9 @@ def query_feeds( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryFeedsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "watch": watch, - "sort": sort, - "filter": filter, - } - ) + json = QueryFeedsRequest( + limit=limit, next=next, prev=prev, watch=watch, sort=sort, filter=filter + ).to_dict() return self.post("/api/v2/feeds/feeds/query", QueryFeedsResponse, json=json) @telemetry.operation_name("getstream.api.feeds.get_feeds_rate_limits") @@ -1641,19 +1575,17 @@ def update_follow( status: Optional[str] = None, custom: Optional[Dict[str, object]] = None, ) -> StreamResponse[UpdateFollowResponse]: - json = build_body_dict( - **{ - "source": source, - "target": target, - "copy_custom_to_notification": copy_custom_to_notification, - "create_notification_activity": create_notification_activity, - "follower_role": follower_role, - "push_preference": push_preference, - "skip_push": skip_push, - "status": status, - "custom": custom, - } - ) + json = UpdateFollowRequest( + source=source, + target=target, + copy_custom_to_notification=copy_custom_to_notification, + create_notification_activity=create_notification_activity, + follower_role=follower_role, + push_preference=push_preference, + skip_push=skip_push, + status=status, + custom=custom, + ).to_dict() return self.patch("/api/v2/feeds/follows", UpdateFollowResponse, json=json) @telemetry.operation_name("getstream.api.feeds.follow") @@ -1668,27 +1600,25 @@ def follow( status: Optional[str] = None, custom: Optional[Dict[str, object]] = None, ) -> StreamResponse[SingleFollowResponse]: - json = build_body_dict( - **{ - "source": source, - "target": target, - "copy_custom_to_notification": copy_custom_to_notification, - "create_notification_activity": create_notification_activity, - "push_preference": push_preference, - "skip_push": skip_push, - "status": status, - "custom": custom, - } - ) + json = FollowRequest( + source=source, + target=target, + copy_custom_to_notification=copy_custom_to_notification, + create_notification_activity=create_notification_activity, + push_preference=push_preference, + skip_push=skip_push, + status=status, + custom=custom, + ).to_dict() return self.post("/api/v2/feeds/follows", SingleFollowResponse, json=json) @telemetry.operation_name("getstream.api.feeds.accept_follow") def accept_follow( self, source: str, target: str, follower_role: Optional[str] = None ) -> StreamResponse[AcceptFollowResponse]: - json = build_body_dict( - **{"source": source, "target": target, "follower_role": follower_role} - ) + json = AcceptFollowRequest( + source=source, target=target, follower_role=follower_role + ).to_dict() return self.post( "/api/v2/feeds/follows/accept", AcceptFollowResponse, json=json ) @@ -1697,14 +1627,14 @@ def accept_follow( def follow_batch( self, follows: List[FollowRequest] ) -> StreamResponse[FollowBatchResponse]: - json = build_body_dict(**{"follows": follows}) + json = FollowBatchRequest(follows=follows).to_dict() return self.post("/api/v2/feeds/follows/batch", FollowBatchResponse, json=json) @telemetry.operation_name("getstream.api.feeds.get_or_create_follows") def get_or_create_follows( self, follows: List[FollowRequest] ) -> StreamResponse[FollowBatchResponse]: - json = build_body_dict(**{"follows": follows}) + json = FollowBatchRequest(follows=follows).to_dict() return self.post( "/api/v2/feeds/follows/batch/upsert", FollowBatchResponse, json=json ) @@ -1718,22 +1648,16 @@ def query_follows( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryFollowsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter": filter, - } - ) + json = QueryFollowsRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return self.post("/api/v2/feeds/follows/query", QueryFollowsResponse, json=json) @telemetry.operation_name("getstream.api.feeds.reject_follow") def reject_follow( self, source: str, target: str ) -> StreamResponse[RejectFollowResponse]: - json = build_body_dict(**{"source": source, "target": target}) + json = RejectFollowRequest(source=source, target=target).to_dict() return self.post( "/api/v2/feeds/follows/reject", RejectFollowResponse, json=json ) @@ -1769,16 +1693,14 @@ def create_membership_level( tags: Optional[List[str]] = None, custom: Optional[Dict[str, object]] = None, ) -> StreamResponse[CreateMembershipLevelResponse]: - json = build_body_dict( - **{ - "id": id, - "name": name, - "description": description, - "priority": priority, - "tags": tags, - "custom": custom, - } - ) + json = CreateMembershipLevelRequest( + id=id, + name=name, + description=description, + priority=priority, + tags=tags, + custom=custom, + ).to_dict() return self.post( "/api/v2/feeds/membership_levels", CreateMembershipLevelResponse, json=json ) @@ -1792,15 +1714,9 @@ def query_membership_levels( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryMembershipLevelsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter": filter, - } - ) + json = QueryMembershipLevelsRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return self.post( "/api/v2/feeds/membership_levels/query", QueryMembershipLevelsResponse, @@ -1829,15 +1745,13 @@ def update_membership_level( path_params = { "id": id, } - json = build_body_dict( - **{ - "description": description, - "name": name, - "priority": priority, - "tags": tags, - "custom": custom, - } - ) + json = UpdateMembershipLevelRequest( + description=description, + name=name, + priority=priority, + tags=tags, + custom=custom, + ).to_dict() return self.patch( "/api/v2/feeds/membership_levels/{id}", UpdateMembershipLevelResponse, @@ -1849,7 +1763,7 @@ def update_membership_level( def query_feeds_usage_stats( self, _from: Optional[str] = None, to: Optional[str] = None ) -> StreamResponse[QueryFeedsUsageStatsResponse]: - json = build_body_dict(**{"from": _from, "to": to}) + json = QueryFeedsUsageStatsRequest(_from=_from, to=to).to_dict() return self.post( "/api/v2/feeds/stats/usage", QueryFeedsUsageStatsResponse, json=json ) @@ -1860,12 +1774,9 @@ def unfollow_batch( follows: List[FollowPair], delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[UnfollowBatchResponse]: - json = build_body_dict( - **{ - "follows": follows, - "delete_notification_activity": delete_notification_activity, - } - ) + json = UnfollowBatchRequest( + follows=follows, delete_notification_activity=delete_notification_activity + ).to_dict() return self.post( "/api/v2/feeds/unfollow/batch", UnfollowBatchResponse, json=json ) @@ -1876,12 +1787,9 @@ def get_or_create_unfollows( follows: List[FollowPair], delete_notification_activity: Optional[bool] = None, ) -> StreamResponse[UnfollowBatchResponse]: - json = build_body_dict( - **{ - "follows": follows, - "delete_notification_activity": delete_notification_activity, - } - ) + json = UnfollowBatchRequest( + follows=follows, delete_notification_activity=delete_notification_activity + ).to_dict() return self.post( "/api/v2/feeds/unfollow/batch/upsert", UnfollowBatchResponse, json=json ) @@ -1893,7 +1801,7 @@ def delete_feed_user_data( path_params = { "user_id": user_id, } - json = build_body_dict(**{"hard_delete": hard_delete}) + json = DeleteFeedUserDataRequest(hard_delete=hard_delete).to_dict() return self.post( "/api/v2/feeds/users/{user_id}/delete", DeleteFeedUserDataResponse, diff --git a/getstream/models/__init__.py b/getstream/models/__init__.py index 2f0dacb0..ada2af3a 100644 --- a/getstream/models/__init__.py +++ b/getstream/models/__init__.py @@ -10256,6 +10256,7 @@ class GetCommandResponse(DataClassJsonMixin): @dataclass class GetCommentRepliesResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) + sort: str = dc_field(metadata=dc_config(field_name="sort")) comments: "List[ThreadedCommentResponse]" = dc_field( metadata=dc_config(field_name="comments") ) @@ -10272,6 +10273,7 @@ class GetCommentResponse(DataClassJsonMixin): @dataclass class GetCommentsResponse(DataClassJsonMixin): duration: str = dc_field(metadata=dc_config(field_name="duration")) + sort: str = dc_field(metadata=dc_config(field_name="sort")) comments: "List[ThreadedCommentResponse]" = dc_field( metadata=dc_config(field_name="comments") ) @@ -12530,6 +12532,9 @@ class MessageRequest(DataClassJsonMixin): mentioned_channel: Optional[bool] = dc_field( default=None, metadata=dc_config(field_name="mentioned_channel") ) + mentioned_here: Optional[bool] = dc_field( + default=None, metadata=dc_config(field_name="mentioned_here") + ) mml: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="mml")) parent_id: Optional[str] = dc_field( default=None, metadata=dc_config(field_name="parent_id") @@ -12611,6 +12616,7 @@ class MessageResponse(DataClassJsonMixin): mentioned_channel: bool = dc_field( metadata=dc_config(field_name="mentioned_channel") ) + mentioned_here: bool = dc_field(metadata=dc_config(field_name="mentioned_here")) pinned: bool = dc_field(metadata=dc_config(field_name="pinned")) reply_count: int = dc_field(metadata=dc_config(field_name="reply_count")) shadowed: bool = dc_field(metadata=dc_config(field_name="shadowed")) @@ -12902,6 +12908,7 @@ class MessageWithChannelResponse(DataClassJsonMixin): mentioned_channel: bool = dc_field( metadata=dc_config(field_name="mentioned_channel") ) + mentioned_here: bool = dc_field(metadata=dc_config(field_name="mentioned_here")) pinned: bool = dc_field(metadata=dc_config(field_name="pinned")) reply_count: int = dc_field(metadata=dc_config(field_name="reply_count")) shadowed: bool = dc_field(metadata=dc_config(field_name="shadowed")) @@ -16273,6 +16280,31 @@ class QueryModerationRulesResponse(DataClassJsonMixin): prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) +@dataclass +class QueryPinnedActivitiesRequest(DataClassJsonMixin): + limit: Optional[int] = dc_field( + default=None, metadata=dc_config(field_name="limit") + ) + next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) + prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) + sort: "Optional[List[SortParamRequest]]" = dc_field( + default=None, metadata=dc_config(field_name="sort") + ) + filter: Optional[Dict[str, object]] = dc_field( + default=None, metadata=dc_config(field_name="filter") + ) + + +@dataclass +class QueryPinnedActivitiesResponse(DataClassJsonMixin): + duration: str = dc_field(metadata=dc_config(field_name="duration")) + pinned_activities: "List[ActivityPinResponse]" = dc_field( + metadata=dc_config(field_name="pinned_activities") + ) + next: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="next")) + prev: Optional[str] = dc_field(default=None, metadata=dc_config(field_name="prev")) + + @dataclass class QueryPollVotesRequest(DataClassJsonMixin): limit: Optional[int] = dc_field( @@ -18191,6 +18223,7 @@ class SearchResultMessage(DataClassJsonMixin): mentioned_channel: bool = dc_field( metadata=dc_config(field_name="mentioned_channel") ) + mentioned_here: bool = dc_field(metadata=dc_config(field_name="mentioned_here")) pinned: bool = dc_field(metadata=dc_config(field_name="pinned")) reply_count: int = dc_field(metadata=dc_config(field_name="reply_count")) shadowed: bool = dc_field(metadata=dc_config(field_name="shadowed")) diff --git a/getstream/moderation/async_rest_client.py b/getstream/moderation/async_rest_client.py index fcb9bbb4..93082596 100644 --- a/getstream/moderation/async_rest_client.py +++ b/getstream/moderation/async_rest_client.py @@ -3,7 +3,7 @@ from getstream.common import telemetry from getstream.models import * from getstream.stream_response import StreamResponse -from getstream.utils import build_query_param, build_body_dict +from getstream.utils import build_query_param class ModerationRestClient(AsyncBaseClient): @@ -41,16 +41,14 @@ async def appeal( attachments: Optional[List[str]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[AppealResponse]: - json = build_body_dict( - **{ - "appeal_reason": appeal_reason, - "entity_id": entity_id, - "entity_type": entity_type, - "user_id": user_id, - "attachments": attachments, - "user": user, - } - ) + json = AppealRequest( + appeal_reason=appeal_reason, + entity_id=entity_id, + entity_type=entity_type, + user_id=user_id, + attachments=attachments, + user=user, + ).to_dict() return await self.post("/api/v2/moderation/appeal", AppealResponse, json=json) @telemetry.operation_name("getstream.api.moderation.get_appeal") @@ -73,17 +71,15 @@ async def query_appeals( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryAppealsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryAppealsRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return await self.post( "/api/v2/moderation/appeals", QueryAppealsResponse, json=json ) @@ -101,26 +97,24 @@ async def ban( timeout: Optional[int] = None, banned_by: Optional[UserRequest] = None, ) -> StreamResponse[BanResponse]: - json = build_body_dict( - **{ - "target_user_id": target_user_id, - "banned_by_id": banned_by_id, - "channel_cid": channel_cid, - "delete_messages": delete_messages, - "ip_ban": ip_ban, - "reason": reason, - "shadow": shadow, - "timeout": timeout, - "banned_by": banned_by, - } - ) + json = BanRequest( + target_user_id=target_user_id, + banned_by_id=banned_by_id, + channel_cid=channel_cid, + delete_messages=delete_messages, + ip_ban=ip_ban, + reason=reason, + shadow=shadow, + timeout=timeout, + banned_by=banned_by, + ).to_dict() return await self.post("/api/v2/moderation/ban", BanResponse, json=json) @telemetry.operation_name("getstream.api.moderation.bulk_image_moderation") async def bulk_image_moderation( self, csv_file: str ) -> StreamResponse[BulkImageModerationResponse]: - json = build_body_dict(**{"csv_file": csv_file}) + json = BulkImageModerationRequest(csv_file=csv_file).to_dict() return await self.post( "/api/v2/moderation/bulk_image_moderation", BulkImageModerationResponse, @@ -142,21 +136,19 @@ async def check( options: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CheckResponse]: - json = build_body_dict( - **{ - "entity_creator_id": entity_creator_id, - "entity_id": entity_id, - "entity_type": entity_type, - "config_key": config_key, - "config_team": config_team, - "test_mode": test_mode, - "user_id": user_id, - "config": config, - "moderation_payload": moderation_payload, - "options": options, - "user": user, - } - ) + json = CheckRequest( + entity_creator_id=entity_creator_id, + entity_id=entity_id, + entity_type=entity_type, + config_key=config_key, + config_team=config_team, + test_mode=test_mode, + user_id=user_id, + config=config, + moderation_payload=moderation_payload, + options=options, + user=user, + ).to_dict() return await self.post("/api/v2/moderation/check", CheckResponse, json=json) @telemetry.operation_name("getstream.api.moderation.upsert_config") @@ -184,29 +176,27 @@ async def upsert_config( velocity_filter_config: Optional[VelocityFilterConfig] = None, video_call_rule_config: Optional[VideoCallRuleConfig] = None, ) -> StreamResponse[UpsertConfigResponse]: - json = build_body_dict( - **{ - "key": key, - "async": _async, - "team": team, - "user_id": user_id, - "ai_image_config": ai_image_config, - "ai_text_config": ai_text_config, - "ai_video_config": ai_video_config, - "automod_platform_circumvention_config": automod_platform_circumvention_config, - "automod_semantic_filters_config": automod_semantic_filters_config, - "automod_toxicity_config": automod_toxicity_config, - "aws_rekognition_config": aws_rekognition_config, - "block_list_config": block_list_config, - "bodyguard_config": bodyguard_config, - "google_vision_config": google_vision_config, - "llm_config": llm_config, - "rule_builder_config": rule_builder_config, - "user": user, - "velocity_filter_config": velocity_filter_config, - "video_call_rule_config": video_call_rule_config, - } - ) + json = UpsertConfigRequest( + key=key, + _async=_async, + team=team, + user_id=user_id, + ai_image_config=ai_image_config, + ai_text_config=ai_text_config, + ai_video_config=ai_video_config, + automod_platform_circumvention_config=automod_platform_circumvention_config, + automod_semantic_filters_config=automod_semantic_filters_config, + automod_toxicity_config=automod_toxicity_config, + aws_rekognition_config=aws_rekognition_config, + block_list_config=block_list_config, + bodyguard_config=bodyguard_config, + google_vision_config=google_vision_config, + llm_config=llm_config, + rule_builder_config=rule_builder_config, + user=user, + velocity_filter_config=velocity_filter_config, + video_call_rule_config=video_call_rule_config, + ).to_dict() return await self.post( "/api/v2/moderation/config", UpsertConfigResponse, json=json ) @@ -252,17 +242,15 @@ async def query_moderation_configs( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationConfigsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryModerationConfigsRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return await self.post( "/api/v2/moderation/configs", QueryModerationConfigsResponse, json=json ) @@ -278,17 +266,15 @@ async def custom_check( moderation_payload: Optional[ModerationPayloadRequest] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CustomCheckResponse]: - json = build_body_dict( - **{ - "entity_id": entity_id, - "entity_type": entity_type, - "flags": flags, - "entity_creator_id": entity_creator_id, - "user_id": user_id, - "moderation_payload": moderation_payload, - "user": user, - } - ) + json = CustomCheckRequest( + entity_id=entity_id, + entity_type=entity_type, + flags=flags, + entity_creator_id=entity_creator_id, + user_id=user_id, + moderation_payload=moderation_payload, + user=user, + ).to_dict() return await self.post( "/api/v2/moderation/custom_check", CustomCheckResponse, json=json ) @@ -315,7 +301,7 @@ async def v2_query_templates( async def v2_upsert_template( self, name: str, config: FeedsModerationTemplateConfigPayload ) -> StreamResponse[UpsertModerationTemplateResponse]: - json = build_body_dict(**{"name": name, "config": config}) + json = UpsertModerationTemplateRequest(name=name, config=config).to_dict() return await self.post( "/api/v2/moderation/feeds_moderation_template", UpsertModerationTemplateResponse, @@ -334,18 +320,16 @@ async def flag( moderation_payload: Optional[ModerationPayload] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[FlagResponse]: - json = build_body_dict( - **{ - "entity_id": entity_id, - "entity_type": entity_type, - "entity_creator_id": entity_creator_id, - "reason": reason, - "user_id": user_id, - "custom": custom, - "moderation_payload": moderation_payload, - "user": user, - } - ) + json = FlagRequest( + entity_id=entity_id, + entity_type=entity_type, + entity_creator_id=entity_creator_id, + reason=reason, + user_id=user_id, + custom=custom, + moderation_payload=moderation_payload, + user=user, + ).to_dict() return await self.post("/api/v2/moderation/flag", FlagResponse, json=json) @telemetry.operation_name("getstream.api.moderation.query_moderation_flags") @@ -357,15 +341,9 @@ async def query_moderation_flags( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryModerationFlagsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter": filter, - } - ) + json = QueryModerationFlagsRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return await self.post( "/api/v2/moderation/flags", QueryModerationFlagsResponse, json=json ) @@ -381,17 +359,15 @@ async def query_moderation_logs( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationLogsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryModerationLogsRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return await self.post( "/api/v2/moderation/logs", QueryModerationLogsResponse, json=json ) @@ -412,22 +388,20 @@ async def upsert_moderation_rule( groups: Optional[List[RuleBuilderConditionGroup]] = None, action: Optional[RuleBuilderAction] = None, ) -> StreamResponse[UpsertModerationRuleResponse]: - json = build_body_dict( - **{ - "name": name, - "rule_type": rule_type, - "cooldown_period": cooldown_period, - "description": description, - "enabled": enabled, - "logic": logic, - "team": team, - "action_sequences": action_sequences, - "conditions": conditions, - "config_keys": config_keys, - "groups": groups, - "action": action, - } - ) + json = UpsertModerationRuleRequest( + name=name, + rule_type=rule_type, + cooldown_period=cooldown_period, + description=description, + enabled=enabled, + logic=logic, + team=team, + action_sequences=action_sequences, + conditions=conditions, + config_keys=config_keys, + groups=groups, + action=action, + ).to_dict() return await self.post( "/api/v2/moderation/moderation_rule", UpsertModerationRuleResponse, @@ -459,17 +433,15 @@ async def query_moderation_rules( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationRulesResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryModerationRulesRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return await self.post( "/api/v2/moderation/moderation_rules", QueryModerationRulesResponse, @@ -484,14 +456,9 @@ async def mute( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[MuteResponse]: - json = build_body_dict( - **{ - "target_ids": target_ids, - "timeout": timeout, - "user_id": user_id, - "user": user, - } - ) + json = MuteRequest( + target_ids=target_ids, timeout=timeout, user_id=user_id, user=user + ).to_dict() return await self.post("/api/v2/moderation/mute", MuteResponse, json=json) @telemetry.operation_name("getstream.api.moderation.query_review_queue") @@ -509,21 +476,19 @@ async def query_review_queue( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryReviewQueueResponse]: - json = build_body_dict( - **{ - "limit": limit, - "lock_count": lock_count, - "lock_duration": lock_duration, - "lock_items": lock_items, - "next": next, - "prev": prev, - "stats_only": stats_only, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryReviewQueueRequest( + limit=limit, + lock_count=lock_count, + lock_duration=lock_duration, + lock_items=lock_items, + next=next, + prev=prev, + stats_only=stats_only, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return await self.post( "/api/v2/moderation/review_queue", QueryReviewQueueResponse, json=json ) @@ -565,30 +530,28 @@ async def submit_action( unblock: Optional[UnblockActionRequestPayload] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[SubmitActionResponse]: - json = build_body_dict( - **{ - "action_type": action_type, - "appeal_id": appeal_id, - "item_id": item_id, - "user_id": user_id, - "ban": ban, - "block": block, - "custom": custom, - "delete_activity": delete_activity, - "delete_comment": delete_comment, - "delete_message": delete_message, - "delete_reaction": delete_reaction, - "delete_user": delete_user, - "flag": flag, - "mark_reviewed": mark_reviewed, - "reject_appeal": reject_appeal, - "restore": restore, - "shadow_block": shadow_block, - "unban": unban, - "unblock": unblock, - "user": user, - } - ) + json = SubmitActionRequest( + action_type=action_type, + appeal_id=appeal_id, + item_id=item_id, + user_id=user_id, + ban=ban, + block=block, + custom=custom, + delete_activity=delete_activity, + delete_comment=delete_comment, + delete_message=delete_message, + delete_reaction=delete_reaction, + delete_user=delete_user, + flag=flag, + mark_reviewed=mark_reviewed, + reject_appeal=reject_appeal, + restore=restore, + shadow_block=shadow_block, + unban=unban, + unblock=unblock, + user=user, + ).to_dict() return await self.post( "/api/v2/moderation/submit_action", SubmitActionResponse, json=json ) @@ -609,9 +572,9 @@ async def unban( "created_by": created_by, } ) - json = build_body_dict( - **{"unbanned_by_id": unbanned_by_id, "unbanned_by": unbanned_by} - ) + json = UnbanRequest( + unbanned_by_id=unbanned_by_id, unbanned_by=unbanned_by + ).to_dict() return await self.post( "/api/v2/moderation/unban", UnbanResponse, @@ -626,7 +589,7 @@ async def unmute( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UnmuteResponse]: - json = build_body_dict( - **{"target_ids": target_ids, "user_id": user_id, "user": user} - ) + json = UnmuteRequest( + target_ids=target_ids, user_id=user_id, user=user + ).to_dict() return await self.post("/api/v2/moderation/unmute", UnmuteResponse, json=json) diff --git a/getstream/moderation/rest_client.py b/getstream/moderation/rest_client.py index f76fd4a4..b07021e8 100644 --- a/getstream/moderation/rest_client.py +++ b/getstream/moderation/rest_client.py @@ -3,7 +3,7 @@ from getstream.common import telemetry from getstream.models import * from getstream.stream_response import StreamResponse -from getstream.utils import build_query_param, build_body_dict +from getstream.utils import build_query_param class ModerationRestClient(BaseClient): @@ -41,16 +41,14 @@ def appeal( attachments: Optional[List[str]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[AppealResponse]: - json = build_body_dict( - **{ - "appeal_reason": appeal_reason, - "entity_id": entity_id, - "entity_type": entity_type, - "user_id": user_id, - "attachments": attachments, - "user": user, - } - ) + json = AppealRequest( + appeal_reason=appeal_reason, + entity_id=entity_id, + entity_type=entity_type, + user_id=user_id, + attachments=attachments, + user=user, + ).to_dict() return self.post("/api/v2/moderation/appeal", AppealResponse, json=json) @telemetry.operation_name("getstream.api.moderation.get_appeal") @@ -73,17 +71,15 @@ def query_appeals( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryAppealsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryAppealsRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return self.post("/api/v2/moderation/appeals", QueryAppealsResponse, json=json) @telemetry.operation_name("getstream.api.moderation.ban") @@ -99,26 +95,24 @@ def ban( timeout: Optional[int] = None, banned_by: Optional[UserRequest] = None, ) -> StreamResponse[BanResponse]: - json = build_body_dict( - **{ - "target_user_id": target_user_id, - "banned_by_id": banned_by_id, - "channel_cid": channel_cid, - "delete_messages": delete_messages, - "ip_ban": ip_ban, - "reason": reason, - "shadow": shadow, - "timeout": timeout, - "banned_by": banned_by, - } - ) + json = BanRequest( + target_user_id=target_user_id, + banned_by_id=banned_by_id, + channel_cid=channel_cid, + delete_messages=delete_messages, + ip_ban=ip_ban, + reason=reason, + shadow=shadow, + timeout=timeout, + banned_by=banned_by, + ).to_dict() return self.post("/api/v2/moderation/ban", BanResponse, json=json) @telemetry.operation_name("getstream.api.moderation.bulk_image_moderation") def bulk_image_moderation( self, csv_file: str ) -> StreamResponse[BulkImageModerationResponse]: - json = build_body_dict(**{"csv_file": csv_file}) + json = BulkImageModerationRequest(csv_file=csv_file).to_dict() return self.post( "/api/v2/moderation/bulk_image_moderation", BulkImageModerationResponse, @@ -140,21 +134,19 @@ def check( options: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CheckResponse]: - json = build_body_dict( - **{ - "entity_creator_id": entity_creator_id, - "entity_id": entity_id, - "entity_type": entity_type, - "config_key": config_key, - "config_team": config_team, - "test_mode": test_mode, - "user_id": user_id, - "config": config, - "moderation_payload": moderation_payload, - "options": options, - "user": user, - } - ) + json = CheckRequest( + entity_creator_id=entity_creator_id, + entity_id=entity_id, + entity_type=entity_type, + config_key=config_key, + config_team=config_team, + test_mode=test_mode, + user_id=user_id, + config=config, + moderation_payload=moderation_payload, + options=options, + user=user, + ).to_dict() return self.post("/api/v2/moderation/check", CheckResponse, json=json) @telemetry.operation_name("getstream.api.moderation.upsert_config") @@ -182,29 +174,27 @@ def upsert_config( velocity_filter_config: Optional[VelocityFilterConfig] = None, video_call_rule_config: Optional[VideoCallRuleConfig] = None, ) -> StreamResponse[UpsertConfigResponse]: - json = build_body_dict( - **{ - "key": key, - "async": _async, - "team": team, - "user_id": user_id, - "ai_image_config": ai_image_config, - "ai_text_config": ai_text_config, - "ai_video_config": ai_video_config, - "automod_platform_circumvention_config": automod_platform_circumvention_config, - "automod_semantic_filters_config": automod_semantic_filters_config, - "automod_toxicity_config": automod_toxicity_config, - "aws_rekognition_config": aws_rekognition_config, - "block_list_config": block_list_config, - "bodyguard_config": bodyguard_config, - "google_vision_config": google_vision_config, - "llm_config": llm_config, - "rule_builder_config": rule_builder_config, - "user": user, - "velocity_filter_config": velocity_filter_config, - "video_call_rule_config": video_call_rule_config, - } - ) + json = UpsertConfigRequest( + key=key, + _async=_async, + team=team, + user_id=user_id, + ai_image_config=ai_image_config, + ai_text_config=ai_text_config, + ai_video_config=ai_video_config, + automod_platform_circumvention_config=automod_platform_circumvention_config, + automod_semantic_filters_config=automod_semantic_filters_config, + automod_toxicity_config=automod_toxicity_config, + aws_rekognition_config=aws_rekognition_config, + block_list_config=block_list_config, + bodyguard_config=bodyguard_config, + google_vision_config=google_vision_config, + llm_config=llm_config, + rule_builder_config=rule_builder_config, + user=user, + velocity_filter_config=velocity_filter_config, + video_call_rule_config=video_call_rule_config, + ).to_dict() return self.post("/api/v2/moderation/config", UpsertConfigResponse, json=json) @telemetry.operation_name("getstream.api.moderation.delete_config") @@ -248,17 +238,15 @@ def query_moderation_configs( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationConfigsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryModerationConfigsRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return self.post( "/api/v2/moderation/configs", QueryModerationConfigsResponse, json=json ) @@ -274,17 +262,15 @@ def custom_check( moderation_payload: Optional[ModerationPayloadRequest] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[CustomCheckResponse]: - json = build_body_dict( - **{ - "entity_id": entity_id, - "entity_type": entity_type, - "flags": flags, - "entity_creator_id": entity_creator_id, - "user_id": user_id, - "moderation_payload": moderation_payload, - "user": user, - } - ) + json = CustomCheckRequest( + entity_id=entity_id, + entity_type=entity_type, + flags=flags, + entity_creator_id=entity_creator_id, + user_id=user_id, + moderation_payload=moderation_payload, + user=user, + ).to_dict() return self.post( "/api/v2/moderation/custom_check", CustomCheckResponse, json=json ) @@ -309,7 +295,7 @@ def v2_query_templates( def v2_upsert_template( self, name: str, config: FeedsModerationTemplateConfigPayload ) -> StreamResponse[UpsertModerationTemplateResponse]: - json = build_body_dict(**{"name": name, "config": config}) + json = UpsertModerationTemplateRequest(name=name, config=config).to_dict() return self.post( "/api/v2/moderation/feeds_moderation_template", UpsertModerationTemplateResponse, @@ -328,18 +314,16 @@ def flag( moderation_payload: Optional[ModerationPayload] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[FlagResponse]: - json = build_body_dict( - **{ - "entity_id": entity_id, - "entity_type": entity_type, - "entity_creator_id": entity_creator_id, - "reason": reason, - "user_id": user_id, - "custom": custom, - "moderation_payload": moderation_payload, - "user": user, - } - ) + json = FlagRequest( + entity_id=entity_id, + entity_type=entity_type, + entity_creator_id=entity_creator_id, + reason=reason, + user_id=user_id, + custom=custom, + moderation_payload=moderation_payload, + user=user, + ).to_dict() return self.post("/api/v2/moderation/flag", FlagResponse, json=json) @telemetry.operation_name("getstream.api.moderation.query_moderation_flags") @@ -351,15 +335,9 @@ def query_moderation_flags( sort: Optional[List[SortParamRequest]] = None, filter: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryModerationFlagsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter": filter, - } - ) + json = QueryModerationFlagsRequest( + limit=limit, next=next, prev=prev, sort=sort, filter=filter + ).to_dict() return self.post( "/api/v2/moderation/flags", QueryModerationFlagsResponse, json=json ) @@ -375,17 +353,15 @@ def query_moderation_logs( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationLogsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryModerationLogsRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return self.post( "/api/v2/moderation/logs", QueryModerationLogsResponse, json=json ) @@ -406,22 +382,20 @@ def upsert_moderation_rule( groups: Optional[List[RuleBuilderConditionGroup]] = None, action: Optional[RuleBuilderAction] = None, ) -> StreamResponse[UpsertModerationRuleResponse]: - json = build_body_dict( - **{ - "name": name, - "rule_type": rule_type, - "cooldown_period": cooldown_period, - "description": description, - "enabled": enabled, - "logic": logic, - "team": team, - "action_sequences": action_sequences, - "conditions": conditions, - "config_keys": config_keys, - "groups": groups, - "action": action, - } - ) + json = UpsertModerationRuleRequest( + name=name, + rule_type=rule_type, + cooldown_period=cooldown_period, + description=description, + enabled=enabled, + logic=logic, + team=team, + action_sequences=action_sequences, + conditions=conditions, + config_keys=config_keys, + groups=groups, + action=action, + ).to_dict() return self.post( "/api/v2/moderation/moderation_rule", UpsertModerationRuleResponse, @@ -451,17 +425,15 @@ def query_moderation_rules( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryModerationRulesResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryModerationRulesRequest( + limit=limit, + next=next, + prev=prev, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return self.post( "/api/v2/moderation/moderation_rules", QueryModerationRulesResponse, @@ -476,14 +448,9 @@ def mute( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[MuteResponse]: - json = build_body_dict( - **{ - "target_ids": target_ids, - "timeout": timeout, - "user_id": user_id, - "user": user, - } - ) + json = MuteRequest( + target_ids=target_ids, timeout=timeout, user_id=user_id, user=user + ).to_dict() return self.post("/api/v2/moderation/mute", MuteResponse, json=json) @telemetry.operation_name("getstream.api.moderation.query_review_queue") @@ -501,21 +468,19 @@ def query_review_queue( filter: Optional[Dict[str, object]] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[QueryReviewQueueResponse]: - json = build_body_dict( - **{ - "limit": limit, - "lock_count": lock_count, - "lock_duration": lock_duration, - "lock_items": lock_items, - "next": next, - "prev": prev, - "stats_only": stats_only, - "user_id": user_id, - "sort": sort, - "filter": filter, - "user": user, - } - ) + json = QueryReviewQueueRequest( + limit=limit, + lock_count=lock_count, + lock_duration=lock_duration, + lock_items=lock_items, + next=next, + prev=prev, + stats_only=stats_only, + user_id=user_id, + sort=sort, + filter=filter, + user=user, + ).to_dict() return self.post( "/api/v2/moderation/review_queue", QueryReviewQueueResponse, json=json ) @@ -557,30 +522,28 @@ def submit_action( unblock: Optional[UnblockActionRequestPayload] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[SubmitActionResponse]: - json = build_body_dict( - **{ - "action_type": action_type, - "appeal_id": appeal_id, - "item_id": item_id, - "user_id": user_id, - "ban": ban, - "block": block, - "custom": custom, - "delete_activity": delete_activity, - "delete_comment": delete_comment, - "delete_message": delete_message, - "delete_reaction": delete_reaction, - "delete_user": delete_user, - "flag": flag, - "mark_reviewed": mark_reviewed, - "reject_appeal": reject_appeal, - "restore": restore, - "shadow_block": shadow_block, - "unban": unban, - "unblock": unblock, - "user": user, - } - ) + json = SubmitActionRequest( + action_type=action_type, + appeal_id=appeal_id, + item_id=item_id, + user_id=user_id, + ban=ban, + block=block, + custom=custom, + delete_activity=delete_activity, + delete_comment=delete_comment, + delete_message=delete_message, + delete_reaction=delete_reaction, + delete_user=delete_user, + flag=flag, + mark_reviewed=mark_reviewed, + reject_appeal=reject_appeal, + restore=restore, + shadow_block=shadow_block, + unban=unban, + unblock=unblock, + user=user, + ).to_dict() return self.post( "/api/v2/moderation/submit_action", SubmitActionResponse, json=json ) @@ -601,9 +564,9 @@ def unban( "created_by": created_by, } ) - json = build_body_dict( - **{"unbanned_by_id": unbanned_by_id, "unbanned_by": unbanned_by} - ) + json = UnbanRequest( + unbanned_by_id=unbanned_by_id, unbanned_by=unbanned_by + ).to_dict() return self.post( "/api/v2/moderation/unban", UnbanResponse, @@ -618,7 +581,7 @@ def unmute( user_id: Optional[str] = None, user: Optional[UserRequest] = None, ) -> StreamResponse[UnmuteResponse]: - json = build_body_dict( - **{"target_ids": target_ids, "user_id": user_id, "user": user} - ) + json = UnmuteRequest( + target_ids=target_ids, user_id=user_id, user=user + ).to_dict() return self.post("/api/v2/moderation/unmute", UnmuteResponse, json=json) diff --git a/getstream/video/async_rest_client.py b/getstream/video/async_rest_client.py index 6a3580ed..4766e143 100644 --- a/getstream/video/async_rest_client.py +++ b/getstream/video/async_rest_client.py @@ -3,7 +3,7 @@ from getstream.common import telemetry from getstream.models import * from getstream.stream_response import StreamResponse -from getstream.utils import build_query_param, build_body_dict +from getstream.utils import build_query_param class VideoRestClient(AsyncBaseClient): @@ -50,15 +50,13 @@ async def query_user_feedback( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryUserFeedbackResponse]: query_params = build_query_param(**{"full": full}) - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter_conditions": filter_conditions, - } - ) + json = QueryUserFeedbackRequest( + limit=limit, + next=next, + prev=prev, + sort=sort, + filter_conditions=filter_conditions, + ).to_dict() return await self.post( "/api/v2/video/call/feedback", QueryUserFeedbackResponse, @@ -77,17 +75,15 @@ async def query_call_members( sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallMembersResponse]: - json = build_body_dict( - **{ - "id": id, - "type": type, - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter_conditions": filter_conditions, - } - ) + json = QueryCallMembersRequest( + id=id, + type=type, + limit=limit, + next=next, + prev=prev, + sort=sort, + filter_conditions=filter_conditions, + ).to_dict() return await self.post( "/api/v2/video/call/members", QueryCallMembersResponse, json=json ) @@ -101,15 +97,13 @@ async def query_call_stats( sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallStatsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter_conditions": filter_conditions, - } - ) + json = QueryCallStatsRequest( + limit=limit, + next=next, + prev=prev, + sort=sort, + filter_conditions=filter_conditions, + ).to_dict() return await self.post( "/api/v2/video/call/stats", QueryCallStatsResponse, json=json ) @@ -156,13 +150,9 @@ async def update_call( "type": type, "id": id, } - json = build_body_dict( - **{ - "starts_at": starts_at, - "custom": custom, - "settings_override": settings_override, - } - ) + json = UpdateCallRequest( + starts_at=starts_at, custom=custom, settings_override=settings_override + ).to_dict() return await self.patch( "/api/v2/video/call/{type}/{id}", UpdateCallResponse, @@ -185,15 +175,13 @@ async def get_or_create_call( "type": type, "id": id, } - json = build_body_dict( - **{ - "members_limit": members_limit, - "notify": notify, - "ring": ring, - "video": video, - "data": data, - } - ) + json = GetOrCreateCallRequest( + members_limit=members_limit, + notify=notify, + ring=ring, + video=video, + data=data, + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}", GetOrCreateCallResponse, @@ -209,7 +197,7 @@ async def block_user( "type": type, "id": id, } - json = build_body_dict(**{"user_id": user_id}) + json = BlockUserRequest(user_id=user_id).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/block", BlockUserResponse, @@ -236,19 +224,17 @@ async def send_closed_caption( "type": type, "id": id, } - json = build_body_dict( - **{ - "speaker_id": speaker_id, - "text": text, - "end_time": end_time, - "language": language, - "service": service, - "start_time": start_time, - "translated": translated, - "user_id": user_id, - "user": user, - } - ) + json = SendClosedCaptionRequest( + speaker_id=speaker_id, + text=text, + end_time=end_time, + language=language, + service=service, + start_time=start_time, + translated=translated, + user_id=user_id, + user=user, + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/closed_captions", SendClosedCaptionResponse, @@ -264,7 +250,7 @@ async def delete_call( "type": type, "id": id, } - json = build_body_dict(**{"hard": hard}) + json = DeleteCallRequest(hard=hard).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/delete", DeleteCallResponse, @@ -285,7 +271,7 @@ async def send_call_event( "type": type, "id": id, } - json = build_body_dict(**{"user_id": user_id, "custom": custom, "user": user}) + json = SendCallEventRequest(user_id=user_id, custom=custom, user=user).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/event", SendCallEventResponse, @@ -309,16 +295,14 @@ async def collect_user_feedback( "type": type, "id": id, } - json = build_body_dict( - **{ - "rating": rating, - "sdk": sdk, - "sdk_version": sdk_version, - "reason": reason, - "user_session_id": user_session_id, - "custom": custom, - } - ) + json = CollectUserFeedbackRequest( + rating=rating, + sdk=sdk, + sdk_version=sdk_version, + reason=reason, + user_session_id=user_session_id, + custom=custom, + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/feedback", CollectUserFeedbackResponse, @@ -345,19 +329,17 @@ async def go_live( "type": type, "id": id, } - json = build_body_dict( - **{ - "recording_storage_name": recording_storage_name, - "start_closed_caption": start_closed_caption, - "start_composite_recording": start_composite_recording, - "start_hls": start_hls, - "start_individual_recording": start_individual_recording, - "start_raw_recording": start_raw_recording, - "start_recording": start_recording, - "start_transcription": start_transcription, - "transcription_storage_name": transcription_storage_name, - } - ) + json = GoLiveRequest( + recording_storage_name=recording_storage_name, + start_closed_caption=start_closed_caption, + start_composite_recording=start_composite_recording, + start_hls=start_hls, + start_individual_recording=start_individual_recording, + start_raw_recording=start_raw_recording, + start_recording=start_recording, + start_transcription=start_transcription, + transcription_storage_name=transcription_storage_name, + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/go_live", GoLiveResponse, @@ -379,14 +361,9 @@ async def kick_user( "type": type, "id": id, } - json = build_body_dict( - **{ - "user_id": user_id, - "block": block, - "kicked_by_id": kicked_by_id, - "kicked_by": kicked_by, - } - ) + json = KickUserRequest( + user_id=user_id, block=block, kicked_by_id=kicked_by_id, kicked_by=kicked_by + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/kick", KickUserResponse, @@ -418,9 +395,9 @@ async def update_call_members( "type": type, "id": id, } - json = build_body_dict( - **{"remove_members": remove_members, "update_members": update_members} - ) + json = UpdateCallMembersRequest( + remove_members=remove_members, update_members=update_members + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/members", UpdateCallMembersResponse, @@ -446,18 +423,16 @@ async def mute_users( "type": type, "id": id, } - json = build_body_dict( - **{ - "audio": audio, - "mute_all_users": mute_all_users, - "muted_by_id": muted_by_id, - "screenshare": screenshare, - "screenshare_audio": screenshare_audio, - "video": video, - "user_ids": user_ids, - "muted_by": muted_by, - } - ) + json = MuteUsersRequest( + audio=audio, + mute_all_users=mute_all_users, + muted_by_id=muted_by_id, + screenshare=screenshare, + screenshare_audio=screenshare_audio, + video=video, + user_ids=user_ids, + muted_by=muted_by, + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/mute_users", MuteUsersResponse, @@ -478,7 +453,9 @@ async def query_call_participants( "id": id, "type": type, } - json = build_body_dict(**{"filter_conditions": filter_conditions}) + json = QueryCallParticipantsRequest( + filter_conditions=filter_conditions + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/participants", QueryCallParticipantsResponse, @@ -495,7 +472,7 @@ async def video_pin( "type": type, "id": id, } - json = build_body_dict(**{"session_id": session_id, "user_id": user_id}) + json = PinRequest(session_id=session_id, user_id=user_id).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/pin", PinResponse, @@ -530,9 +507,9 @@ async def start_recording( "id": id, "recording_type": recording_type, } - json = build_body_dict( - **{"recording_external_storage": recording_external_storage} - ) + json = StartRecordingRequest( + recording_external_storage=recording_external_storage + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/start", StartRecordingResponse, @@ -552,7 +529,7 @@ async def stop_recording( "id": id, "recording_type": recording_type, } - json = build_body_dict(**{}) + json = StopRecordingRequest().to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/stop", StopRecordingResponse, @@ -588,7 +565,7 @@ async def ring_call( "type": type, "id": id, } - json = build_body_dict(**{"video": video, "members_ids": members_ids}) + json = RingCallRequest(video=video, members_ids=members_ids).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/ring", RingCallResponse, @@ -604,7 +581,7 @@ async def start_rtmp_broadcasts( "type": type, "id": id, } - json = build_body_dict(**{"broadcasts": broadcasts}) + json = StartRTMPBroadcastsRequest(broadcasts=broadcasts).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/rtmp_broadcasts", StartRTMPBroadcastsResponse, @@ -638,7 +615,7 @@ async def stop_rtmp_broadcast( "id": id, "name": name, } - json = build_body_dict(**{}) + json = StopRTMPBroadcastsRequest().to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/rtmp_broadcasts/{name}/stop", StopRTMPBroadcastsResponse, @@ -733,14 +710,12 @@ async def start_closed_captions( "type": type, "id": id, } - json = build_body_dict( - **{ - "enable_transcription": enable_transcription, - "external_storage": external_storage, - "language": language, - "speech_segment_config": speech_segment_config, - } - ) + json = StartClosedCaptionsRequest( + enable_transcription=enable_transcription, + external_storage=external_storage, + language=language, + speech_segment_config=speech_segment_config, + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/start_closed_captions", StartClosedCaptionsResponse, @@ -756,9 +731,9 @@ async def start_frame_recording( "type": type, "id": id, } - json = build_body_dict( - **{"recording_external_storage": recording_external_storage} - ) + json = StartFrameRecordingRequest( + recording_external_storage=recording_external_storage + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/start_frame_recording", StartFrameRecordingResponse, @@ -779,13 +754,11 @@ async def start_transcription( "type": type, "id": id, } - json = build_body_dict( - **{ - "enable_closed_captions": enable_closed_captions, - "language": language, - "transcription_external_storage": transcription_external_storage, - } - ) + json = StartTranscriptionRequest( + enable_closed_captions=enable_closed_captions, + language=language, + transcription_external_storage=transcription_external_storage, + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/start_transcription", StartTranscriptionResponse, @@ -815,7 +788,9 @@ async def stop_closed_captions( "type": type, "id": id, } - json = build_body_dict(**{"stop_transcription": stop_transcription}) + json = StopClosedCaptionsRequest( + stop_transcription=stop_transcription + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/stop_closed_captions", StopClosedCaptionsResponse, @@ -855,18 +830,16 @@ async def stop_live( "type": type, "id": id, } - json = build_body_dict( - **{ - "continue_closed_caption": continue_closed_caption, - "continue_composite_recording": continue_composite_recording, - "continue_hls": continue_hls, - "continue_individual_recording": continue_individual_recording, - "continue_raw_recording": continue_raw_recording, - "continue_recording": continue_recording, - "continue_rtmp_broadcasts": continue_rtmp_broadcasts, - "continue_transcription": continue_transcription, - } - ) + json = StopLiveRequest( + continue_closed_caption=continue_closed_caption, + continue_composite_recording=continue_composite_recording, + continue_hls=continue_hls, + continue_individual_recording=continue_individual_recording, + continue_raw_recording=continue_raw_recording, + continue_recording=continue_recording, + continue_rtmp_broadcasts=continue_rtmp_broadcasts, + continue_transcription=continue_transcription, + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/stop_live", StopLiveResponse, @@ -882,7 +855,9 @@ async def stop_transcription( "type": type, "id": id, } - json = build_body_dict(**{"stop_closed_captions": stop_closed_captions}) + json = StopTranscriptionRequest( + stop_closed_captions=stop_closed_captions + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/stop_transcription", StopTranscriptionResponse, @@ -912,7 +887,7 @@ async def unblock_user( "type": type, "id": id, } - json = build_body_dict(**{"user_id": user_id}) + json = UnblockUserRequest(user_id=user_id).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/unblock", UnblockUserResponse, @@ -928,7 +903,7 @@ async def video_unpin( "type": type, "id": id, } - json = build_body_dict(**{"session_id": session_id, "user_id": user_id}) + json = UnpinRequest(session_id=session_id, user_id=user_id).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/unpin", UnpinResponse, @@ -949,13 +924,11 @@ async def update_user_permissions( "type": type, "id": id, } - json = build_body_dict( - **{ - "user_id": user_id, - "grant_permissions": grant_permissions, - "revoke_permissions": revoke_permissions, - } - ) + json = UpdateUserPermissionsRequest( + user_id=user_id, + grant_permissions=grant_permissions, + revoke_permissions=revoke_permissions, + ).to_dict() return await self.post( "/api/v2/video/call/{type}/{id}/user_permissions", UpdateUserPermissionsResponse, @@ -1134,15 +1107,13 @@ async def query_calls( sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter_conditions": filter_conditions, - } - ) + json = QueryCallsRequest( + limit=limit, + next=next, + prev=prev, + sort=sort, + filter_conditions=filter_conditions, + ).to_dict() return await self.post("/api/v2/video/calls", QueryCallsResponse, json=json) @telemetry.operation_name("getstream.api.video.list_call_types") @@ -1158,15 +1129,13 @@ async def create_call_type( notification_settings: Optional[NotificationSettingsRequest] = None, settings: Optional[CallSettingsRequest] = None, ) -> StreamResponse[CreateCallTypeResponse]: - json = build_body_dict( - **{ - "name": name, - "external_storage": external_storage, - "grants": grants, - "notification_settings": notification_settings, - "settings": settings, - } - ) + json = CreateCallTypeRequest( + name=name, + external_storage=external_storage, + grants=grants, + notification_settings=notification_settings, + settings=settings, + ).to_dict() return await self.post( "/api/v2/video/calltypes", CreateCallTypeResponse, json=json ) @@ -1203,14 +1172,12 @@ async def update_call_type( path_params = { "name": name, } - json = build_body_dict( - **{ - "external_storage": external_storage, - "grants": grants, - "notification_settings": notification_settings, - "settings": settings, - } - ) + json = UpdateCallTypeRequest( + external_storage=external_storage, + grants=grants, + notification_settings=notification_settings, + settings=settings, + ).to_dict() return await self.put( "/api/v2/video/calltypes/{name}", UpdateCallTypeResponse, @@ -1243,19 +1210,17 @@ async def create_sip_inbound_routing_rule( pin_protection_configs: Optional[SIPPinProtectionConfigsRequest] = None, pin_routing_configs: Optional[SIPInboundRoutingRulePinConfigsRequest] = None, ) -> StreamResponse[SIPInboundRoutingRuleResponse]: - json = build_body_dict( - **{ - "name": name, - "trunk_ids": trunk_ids, - "caller_configs": caller_configs, - "called_numbers": called_numbers, - "caller_numbers": caller_numbers, - "call_configs": call_configs, - "direct_routing_configs": direct_routing_configs, - "pin_protection_configs": pin_protection_configs, - "pin_routing_configs": pin_routing_configs, - } - ) + json = SIPInboundRoutingRuleRequest( + name=name, + trunk_ids=trunk_ids, + caller_configs=caller_configs, + called_numbers=called_numbers, + caller_numbers=caller_numbers, + call_configs=call_configs, + direct_routing_configs=direct_routing_configs, + pin_protection_configs=pin_protection_configs, + pin_routing_configs=pin_routing_configs, + ).to_dict() return await self.post( "/api/v2/video/sip/inbound_routing_rules", SIPInboundRoutingRuleResponse, @@ -1292,19 +1257,17 @@ async def update_sip_inbound_routing_rule( path_params = { "id": id, } - json = build_body_dict( - **{ - "name": name, - "called_numbers": called_numbers, - "trunk_ids": trunk_ids, - "caller_configs": caller_configs, - "caller_numbers": caller_numbers, - "call_configs": call_configs, - "direct_routing_configs": direct_routing_configs, - "pin_protection_configs": pin_protection_configs, - "pin_routing_configs": pin_routing_configs, - } - ) + json = UpdateSIPInboundRoutingRuleRequest( + name=name, + called_numbers=called_numbers, + trunk_ids=trunk_ids, + caller_configs=caller_configs, + caller_numbers=caller_numbers, + call_configs=call_configs, + direct_routing_configs=direct_routing_configs, + pin_protection_configs=pin_protection_configs, + pin_routing_configs=pin_routing_configs, + ).to_dict() return await self.put( "/api/v2/video/sip/inbound_routing_rules/{id}", UpdateSIPInboundRoutingRuleResponse, @@ -1320,7 +1283,7 @@ async def list_sip_trunks(self) -> StreamResponse[ListSIPTrunksResponse]: async def create_sip_trunk( self, name: str, numbers: List[str] ) -> StreamResponse[CreateSIPTrunkResponse]: - json = build_body_dict(**{"name": name, "numbers": numbers}) + json = CreateSIPTrunkRequest(name=name, numbers=numbers).to_dict() return await self.post( "/api/v2/video/sip/inbound_trunks", CreateSIPTrunkResponse, json=json ) @@ -1343,7 +1306,7 @@ async def update_sip_trunk( path_params = { "id": id, } - json = build_body_dict(**{"name": name, "numbers": numbers}) + json = UpdateSIPTrunkRequest(name=name, numbers=numbers).to_dict() return await self.put( "/api/v2/video/sip/inbound_trunks/{id}", UpdateSIPTrunkResponse, @@ -1360,15 +1323,13 @@ async def resolve_sip_inbound( routing_number: Optional[str] = None, sip_headers: Optional[Dict[str, str]] = None, ) -> StreamResponse[ResolveSipInboundResponse]: - json = build_body_dict( - **{ - "sip_caller_number": sip_caller_number, - "sip_trunk_number": sip_trunk_number, - "challenge": challenge, - "routing_number": routing_number, - "sip_headers": sip_headers, - } - ) + json = ResolveSipInboundRequest( + sip_caller_number=sip_caller_number, + sip_trunk_number=sip_trunk_number, + challenge=challenge, + routing_number=routing_number, + sip_headers=sip_headers, + ).to_dict() return await self.post( "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json ) @@ -1380,9 +1341,9 @@ async def query_aggregate_call_stats( to: Optional[str] = None, report_types: Optional[List[str]] = None, ) -> StreamResponse[QueryAggregateCallStatsResponse]: - json = build_body_dict( - **{"from": _from, "to": to, "report_types": report_types} - ) + json = QueryAggregateCallStatsRequest( + _from=_from, to=to, report_types=report_types + ).to_dict() return await self.post( "/api/v2/video/stats", QueryAggregateCallStatsResponse, json=json ) diff --git a/getstream/video/rest_client.py b/getstream/video/rest_client.py index c13881e3..279c3c6d 100644 --- a/getstream/video/rest_client.py +++ b/getstream/video/rest_client.py @@ -3,7 +3,7 @@ from getstream.common import telemetry from getstream.models import * from getstream.stream_response import StreamResponse -from getstream.utils import build_query_param, build_body_dict +from getstream.utils import build_query_param class VideoRestClient(BaseClient): @@ -48,15 +48,13 @@ def query_user_feedback( filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryUserFeedbackResponse]: query_params = build_query_param(**{"full": full}) - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter_conditions": filter_conditions, - } - ) + json = QueryUserFeedbackRequest( + limit=limit, + next=next, + prev=prev, + sort=sort, + filter_conditions=filter_conditions, + ).to_dict() return self.post( "/api/v2/video/call/feedback", QueryUserFeedbackResponse, @@ -75,17 +73,15 @@ def query_call_members( sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallMembersResponse]: - json = build_body_dict( - **{ - "id": id, - "type": type, - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter_conditions": filter_conditions, - } - ) + json = QueryCallMembersRequest( + id=id, + type=type, + limit=limit, + next=next, + prev=prev, + sort=sort, + filter_conditions=filter_conditions, + ).to_dict() return self.post( "/api/v2/video/call/members", QueryCallMembersResponse, json=json ) @@ -99,15 +95,13 @@ def query_call_stats( sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallStatsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter_conditions": filter_conditions, - } - ) + json = QueryCallStatsRequest( + limit=limit, + next=next, + prev=prev, + sort=sort, + filter_conditions=filter_conditions, + ).to_dict() return self.post("/api/v2/video/call/stats", QueryCallStatsResponse, json=json) @telemetry.operation_name("getstream.api.video.get_call") @@ -152,13 +146,9 @@ def update_call( "type": type, "id": id, } - json = build_body_dict( - **{ - "starts_at": starts_at, - "custom": custom, - "settings_override": settings_override, - } - ) + json = UpdateCallRequest( + starts_at=starts_at, custom=custom, settings_override=settings_override + ).to_dict() return self.patch( "/api/v2/video/call/{type}/{id}", UpdateCallResponse, @@ -181,15 +171,13 @@ def get_or_create_call( "type": type, "id": id, } - json = build_body_dict( - **{ - "members_limit": members_limit, - "notify": notify, - "ring": ring, - "video": video, - "data": data, - } - ) + json = GetOrCreateCallRequest( + members_limit=members_limit, + notify=notify, + ring=ring, + video=video, + data=data, + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}", GetOrCreateCallResponse, @@ -205,7 +193,7 @@ def block_user( "type": type, "id": id, } - json = build_body_dict(**{"user_id": user_id}) + json = BlockUserRequest(user_id=user_id).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/block", BlockUserResponse, @@ -232,19 +220,17 @@ def send_closed_caption( "type": type, "id": id, } - json = build_body_dict( - **{ - "speaker_id": speaker_id, - "text": text, - "end_time": end_time, - "language": language, - "service": service, - "start_time": start_time, - "translated": translated, - "user_id": user_id, - "user": user, - } - ) + json = SendClosedCaptionRequest( + speaker_id=speaker_id, + text=text, + end_time=end_time, + language=language, + service=service, + start_time=start_time, + translated=translated, + user_id=user_id, + user=user, + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/closed_captions", SendClosedCaptionResponse, @@ -260,7 +246,7 @@ def delete_call( "type": type, "id": id, } - json = build_body_dict(**{"hard": hard}) + json = DeleteCallRequest(hard=hard).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/delete", DeleteCallResponse, @@ -281,7 +267,7 @@ def send_call_event( "type": type, "id": id, } - json = build_body_dict(**{"user_id": user_id, "custom": custom, "user": user}) + json = SendCallEventRequest(user_id=user_id, custom=custom, user=user).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/event", SendCallEventResponse, @@ -305,16 +291,14 @@ def collect_user_feedback( "type": type, "id": id, } - json = build_body_dict( - **{ - "rating": rating, - "sdk": sdk, - "sdk_version": sdk_version, - "reason": reason, - "user_session_id": user_session_id, - "custom": custom, - } - ) + json = CollectUserFeedbackRequest( + rating=rating, + sdk=sdk, + sdk_version=sdk_version, + reason=reason, + user_session_id=user_session_id, + custom=custom, + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/feedback", CollectUserFeedbackResponse, @@ -341,19 +325,17 @@ def go_live( "type": type, "id": id, } - json = build_body_dict( - **{ - "recording_storage_name": recording_storage_name, - "start_closed_caption": start_closed_caption, - "start_composite_recording": start_composite_recording, - "start_hls": start_hls, - "start_individual_recording": start_individual_recording, - "start_raw_recording": start_raw_recording, - "start_recording": start_recording, - "start_transcription": start_transcription, - "transcription_storage_name": transcription_storage_name, - } - ) + json = GoLiveRequest( + recording_storage_name=recording_storage_name, + start_closed_caption=start_closed_caption, + start_composite_recording=start_composite_recording, + start_hls=start_hls, + start_individual_recording=start_individual_recording, + start_raw_recording=start_raw_recording, + start_recording=start_recording, + start_transcription=start_transcription, + transcription_storage_name=transcription_storage_name, + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/go_live", GoLiveResponse, @@ -375,14 +357,9 @@ def kick_user( "type": type, "id": id, } - json = build_body_dict( - **{ - "user_id": user_id, - "block": block, - "kicked_by_id": kicked_by_id, - "kicked_by": kicked_by, - } - ) + json = KickUserRequest( + user_id=user_id, block=block, kicked_by_id=kicked_by_id, kicked_by=kicked_by + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/kick", KickUserResponse, @@ -414,9 +391,9 @@ def update_call_members( "type": type, "id": id, } - json = build_body_dict( - **{"remove_members": remove_members, "update_members": update_members} - ) + json = UpdateCallMembersRequest( + remove_members=remove_members, update_members=update_members + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/members", UpdateCallMembersResponse, @@ -442,18 +419,16 @@ def mute_users( "type": type, "id": id, } - json = build_body_dict( - **{ - "audio": audio, - "mute_all_users": mute_all_users, - "muted_by_id": muted_by_id, - "screenshare": screenshare, - "screenshare_audio": screenshare_audio, - "video": video, - "user_ids": user_ids, - "muted_by": muted_by, - } - ) + json = MuteUsersRequest( + audio=audio, + mute_all_users=mute_all_users, + muted_by_id=muted_by_id, + screenshare=screenshare, + screenshare_audio=screenshare_audio, + video=video, + user_ids=user_ids, + muted_by=muted_by, + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/mute_users", MuteUsersResponse, @@ -474,7 +449,9 @@ def query_call_participants( "id": id, "type": type, } - json = build_body_dict(**{"filter_conditions": filter_conditions}) + json = QueryCallParticipantsRequest( + filter_conditions=filter_conditions + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/participants", QueryCallParticipantsResponse, @@ -491,7 +468,7 @@ def video_pin( "type": type, "id": id, } - json = build_body_dict(**{"session_id": session_id, "user_id": user_id}) + json = PinRequest(session_id=session_id, user_id=user_id).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/pin", PinResponse, @@ -526,9 +503,9 @@ def start_recording( "id": id, "recording_type": recording_type, } - json = build_body_dict( - **{"recording_external_storage": recording_external_storage} - ) + json = StartRecordingRequest( + recording_external_storage=recording_external_storage + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/start", StartRecordingResponse, @@ -548,7 +525,7 @@ def stop_recording( "id": id, "recording_type": recording_type, } - json = build_body_dict(**{}) + json = StopRecordingRequest().to_dict() return self.post( "/api/v2/video/call/{type}/{id}/recordings/{recording_type}/stop", StopRecordingResponse, @@ -584,7 +561,7 @@ def ring_call( "type": type, "id": id, } - json = build_body_dict(**{"video": video, "members_ids": members_ids}) + json = RingCallRequest(video=video, members_ids=members_ids).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/ring", RingCallResponse, @@ -600,7 +577,7 @@ def start_rtmp_broadcasts( "type": type, "id": id, } - json = build_body_dict(**{"broadcasts": broadcasts}) + json = StartRTMPBroadcastsRequest(broadcasts=broadcasts).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/rtmp_broadcasts", StartRTMPBroadcastsResponse, @@ -634,7 +611,7 @@ def stop_rtmp_broadcast( "id": id, "name": name, } - json = build_body_dict(**{}) + json = StopRTMPBroadcastsRequest().to_dict() return self.post( "/api/v2/video/call/{type}/{id}/rtmp_broadcasts/{name}/stop", StopRTMPBroadcastsResponse, @@ -729,14 +706,12 @@ def start_closed_captions( "type": type, "id": id, } - json = build_body_dict( - **{ - "enable_transcription": enable_transcription, - "external_storage": external_storage, - "language": language, - "speech_segment_config": speech_segment_config, - } - ) + json = StartClosedCaptionsRequest( + enable_transcription=enable_transcription, + external_storage=external_storage, + language=language, + speech_segment_config=speech_segment_config, + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/start_closed_captions", StartClosedCaptionsResponse, @@ -752,9 +727,9 @@ def start_frame_recording( "type": type, "id": id, } - json = build_body_dict( - **{"recording_external_storage": recording_external_storage} - ) + json = StartFrameRecordingRequest( + recording_external_storage=recording_external_storage + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/start_frame_recording", StartFrameRecordingResponse, @@ -775,13 +750,11 @@ def start_transcription( "type": type, "id": id, } - json = build_body_dict( - **{ - "enable_closed_captions": enable_closed_captions, - "language": language, - "transcription_external_storage": transcription_external_storage, - } - ) + json = StartTranscriptionRequest( + enable_closed_captions=enable_closed_captions, + language=language, + transcription_external_storage=transcription_external_storage, + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/start_transcription", StartTranscriptionResponse, @@ -811,7 +784,9 @@ def stop_closed_captions( "type": type, "id": id, } - json = build_body_dict(**{"stop_transcription": stop_transcription}) + json = StopClosedCaptionsRequest( + stop_transcription=stop_transcription + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/stop_closed_captions", StopClosedCaptionsResponse, @@ -851,18 +826,16 @@ def stop_live( "type": type, "id": id, } - json = build_body_dict( - **{ - "continue_closed_caption": continue_closed_caption, - "continue_composite_recording": continue_composite_recording, - "continue_hls": continue_hls, - "continue_individual_recording": continue_individual_recording, - "continue_raw_recording": continue_raw_recording, - "continue_recording": continue_recording, - "continue_rtmp_broadcasts": continue_rtmp_broadcasts, - "continue_transcription": continue_transcription, - } - ) + json = StopLiveRequest( + continue_closed_caption=continue_closed_caption, + continue_composite_recording=continue_composite_recording, + continue_hls=continue_hls, + continue_individual_recording=continue_individual_recording, + continue_raw_recording=continue_raw_recording, + continue_recording=continue_recording, + continue_rtmp_broadcasts=continue_rtmp_broadcasts, + continue_transcription=continue_transcription, + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/stop_live", StopLiveResponse, @@ -878,7 +851,9 @@ def stop_transcription( "type": type, "id": id, } - json = build_body_dict(**{"stop_closed_captions": stop_closed_captions}) + json = StopTranscriptionRequest( + stop_closed_captions=stop_closed_captions + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/stop_transcription", StopTranscriptionResponse, @@ -908,7 +883,7 @@ def unblock_user( "type": type, "id": id, } - json = build_body_dict(**{"user_id": user_id}) + json = UnblockUserRequest(user_id=user_id).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/unblock", UnblockUserResponse, @@ -924,7 +899,7 @@ def video_unpin( "type": type, "id": id, } - json = build_body_dict(**{"session_id": session_id, "user_id": user_id}) + json = UnpinRequest(session_id=session_id, user_id=user_id).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/unpin", UnpinResponse, @@ -945,13 +920,11 @@ def update_user_permissions( "type": type, "id": id, } - json = build_body_dict( - **{ - "user_id": user_id, - "grant_permissions": grant_permissions, - "revoke_permissions": revoke_permissions, - } - ) + json = UpdateUserPermissionsRequest( + user_id=user_id, + grant_permissions=grant_permissions, + revoke_permissions=revoke_permissions, + ).to_dict() return self.post( "/api/v2/video/call/{type}/{id}/user_permissions", UpdateUserPermissionsResponse, @@ -1130,15 +1103,13 @@ def query_calls( sort: Optional[List[SortParamRequest]] = None, filter_conditions: Optional[Dict[str, object]] = None, ) -> StreamResponse[QueryCallsResponse]: - json = build_body_dict( - **{ - "limit": limit, - "next": next, - "prev": prev, - "sort": sort, - "filter_conditions": filter_conditions, - } - ) + json = QueryCallsRequest( + limit=limit, + next=next, + prev=prev, + sort=sort, + filter_conditions=filter_conditions, + ).to_dict() return self.post("/api/v2/video/calls", QueryCallsResponse, json=json) @telemetry.operation_name("getstream.api.video.list_call_types") @@ -1154,15 +1125,13 @@ def create_call_type( notification_settings: Optional[NotificationSettingsRequest] = None, settings: Optional[CallSettingsRequest] = None, ) -> StreamResponse[CreateCallTypeResponse]: - json = build_body_dict( - **{ - "name": name, - "external_storage": external_storage, - "grants": grants, - "notification_settings": notification_settings, - "settings": settings, - } - ) + json = CreateCallTypeRequest( + name=name, + external_storage=external_storage, + grants=grants, + notification_settings=notification_settings, + settings=settings, + ).to_dict() return self.post("/api/v2/video/calltypes", CreateCallTypeResponse, json=json) @telemetry.operation_name("getstream.api.video.delete_call_type") @@ -1197,14 +1166,12 @@ def update_call_type( path_params = { "name": name, } - json = build_body_dict( - **{ - "external_storage": external_storage, - "grants": grants, - "notification_settings": notification_settings, - "settings": settings, - } - ) + json = UpdateCallTypeRequest( + external_storage=external_storage, + grants=grants, + notification_settings=notification_settings, + settings=settings, + ).to_dict() return self.put( "/api/v2/video/calltypes/{name}", UpdateCallTypeResponse, @@ -1237,19 +1204,17 @@ def create_sip_inbound_routing_rule( pin_protection_configs: Optional[SIPPinProtectionConfigsRequest] = None, pin_routing_configs: Optional[SIPInboundRoutingRulePinConfigsRequest] = None, ) -> StreamResponse[SIPInboundRoutingRuleResponse]: - json = build_body_dict( - **{ - "name": name, - "trunk_ids": trunk_ids, - "caller_configs": caller_configs, - "called_numbers": called_numbers, - "caller_numbers": caller_numbers, - "call_configs": call_configs, - "direct_routing_configs": direct_routing_configs, - "pin_protection_configs": pin_protection_configs, - "pin_routing_configs": pin_routing_configs, - } - ) + json = SIPInboundRoutingRuleRequest( + name=name, + trunk_ids=trunk_ids, + caller_configs=caller_configs, + called_numbers=called_numbers, + caller_numbers=caller_numbers, + call_configs=call_configs, + direct_routing_configs=direct_routing_configs, + pin_protection_configs=pin_protection_configs, + pin_routing_configs=pin_routing_configs, + ).to_dict() return self.post( "/api/v2/video/sip/inbound_routing_rules", SIPInboundRoutingRuleResponse, @@ -1286,19 +1251,17 @@ def update_sip_inbound_routing_rule( path_params = { "id": id, } - json = build_body_dict( - **{ - "name": name, - "called_numbers": called_numbers, - "trunk_ids": trunk_ids, - "caller_configs": caller_configs, - "caller_numbers": caller_numbers, - "call_configs": call_configs, - "direct_routing_configs": direct_routing_configs, - "pin_protection_configs": pin_protection_configs, - "pin_routing_configs": pin_routing_configs, - } - ) + json = UpdateSIPInboundRoutingRuleRequest( + name=name, + called_numbers=called_numbers, + trunk_ids=trunk_ids, + caller_configs=caller_configs, + caller_numbers=caller_numbers, + call_configs=call_configs, + direct_routing_configs=direct_routing_configs, + pin_protection_configs=pin_protection_configs, + pin_routing_configs=pin_routing_configs, + ).to_dict() return self.put( "/api/v2/video/sip/inbound_routing_rules/{id}", UpdateSIPInboundRoutingRuleResponse, @@ -1314,7 +1277,7 @@ def list_sip_trunks(self) -> StreamResponse[ListSIPTrunksResponse]: def create_sip_trunk( self, name: str, numbers: List[str] ) -> StreamResponse[CreateSIPTrunkResponse]: - json = build_body_dict(**{"name": name, "numbers": numbers}) + json = CreateSIPTrunkRequest(name=name, numbers=numbers).to_dict() return self.post( "/api/v2/video/sip/inbound_trunks", CreateSIPTrunkResponse, json=json ) @@ -1337,7 +1300,7 @@ def update_sip_trunk( path_params = { "id": id, } - json = build_body_dict(**{"name": name, "numbers": numbers}) + json = UpdateSIPTrunkRequest(name=name, numbers=numbers).to_dict() return self.put( "/api/v2/video/sip/inbound_trunks/{id}", UpdateSIPTrunkResponse, @@ -1354,15 +1317,13 @@ def resolve_sip_inbound( routing_number: Optional[str] = None, sip_headers: Optional[Dict[str, str]] = None, ) -> StreamResponse[ResolveSipInboundResponse]: - json = build_body_dict( - **{ - "sip_caller_number": sip_caller_number, - "sip_trunk_number": sip_trunk_number, - "challenge": challenge, - "routing_number": routing_number, - "sip_headers": sip_headers, - } - ) + json = ResolveSipInboundRequest( + sip_caller_number=sip_caller_number, + sip_trunk_number=sip_trunk_number, + challenge=challenge, + routing_number=routing_number, + sip_headers=sip_headers, + ).to_dict() return self.post( "/api/v2/video/sip/resolve", ResolveSipInboundResponse, json=json ) @@ -1374,9 +1335,9 @@ def query_aggregate_call_stats( to: Optional[str] = None, report_types: Optional[List[str]] = None, ) -> StreamResponse[QueryAggregateCallStatsResponse]: - json = build_body_dict( - **{"from": _from, "to": to, "report_types": report_types} - ) + json = QueryAggregateCallStatsRequest( + _from=_from, to=to, report_types=report_types + ).to_dict() return self.post( "/api/v2/video/stats", QueryAggregateCallStatsResponse, json=json ) From 069f5522e1cabc60e9f432e7a2eebe0f6710a066 Mon Sep 17 00:00:00 2001 From: Yun Wang Date: Wed, 18 Feb 2026 16:36:21 +0100 Subject: [PATCH 8/8] feat: explicitly set return value to string --- getstream/utils/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/getstream/utils/__init__.py b/getstream/utils/__init__.py index 13ddfcbe..f1daec6b 100644 --- a/getstream/utils/__init__.py +++ b/getstream/utils/__init__.py @@ -96,7 +96,7 @@ def datetime_from_unix_ns( def _serialize_query_value(value) -> str: """Serialize a single value for use in a query parameter.""" if hasattr(value, "to_json") and callable(value.to_json): - return value.to_json() + return str(value.to_json()) if isinstance(value, datetime): return value.isoformat() return str(value)