diff --git a/src/Generated/ChatTrait.php b/src/Generated/ChatTrait.php index c8a8b64..4e69cf2 100644 --- a/src/Generated/ChatTrait.php +++ b/src/Generated/ChatTrait.php @@ -147,7 +147,7 @@ public function queryChannels(GeneratedModels\QueryChannelsRequest $requestData) return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\QueryChannelsResponse::class); } /** - * Update channels in batch + * Update channels in batch. By default returns task_id for an asynchronous task. With synchronous: true, updateData accepts at most 100 explicit CIDs and returns a positive success_channels_count of channels selected for update after the database write completes, without task_id. Always poll a returned task_id, including when an older node ignores synchronous. * Sends events: * - channel.frozen * - channel.hidden @@ -383,6 +383,24 @@ public function updateChannel(string $type, string $id, GeneratedModels\UpdateCh // Use the provided request data array directly return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\UpdateChannelResponse::class); } + /** + * Lists the users banned from a channel, by a ban on the channel or by a future channel ban issued by the channel's creator, with one entry per user + * + * @param string $type + * @param string $id + * @param GeneratedModels\QueryChannelBansRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function queryChannelBans(string $type, string $id, GeneratedModels\QueryChannelBansRequest $requestData): StreamResponse { + $path = '/api/v2/chat/channels/{type}/{id}/bans/query'; + $path = str_replace('{type}', (string) $type, $path); + $path = str_replace('{id}', (string) $id, $path); + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\QueryChannelBansResponse::class); + } /** * Deletes a draft * Sends events: @@ -578,6 +596,7 @@ public function updateMemberPartial(string $type, string $id, GeneratedModels\Up * - channel.visible * - message.new * - message.updated + * - scheduled_message.created * * @param string $type * @param string $id @@ -1336,7 +1355,7 @@ public function deleteReminder(string $messageID, ?string $userID = null): Strea return StreamResponse::fromJson($this->makeRequest('DELETE', $path, $queryParams, $requestData), GeneratedModels\DeleteReminderResponse::class); } /** - * Updates an existing reminder + * Updates an existing reminder. remind_at and expires_at are both replaced on every call: omitting either one clears it * Sends events: * - reminder.updated * @@ -1354,7 +1373,7 @@ public function updateReminder(string $messageID, GeneratedModels\UpdateReminder return StreamResponse::fromJson($this->makeRequest('PATCH', $path, $queryParams, $requestData), GeneratedModels\UpdateReminderResponse::class); } /** - * Creates a new reminder + * Creates a new reminder. An optional expires_at hides the reminder from every read once it passes and stops it counting against the per-user reminder cap * Sends events: * - reminder.created * @@ -1663,6 +1682,73 @@ public function getRetentionPolicyRuns(GeneratedModels\GetRetentionPolicyRunsReq // Use the provided request data array directly return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\GetRetentionPolicyRunsResponse::class); } + /** + * Lists the scheduled messages of one user across channels: pending ones first, then failed ones, each by scheduled_at. Client-side requests return the caller's own; server-side requests require user_id + * + * @param GeneratedModels\QueryScheduledMessagesRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function queryScheduledMessages(GeneratedModels\QueryScheduledMessagesRequest $requestData): StreamResponse { + $path = '/api/v2/chat/scheduled_messages/query'; + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\QueryScheduledMessagesResponse::class); + } + /** + * Cancels a scheduled message so it is never sent, or removes a failed one. Returns 409 while the message is being sent + * Sends events: + * - scheduled_message.deleted + * + * @param string $id + * @return StreamResponse + * @throws StreamException + */ + public function deleteScheduledMessage(string $id): StreamResponse { + $path = '/api/v2/chat/scheduled_messages/{id}'; + $path = str_replace('{id}', (string) $id, $path); + + $queryParams = []; + $requestData = null; + return StreamResponse::fromJson($this->makeRequest('DELETE', $path, $queryParams, $requestData), GeneratedModels\DeleteScheduledMessageResponse::class); + } + /** + * Replaces the message and/or the send time of a scheduled message. The scheduling checks run again, and the message is then sent, under the caller's auth mode. A request that changes only scheduled_at keeps the auth mode the message was scheduled with. Returns 409 while the message is being sent + * Sends events: + * - scheduled_message.updated + * + * @param string $id + * @param GeneratedModels\UpdateScheduledMessageRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function updateScheduledMessage(string $id, GeneratedModels\UpdateScheduledMessageRequest $requestData): StreamResponse { + $path = '/api/v2/chat/scheduled_messages/{id}'; + $path = str_replace('{id}', (string) $id, $path); + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('PATCH', $path, $queryParams, $requestData), GeneratedModels\UpdateScheduledMessageResponse::class); + } + /** + * Moves the send time of a scheduled message to now and queues the send. Every send check runs when it is sent. Returns 409 while the message is being sent + * Sends events: + * - scheduled_message.updated + * + * @param string $id + * @param GeneratedModels\SendScheduledMessageNowRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function sendScheduledMessageNow(string $id, GeneratedModels\SendScheduledMessageNowRequest $requestData): StreamResponse { + $path = '/api/v2/chat/scheduled_messages/{id}/send_now'; + $path = str_replace('{id}', (string) $id, $path); + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\SendScheduledMessageNowResponse::class); + } /** * Search messages across channels * diff --git a/src/Generated/CommonTrait.php b/src/Generated/CommonTrait.php index e03a0ef..ec8d2cc 100644 --- a/src/Generated/CommonTrait.php +++ b/src/Generated/CommonTrait.php @@ -158,6 +158,20 @@ public function updateBlockList(string $name, GeneratedModels\UpdateBlockListReq // Use the provided request data array directly return StreamResponse::fromJson($this->makeRequest('PUT', $path, $queryParams, $requestData), GeneratedModels\UpdateBlockListResponse::class); } + /** + * Validates that Stream can publish to a customer-owned GCP Pub/Sub topic + * + * @param GeneratedModels\CheckGCPPubSubRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function checkGCPPubSub(GeneratedModels\CheckGCPPubSubRequest $requestData): StreamResponse { + $path = '/api/v2/check_gcp_pubsub'; + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\CheckGCPPubSubResponse::class); + } /** * Sends a test message via push, this is a test endpoint to verify your push settings * @@ -805,15 +819,19 @@ public function deletePollOption(string $pollID, string $optionID, ?string $user * * @param string $pollID * @param string $optionID + * @param ?string $userID * @return StreamResponse * @throws StreamException */ - public function getPollOption(string $pollID, string $optionID): StreamResponse { + public function getPollOption(string $pollID, string $optionID, ?string $userID = null): StreamResponse { $path = '/api/v2/polls/{poll_id}/options/{option_id}'; $path = str_replace('{poll_id}', (string) $pollID, $path); $path = str_replace('{option_id}', (string) $optionID, $path); $queryParams = []; + if ($userID !== null) { + $queryParams['user_id'] = $userID; + } $requestData = null; return StreamResponse::fromJson($this->makeRequest('GET', $path, $queryParams, $requestData), GeneratedModels\PollOptionResponse::class); } diff --git a/src/Generated/FeedsTrait.php b/src/Generated/FeedsTrait.php index 7606e82..06826e5 100644 --- a/src/Generated/FeedsTrait.php +++ b/src/Generated/FeedsTrait.php @@ -357,13 +357,17 @@ public function deleteActivity(string $id, ?bool $hardDelete = null, ?bool $dele * @param string $id * @param ?string $commentSort * @param ?int $commentLimit + * @param ?bool $skipOwnFollowings * @param ?string $userID * @param ?string $language * @param ?bool $translateText + * @param ?bool $includeTopLevelCommentCount + * @param ?bool $includeSoftDeletedActivities + * @param ?bool $includeModeratedActivities * @return StreamResponse * @throws StreamException */ - public function getActivity(string $id, ?string $commentSort = null, ?int $commentLimit = null, ?string $userID = null, ?string $language = null, ?bool $translateText = null): StreamResponse { + public function getActivity(string $id, ?string $commentSort = null, ?int $commentLimit = null, ?bool $skipOwnFollowings = null, ?string $userID = null, ?string $language = null, ?bool $translateText = null, ?bool $includeTopLevelCommentCount = null, ?bool $includeSoftDeletedActivities = null, ?bool $includeModeratedActivities = null): StreamResponse { $path = '/api/v2/feeds/activities/{id}'; $path = str_replace('{id}', (string) $id, $path); @@ -374,6 +378,9 @@ public function getActivity(string $id, ?string $commentSort = null, ?int $comme if ($commentLimit !== null) { $queryParams['comment_limit'] = $commentLimit; } + if ($skipOwnFollowings !== null) { + $queryParams['skip_own_followings'] = $skipOwnFollowings; + } if ($userID !== null) { $queryParams['user_id'] = $userID; } @@ -383,11 +390,20 @@ public function getActivity(string $id, ?string $commentSort = null, ?int $comme if ($translateText !== null) { $queryParams['translate_text'] = $translateText; } + if ($includeTopLevelCommentCount !== null) { + $queryParams['include_top_level_comment_count'] = $includeTopLevelCommentCount; + } + if ($includeSoftDeletedActivities !== null) { + $queryParams['include_soft_deleted_activities'] = $includeSoftDeletedActivities; + } + if ($includeModeratedActivities !== null) { + $queryParams['include_moderated_activities'] = $includeModeratedActivities; + } $requestData = null; return StreamResponse::fromJson($this->makeRequest('GET', $path, $queryParams, $requestData), GeneratedModels\GetActivityResponse::class); } /** - * Updates certain fields of the activity. Use 'set' to update specific fields and 'unset' to remove fields. This allows you to update only the fields you need without replacing the entire activity. Useful for updating reply restrictions ('restrict_replies'), mentioned users, or custom data. + * Updates certain fields of the activity. Use 'set' to update specific fields and 'unset' to remove fields. This allows you to update only the fields you need without replacing the entire activity. Useful for updating reply restrictions ('restrict_replies'), mentioned users, or custom data. Changing `feeds` is a placement change (add/delete on those feeds), not an activity content update. * Sends events: * - feeds.activity.updated * @@ -405,7 +421,7 @@ public function updateActivityPartial(string $id, GeneratedModels\UpdateActivity return StreamResponse::fromJson($this->makeRequest('PATCH', $path, $queryParams, $requestData), GeneratedModels\UpdateActivityPartialResponse::class); } /** - * Replaces an activity with the provided data. Use this to update text, attachments, reply restrictions ('restrict_replies'), mentioned users, and other activity fields. Note: This is a full update - any fields not provided will be cleared. + * Replaces an activity with the provided data. Use this to update text, attachments, reply restrictions ('restrict_replies'), mentioned users, and other activity fields. Note: This is a full update - any fields not provided will be cleared. Changing `feeds` is a placement change (add/delete on those feeds), not an activity content update. * Sends events: * - feeds.activity.updated * @@ -531,16 +547,20 @@ public function queryBookmarks(GeneratedModels\QueryBookmarksRequest $requestDat * Delete collections in a batch operation. Users can only delete their own collections. * * @param array $collectionRefs + * @param ?bool $hardDelete * @return StreamResponse * @throws StreamException */ - public function deleteCollections(array $collectionRefs): StreamResponse { + public function deleteCollections(array $collectionRefs, ?bool $hardDelete = null): StreamResponse { $path = '/api/v2/feeds/collections'; $queryParams = []; if ($collectionRefs !== null) { $queryParams['collection_refs'] = $collectionRefs; } + if ($hardDelete !== null) { + $queryParams['hard_delete'] = $hardDelete; + } $requestData = null; return StreamResponse::fromJson($this->makeRequest('DELETE', $path, $queryParams, $requestData), GeneratedModels\DeleteCollectionsResponse::class); } @@ -636,10 +656,11 @@ public function queryCollections(GeneratedModels\QueryCollectionsRequest $reques * @param ?int $limit * @param ?string $prev * @param ?string $next + * @param ?bool $includeTopLevelCommentCount * @return StreamResponse * @throws StreamException */ - public function getComments(string $objectID, string $objectType, ?int $depth = null, ?string $sort = null, ?int $repliesLimit = null, ?string $idAround = null, ?string $language = null, ?bool $translateText = null, ?string $userID = null, ?int $limit = null, ?string $prev = null, ?string $next = null): StreamResponse { + public function getComments(string $objectID, string $objectType, ?int $depth = null, ?string $sort = null, ?int $repliesLimit = null, ?string $idAround = null, ?string $language = null, ?bool $translateText = null, ?string $userID = null, ?int $limit = null, ?string $prev = null, ?string $next = null, ?bool $includeTopLevelCommentCount = null): StreamResponse { $path = '/api/v2/feeds/comments'; $queryParams = []; @@ -679,6 +700,9 @@ public function getComments(string $objectID, string $objectType, ?int $depth = if ($next !== null) { $queryParams['next'] = $next; } + if ($includeTopLevelCommentCount !== null) { + $queryParams['include_top_level_comment_count'] = $includeTopLevelCommentCount; + } $requestData = null; return StreamResponse::fromJson($this->makeRequest('GET', $path, $queryParams, $requestData), GeneratedModels\GetCommentsResponse::class); } @@ -867,6 +891,22 @@ public function updateComment(string $id, GeneratedModels\UpdateCommentRequest $ // Use the provided request data array directly return StreamResponse::fromJson($this->makeRequest('PATCH', $path, $queryParams, $requestData), GeneratedModels\UpdateCommentResponse::class); } + /** + * Hide or unhide a comment for the current user + * + * @param string $id + * @param GeneratedModels\CommentFeedbackRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function commentFeedback(string $id, GeneratedModels\CommentFeedbackRequest $requestData): StreamResponse { + $path = '/api/v2/feeds/comments/{id}/feedback'; + $path = str_replace('{id}', (string) $id, $path); + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\CommentFeedbackResponse::class); + } /** * Updates certain fields of the comment. Use 'set' to update specific fields and 'unset' to remove fields. * Sends events: @@ -1744,7 +1784,7 @@ public function getOrCreateFollows(GeneratedModels\FollowBatchRequest $requestDa return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\FollowBatchResponse::class); } /** - * Query follows based on filters with pagination and sorting options + * Query follows based on filters with pagination and sorting options. Server-side callers may set include_group_counts to also receive accepted following counts keyed by followed feed group. Requires exactly one source_feed / source_fid string equality. HTTP 400 if target_feed appears, if two source FIDs are given, or if $in / $or / $nor mentions those keys. * * @param GeneratedModels\QueryFollowsRequest $requestData * @return StreamResponse @@ -1873,6 +1913,61 @@ public function updateMembershipLevel(string $id, GeneratedModels\UpdateMembersh // Use the provided request data array directly return StreamResponse::fromJson($this->makeRequest('PATCH', $path, $queryParams, $requestData), GeneratedModels\UpdateMembershipLevelResponse::class); } + /** + * Returns the feeds retention policies configured for the app. Server-side only. + * + * @return StreamResponse + * @throws StreamException + */ + public function feedsGetRetentionPolicy(): StreamResponse { + $path = '/api/v2/feeds/retention_policy'; + + $queryParams = []; + $requestData = null; + return StreamResponse::fromJson($this->makeRequest('GET', $path, $queryParams, $requestData), GeneratedModels\GetFeedsRetentionPolicyResponse::class); + } + /** + * Creates or updates a feeds retention policy for the app (an app may have multiple, each scoped to feed groups). Server-side only. + * + * @param GeneratedModels\SetFeedsRetentionPolicyRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function feedsSetRetentionPolicy(GeneratedModels\SetFeedsRetentionPolicyRequest $requestData): StreamResponse { + $path = '/api/v2/feeds/retention_policy'; + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\SetFeedsRetentionPolicyResponse::class); + } + /** + * Removes the named feeds retention policy for the app (an app may hold several). Server-side only. + * + * @param GeneratedModels\DeleteFeedsRetentionPolicyRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function feedsDeleteRetentionPolicy(GeneratedModels\DeleteFeedsRetentionPolicyRequest $requestData): StreamResponse { + $path = '/api/v2/feeds/retention_policy/delete'; + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\DeleteFeedsRetentionPolicyResponse::class); + } + /** + * Returns filtered and sorted feeds retention cleanup run history for the app. Supports filter_conditions on 'policy' and 'date' fields. Server-side only. + * + * @param GeneratedModels\GetFeedsRetentionPolicyRunsRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function feedsGetRetentionPolicyRuns(GeneratedModels\GetFeedsRetentionPolicyRunsRequest $requestData): StreamResponse { + $path = '/api/v2/feeds/retention_policy/runs'; + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\GetFeedsRetentionPolicyRunsResponse::class); + } /** * Queries revision history for activities and comments * @@ -1977,7 +2072,26 @@ public function exportFeedUserData(string $userID): StreamResponse { return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\ExportFeedUserDataResponse::class); } /** - * Returns the user's most common interest tags ranked by the number of distinct activities they reacted to that carried each tag. Client-side callers may only read their own interests; server-side callers may fetch any user. Results are sorted by descending count, then alphabetically by tag. + * Removes the given interest tags from a user, whether they were set manually or computed from reactions. A removed computed tag returns on the next recomputation if the user's reactions still support it; to keep a tag out of ranking for good, set it with a weight of 0 or below instead. Client-side callers may only manage their own interests; server-side callers may manage any user. Returns the user's remaining interests. + * + * @param string $userID + * @param array $tags + * @return StreamResponse + * @throws StreamException + */ + public function deleteUserInterests(string $userID, array $tags): StreamResponse { + $path = '/api/v2/feeds/users/{user_id}/interests'; + $path = str_replace('{user_id}', (string) $userID, $path); + + $queryParams = []; + if ($tags !== null) { + $queryParams['tags'] = $tags; + } + $requestData = null; + return StreamResponse::fromJson($this->makeRequest('DELETE', $path, $queryParams, $requestData), GeneratedModels\DeleteUserInterestsResponse::class); + } + /** + * Returns the user's interest tags with their ranking weights: tags computed from the activities the user reacted to and tags set manually through the API. Client-side callers may only read their own interests; server-side callers may fetch any user. Results are sorted by descending weight, then manually set tags before computed ones, then descending count, then alphabetically by tag. * * @param string $userID * @param ?int $limit @@ -1995,4 +2109,20 @@ public function getUserInterests(string $userID, ?int $limit = null): StreamResp $requestData = null; return StreamResponse::fromJson($this->makeRequest('GET', $path, $queryParams, $requestData), GeneratedModels\GetUserInterestsResponse::class); } + /** + * Adds or updates interest tags on a user with explicit ranking weights. Tags set this way rank above the tags computed from the user's reactions at equal weight and are never overwritten by them. Client-side callers may only manage their own interests; server-side callers may manage any user. Returns the user's full interest list after the write. + * + * @param string $userID + * @param GeneratedModels\UpsertUserInterestsRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function upsertUserInterests(string $userID, GeneratedModels\UpsertUserInterestsRequest $requestData): StreamResponse { + $path = '/api/v2/feeds/users/{user_id}/interests'; + $path = str_replace('{user_id}', (string) $userID, $path); + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('PUT', $path, $queryParams, $requestData), GeneratedModels\UpsertUserInterestsResponse::class); + } } diff --git a/src/Generated/VideoTrait.php b/src/Generated/VideoTrait.php index a53b00a..f22f60c 100644 --- a/src/Generated/VideoTrait.php +++ b/src/Generated/VideoTrait.php @@ -58,6 +58,20 @@ public function queryCallMembers(GeneratedModels\QueryCallMembersRequest $reques // Use the provided request data array directly return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\QueryCallMembersResponse::class); } + /** + * Returns a call's ring attempts, newest first. A session can be rung more than once, and the session-level accepted_by / rejected_by / missed_by maps flatten every ring together; an attempt says which ring a user acted on, which devices it reached, and who settled it and why. Pass call_session_id to limit the read to one session. + * + * @param GeneratedModels\QueryCallRingAttemptsRequest $requestData + * @return StreamResponse + * @throws StreamException + */ + public function queryCallRingAttempts(GeneratedModels\QueryCallRingAttemptsRequest $requestData): StreamResponse { + $path = '/api/v2/video/call/ring_attempts'; + + $queryParams = []; + // Use the provided request data array directly + return StreamResponse::fromJson($this->makeRequest('POST', $path, $queryParams, $requestData), GeneratedModels\QueryCallRingAttemptsResponse::class); + } /** * * @param GeneratedModels\QueryCallStatsRequest $requestData diff --git a/src/Generated/Webhook.php b/src/Generated/Webhook.php index f72aa43..7acc024 100644 --- a/src/Generated/Webhook.php +++ b/src/Generated/Webhook.php @@ -23,9 +23,12 @@ use GetStream\GeneratedModels\AsyncBulkImageModerationEvent; use GetStream\GeneratedModels\AsyncExportChannelsEvent; use GetStream\GeneratedModels\AsyncExportErrorEvent; +use GetStream\GeneratedModels\AsyncExportLabelResultsEvent; use GetStream\GeneratedModels\AsyncExportModerationLogsEvent; use GetStream\GeneratedModels\AsyncExportReviewQueueEvent; use GetStream\GeneratedModels\AsyncExportUsersEvent; +use GetStream\GeneratedModels\AsyncImportErrorEvent; +use GetStream\GeneratedModels\AsyncImportSuccessEvent; use GetStream\GeneratedModels\BlockedUserEvent; use GetStream\GeneratedModels\BookmarkAddedEvent; use GetStream\GeneratedModels\BookmarkDeletedEvent; @@ -63,6 +66,7 @@ use GetStream\GeneratedModels\CallRecordingStoppedEvent; use GetStream\GeneratedModels\CallRejectedEvent; use GetStream\GeneratedModels\CallRingEvent; +use GetStream\GeneratedModels\CallRingSettledEvent; use GetStream\GeneratedModels\CallRtmpBroadcastFailedEvent; use GetStream\GeneratedModels\CallRtmpBroadcastStartedEvent; use GetStream\GeneratedModels\CallRtmpBroadcastStoppedEvent; @@ -96,6 +100,7 @@ use GetStream\GeneratedModels\ClosedCaptionEvent; use GetStream\GeneratedModels\CommentAddedEvent; use GetStream\GeneratedModels\CommentDeletedEvent; +use GetStream\GeneratedModels\CommentFeedbackEvent; use GetStream\GeneratedModels\CommentReactionAddedEvent; use GetStream\GeneratedModels\CommentReactionDeletedEvent; use GetStream\GeneratedModels\CommentReactionUpdatedEvent; @@ -144,6 +149,12 @@ use GetStream\GeneratedModels\NotificationThreadMessageNewEvent; use GetStream\GeneratedModels\PendingMessageEvent; use GetStream\GeneratedModels\PermissionRequestEvent; +use GetStream\GeneratedModels\PollClosedEvent; +use GetStream\GeneratedModels\PollDeletedEvent; +use GetStream\GeneratedModels\PollUpdatedEvent; +use GetStream\GeneratedModels\PollVoteCastedEvent; +use GetStream\GeneratedModels\PollVoteChangedEvent; +use GetStream\GeneratedModels\PollVoteRemovedEvent; use GetStream\GeneratedModels\ReactionDeletedEvent; use GetStream\GeneratedModels\ReactionNewEvent; use GetStream\GeneratedModels\ReactionUpdatedEvent; @@ -153,6 +164,8 @@ use GetStream\GeneratedModels\ReminderUpdatedEvent; use GetStream\GeneratedModels\ReviewQueueItemNewEvent; use GetStream\GeneratedModels\ReviewQueueItemUpdatedEvent; +use GetStream\GeneratedModels\ScheduledMessageFailedEvent; +use GetStream\GeneratedModels\ScheduledMessageSentEvent; use GetStream\GeneratedModels\StoriesFeedUpdatedEvent; use GetStream\GeneratedModels\ThreadUpdatedEvent; use GetStream\GeneratedModels\UnblockedUserEvent; @@ -226,6 +239,7 @@ class Webhook public const EVENT_TYPE_CALL_RECORDING_STOPPED = 'call.recording_stopped'; public const EVENT_TYPE_CALL_REJECTED = 'call.rejected'; public const EVENT_TYPE_CALL_RING = 'call.ring'; + public const EVENT_TYPE_CALL_RING_SETTLED = 'call.ring_settled'; public const EVENT_TYPE_CALL_RTMP_BROADCAST_FAILED = 'call.rtmp_broadcast_failed'; public const EVENT_TYPE_CALL_RTMP_BROADCAST_STARTED = 'call.rtmp_broadcast_started'; public const EVENT_TYPE_CALL_RTMP_BROADCAST_STOPPED = 'call.rtmp_broadcast_stopped'; @@ -263,6 +277,8 @@ class Webhook public const EVENT_TYPE_EXPORT_BULK_IMAGE_MODERATION_SUCCESS = 'export.bulk_image_moderation.success'; public const EVENT_TYPE_EXPORT_CHANNELS_ERROR = 'export.channels.error'; public const EVENT_TYPE_EXPORT_CHANNELS_SUCCESS = 'export.channels.success'; + public const EVENT_TYPE_EXPORT_LABEL_RESULTS_ERROR = 'export.label_results.error'; + public const EVENT_TYPE_EXPORT_LABEL_RESULTS_SUCCESS = 'export.label_results.success'; public const EVENT_TYPE_EXPORT_MODERATION_LOGS_ERROR = 'export.moderation_logs.error'; public const EVENT_TYPE_EXPORT_MODERATION_LOGS_SUCCESS = 'export.moderation_logs.success'; public const EVENT_TYPE_EXPORT_REVIEW_QUEUE_ERROR = 'export.review_queue.error'; @@ -288,6 +304,7 @@ class Webhook public const EVENT_TYPE_FEEDS_BOOKMARK_FOLDER_UPDATED = 'feeds.bookmark_folder.updated'; public const EVENT_TYPE_FEEDS_COMMENT_ADDED = 'feeds.comment.added'; public const EVENT_TYPE_FEEDS_COMMENT_DELETED = 'feeds.comment.deleted'; + public const EVENT_TYPE_FEEDS_COMMENT_FEEDBACK = 'feeds.comment.feedback'; public const EVENT_TYPE_FEEDS_COMMENT_REACTION_ADDED = 'feeds.comment.reaction.added'; public const EVENT_TYPE_FEEDS_COMMENT_REACTION_DELETED = 'feeds.comment.reaction.deleted'; public const EVENT_TYPE_FEEDS_COMMENT_REACTION_UPDATED = 'feeds.comment.reaction.updated'; @@ -308,6 +325,8 @@ class Webhook public const EVENT_TYPE_FEEDS_NOTIFICATION_FEED_UPDATED = 'feeds.notification_feed.updated'; public const EVENT_TYPE_FEEDS_STORIES_FEED_UPDATED = 'feeds.stories_feed.updated'; public const EVENT_TYPE_FLAG_UPDATED = 'flag.updated'; + public const EVENT_TYPE_IMPORT_ERROR = 'import.error'; + public const EVENT_TYPE_IMPORT_SUCCESS = 'import.success'; public const EVENT_TYPE_INGRESS_ERROR = 'ingress.error'; public const EVENT_TYPE_INGRESS_STARTED = 'ingress.started'; public const EVENT_TYPE_INGRESS_STOPPED = 'ingress.stopped'; @@ -333,6 +352,12 @@ class Webhook public const EVENT_TYPE_NOTIFICATION_MARK_UNREAD = 'notification.mark_unread'; public const EVENT_TYPE_NOTIFICATION_REMINDER_DUE = 'notification.reminder_due'; public const EVENT_TYPE_NOTIFICATION_THREAD_MESSAGE_NEW = 'notification.thread_message_new'; + public const EVENT_TYPE_POLL_CLOSED = 'poll.closed'; + public const EVENT_TYPE_POLL_DELETED = 'poll.deleted'; + public const EVENT_TYPE_POLL_UPDATED = 'poll.updated'; + public const EVENT_TYPE_POLL_VOTE_CASTED = 'poll.vote_casted'; + public const EVENT_TYPE_POLL_VOTE_CHANGED = 'poll.vote_changed'; + public const EVENT_TYPE_POLL_VOTE_REMOVED = 'poll.vote_removed'; public const EVENT_TYPE_REACTION_DELETED = 'reaction.deleted'; public const EVENT_TYPE_REACTION_NEW = 'reaction.new'; public const EVENT_TYPE_REACTION_UPDATED = 'reaction.updated'; @@ -341,6 +366,8 @@ class Webhook public const EVENT_TYPE_REMINDER_UPDATED = 'reminder.updated'; public const EVENT_TYPE_REVIEW_QUEUE_ITEM_NEW = 'review_queue_item.new'; public const EVENT_TYPE_REVIEW_QUEUE_ITEM_UPDATED = 'review_queue_item.updated'; + public const EVENT_TYPE_SCHEDULED_MESSAGE_FAILED = 'scheduled_message.failed'; + public const EVENT_TYPE_SCHEDULED_MESSAGE_SENT = 'scheduled_message.sent'; public const EVENT_TYPE_THREAD_UPDATED = 'thread.updated'; public const EVENT_TYPE_USER_BANNED = 'user.banned'; public const EVENT_TYPE_USER_DEACTIVATED = 'user.deactivated'; @@ -468,6 +495,7 @@ private static function getEventClass(string $eventType): ?string 'call.recording_stopped' => CallRecordingStoppedEvent::class, 'call.rejected' => CallRejectedEvent::class, 'call.ring' => CallRingEvent::class, + 'call.ring_settled' => CallRingSettledEvent::class, 'call.rtmp_broadcast_failed' => CallRtmpBroadcastFailedEvent::class, 'call.rtmp_broadcast_started' => CallRtmpBroadcastStartedEvent::class, 'call.rtmp_broadcast_stopped' => CallRtmpBroadcastStoppedEvent::class, @@ -505,6 +533,8 @@ private static function getEventClass(string $eventType): ?string 'export.bulk_image_moderation.success' => AsyncBulkImageModerationEvent::class, 'export.channels.error' => AsyncExportErrorEvent::class, 'export.channels.success' => AsyncExportChannelsEvent::class, + 'export.label_results.error' => AsyncExportErrorEvent::class, + 'export.label_results.success' => AsyncExportLabelResultsEvent::class, 'export.moderation_logs.error' => AsyncExportErrorEvent::class, 'export.moderation_logs.success' => AsyncExportModerationLogsEvent::class, 'export.review_queue.error' => AsyncExportErrorEvent::class, @@ -530,6 +560,7 @@ private static function getEventClass(string $eventType): ?string 'feeds.bookmark_folder.updated' => BookmarkFolderUpdatedEvent::class, 'feeds.comment.added' => CommentAddedEvent::class, 'feeds.comment.deleted' => CommentDeletedEvent::class, + 'feeds.comment.feedback' => CommentFeedbackEvent::class, 'feeds.comment.reaction.added' => CommentReactionAddedEvent::class, 'feeds.comment.reaction.deleted' => CommentReactionDeletedEvent::class, 'feeds.comment.reaction.updated' => CommentReactionUpdatedEvent::class, @@ -550,6 +581,8 @@ private static function getEventClass(string $eventType): ?string 'feeds.notification_feed.updated' => NotificationFeedUpdatedEvent::class, 'feeds.stories_feed.updated' => StoriesFeedUpdatedEvent::class, 'flag.updated' => FlagUpdatedEvent::class, + 'import.error' => AsyncImportErrorEvent::class, + 'import.success' => AsyncImportSuccessEvent::class, 'ingress.error' => IngressErrorEvent::class, 'ingress.started' => IngressStartedEvent::class, 'ingress.stopped' => IngressStoppedEvent::class, @@ -575,6 +608,12 @@ private static function getEventClass(string $eventType): ?string 'notification.mark_unread' => NotificationMarkUnreadEvent::class, 'notification.reminder_due' => ReminderNotificationEvent::class, 'notification.thread_message_new' => NotificationThreadMessageNewEvent::class, + 'poll.closed' => PollClosedEvent::class, + 'poll.deleted' => PollDeletedEvent::class, + 'poll.updated' => PollUpdatedEvent::class, + 'poll.vote_casted' => PollVoteCastedEvent::class, + 'poll.vote_changed' => PollVoteChangedEvent::class, + 'poll.vote_removed' => PollVoteRemovedEvent::class, 'reaction.deleted' => ReactionDeletedEvent::class, 'reaction.new' => ReactionNewEvent::class, 'reaction.updated' => ReactionUpdatedEvent::class, @@ -583,6 +622,8 @@ private static function getEventClass(string $eventType): ?string 'reminder.updated' => ReminderUpdatedEvent::class, 'review_queue_item.new' => ReviewQueueItemNewEvent::class, 'review_queue_item.updated' => ReviewQueueItemUpdatedEvent::class, + 'scheduled_message.failed' => ScheduledMessageFailedEvent::class, + 'scheduled_message.sent' => ScheduledMessageSentEvent::class, 'thread.updated' => ThreadUpdatedEvent::class, 'user.banned' => UserBannedEvent::class, 'user.deactivated' => UserDeactivatedEvent::class, diff --git a/src/GeneratedModels/AIAudioConfigRequest.php b/src/GeneratedModels/AIAudioConfigRequest.php index ed2ec41..5431f84 100644 --- a/src/GeneratedModels/AIAudioConfigRequest.php +++ b/src/GeneratedModels/AIAudioConfigRequest.php @@ -6,10 +6,12 @@ class AIAudioConfigRequest extends BaseModel { public function __construct( - public ?string $profile = null, + public ?string $profile = null, // Bodyguard credentials profile to classify transcripts with. Applies to the NLP engine only; ignored when LLM configurability is enabled. Empty falls back to the app-pinned profile, then the organization's top-level credentials /** @var array|null */ #[ArrayOf(BodyguardRule::class)] - public ?array $rules = null, + public ?array $rules = null, // Deprecated pre-split rule list. Still the live config while no engine config exists; once one does it is kept as a fallback for whichever engine has none of its own + public ?AITextConfig $aiTextConfig = null, + public ?LLMConfig $llmConfig = null, ) { } diff --git a/src/GeneratedModels/AIAudioConfigResponse.php b/src/GeneratedModels/AIAudioConfigResponse.php index 9e13529..6e6601d 100644 --- a/src/GeneratedModels/AIAudioConfigResponse.php +++ b/src/GeneratedModels/AIAudioConfigResponse.php @@ -6,11 +6,13 @@ class AIAudioConfigResponse extends BaseModel { public function __construct( - public ?bool $enabled = null, - public ?string $profile = null, + public ?bool $enabled = null, // Whether the engine selected by the application's LLM configurability flag has a rule that does something. Derived, not stored + public ?string $profile = null, // Bodyguard credentials profile transcripts are classified with. Applies to the NLP engine only /** @var array|null */ #[ArrayOf(BodyguardRule::class)] - public ?array $rules = null, + public ?array $rules = null, // The active engine's rules, flattened into the pre-split shape for clients that predate the per-engine configs. This is the whole config for a policy that has no per-engine config stored + public ?AITextConfig $aiTextConfig = null, + public ?LLMConfig $llmConfig = null, ) { } diff --git a/src/GeneratedModels/AIVideoConfig.php b/src/GeneratedModels/AIVideoConfig.php index 48b7748..40ba94c 100644 --- a/src/GeneratedModels/AIVideoConfig.php +++ b/src/GeneratedModels/AIVideoConfig.php @@ -11,7 +11,6 @@ public function __construct( /** @var array|null */ #[ArrayOf(AWSRekognitionRule::class)] public ?array $rules = null, - public ?string $provider = null, ) { } diff --git a/src/GeneratedModels/APIError.php b/src/GeneratedModels/APIError.php index 6654dff..69d0184 100644 --- a/src/GeneratedModels/APIError.php +++ b/src/GeneratedModels/APIError.php @@ -14,6 +14,7 @@ public function __construct( public ?string $moreInfo = null, // URL with additional information public ?array $details = null, // Additional error-specific information public ?bool $unrecoverable = null, // Flag that indicates if the error is unrecoverable, requests that return unrecoverable errors should not be retried, this error only applies to the request that caused it + public ?int $cooldownRemainingMs = null, // Milliseconds until the user's slow mode cool down period ends. Only set on code 60 (cool down) errors ) { } diff --git a/src/GeneratedModels/ActivityResponse.php b/src/GeneratedModels/ActivityResponse.php index 6304735..d563e3c 100644 --- a/src/GeneratedModels/ActivityResponse.php +++ b/src/GeneratedModels/ActivityResponse.php @@ -44,6 +44,7 @@ public function __construct( public ?ModerationV2Response $moderation = null, public ?string $moderationAction = null, public ?int $commentCount = null, // Number of comments on the activity + public ?int $topLevelCommentCount = null, // Number of top-level comments (comments directly on the activity, excluding replies). Only returned by GetActivity when include_top_level_comment_count=true; never set on feed reads or events. Same status/deletion rules as comment_count; not adjusted per viewer. public ?int $bookmarkCount = null, // Number of bookmarks on the activity public ?int $shareCount = null, // Number of times the activity was shared public ?int $reactionCount = null, // Number of reactions to the activity diff --git a/src/GeneratedModels/ActivitySelectorConfig.php b/src/GeneratedModels/ActivitySelectorConfig.php index a90f63a..924bc18 100644 --- a/src/GeneratedModels/ActivitySelectorConfig.php +++ b/src/GeneratedModels/ActivitySelectorConfig.php @@ -15,6 +15,8 @@ public function __construct( public ?string $cutoffWindow = null, // Flexible relative time window for activity selection (e.g., '1h', '3d', '1y'). Activities older than this duration will be filtered out. Cannot be used together with cutoff_time public ?int $minPopularity = null, // Minimum popularity threshold. For the 'popular' selector, omit to use the default (5); values below 1 are rejected public ?FeedGroupScope $feedGroups = null, + public ?int $rankingCandidateLimit = null, // Maximum number of candidate activities this selector contributes to a ranked feed (1-1000). Omit to use the default ranking buffer. Only supported on the popular, proximity, interest and query selectors, and ignored on feeds without ranking + public ?int $timeBudgetMs = null, // Maximum time in milliseconds this selector may take (25-5000). A selector that runs over its budget is dropped from that read instead of failing it, and stays out for the rest of that pagination session. The budget can only tighten the default, never extend it. Omit to use the default. Only supported on the popular, proximity, interest, query and follow_suggestion selectors public ?object $params = null, ) { } diff --git a/src/GeneratedModels/ActivitySelectorConfigResponse.php b/src/GeneratedModels/ActivitySelectorConfigResponse.php index bc1e540..853cf6f 100644 --- a/src/GeneratedModels/ActivitySelectorConfigResponse.php +++ b/src/GeneratedModels/ActivitySelectorConfigResponse.php @@ -15,6 +15,8 @@ public function __construct( public ?string $cutoffWindow = null, // Flexible relative time window for activity selection (e.g., '1h', '3d', '1y') public ?int $minPopularity = null, // Minimum popularity threshold. For the 'popular' selector, values below 1 are normalized to the default (5) at read time. public ?FeedGroupScope $feedGroups = null, + public ?int $rankingCandidateLimit = null, // Maximum number of candidate activities this selector contributes to a ranked feed + public ?int $timeBudgetMs = null, // Maximum time in milliseconds this selector may take before it is dropped from the read public ?object $params = null, // Generic params for selector-specific configuration ) { } diff --git a/src/GeneratedModels/AddActivityRequest.php b/src/GeneratedModels/AddActivityRequest.php index 3938b1a..84cbeb8 100644 --- a/src/GeneratedModels/AddActivityRequest.php +++ b/src/GeneratedModels/AddActivityRequest.php @@ -38,6 +38,7 @@ public function __construct( public ?bool $enrichOwnFields = null, public ?bool $forceModeration = null, public ?bool $createUsers = null, + public ?bool $skipExisting = null, ) { } diff --git a/src/GeneratedModels/AddActivityResponse.php b/src/GeneratedModels/AddActivityResponse.php index 8146267..c27acdf 100644 --- a/src/GeneratedModels/AddActivityResponse.php +++ b/src/GeneratedModels/AddActivityResponse.php @@ -8,6 +8,7 @@ class AddActivityResponse extends BaseModel public function __construct( public ?ActivityResponse $activity = null, public ?int $mentionNotificationsCreated = null, // Number of mention notification activities created for mentioned users + public ?array $skippedExisting = null, // Contains the activity ID when skip_existing is true and the activity already existed, so it was left unchanged. public ?string $duration = null, ) { } diff --git a/src/GeneratedModels/AddCommentReactionResponse.php b/src/GeneratedModels/AddCommentReactionResponse.php index d5b0d30..22c2b58 100644 --- a/src/GeneratedModels/AddCommentReactionResponse.php +++ b/src/GeneratedModels/AddCommentReactionResponse.php @@ -13,6 +13,9 @@ public function __construct( public ?bool $notificationAccepted = null, // Whether notification creation was accepted for asynchronous processing public ?string $notificationTaskID = null, // ID of the async notification-creation task; poll GET /tasks/{id} for its status public ?ActivityResponse $referenceActivity = null, + public ?string $outcome = null, // What this write did to the user's reaction on this target. One of: created, replaced, unchanged. 'created' means a new reaction was written and nothing was replaced; 'replaced' means enforce_unique removed one or more of the user's other reaction types; 'unchanged' means the user already held this reaction type (its custom data may still have been updated). Without enforce_unique a user can hold several reaction types on one target, so 'created' then means 'this reaction type was newly added', not 'the user's first reaction on this target'. + public ?string $previousReactionType = null, // The reaction type this write replaced, or null when nothing was replaced. Non-null exactly when outcome is 'replaced'. If enforce_unique removed several reactions — possible only for data created before enforce_unique was adopted — this is the most recently created one. + public ?int $counterDelta = null, // The change this write made to the number of reactions the user holds on this target: 1 when outcome is 'created', 0 when it is 'replaced' or 'unchanged'. These endpoints never return -1; a successful delete-reaction call is what decrements the count. With enforce_unique this is the delta of the user's reaction on the target; without it, the delta of reactions of this type. public ?string $duration = null, // Duration of the request ) { } diff --git a/src/GeneratedModels/AddReactionResponse.php b/src/GeneratedModels/AddReactionResponse.php index 32d16bf..edaebed 100644 --- a/src/GeneratedModels/AddReactionResponse.php +++ b/src/GeneratedModels/AddReactionResponse.php @@ -13,6 +13,9 @@ public function __construct( public ?bool $notificationAccepted = null, // Whether notification creation was accepted for asynchronous processing public ?string $notificationTaskID = null, // ID of the async notification-creation task; poll GET /tasks/{id} for its status public ?ActivityResponse $referenceActivity = null, + public ?string $outcome = null, // What this write did to the user's reaction on this target. One of: created, replaced, unchanged. 'created' means a new reaction was written and nothing was replaced; 'replaced' means enforce_unique removed one or more of the user's other reaction types; 'unchanged' means the user already held this reaction type (its custom data may still have been updated). Without enforce_unique a user can hold several reaction types on one target, so 'created' then means 'this reaction type was newly added', not 'the user's first reaction on this target'. + public ?string $previousReactionType = null, // The reaction type this write replaced, or null when nothing was replaced. Non-null exactly when outcome is 'replaced'. If enforce_unique removed several reactions — possible only for data created before enforce_unique was adopted — this is the most recently created one. + public ?int $counterDelta = null, // The change this write made to the number of reactions the user holds on this target: 1 when outcome is 'created', 0 when it is 'replaced' or 'unchanged'. These endpoints never return -1; a successful delete-reaction call is what decrements the count. With enforce_unique this is the delta of the user's reaction on the target; without it, the delta of reactions of this type. public ?string $duration = null, ) { } diff --git a/src/GeneratedModels/AggregationConfig.php b/src/GeneratedModels/AggregationConfig.php index 7d45d1d..bbfff28 100644 --- a/src/GeneratedModels/AggregationConfig.php +++ b/src/GeneratedModels/AggregationConfig.php @@ -7,6 +7,7 @@ class AggregationConfig extends BaseModel { public function __construct( public ?string $format = null, // Format for activity aggregation + public ?int $groupSize = null, // Maximum number of activities kept in each aggregated group. Omit to use the default: 15 for apps migrated from Feeds v2 or created on or after 2026-10-11, 100 otherwise. Must be between 1 and 100 when set. public ?string $scoreStrategy = null, // Strategy for computing aggregated group scores from member activity scores when ranking is enabled. Valid values: sum, max, avg public ?string $activitiesSort = null, // Order of member activities inside each aggregated group for non-stories feeds: created_at_desc (newest first, default) or created_at_asc (oldest first). Stories feeds ignore this and always use oldest first. ) { diff --git a/src/GeneratedModels/AnalyzeRequest.php b/src/GeneratedModels/AnalyzeRequest.php index 0649eac..fcf334a 100644 --- a/src/GeneratedModels/AnalyzeRequest.php +++ b/src/GeneratedModels/AnalyzeRequest.php @@ -15,6 +15,7 @@ public function __construct( public ?\DateTime $contentPublishedAt = null, // Original timestamp when the content was produced. Used as the `published_at` timestamp on per-content log entries that surface in `matched_contents` on aggregation-rule webhooks. public ?array $contentIds = null, // Optional map from a content label (either a `texts` key or an `image:` multipart label) to a caller-supplied per-instance identifier. Echoed on per-field verdicts and surfaced in `matched_contents` when an aggregation rule fires. public ?bool $asyncResponse = null, // When true, the response carries no verdicts (status `pending`) and per-modality results arrive via `moderation.text_analysis.complete` and `moderation.image_analysis.complete` webhooks. Image moderation runs on a background worker; text moderation runs synchronously and is then delivered via webhook. + public ?string $countryCode = null, // ISO 3166-1 alpha-2 country the content is aimed at (e.g. US, DE). Forwarded to the AI text provider as country context so it can resolve words whose meaning changes between countries. public ?string $userID = null, public ?UserRequest $user = null, // User request object ) { diff --git a/src/GeneratedModels/AnalyzeResponse.php b/src/GeneratedModels/AnalyzeResponse.php index aaf12cf..fa92541 100644 --- a/src/GeneratedModels/AnalyzeResponse.php +++ b/src/GeneratedModels/AnalyzeResponse.php @@ -14,6 +14,8 @@ public function __construct( #[MapOf(AnalyzeImageField::class)] public ?array $images = null, // Per-image moderation verdicts keyed by caller label. public ?string $duration = null, + public ?string $llmModel = null, // ID of the LLM model that scored the content (e.g. gpt-4o-mini). Omitted when no LLM verdict was used (e.g. Bodyguard-only, or `pending`). + public ?string $llmReasoningEffort = null, // reasoning_effort sent with the LLM request. Omitted when the request did not send one. ) { } diff --git a/src/GeneratedModels/AppDefaults.php b/src/GeneratedModels/AppDefaults.php new file mode 100644 index 0000000..1d50ba7 --- /dev/null +++ b/src/GeneratedModels/AppDefaults.php @@ -0,0 +1,19 @@ +|null */ @@ -33,6 +33,8 @@ public function __construct( public ?string $aiTextSeverity = null, // Text severity level assigned by the AI provider public ?string $configKey = null, // Moderation policy key that was applied public ?string $reviewQueueItemID = null, // ID of the review queue item linked to this appeal, if the appeal was submitted with one + public ?array $languages = null, // Detected languages in the content + public ?string $appealReasonLanguage = null, // Detected language of the appeal_reason text itself ) { } diff --git a/src/GeneratedModels/AppealRequest.php b/src/GeneratedModels/AppealRequest.php index 030c18f..3ececad 100644 --- a/src/GeneratedModels/AppealRequest.php +++ b/src/GeneratedModels/AppealRequest.php @@ -11,6 +11,7 @@ public function __construct( public ?string $appealReason = null, // Explanation for why the content is being appealed public ?array $attachments = null, // Array of Attachment URLs(e.g., images) public ?string $reviewQueueItemID = null, // ID of the review queue item (flagged message) that triggered the ban. Applicable only for user ban appeals. + public ?string $channelCid = null, // CID of the channel ban being appealed. Only used when entity_type is stream:user; omit to appeal the global ban. public ?string $userID = null, public ?UserRequest $user = null, // User request object ) { diff --git a/src/GeneratedModels/AsyncExportLabelResultsEvent.php b/src/GeneratedModels/AsyncExportLabelResultsEvent.php new file mode 100644 index 0000000..aa9cccd --- /dev/null +++ b/src/GeneratedModels/AsyncExportLabelResultsEvent.php @@ -0,0 +1,22 @@ +|null */ + #[MapOf(RingSettledTarget::class)] + public ?array $targets = null, // Final state of every rung user, keyed by user ID + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/CallSettingsRequest.php b/src/GeneratedModels/CallSettingsRequest.php index 30289d2..7db7338 100644 --- a/src/GeneratedModels/CallSettingsRequest.php +++ b/src/GeneratedModels/CallSettingsRequest.php @@ -23,6 +23,7 @@ public function __construct( public ?SessionSettingsRequest $session = null, public ?IngressSettingsRequest $ingress = null, public ?EncryptionSettingsRequest $encryption = null, + public ?LifecycleSettingsRequest $lifecycle = null, ) { } diff --git a/src/GeneratedModels/CallSettingsResponse.php b/src/GeneratedModels/CallSettingsResponse.php index 817a183..a6c43a1 100644 --- a/src/GeneratedModels/CallSettingsResponse.php +++ b/src/GeneratedModels/CallSettingsResponse.php @@ -23,6 +23,7 @@ public function __construct( public ?SessionSettingsResponse $session = null, public ?IngressSettingsResponse $ingress = null, public ?EncryptionSettingsResponse $encryption = null, // EncryptionSettings is the payload for end-to-end encryption settings + public ?LifecycleSettingsResponse $lifecycle = null, // LifecycleSettings is the payload for call lifecycle settings ) { } diff --git a/src/GeneratedModels/CastPollVoteRequest.php b/src/GeneratedModels/CastPollVoteRequest.php index 1923c3b..01302d6 100644 --- a/src/GeneratedModels/CastPollVoteRequest.php +++ b/src/GeneratedModels/CastPollVoteRequest.php @@ -7,6 +7,8 @@ class CastPollVoteRequest extends BaseModel { public function __construct( public ?VoteData $vote = null, + public ?string $configKey = null, // Key of the moderation configuration to use. Server-side only. + public ?string $configTeam = null, // Team associated with the configuration. Server-side only. public ?string $userID = null, public ?UserRequest $user = null, // User request object ) { diff --git a/src/GeneratedModels/ChannelBanResponse.php b/src/GeneratedModels/ChannelBanResponse.php new file mode 100644 index 0000000..3a227b5 --- /dev/null +++ b/src/GeneratedModels/ChannelBanResponse.php @@ -0,0 +1,19 @@ +|null */ #[ArrayOf(Command::class)] diff --git a/src/GeneratedModels/ChannelOwnCapability.php b/src/GeneratedModels/ChannelOwnCapability.php index ffb85a8..956f548 100644 --- a/src/GeneratedModels/ChannelOwnCapability.php +++ b/src/GeneratedModels/ChannelOwnCapability.php @@ -4,7 +4,7 @@ namespace GetStream\GeneratedModels; /** - * All possibility of string to use + * An action that can be performed in a channel. */ class ChannelOwnCapability extends BaseModel { diff --git a/src/GeneratedModels/ChannelPushPreferencesResponse.php b/src/GeneratedModels/ChannelPushPreferencesResponse.php index 12bedea..dffc95f 100644 --- a/src/GeneratedModels/ChannelPushPreferencesResponse.php +++ b/src/GeneratedModels/ChannelPushPreferencesResponse.php @@ -3,12 +3,15 @@ declare(strict_types=1); namespace GetStream\GeneratedModels; +/** + * The push preference details. + */ class ChannelPushPreferencesResponse extends BaseModel { public function __construct( - public ?string $chatLevel = null, + public ?string $chatLevel = null, // The scope level of the push notifications. public ?ChatPreferencesResponse $chatPreferences = null, - public ?\DateTime $disabledUntil = null, + public ?\DateTime $disabledUntil = null, // If provided the notifications will be disabled until the set date. ) { } diff --git a/src/GeneratedModels/ChannelStateResponse.php b/src/GeneratedModels/ChannelStateResponse.php index 7d0de61..1f6943a 100644 --- a/src/GeneratedModels/ChannelStateResponse.php +++ b/src/GeneratedModels/ChannelStateResponse.php @@ -9,35 +9,39 @@ public function __construct( public ?ChannelResponse $channel = null, // Represents channel in chat /** @var array|null */ #[ArrayOf(MessageResponse::class)] - public ?array $messages = null, + public ?array $messages = null, // List of channel messages /** @var array|null */ #[ArrayOf(MessageResponse::class)] - public ?array $pinnedMessages = null, - public ?int $watcherCount = null, + public ?array $pinnedMessages = null, // List of pinned messages in the channel + public ?int $watcherCount = null, // Number of channel watchers /** @var array|null */ #[ArrayOf(UserResponse::class)] - public ?array $watchers = null, + public ?array $watchers = null, // List of user who is watching the channel /** @var array|null */ #[ArrayOf(ReadStateResponse::class)] - public ?array $read = null, + public ?array $read = null, // List of read states /** @var array|null */ #[ArrayOf(ChannelMemberResponse::class)] - public ?array $members = null, + public ?array $members = null, // List of channel members public ?ChannelMemberResponse $membership = null, - public ?ChannelPushPreferencesResponse $pushPreferences = null, + public ?ChannelPushPreferencesResponse $pushPreferences = null, // The push preference details. /** @var array|null */ #[ArrayOf(ThreadStateResponse::class)] public ?array $threads = null, - public ?bool $hidden = null, - public ?\DateTime $hideMessagesBefore = null, + public ?bool $hidden = null, // Whether this channel is hidden or not + public ?\DateTime $hideMessagesBefore = null, // Messages before this date are hidden from the user /** @var array|null */ #[ArrayOf(PendingMessageResponse::class)] - public ?array $pendingMessages = null, + public ?array $pendingMessages = null, // Pending messages that this user has sent public ?DraftResponse $draft = null, /** @var array|null */ #[ArrayOf(SharedLocationResponseData::class)] - public ?array $activeLiveLocations = null, + public ?array $activeLiveLocations = null, // Active live locations in the channel + public ?int $cooldownRemainingMs = null, // Milliseconds until the current user's slow mode cool down period ends. Only set on client-side get or create channel and get channel requests while the user is under cool down public ?string $duration = null, + /** @var array|null */ + #[ArrayOf(ScheduledMessageResponse::class)] + public ?array $scheduledMessages = null, // The caller's own scheduled, sending and failed messages in this channel. Set only by a client-side GetOrCreateChannel with include_scheduled_messages; absent when not requested or not known, in which case use the scheduled messages query ) { } diff --git a/src/GeneratedModels/ChannelStateResponseFields.php b/src/GeneratedModels/ChannelStateResponseFields.php index 7408e46..c6f525b 100644 --- a/src/GeneratedModels/ChannelStateResponseFields.php +++ b/src/GeneratedModels/ChannelStateResponseFields.php @@ -24,7 +24,7 @@ public function __construct( #[ArrayOf(ChannelMemberResponse::class)] public ?array $members = null, // List of channel members public ?ChannelMemberResponse $membership = null, - public ?ChannelPushPreferencesResponse $pushPreferences = null, + public ?ChannelPushPreferencesResponse $pushPreferences = null, // The push preference details. /** @var array|null */ #[ArrayOf(ThreadStateResponse::class)] public ?array $threads = null, @@ -37,6 +37,7 @@ public function __construct( /** @var array|null */ #[ArrayOf(SharedLocationResponseData::class)] public ?array $activeLiveLocations = null, // Active live locations in the channel + public ?int $cooldownRemainingMs = null, // Milliseconds until the current user's slow mode cool down period ends. Only set on client-side get or create channel and get channel requests while the user is under cool down ) { } diff --git a/src/GeneratedModels/ChannelTypeConfig.php b/src/GeneratedModels/ChannelTypeConfig.php index ccf29c1..de45dca 100644 --- a/src/GeneratedModels/ChannelTypeConfig.php +++ b/src/GeneratedModels/ChannelTypeConfig.php @@ -46,7 +46,7 @@ public function __construct( public ?int $partitionSize = null, public ?string $partitionTtl = null, public ?bool $skipLastMsgUpdateForSystemMsgs = null, - public ?string $pushLevel = null, + public ?string $pushLevel = null, // Sets the push notification level for a channel type public ?ChatPreferences $chatPreferences = null, /** @var array|null */ #[ArrayOf(Command::class)] diff --git a/src/GeneratedModels/CheckGCPPubSubRequest.php b/src/GeneratedModels/CheckGCPPubSubRequest.php new file mode 100644 index 0000000..a101bd9 --- /dev/null +++ b/src/GeneratedModels/CheckGCPPubSubRequest.php @@ -0,0 +1,17 @@ +|null */ #[ArrayOf(TriggeredRuleResponse::class)] public ?array $triggeredRules = null, // All moderation rules triggered by this check (content, user, and call rules), with their resolved actions + /** @var array|null */ + #[ArrayOf(IntentScoreResponse::class)] + public ?array $intentScores = null, // Score (0-100) of each policy intent topic against this request's text, in policy order (test mode only; omitted when the policy has no topics or scoring failed) public ?string $duration = null, + public ?string $llmModel = null, // ID of the LLM model that produced the verdict (e.g. gpt-4o-mini). Omitted when no LLM ran synchronously (e.g. Bodyguard-only checks or async moderation) + public ?string $llmReasoningEffort = null, // reasoning_effort sent with the LLM request that produced the verdict. Omitted when the request did not send one ) { } diff --git a/src/GeneratedModels/ClientEvent.php b/src/GeneratedModels/ClientEvent.php index e451ad6..bb9425f 100644 --- a/src/GeneratedModels/ClientEvent.php +++ b/src/GeneratedModels/ClientEvent.php @@ -28,6 +28,7 @@ public function __construct( public ?int $elapsedTime = null, // Milliseconds elapsed between the stage attempt's initiation and this event. public ?string $callSessionID = null, // Call session ID associated with the attempt. Required on every event except CoordinatorJoin initiation and CoordinatorJoin failure (where the call session is not yet established); optional on MediaDevicePermission. public ?string $joinReason = null, // Reason the client initiated the join. Optional on CoordinatorJoin events; empty when not provided. + public ?string $source = null, // Source of the coordinator join. Optional on CoordinatorJoin events; omitted when not provided. public ?string $sfuID = null, // Identifier of the SFU the client was attempting to connect to. Required on WSJoin and PeerConnectionConnect failure, and on FirstAudioFrame and FirstVideoFrame. public ?string $trackID = null, // Identifier of the media track the frame belongs to. Required on FirstVideoFrame; optional on FirstAudioFrame. public ?string $retryFailureReason = null, // Failure reason string. Required on CoordinatorJoin, CoordinatorWS, WSJoin, and PeerConnectionConnect failure. @@ -36,6 +37,8 @@ public function __construct( public ?string $screenShareStatus = null, // Screen-share permission status: INITIATED, FAILED, GRANTED, or NOT_INITIATED. Optional on MediaDevicePermission events. public ?string $microphonePermissionStatus = null, // Microphone permission status: INITIATED, FAILED, GRANTED, or NOT_INITIATED. Required on every MediaDevicePermission event. public ?string $cameraPermissionStatus = null, // Camera permission status: INITIATED, FAILED, GRANTED, or NOT_INITIATED. Required on every MediaDevicePermission event. + public ?string $leaveInitiator = null, // Source of the leave that aborted a join: user, app, callkit, remote_event, sdk_error, or unknown. Not validated against this set, so SDKs may report new values. Optional; sent on failure events. Maximum 32 characters. + public ?string $leaveReason = null, // Internal reason or triggering event for the leave that aborted a join. Optional; sent on failure events. Maximum 200 characters. ) { } diff --git a/src/GeneratedModels/CommentFeedbackEvent.php b/src/GeneratedModels/CommentFeedbackEvent.php new file mode 100644 index 0000000..89d7a35 --- /dev/null +++ b/src/GeneratedModels/CommentFeedbackEvent.php @@ -0,0 +1,23 @@ +|null */ #[ArrayOf(UserResponse::class)] public ?array $mentionedUsers = null, // Users mentioned in the comment + public ?bool $hidden = null, // Only true in QueryComments results filtered with hidden: true public ?string $status = null, // Status of the comment. One of: active, deleted, removed, hidden public ?\DateTime $createdAt = null, // When the comment was created public ?\DateTime $updatedAt = null, // When the comment was last updated diff --git a/src/GeneratedModels/ConfigOverridesRequest.php b/src/GeneratedModels/ConfigOverridesRequest.php index 14dcd8c..d56d9c6 100644 --- a/src/GeneratedModels/ConfigOverridesRequest.php +++ b/src/GeneratedModels/ConfigOverridesRequest.php @@ -23,7 +23,7 @@ public function __construct( public ?bool $userMessageReminders = null, // Enable/disable user message reminders public ?bool $sharedLocations = null, // Enable/disable shared locations public ?bool $countMessages = null, // Enable/disable message counting - public ?string $pushLevel = null, + public ?string $pushLevel = null, // Overrides the push notification level for this channel public ?ChatPreferences $chatPreferences = null, ) { } diff --git a/src/GeneratedModels/ConfigResponse.php b/src/GeneratedModels/ConfigResponse.php index 9d86514..7cba8df 100644 --- a/src/GeneratedModels/ConfigResponse.php +++ b/src/GeneratedModels/ConfigResponse.php @@ -20,6 +20,7 @@ public function __construct( public ?AIAudioConfigResponse $aiAudioConfig = null, public ?VelocityFilterConfig $velocityFilterConfig = null, public ?FloodConfig $floodConfig = null, + public ?IntentConfigResponse $intentConfig = null, public ?\DateTime $createdAt = null, // When the configuration was created public ?\DateTime $updatedAt = null, // When the configuration was last updated public ?VideoCallRuleConfig $videoCallRuleConfig = null, diff --git a/src/GeneratedModels/ContentCountryCodeParameters.php b/src/GeneratedModels/ContentCountryCodeParameters.php new file mode 100644 index 0000000..d007d18 --- /dev/null +++ b/src/GeneratedModels/ContentCountryCodeParameters.php @@ -0,0 +1,16 @@ +|null */ #[ArrayOf(PollOptionInput::class)] public ?array $options = null, - public ?string $votingVisibility = null, + public ?string $votingVisibility = null, // Represents the visibility of votes in a poll. public ?bool $enforceUniqueVote = null, // Indicates whether users can cast multiple votes public ?int $maxVotesAllowed = null, // Indicates the maximum amount of votes a user can cast public ?bool $allowUserSuggestedOptions = null, public ?bool $allowAnswers = null, // Indicates whether users can suggest user defined answers public ?bool $isClosed = null, // Indicates whether the poll is open for voting + public ?string $team = null, public ?object $custom = null, // Custom data for this object + public ?string $configKey = null, // Key of the moderation configuration to use. Server-side only. + public ?string $configTeam = null, // Team associated with the configuration. Server-side only. public ?string $userID = null, public ?UserRequest $user = null, // User request object ) { diff --git a/src/GeneratedModels/CreateReminderRequest.php b/src/GeneratedModels/CreateReminderRequest.php index 2788cb9..27b2262 100644 --- a/src/GeneratedModels/CreateReminderRequest.php +++ b/src/GeneratedModels/CreateReminderRequest.php @@ -7,6 +7,7 @@ class CreateReminderRequest extends BaseModel { public function __construct( public ?\DateTime $remindAt = null, + public ?\DateTime $expiresAt = null, public ?string $userID = null, public ?UserRequest $user = null, // User request object ) { diff --git a/src/GeneratedModels/DeleteFeedsRetentionPolicyRequest.php b/src/GeneratedModels/DeleteFeedsRetentionPolicyRequest.php new file mode 100644 index 0000000..c01cd63 --- /dev/null +++ b/src/GeneratedModels/DeleteFeedsRetentionPolicyRequest.php @@ -0,0 +1,15 @@ +|null */ + #[ArrayOf(InterestTagResponse::class)] + public ?array $interests = null, // Interest tags still set on the user + public ?string $duration = null, + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/DeliveryReceiptsResponse.php b/src/GeneratedModels/DeliveryReceiptsResponse.php index 25fe622..b63a424 100644 --- a/src/GeneratedModels/DeliveryReceiptsResponse.php +++ b/src/GeneratedModels/DeliveryReceiptsResponse.php @@ -3,6 +3,9 @@ declare(strict_types=1); namespace GetStream\GeneratedModels; +/** + * The settings for the delivery receipt events. + */ class DeliveryReceiptsResponse extends BaseModel { public function __construct( diff --git a/src/GeneratedModels/DeviceResponse.php b/src/GeneratedModels/DeviceResponse.php index 1493dc2..e868d8d 100644 --- a/src/GeneratedModels/DeviceResponse.php +++ b/src/GeneratedModels/DeviceResponse.php @@ -4,15 +4,15 @@ namespace GetStream\GeneratedModels; /** - * Response for Device + * An object representing a device which can receive push notifications. */ class DeviceResponse extends BaseModel { public function __construct( public ?string $pushProvider = null, // Push provider public ?string $pushProviderName = null, // Push provider name - public ?string $id = null, // Device ID - public ?\DateTime $createdAt = null, // Date/time of creation + public ?string $id = null, // The device identifier. + public ?\DateTime $createdAt = null, // The date when the device was created. public ?bool $disabled = null, // Whether device is disabled or not public ?string $disabledReason = null, // Reason explaining why device had been disabled public ?bool $voip = null, // When true the token is for Apple VoIP push notifications diff --git a/src/GeneratedModels/EnrichmentOptions.php b/src/GeneratedModels/EnrichmentOptions.php index 43c1ac8..ce2877e 100644 --- a/src/GeneratedModels/EnrichmentOptions.php +++ b/src/GeneratedModels/EnrichmentOptions.php @@ -28,6 +28,7 @@ public function __construct( public ?bool $skipOwnCapabilities = null, // Default: false. When true, skips computing and including capabilities for feeds. public ?bool $skipAll = null, // Default: false. When true, skips all enrichments. public ?bool $includeScoreVars = null, // Default: false. When true, includes score_vars in activity responses containing variable values used at ranking time. + public ?bool $includeRankingConfig = null, // Default: false. Server-side only. When true, the response includes ranking_config: the ranking configuration (from the feed view, or the feed group as fallback) used to rank this read. public ?bool $includeFlatActivities = null, // Controls the top-level flat 'activities' array for aggregated feeds. For new apps, defaults to false (excluded); set to true to include. For older apps, defaults to true (included) for backward compatibility; set to false to exclude. ) { } diff --git a/src/GeneratedModels/EntityCreatorResponse.php b/src/GeneratedModels/EntityCreatorResponse.php index af6e59d..8096be4 100644 --- a/src/GeneratedModels/EntityCreatorResponse.php +++ b/src/GeneratedModels/EntityCreatorResponse.php @@ -28,7 +28,7 @@ public function __construct( public ?bool $bypassModeration = null, public ?\DateTime $banExpires = null, public ?PushNotificationSettingsResponse $pushNotifications = null, - public ?PrivacySettingsResponse $privacySettings = null, + public ?PrivacySettingsResponse $privacySettings = null, // The privacy settings of the user. /** @var array|null */ #[ArrayOf(DeviceResponse::class)] public ?array $devices = null, diff --git a/src/GeneratedModels/EventHook.php b/src/GeneratedModels/EventHook.php index bd72aa8..877c3cd 100644 --- a/src/GeneratedModels/EventHook.php +++ b/src/GeneratedModels/EventHook.php @@ -23,11 +23,16 @@ public function __construct( public ?string $snsKey = null, public ?string $snsSecret = null, public ?string $snsRoleArn = null, + public ?string $gcpPubsubTopic = null, + public ?string $gcpPubsubAuthType = null, + public ?string $gcpPubsubRegion = null, public ?string $product = null, public ?bool $shouldSendCustomEvents = null, public ?int $timeoutMs = null, public ?AsyncModerationCallbackConfig $callback = null, public ?bool $snsEventBasedMessageGroupIDEnabled = null, + public ?bool $sqsEventBasedMessageGroupIDEnabled = null, + public ?bool $gcpPubsubEventBasedOrderingKeyEnabled = null, public ?WebhookFailoverConfig $failoverConfig = null, public ?\DateTime $createdAt = null, public ?\DateTime $updatedAt = null, diff --git a/src/GeneratedModels/FeedsNotificationComment.php b/src/GeneratedModels/FeedsNotificationComment.php index 6a1c283..aa5728c 100644 --- a/src/GeneratedModels/FeedsNotificationComment.php +++ b/src/GeneratedModels/FeedsNotificationComment.php @@ -12,6 +12,7 @@ public function __construct( /** @var array|null */ #[ArrayOf(Attachment::class)] public ?array $attachments = null, + public ?string $parentID = null, ) { } diff --git a/src/GeneratedModels/FeedsPolicyConfig.php b/src/GeneratedModels/FeedsPolicyConfig.php new file mode 100644 index 0000000..39fe122 --- /dev/null +++ b/src/GeneratedModels/FeedsPolicyConfig.php @@ -0,0 +1,16 @@ +|null */ #[ArrayOf(UserResponse::class)] public ?array $mentionedUsers = null, + public ?bool $hidden = null, public ?string $status = null, public ?\DateTime $createdAt = null, public ?\DateTime $updatedAt = null, diff --git a/src/GeneratedModels/FileUploadRequest.php b/src/GeneratedModels/FileUploadRequest.php index 15d11e2..1f28cb1 100644 --- a/src/GeneratedModels/FileUploadRequest.php +++ b/src/GeneratedModels/FileUploadRequest.php @@ -3,7 +3,7 @@ declare(strict_types=1); namespace GetStream\GeneratedModels; -class FileUploadRequest extends BaseModel +class FileUploadRequest extends BaseModel implements MultipartRequest { public function __construct( public ?string $file = null, // file field diff --git a/src/GeneratedModels/FilterConfigResponse.php b/src/GeneratedModels/FilterConfigResponse.php index 879b929..0828125 100644 --- a/src/GeneratedModels/FilterConfigResponse.php +++ b/src/GeneratedModels/FilterConfigResponse.php @@ -10,7 +10,9 @@ public function __construct( public ?array $aiTextLabels = null, // AI text moderation labels available as filter values public ?array $aiImageLabels = null, // AI image moderation labels available as filter values. Reflects the app's effective image taxonomy: custom Bodyguard taxonomy when enabled, otherwise the standard L1 label set. public ?array $aiImageTaxonomy = null, // AI image moderation labels available as filter values, as a map of L1 label to its L2 sub-labels. Reflects the app's effective image taxonomy: custom Bodyguard taxonomy when enabled, otherwise the standard catalogue of the org's enabled image providers. + public ?array $aiImageOcrLabels = null, // Labels the image OCR pipeline can flag, available as filter values on the `label` field under the ai_image category. The app's LLM labels when LLM configurability is enabled, otherwise the AI text labels. OCR and image-classification labels share the `label` field, so a name present in both matches either. public ?array $configKeys = null, // Moderation config keys present in the queue, available as filter values + public ?array $ruleNames = null, // Names of the app's moderation rules, available as filter values on the `label` field when filtering rule-flagged content. Includes disabled rules, since items flagged before a rule was turned off still carry its name; excludes deleted ones. Scoped to the caller's teams on a multi-tenant app. Capped at 30 names, ordered by name, so an app above that cap is listed partially. public ?array $filterableCustomKeys = null, // The moderation_payload.custom keys the app has configured as review-queue filter chips (via moderation_dashboard_preferences.filterable_custom_keys). Discovery hint for the dashboard only — the filter accepts any custom key regardless of this list. ) { } diff --git a/src/GeneratedModels/FloodIdenticalRuleParameters.php b/src/GeneratedModels/FloodIdenticalRuleParameters.php index 284f274..01f42e4 100644 --- a/src/GeneratedModels/FloodIdenticalRuleParameters.php +++ b/src/GeneratedModels/FloodIdenticalRuleParameters.php @@ -9,6 +9,8 @@ public function __construct( public ?int $threshold = null, public ?string $timeWindow = null, public ?array $allowlist = null, + public ?bool $trackAcrossUsers = null, + public ?int $minTextLength = null, ) { } diff --git a/src/GeneratedModels/FloodSimilarRuleParameters.php b/src/GeneratedModels/FloodSimilarRuleParameters.php index c34e9cf..596b937 100644 --- a/src/GeneratedModels/FloodSimilarRuleParameters.php +++ b/src/GeneratedModels/FloodSimilarRuleParameters.php @@ -10,6 +10,7 @@ public function __construct( public ?string $timeWindow = null, public ?int $similarityDistance = null, public ?array $allowlist = null, + public ?int $minTextLength = null, ) { } diff --git a/src/GeneratedModels/FollowBatchRequest.php b/src/GeneratedModels/FollowBatchRequest.php index 3926348..254d8dd 100644 --- a/src/GeneratedModels/FollowBatchRequest.php +++ b/src/GeneratedModels/FollowBatchRequest.php @@ -11,6 +11,7 @@ public function __construct( public ?array $follows = null, // List of follow relationships to create public ?bool $enrichOwnFields = null, // If true, enriches the follow's source_feed and target_feed with own_* fields (own_follows, own_followings, own_capabilities, own_membership). Defaults to false for performance. public ?bool $createUsers = null, // If true, auto-creates users referenced by source/target FIDs in the batch when they don't already exist. Server-side only. Defaults to false. This top-level field is the only supported batch/upsert create_users control. + public ?bool $async = null, // If true, the batch is queued as a background task, paced per app, and the response has empty follows and a task_id. Server-side only. Supported by the get-or-create endpoint (GetOrCreateFollows); FollowBatch rejects it. Async batches can apply out of order with other follow writes. Defaults to false. ) { } diff --git a/src/GeneratedModels/FollowBatchResponse.php b/src/GeneratedModels/FollowBatchResponse.php index b76b3b7..8eaba30 100644 --- a/src/GeneratedModels/FollowBatchResponse.php +++ b/src/GeneratedModels/FollowBatchResponse.php @@ -12,6 +12,7 @@ public function __construct( /** @var array|null */ #[ArrayOf(FollowResponse::class)] public ?array $created = null, // List of newly created follow relationships + public ?string $taskID = null, // ID of the background task when the request was sent with async: true public ?string $duration = null, ) { } diff --git a/src/GeneratedModels/FullUserResponse.php b/src/GeneratedModels/FullUserResponse.php index e9b40be..63fed89 100644 --- a/src/GeneratedModels/FullUserResponse.php +++ b/src/GeneratedModels/FullUserResponse.php @@ -23,7 +23,7 @@ public function __construct( public ?\DateTime $revokeTokensIssuedBefore = null, public ?\DateTime $deactivatedAt = null, public ?int $avgResponseTime = null, - public ?PrivacySettingsResponse $privacySettings = null, + public ?PrivacySettingsResponse $privacySettings = null, // The privacy settings of the user. /** @var array|null */ #[ArrayOf(DeviceResponse::class)] public ?array $devices = null, @@ -34,7 +34,8 @@ public function __construct( /** @var array|null */ #[ArrayOf(ChannelMute::class)] public ?array $channelMutes = null, - public ?int $unreadCount = null, + /** @deprecated */ + public ?int $unreadCount = null, // Deprecated: Use total_unread_count instead. public ?int $totalUnreadCount = null, public ?int $unreadChannels = null, public ?int $unreadThreads = null, diff --git a/src/GeneratedModels/GetApplicationResponse.php b/src/GeneratedModels/GetApplicationResponse.php index 4f5a3c8..371694e 100644 --- a/src/GeneratedModels/GetApplicationResponse.php +++ b/src/GeneratedModels/GetApplicationResponse.php @@ -9,7 +9,7 @@ class GetApplicationResponse extends BaseModel { public function __construct( - public ?AppResponseFields $app = null, + public ?AppResponseFields $app = null, // A type representing the app settings. public ?string $duration = null, // Duration of the request in milliseconds ) { } diff --git a/src/GeneratedModels/GetChannelTypeResponse.php b/src/GeneratedModels/GetChannelTypeResponse.php index b40b263..2f95a57 100644 --- a/src/GeneratedModels/GetChannelTypeResponse.php +++ b/src/GeneratedModels/GetChannelTypeResponse.php @@ -49,7 +49,7 @@ public function __construct( public ?int $partitionSize = null, public ?string $partitionTtl = null, public ?bool $skipLastMsgUpdateForSystemMsgs = null, - public ?string $pushLevel = null, + public ?string $pushLevel = null, // Sets the push notification level for a channel type public ?ChatPreferences $chatPreferences = null, /** @var array|null */ #[ArrayOf(Command::class)] diff --git a/src/GeneratedModels/GetCommentsResponse.php b/src/GeneratedModels/GetCommentsResponse.php index 182b0fd..330f062 100644 --- a/src/GeneratedModels/GetCommentsResponse.php +++ b/src/GeneratedModels/GetCommentsResponse.php @@ -10,6 +10,8 @@ public function __construct( #[ArrayOf(ThreadedCommentResponse::class)] public ?array $comments = null, // Threaded listing for the activity public ?string $sort = null, // Sort order used for the comments (first, last, top, best, controversial) + public ?int $commentCount = null, // Total number of comments on the object, including replies at every depth + public ?int $topLevelCommentCount = null, // Number of comments directly on the object, excluding replies. Independent of depth, replies_limit and id_around, and not adjusted per viewer. Only present when include_top_level_comment_count is set public ?string $next = null, public ?string $prev = null, public ?string $duration = null, diff --git a/src/GeneratedModels/GetFeedsRetentionPolicyResponse.php b/src/GeneratedModels/GetFeedsRetentionPolicyResponse.php new file mode 100644 index 0000000..b4fb549 --- /dev/null +++ b/src/GeneratedModels/GetFeedsRetentionPolicyResponse.php @@ -0,0 +1,22 @@ +|null */ + #[ArrayOf(FeedsRetentionPolicy::class)] + public ?array $policies = null, + public ?bool $enabled = null, + public ?string $duration = null, // Duration of the request in milliseconds + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/GetFeedsRetentionPolicyRunsRequest.php b/src/GeneratedModels/GetFeedsRetentionPolicyRunsRequest.php new file mode 100644 index 0000000..3f563d3 --- /dev/null +++ b/src/GeneratedModels/GetFeedsRetentionPolicyRunsRequest.php @@ -0,0 +1,21 @@ +|null */ + #[ArrayOf(SortParamRequest::class)] + public ?array $sort = null, // Array of sort parameters + public ?int $limit = null, + public ?string $next = null, + public ?string $prev = null, + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/GetFeedsRetentionPolicyRunsResponse.php b/src/GeneratedModels/GetFeedsRetentionPolicyRunsResponse.php new file mode 100644 index 0000000..7d1e805 --- /dev/null +++ b/src/GeneratedModels/GetFeedsRetentionPolicyRunsResponse.php @@ -0,0 +1,23 @@ +|null */ + #[ArrayOf(FeedsRetentionRunResponse::class)] + public ?array $runs = null, + public ?string $next = null, + public ?string $prev = null, + public ?string $duration = null, // Duration of the request in milliseconds + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/GetOrCreateChannelDefaults.php b/src/GeneratedModels/GetOrCreateChannelDefaults.php new file mode 100644 index 0000000..0b9c42e --- /dev/null +++ b/src/GeneratedModels/GetOrCreateChannelDefaults.php @@ -0,0 +1,19 @@ +|null */ #[ArrayOf(InterestTagResponse::class)] - public ?array $interests = null, // Top-N interest tags sorted by descending count, then alphabetically by tag + public ?array $interests = null, // Interest tags sorted by descending weight, then manually set tags before computed ones, then descending count, then alphabetically by tag public ?string $duration = null, ) { } diff --git a/src/GeneratedModels/GroupedChannelsBucket.php b/src/GeneratedModels/GroupedChannelsBucket.php index fb21d8d..47d4410 100644 --- a/src/GeneratedModels/GroupedChannelsBucket.php +++ b/src/GeneratedModels/GroupedChannelsBucket.php @@ -9,7 +9,7 @@ public function __construct( /** @var array|null */ #[ArrayOf(ChannelStateResponseFields::class)] public ?array $channels = null, // Channels returned for this bucket - public ?int $unreadChannels = null, // Unread channels currently classified into this bucket + public ?int $unreadChannels = null, // Total unread channels matching this bucket and its filters, independent of page size public ?string $next = null, // Cursor for the next page of this group public ?string $prev = null, // Cursor for the previous page of this group ) { diff --git a/src/GeneratedModels/GroupedChannelsGroupRequest.php b/src/GeneratedModels/GroupedChannelsGroupRequest.php index 3bf369d..7155dc1 100644 --- a/src/GeneratedModels/GroupedChannelsGroupRequest.php +++ b/src/GeneratedModels/GroupedChannelsGroupRequest.php @@ -6,9 +6,10 @@ class GroupedChannelsGroupRequest extends BaseModel { public function __construct( - public ?int $limit = null, - public ?string $next = null, - public ?string $prev = null, + public ?int $limit = null, // Max channels for this group; omitted or zero uses the request limit + public ?string $next = null, // Cursor for the next page; only allowed when requesting one group + public ?string $prev = null, // Cursor for the previous page; only allowed when requesting one group + public ?object $filterConditions = null, // Optional query_timestamp $gte bound for a stored group, requiring query_timestamp sort; do not repeat its group name. For all, combine group equality/$in and date bounds with $or, or use one standalone group $ne exclusion. An empty object matches a stored group; omitted or null preserves legacy grouping. ) { } diff --git a/src/GeneratedModels/GroupedQueryChannelsRequest.php b/src/GeneratedModels/GroupedQueryChannelsRequest.php index 0dac47a..b357f18 100644 --- a/src/GeneratedModels/GroupedQueryChannelsRequest.php +++ b/src/GeneratedModels/GroupedQueryChannelsRequest.php @@ -9,9 +9,12 @@ public function __construct( public ?int $limit = null, // Default max channels per group (default 10) /** @var array|null */ #[MapOf(GroupedChannelsGroupRequest::class)] - public ?array $groups = null, // Groups to return, keyed by group name. Each group can define limit, next, or prev. 'next' and 'prev' cursors are only allowed when the request contains exactly one group; multi-group pagination is rejected. + public ?array $groups = null, // Groups to return, keyed by stored group name. Each entry can define limit, next, prev, and optional filter_conditions: date bounds for stored groups; all supports combined group/date branches or one group $ne exclusion. Cursors are only allowed when requesting exactly one group. Omitted or null filters preserve legacy grouping, including all. public ?string $userID = null, public ?UserRequest $user = null, // User request object + /** @var array|null */ + #[ArrayOf(SortParamRequest::class)] + public ?array $sort = null, // Optional query_timestamp descending with NULLS LAST when enabled. Omitted sort preserves existing last_updated ordering and cursor formats ) { } diff --git a/src/GeneratedModels/GroupedQueryChannelsResponse.php b/src/GeneratedModels/GroupedQueryChannelsResponse.php index 709f763..b23df21 100644 --- a/src/GeneratedModels/GroupedQueryChannelsResponse.php +++ b/src/GeneratedModels/GroupedQueryChannelsResponse.php @@ -8,7 +8,7 @@ class GroupedQueryChannelsResponse extends BaseModel public function __construct( /** @var array|null */ #[MapOf(GroupedChannelsBucket::class)] - public ?array $groups = null, // Predefined channel groups keyed by group name + public ?array $groups = null, // Groups keyed by the requested stored group name public ?string $duration = null, // Duration of the request in milliseconds ) { } diff --git a/src/GeneratedModels/ImageUploadRequest.php b/src/GeneratedModels/ImageUploadRequest.php index 1b116c0..308a377 100644 --- a/src/GeneratedModels/ImageUploadRequest.php +++ b/src/GeneratedModels/ImageUploadRequest.php @@ -3,7 +3,7 @@ declare(strict_types=1); namespace GetStream\GeneratedModels; -class ImageUploadRequest extends BaseModel +class ImageUploadRequest extends BaseModel implements MultipartRequest { public function __construct( public ?string $file = null, diff --git a/src/GeneratedModels/IntentConditionInfo.php b/src/GeneratedModels/IntentConditionInfo.php new file mode 100644 index 0000000..810b735 --- /dev/null +++ b/src/GeneratedModels/IntentConditionInfo.php @@ -0,0 +1,18 @@ +|null */ + #[ArrayOf(IntentTopicRequest::class)] + public ?array $topics = null, // Topics to classify conversation text against (max 20, labels must be unique) + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/IntentConfigResponse.php b/src/GeneratedModels/IntentConfigResponse.php new file mode 100644 index 0000000..e2e6d91 --- /dev/null +++ b/src/GeneratedModels/IntentConfigResponse.php @@ -0,0 +1,17 @@ +|null */ + #[ArrayOf(IntentTopicResponse::class)] + public ?array $topics = null, // Topics conversation text is classified against + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/IntentEvaluationInfo.php b/src/GeneratedModels/IntentEvaluationInfo.php new file mode 100644 index 0000000..f88092d --- /dev/null +++ b/src/GeneratedModels/IntentEvaluationInfo.php @@ -0,0 +1,21 @@ +|null */ + #[ArrayOf(IntentConditionInfo::class)] + public ?array $conditions = null, // One entry per `intent_rule` condition of the rule, flat conditions first, then group conditions. + public ?string $conversationID = null, // The analyzed conversation: the channel CID for chat, the object ID for feeds. + public ?int $messageCount = null, // Number of conversation messages sent to the model. + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/IntentRuleParameters.php b/src/GeneratedModels/IntentRuleParameters.php new file mode 100644 index 0000000..76ae5e2 --- /dev/null +++ b/src/GeneratedModels/IntentRuleParameters.php @@ -0,0 +1,19 @@ +|null */ #[ArrayOf(MatchedContent::class)] public ?array $matchedContents = null, // Ordered list of contents whose verdicts contributed to an aggregation rule's threshold. Populated only for aggregation rules when callers supplied `content_ids`. + public ?IntentEvaluationInfo $intent = null, ) { } diff --git a/src/GeneratedModels/MultipartRequest.php b/src/GeneratedModels/MultipartRequest.php new file mode 100644 index 0000000..328122d --- /dev/null +++ b/src/GeneratedModels/MultipartRequest.php @@ -0,0 +1,17 @@ +|null */ #[ArrayOf(Attachment::class)] - public ?array $attachments = null, + public ?array $attachments = null, // Attachments on the comment + public ?string $parentID = null, // The ID of the parent comment when this comment is a reply; omitted for top-level comments ) { } diff --git a/src/GeneratedModels/OwnUserResponse.php b/src/GeneratedModels/OwnUserResponse.php index 6a9f69b..4cd2706 100644 --- a/src/GeneratedModels/OwnUserResponse.php +++ b/src/GeneratedModels/OwnUserResponse.php @@ -23,8 +23,8 @@ public function __construct( public ?\DateTime $revokeTokensIssuedBefore = null, public ?\DateTime $deactivatedAt = null, public ?int $avgResponseTime = null, - public ?PushPreferencesResponse $pushPreferences = null, - public ?PrivacySettingsResponse $privacySettings = null, + public ?PushPreferencesResponse $pushPreferences = null, // The push preference details. + public ?PrivacySettingsResponse $privacySettings = null, // The privacy settings of the user. /** @var array|null */ #[ArrayOf(DeviceResponse::class)] public ?array $devices = null, @@ -35,7 +35,8 @@ public function __construct( /** @var array|null */ #[ArrayOf(ChannelMute::class)] public ?array $channelMutes = null, - public ?int $unreadCount = null, + /** @deprecated */ + public ?int $unreadCount = null, // Deprecated: Use total_unread_count instead. public ?int $totalUnreadCount = null, public ?array $totalUnreadCountByTeam = null, public ?int $unreadChannels = null, diff --git a/src/GeneratedModels/PagerDefaults.php b/src/GeneratedModels/PagerDefaults.php new file mode 100644 index 0000000..340da7a --- /dev/null +++ b/src/GeneratedModels/PagerDefaults.php @@ -0,0 +1,18 @@ +|null */ + #[ArrayOf(RingAttemptResponse::class)] + public ?array $ringAttempts = null, // The attempts, newest first + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/QueryChannelBansRequest.php b/src/GeneratedModels/QueryChannelBansRequest.php new file mode 100644 index 0000000..6572e5a --- /dev/null +++ b/src/GeneratedModels/QueryChannelBansRequest.php @@ -0,0 +1,22 @@ +|null */ + #[ArrayOf(ChannelBanResponse::class)] + public ?array $bans = null, // Users banned from the channel, one entry per user, newest ban first + public ?int $total = null, // Number of banned users, each counted once, ignoring paging. Counted per scope with a cap of 100000 each, so it can reach 200000. Only present when include_total is set on the request; omitted when counting timed out + public ?ChannelBansScopeTotals $totalByScope = null, + public ?string $next = null, + public ?string $prev = null, + public ?string $duration = null, // Duration of the request in milliseconds + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/QueryChannelsDefaults.php b/src/GeneratedModels/QueryChannelsDefaults.php new file mode 100644 index 0000000..13cbc47 --- /dev/null +++ b/src/GeneratedModels/QueryChannelsDefaults.php @@ -0,0 +1,21 @@ +|null */ #[ArrayOf(SortParamRequest::class)] public ?array $sort = null, // Sorting parameters for the query + public ?bool $includeGroupCounts = null, // When true (server-side only), the response includes group_counts: accepted following counts keyed by the followed feed's group. Requires exactly one source_feed / source_fid string equality. HTTP 400 if target_feed appears, if two source FIDs are given, or if $in / $or / $nor mentions those keys. Independent of paging and of other filters, including status. public ?int $limit = null, public ?string $next = null, public ?string $prev = null, diff --git a/src/GeneratedModels/QueryFollowsResponse.php b/src/GeneratedModels/QueryFollowsResponse.php index 00cb58f..f7b0aee 100644 --- a/src/GeneratedModels/QueryFollowsResponse.php +++ b/src/GeneratedModels/QueryFollowsResponse.php @@ -9,6 +9,7 @@ public function __construct( /** @var array|null */ #[ArrayOf(FollowResponse::class)] public ?array $follows = null, // List of follow relationships matching the query + public ?array $groupCounts = null, // Accepted following counts keyed by followed feed group. Present only when include_group_counts is set with a source_feed equality. public ?string $next = null, // Cursor for next page public ?string $prev = null, // Cursor for previous page public ?string $duration = null, diff --git a/src/GeneratedModels/QueryPinnedActivitiesRequest.php b/src/GeneratedModels/QueryPinnedActivitiesRequest.php index 09cc26e..bd7d9d9 100644 --- a/src/GeneratedModels/QueryPinnedActivitiesRequest.php +++ b/src/GeneratedModels/QueryPinnedActivitiesRequest.php @@ -11,9 +11,14 @@ public function __construct( #[ArrayOf(SortParamRequest::class)] public ?array $sort = null, // Sorting parameters for the query public ?bool $enrichOwnFields = null, + public ?bool $includeSoftDeletedActivities = null, // When true, return pinned activities even if they are soft-deleted. Server-side only; not allowed when a user is set. + public ?bool $includeModeratedActivities = null, // When true, return pinned activities even if moderation hides them (shadowed or removed). Server-side only; not allowed when a user is set. + public ?bool $includeExpiredActivities = null, // When true, return pinned activities even if they have expired. Server-side only; not allowed when a user is set. public ?int $limit = null, public ?string $next = null, public ?string $prev = null, + public ?string $userID = null, + public ?UserRequest $user = null, // User request object ) { } diff --git a/src/GeneratedModels/QueryReviewQueueRequest.php b/src/GeneratedModels/QueryReviewQueueRequest.php index 323ff8d..d92e55b 100644 --- a/src/GeneratedModels/QueryReviewQueueRequest.php +++ b/src/GeneratedModels/QueryReviewQueueRequest.php @@ -6,7 +6,7 @@ class QueryReviewQueueRequest extends BaseModel { public function __construct( - public ?object $filter = null, // Filter conditions for review queue items. Accepts built-in fields (e.g. status, channel_cid, severity, recommended_action) and customer-supplied moderation_payload.custom keys: any key that is not a built-in field is matched against the item's custom moderation data (e.g. {"location_id": "loc-42"}). Use filter_config.filterable_custom_keys to discover which custom keys the app exposes as chips. + public ?object $filter = null, // Filter conditions for review queue items. Accepts built-in fields (e.g. status, channel_cid, severity, recommended_action) and customer-supplied moderation_payload.custom keys: any key that is not a built-in field is matched against the item's custom moderation data (e.g. {"location_id": "loc-42"}). Use filter_config.filterable_custom_keys to discover which custom keys the app exposes as chips. content_text searches the moderated text: "$q" is a keyword search (terms ANDed, no adjacency) over the indexed tsvector, while "$eq" (or "$in" for several wordings) matches the text exactly. The exact form is unindexed, so scope it with date_range rather than running it across the whole queue. /** @var array|null */ #[ArrayOf(SortParamRequest::class)] public ?array $sort = null, // Sorting parameters for the results diff --git a/src/GeneratedModels/QueryScheduledMessagesRequest.php b/src/GeneratedModels/QueryScheduledMessagesRequest.php new file mode 100644 index 0000000..0e40d31 --- /dev/null +++ b/src/GeneratedModels/QueryScheduledMessagesRequest.php @@ -0,0 +1,22 @@ +|null */ + #[ArrayOf(SortParamRequest::class)] + public ?array $sort = null, // Only scheduled_at ascending is supported. Pending messages come before failed ones + public ?int $limit = null, // Page size, 1 to 100. Defaults to 20 + public ?string $next = null, // Cursor from the previous page + public ?string $userID = null, + public ?UserRequest $user = null, // User request object + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/QueryScheduledMessagesResponse.php b/src/GeneratedModels/QueryScheduledMessagesResponse.php new file mode 100644 index 0000000..7ab77d7 --- /dev/null +++ b/src/GeneratedModels/QueryScheduledMessagesResponse.php @@ -0,0 +1,19 @@ +|null */ + #[ArrayOf(ScheduledMessageResponse::class)] + public ?array $scheduledMessages = null, // Pending messages first, then failed ones, each by scheduled_at + public ?string $next = null, // Cursor for the next page; empty on the last page + public ?string $duration = null, // Duration of the request in milliseconds + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/RankingConfig.php b/src/GeneratedModels/RankingConfig.php index 5ab8a6f..7998388 100644 --- a/src/GeneratedModels/RankingConfig.php +++ b/src/GeneratedModels/RankingConfig.php @@ -12,6 +12,7 @@ public function __construct( /** @var array|null */ #[MapOf(DecayFunctionConfig::class)] public ?array $functions = null, // Decay functions configuration + public ?float $excludeBelow = null, // Activities scoring strictly below this value are dropped from the ranked feed. Not supported on aggregated feeds ) { } diff --git a/src/GeneratedModels/ReadReceiptsResponse.php b/src/GeneratedModels/ReadReceiptsResponse.php index 29eb5c2..902a9ba 100644 --- a/src/GeneratedModels/ReadReceiptsResponse.php +++ b/src/GeneratedModels/ReadReceiptsResponse.php @@ -3,6 +3,9 @@ declare(strict_types=1); namespace GetStream\GeneratedModels; +/** + * The settings for the read receipt events. + */ class ReadReceiptsResponse extends BaseModel { public function __construct( diff --git a/src/GeneratedModels/ReminderResponseData.php b/src/GeneratedModels/ReminderResponseData.php index f3a7f38..15e8cfe 100644 --- a/src/GeneratedModels/ReminderResponseData.php +++ b/src/GeneratedModels/ReminderResponseData.php @@ -7,6 +7,7 @@ class ReminderResponseData extends BaseModel { public function __construct( public ?\DateTime $remindAt = null, + public ?\DateTime $expiresAt = null, public ?string $channelCid = null, public ?ChannelResponse $channel = null, // Represents channel in chat public ?string $messageID = null, diff --git a/src/GeneratedModels/ReviewQueueItemResponse.php b/src/GeneratedModels/ReviewQueueItemResponse.php index 4944c3c..15fbc89 100644 --- a/src/GeneratedModels/ReviewQueueItemResponse.php +++ b/src/GeneratedModels/ReviewQueueItemResponse.php @@ -18,6 +18,7 @@ public function __construct( public ?\DateTime $reviewedAt = null, // When the item was reviewed public ?string $reviewedBy = null, // ID of the moderator who reviewed the item public ?array $languages = null, // Detected languages in the content + public ?string $countryCode = null, public ?int $severity = null, // Severity level of the content public ?string $aiTextSeverity = null, // AI-determined text severity public ?string $latestModeratorAction = null, @@ -43,6 +44,7 @@ public function __construct( public ?Reaction $feedsV2Reaction = null, public ?FeedsV3ActivityResponse $feedsV3Activity = null, public ?FeedsV3CommentResponse $feedsV3Comment = null, + public ?PollResponseData $poll = null, public ?array $teams = null, // Teams associated with this item public ?string $configKey = null, public ?int $flagsCount = null, diff --git a/src/GeneratedModels/RingAttemptResponse.php b/src/GeneratedModels/RingAttemptResponse.php new file mode 100644 index 0000000..fb97459 --- /dev/null +++ b/src/GeneratedModels/RingAttemptResponse.php @@ -0,0 +1,34 @@ +|null */ + #[MapOf(RingTargetResponse::class)] + public ?array $targets = null, // The rung users, keyed by user ID + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/RingCallRequest.php b/src/GeneratedModels/RingCallRequest.php index e1ce3e5..1c2d471 100644 --- a/src/GeneratedModels/RingCallRequest.php +++ b/src/GeneratedModels/RingCallRequest.php @@ -8,6 +8,7 @@ class RingCallRequest extends BaseModel public function __construct( public ?array $membersIds = null, // Members that should receive the ring. If no ids are provided, all call members who are not already in the call will receive ring notifications. public ?bool $video = null, // Indicate if call should be video + public ?object $custom = null, // Opaque context stored on the ring attempt; refs and IDs only ) { } diff --git a/src/GeneratedModels/RingCallResponse.php b/src/GeneratedModels/RingCallResponse.php index 746f06d..55dd03a 100644 --- a/src/GeneratedModels/RingCallResponse.php +++ b/src/GeneratedModels/RingCallResponse.php @@ -8,6 +8,7 @@ class RingCallResponse extends BaseModel public function __construct( public ?string $duration = null, public ?array $membersIds = null, // List of members ringing notification was sent to + public ?string $ringID = null, // The ring this call created, for correlating the accept, reject and missed outcomes that follow ) { } diff --git a/src/GeneratedModels/RingDeliveryResponse.php b/src/GeneratedModels/RingDeliveryResponse.php new file mode 100644 index 0000000..9872f0d --- /dev/null +++ b/src/GeneratedModels/RingDeliveryResponse.php @@ -0,0 +1,24 @@ +|null */ + #[ArrayOf(RingDeliveryResponse::class)] + public ?array $deliveries = null, // The dispatches of this ring to the target's devices + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/RuleBuilderCondition.php b/src/GeneratedModels/RuleBuilderCondition.php index c493f35..7471ac9 100644 --- a/src/GeneratedModels/RuleBuilderCondition.php +++ b/src/GeneratedModels/RuleBuilderCondition.php @@ -21,6 +21,7 @@ public function __construct( public ?FloodSimilarRuleParameters $floodSimilarParams = null, public ?ContentCustomPropertyCountParameters $contentCustomPropertyCountParams = null, public ?ContentCustomPropertyParameters $contentCustomPropertyParams = null, + public ?ContentCountryCodeParameters $contentCountryCodeParams = null, public ?IPContentCountRuleParameters $ipContentCountRuleParams = null, public ?IPFlagCountRuleParameters $ipFlagCountRuleParams = null, public ?TextContentParameters $textContentParams = null, @@ -37,6 +38,10 @@ public function __construct( public ?CallCustomPropertyParameters $callCustomPropertyParams = null, public ?CallViolationCountParameters $callViolationCountParams = null, public ?UserReactionCountRuleParameters $userReactionCountParams = null, + public ?UserIdenticalImageCountParameters $userIdenticalImageCountParams = null, + public ?UserChannelCountRuleParameters $userChannelCountParams = null, + public ?UserChannelBanCountRuleParameters $userChannelBanCountParams = null, + public ?IntentRuleParameters $intentRuleParams = null, // intent_rule params: policy intent topic label and the minimum final score (1-100) that fires the condition ) { } diff --git a/src/GeneratedModels/ScheduledMessageChannelResponse.php b/src/GeneratedModels/ScheduledMessageChannelResponse.php new file mode 100644 index 0000000..4f1f3a1 --- /dev/null +++ b/src/GeneratedModels/ScheduledMessageChannelResponse.php @@ -0,0 +1,22 @@ +:) + public ?string $type = null, // Channel type + public ?string $id = null, // Channel ID + public ?string $name = null, // Channel name, from its custom data + public ?string $image = null, // Channel image, from its custom data + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/ScheduledMessageContentResponse.php b/src/GeneratedModels/ScheduledMessageContentResponse.php new file mode 100644 index 0000000..4959eb7 --- /dev/null +++ b/src/GeneratedModels/ScheduledMessageContentResponse.php @@ -0,0 +1,39 @@ +|null */ + #[ArrayOf(Attachment::class)] + public ?array $attachments = null, // Array of message attachments + public ?string $parentID = null, // ID of parent message (thread) + public ?bool $showInChannel = null, // Whether thread reply should be shown in the channel as well + public ?string $quotedMessageID = null, + public ?array $mentionedUsers = null, // IDs of the users mentioned in the message + public ?array $mentionedRoles = null, // Roles mentioned in the message + public ?array $mentionedGroupIds = null, // IDs of the user groups mentioned in the message + public ?bool $mentionedChannel = null, // Whether the message mentions the whole channel + public ?bool $mentionedHere = null, // Whether the message mentions the online channel members + public ?array $restrictedVisibility = null, // IDs of the users the message will be visible to + public ?bool $silent = null, // Whether message is silent or not + public ?bool $pinned = null, // Whether the message will be pinned when sent + public ?\DateTime $pinExpires = null, // Date/time the pin expires + public ?string $pollID = null, // Identifier of the poll to include in the message + public ?ScheduledMessageLocation $sharedLocation = null, // The location a scheduled message will share + public ?object $custom = null, + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/ScheduledMessageFailedEvent.php b/src/GeneratedModels/ScheduledMessageFailedEvent.php new file mode 100644 index 0000000..7619bcb --- /dev/null +++ b/src/GeneratedModels/ScheduledMessageFailedEvent.php @@ -0,0 +1,24 @@ +|null */ #[ArrayOf(UserResponse::class)] public ?array $mentionedUsers = null, + public ?bool $hidden = null, public ?string $status = null, // Status of the comment. One of: active, deleted, removed, hidden public ?\DateTime $createdAt = null, public ?\DateTime $updatedAt = null, diff --git a/src/GeneratedModels/TypingIndicatorsResponse.php b/src/GeneratedModels/TypingIndicatorsResponse.php index 8af2c2b..1dd99f0 100644 --- a/src/GeneratedModels/TypingIndicatorsResponse.php +++ b/src/GeneratedModels/TypingIndicatorsResponse.php @@ -3,6 +3,9 @@ declare(strict_types=1); namespace GetStream\GeneratedModels; +/** + * The settings for typing indicator events. + */ class TypingIndicatorsResponse extends BaseModel { public function __construct( diff --git a/src/GeneratedModels/UnbanRequest.php b/src/GeneratedModels/UnbanRequest.php index 4d0e855..1b315d7 100644 --- a/src/GeneratedModels/UnbanRequest.php +++ b/src/GeneratedModels/UnbanRequest.php @@ -8,6 +8,7 @@ class UnbanRequest extends BaseModel public function __construct( /** @deprecated */ public ?string $unbannedByID = null, // ID of the user performing the unban Deprecated: not used by the unban flow + /** @deprecated */ public ?UserRequest $unbannedBy = null, // User request object ) { } diff --git a/src/GeneratedModels/UnblockActionRequestPayload.php b/src/GeneratedModels/UnblockActionRequestPayload.php index d5ec0df..0642b84 100644 --- a/src/GeneratedModels/UnblockActionRequestPayload.php +++ b/src/GeneratedModels/UnblockActionRequestPayload.php @@ -4,7 +4,7 @@ namespace GetStream\GeneratedModels; /** - * Deprecated: use restore instead — it now also reverses a block or shadow block. Configuration for unblock action. + * Deprecated: Use restore instead, which now also reverses a block or shadow block. Configuration for unblock action. */ class UnblockActionRequestPayload extends BaseModel { diff --git a/src/GeneratedModels/UnfollowBatchRequest.php b/src/GeneratedModels/UnfollowBatchRequest.php index c5c6615..f99fd9e 100644 --- a/src/GeneratedModels/UnfollowBatchRequest.php +++ b/src/GeneratedModels/UnfollowBatchRequest.php @@ -11,6 +11,7 @@ public function __construct( public ?array $follows = null, // List of follow relationships to remove, each with optional keep_history public ?bool $deleteNotificationActivity = null, // Whether to delete the corresponding notification activity (default: false) public ?bool $enrichOwnFields = null, // If true, enriches the follow's source_feed and target_feed with own_* fields (own_follows, own_followings, own_capabilities, own_membership). Defaults to false for performance. + public ?bool $async = null, // If true, the batch is queued as a background task, paced per app, and the response has empty follows and a task_id. Server-side only. Supported by the get-or-create endpoint (GetOrCreateUnfollows); UnfollowBatch rejects it. Async batches can apply out of order with other follow writes. Defaults to false. ) { } diff --git a/src/GeneratedModels/UnfollowBatchResponse.php b/src/GeneratedModels/UnfollowBatchResponse.php index f34adb9..d952dcf 100644 --- a/src/GeneratedModels/UnfollowBatchResponse.php +++ b/src/GeneratedModels/UnfollowBatchResponse.php @@ -9,6 +9,7 @@ public function __construct( /** @var array|null */ #[ArrayOf(FollowResponse::class)] public ?array $follows = null, // List of follow relationships that were removed + public ?string $taskID = null, // ID of the background task when the request was sent with async: true public ?string $duration = null, ) { } diff --git a/src/GeneratedModels/UnreadCountsChannel.php b/src/GeneratedModels/UnreadCountsChannel.php index 8861254..30f551f 100644 --- a/src/GeneratedModels/UnreadCountsChannel.php +++ b/src/GeneratedModels/UnreadCountsChannel.php @@ -3,12 +3,15 @@ declare(strict_types=1); namespace GetStream\GeneratedModels; +/** + * The unread information of a channel. + */ class UnreadCountsChannel extends BaseModel { public function __construct( - public ?string $channelID = null, - public ?int $unreadCount = null, - public ?\DateTime $lastRead = null, + public ?string $channelID = null, // The channel CID (type:id). + public ?int $unreadCount = null, // The number of unread messages inside the channel. + public ?\DateTime $lastRead = null, // The date which the current user last read the channel. ) { } diff --git a/src/GeneratedModels/UnreadCountsChannelType.php b/src/GeneratedModels/UnreadCountsChannelType.php index 0effc74..05b81e6 100644 --- a/src/GeneratedModels/UnreadCountsChannelType.php +++ b/src/GeneratedModels/UnreadCountsChannelType.php @@ -3,12 +3,15 @@ declare(strict_types=1); namespace GetStream\GeneratedModels; +/** + * The unread information from channels with a specific type. + */ class UnreadCountsChannelType extends BaseModel { public function __construct( - public ?string $channelType = null, - public ?int $channelCount = null, - public ?int $unreadCount = null, + public ?string $channelType = null, // The channel type. + public ?int $channelCount = null, // The number of unread channels of this channel type. + public ?int $unreadCount = null, // The number of unread messages of all the channels with this type. ) { } diff --git a/src/GeneratedModels/UnreadCountsThread.php b/src/GeneratedModels/UnreadCountsThread.php index 628e290..370950b 100644 --- a/src/GeneratedModels/UnreadCountsThread.php +++ b/src/GeneratedModels/UnreadCountsThread.php @@ -3,13 +3,16 @@ declare(strict_types=1); namespace GetStream\GeneratedModels; +/** + * The unread information of a thread. + */ class UnreadCountsThread extends BaseModel { public function __construct( - public ?int $unreadCount = null, - public ?\DateTime $lastRead = null, - public ?string $lastReadMessageID = null, - public ?string $parentMessageID = null, + public ?int $unreadCount = null, // The number of unread replies inside the thread. + public ?\DateTime $lastRead = null, // The date which the current user last read the thread. + public ?string $lastReadMessageID = null, // The id of the last reply which the current user read in the thread. + public ?string $parentMessageID = null, // The message id of the root of the thread. ) { } diff --git a/src/GeneratedModels/UpdateChannelTypeRequest.php b/src/GeneratedModels/UpdateChannelTypeRequest.php index c19ad14..923e4e0 100644 --- a/src/GeneratedModels/UpdateChannelTypeRequest.php +++ b/src/GeneratedModels/UpdateChannelTypeRequest.php @@ -43,7 +43,7 @@ public function __construct( public ?array $allowedFlagReasons = null, public ?Thresholds $automodThresholds = null, // Sets thresholds for AI moderation public ?bool $skipLastMsgUpdateForSystemMsgs = null, - public ?string $pushLevel = null, + public ?string $pushLevel = null, // Sets the push notification level for a channel type public ?ChatPreferences $chatPreferences = null, public ?array $commands = null, // List of commands that channel supports ) { diff --git a/src/GeneratedModels/UpdateChannelTypeResponse.php b/src/GeneratedModels/UpdateChannelTypeResponse.php index e38b457..dcccaa9 100644 --- a/src/GeneratedModels/UpdateChannelTypeResponse.php +++ b/src/GeneratedModels/UpdateChannelTypeResponse.php @@ -3,6 +3,9 @@ declare(strict_types=1); namespace GetStream\GeneratedModels; +/** + * Basic response information + */ class UpdateChannelTypeResponse extends BaseModel { public function __construct( @@ -44,12 +47,12 @@ public function __construct( public ?int $partitionSize = null, public ?string $partitionTtl = null, public ?bool $skipLastMsgUpdateForSystemMsgs = null, - public ?string $pushLevel = null, + public ?string $pushLevel = null, // Sets the push notification level for a channel type public ?ChatPreferences $chatPreferences = null, public ?\DateTime $createdAt = null, public ?\DateTime $updatedAt = null, public ?array $commands = null, - public ?string $duration = null, + public ?string $duration = null, // Duration of the request in milliseconds ) { } diff --git a/src/GeneratedModels/UpdatePollOptionRequest.php b/src/GeneratedModels/UpdatePollOptionRequest.php index 2840163..e604f09 100644 --- a/src/GeneratedModels/UpdatePollOptionRequest.php +++ b/src/GeneratedModels/UpdatePollOptionRequest.php @@ -9,6 +9,8 @@ public function __construct( public ?string $id = null, // Option ID public ?string $text = null, // Option text public ?object $custom = null, // Custom data for this object + public ?string $configKey = null, // Key of the moderation configuration to use. Server-side only. + public ?string $configTeam = null, // Team associated with the configuration. Server-side only. public ?string $userID = null, public ?UserRequest $user = null, // User request object ) { diff --git a/src/GeneratedModels/UpdatePollPartialRequest.php b/src/GeneratedModels/UpdatePollPartialRequest.php index c5b890f..f186d60 100644 --- a/src/GeneratedModels/UpdatePollPartialRequest.php +++ b/src/GeneratedModels/UpdatePollPartialRequest.php @@ -6,6 +6,8 @@ class UpdatePollPartialRequest extends BaseModel { public function __construct( + public ?string $configKey = null, // Key of the moderation configuration to use. Server-side only. + public ?string $configTeam = null, // Team associated with the configuration. Server-side only. public ?object $set = null, // Sets new field values public ?array $unset = null, // Array of field names to unset public ?string $userID = null, diff --git a/src/GeneratedModels/UpdatePollRequest.php b/src/GeneratedModels/UpdatePollRequest.php index 4ba62cd..594cb33 100644 --- a/src/GeneratedModels/UpdatePollRequest.php +++ b/src/GeneratedModels/UpdatePollRequest.php @@ -19,6 +19,8 @@ public function __construct( public ?bool $allowAnswers = null, // Allow answers public ?bool $isClosed = null, // Is closed public ?object $custom = null, // Custom data for this object + public ?string $configKey = null, // Key of the moderation configuration to use. Server-side only. + public ?string $configTeam = null, // Team associated with the configuration. Server-side only. public ?string $userID = null, public ?UserRequest $user = null, // User request object ) { diff --git a/src/GeneratedModels/UpdateReminderRequest.php b/src/GeneratedModels/UpdateReminderRequest.php index 36ea28f..f05f2ce 100644 --- a/src/GeneratedModels/UpdateReminderRequest.php +++ b/src/GeneratedModels/UpdateReminderRequest.php @@ -7,6 +7,7 @@ class UpdateReminderRequest extends BaseModel { public function __construct( public ?\DateTime $remindAt = null, + public ?\DateTime $expiresAt = null, public ?string $userID = null, public ?UserRequest $user = null, // User request object ) { diff --git a/src/GeneratedModels/UpdateScheduledMessageRequest.php b/src/GeneratedModels/UpdateScheduledMessageRequest.php new file mode 100644 index 0000000..539fec4 --- /dev/null +++ b/src/GeneratedModels/UpdateScheduledMessageRequest.php @@ -0,0 +1,16 @@ +|null */ + #[ArrayOf(UserInterestRequest::class)] + public ?array $interests = null, // Interest tags to add or update (1-50) + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/UpsertUserInterestsResponse.php b/src/GeneratedModels/UpsertUserInterestsResponse.php new file mode 100644 index 0000000..b2085fc --- /dev/null +++ b/src/GeneratedModels/UpsertUserInterestsResponse.php @@ -0,0 +1,21 @@ +|null */ + #[ArrayOf(InterestTagResponse::class)] + public ?array $interests = null, // All interest tags of the user after the write + public ?string $duration = null, + ) { + } + + // BaseModel automatically handles jsonSerialize(), toArray(), and fromJson() using constructor types! + // Use #[JsonKey('user_id')] to override field names if needed. +} diff --git a/src/GeneratedModels/UserChannelBanCountRuleParameters.php b/src/GeneratedModels/UserChannelBanCountRuleParameters.php new file mode 100644 index 0000000..97d5b72 --- /dev/null +++ b/src/GeneratedModels/UserChannelBanCountRuleParameters.php @@ -0,0 +1,17 @@ +|null */ #[ArrayOf(DeviceResponse::class)] public ?array $devices = null, // List of devices user is using diff --git a/src/GeneratedModels/UserResponsePrivacyFields.php b/src/GeneratedModels/UserResponsePrivacyFields.php index 72fbc41..d6bbe25 100644 --- a/src/GeneratedModels/UserResponsePrivacyFields.php +++ b/src/GeneratedModels/UserResponsePrivacyFields.php @@ -24,7 +24,7 @@ public function __construct( public ?\DateTime $deactivatedAt = null, public ?array $blockedUserIds = null, public ?int $avgResponseTime = null, - public ?PrivacySettingsResponse $privacySettings = null, + public ?PrivacySettingsResponse $privacySettings = null, // The privacy settings of the user. public ?bool $invisible = null, ) { } diff --git a/src/GeneratedModels/WSEvent.php b/src/GeneratedModels/WSEvent.php index f25640a..0c9855d 100644 --- a/src/GeneratedModels/WSEvent.php +++ b/src/GeneratedModels/WSEvent.php @@ -31,7 +31,7 @@ public function __construct( public ?string $reason = null, public ?UserResponse $createdBy = null, // User response object public ?bool $automoderation = null, - public ?ModerationResponse $automoderationScores = null, + public ?ModerationResponse $automoderationScores = null, // Response from AI moderation public ?string $parentID = null, public ?string $team = null, public ?object $custom = null, diff --git a/src/GeneratedModels/WrappedUnreadCountsResponse.php b/src/GeneratedModels/WrappedUnreadCountsResponse.php index 5538d03..61aa86a 100644 --- a/src/GeneratedModels/WrappedUnreadCountsResponse.php +++ b/src/GeneratedModels/WrappedUnreadCountsResponse.php @@ -4,23 +4,23 @@ namespace GetStream\GeneratedModels; /** - * Basic response information + * The total unread information from the current user. */ class WrappedUnreadCountsResponse extends BaseModel { public function __construct( - public ?int $totalUnreadCount = null, - public ?int $totalUnreadThreadsCount = null, - public ?array $totalUnreadCountByTeam = null, + public ?int $totalUnreadCount = null, // The total number of unread messages. + public ?int $totalUnreadThreadsCount = null, // The total number of unread threads. + public ?array $totalUnreadCountByTeam = null, // The total number of unread messages grouped by team. /** @var array|null */ #[ArrayOf(UnreadCountsChannel::class)] - public ?array $channels = null, + public ?array $channels = null, // The unread information per channel. /** @var array|null */ #[ArrayOf(UnreadCountsChannelType::class)] - public ?array $channelType = null, + public ?array $channelType = null, // The unread information per channel type. /** @var array|null */ #[ArrayOf(UnreadCountsThread::class)] - public ?array $threads = null, + public ?array $threads = null, // The unread information per thread. public ?string $duration = null, // Duration of the request in milliseconds ) { } diff --git a/tests/Integration/ChatScheduledMessagesIntegrationTest.php b/tests/Integration/ChatScheduledMessagesIntegrationTest.php new file mode 100644 index 0000000..de9b8c6 --- /dev/null +++ b/tests/Integration/ChatScheduledMessagesIntegrationTest.php @@ -0,0 +1,126 @@ +chat = ClientBuilder::fromEnv()->buildChatClient(); + $this->userID = $this->getSharedUserIDs()[0]; + } + + /** + * @test + */ + public function schedulesUpdatesAndSendsAMessageNow(): void + { + [$type, $channelID] = $this->createTestChannelWithMembers($this->userID, [$this->userID]); + $cid = "{$type}:{$channelID}"; + + $scheduled = $this->scheduleMessage($type, $channelID, 'Scheduled from PHP SDK'); + self::assertSame('scheduled', $scheduled->status); + self::assertSame($cid, $scheduled->cid); + self::assertSame('Scheduled from PHP SDK', $scheduled->message->text); + + $queryResp = $this->chat->queryScheduledMessages(new GeneratedModels\QueryScheduledMessagesRequest( + filter: new GeneratedModels\ScheduledMessagesFilter(cid: $cid), + userID: $this->userID, + )); + $this->assertResponseSuccess($queryResp, 'query scheduled messages'); + $found = $queryResp->getData()->scheduledMessages; + self::assertCount(1, $found); + self::assertSame($scheduled->id, $found[0]->id); + + $scheduledAt = new \DateTime('+2 hours'); + $updateResp = $this->chat->updateScheduledMessage($scheduled->id, new GeneratedModels\UpdateScheduledMessageRequest( + message: new GeneratedModels\MessageRequest(text: 'Rescheduled from PHP SDK'), + scheduledAt: $scheduledAt, + )); + $this->assertResponseSuccess($updateResp, 'update scheduled message'); + $updated = $updateResp->getData()->scheduledMessage; + self::assertSame('Rescheduled from PHP SDK', $updated->message->text); + self::assertSame($scheduledAt->getTimestamp(), $updated->scheduledAt->getTimestamp()); + + $sendResp = $this->chat->sendScheduledMessageNow($scheduled->id, new GeneratedModels\SendScheduledMessageNowRequest()); + $this->assertResponseSuccess($sendResp, 'send scheduled message now'); + self::assertSame($scheduled->id, $sendResp->getData()->scheduledMessage->id); + } + + /** + * @test + */ + public function deletesAScheduledMessage(): void + { + [$type, $channelID] = $this->createTestChannelWithMembers($this->userID, [$this->userID]); + + $scheduled = $this->scheduleMessage($type, $channelID, 'Deleted before sending'); + + $deleteResp = $this->chat->deleteScheduledMessage($scheduled->id); + $this->assertResponseSuccess($deleteResp, 'delete scheduled message'); + self::assertSame($scheduled->id, $deleteResp->getData()->scheduledMessage->id); + self::assertSame('canceled', $deleteResp->getData()->scheduledMessage->status); + + $queryResp = $this->chat->queryScheduledMessages(new GeneratedModels\QueryScheduledMessagesRequest( + filter: new GeneratedModels\ScheduledMessagesFilter(cid: "{$type}:{$channelID}"), + userID: $this->userID, + )); + $this->assertResponseSuccess($queryResp, 'query scheduled messages'); + self::assertCount(0, $queryResp->getData()->scheduledMessages); + } + + /** + * Schedules a message an hour ahead, skipping the test when the app or + * backend does not support scheduled messages. + */ + private function scheduleMessage(string $type, string $channelID, string $text): GeneratedModels\ScheduledMessageResponse + { + try { + $resp = $this->sendMessage($type, $channelID, new GeneratedModels\SendMessageRequest( + message: new GeneratedModels\MessageRequest(text: $text, userID: $this->userID), + scheduledAt: new \DateTime('+1 hour'), + )); + } catch (StreamApiException $e) { + if ($e->getApiErrorCode() === self::SCHEDULED_MESSAGES_DISABLED) { + self::markTestSkipped('Scheduled messages are not enabled for this app'); + } + + throw $e; + } + $this->assertResponseSuccess($resp, 'schedule message'); + + $scheduled = $resp->getData()->scheduledMessage; + if ($scheduled === null) { + self::markTestSkipped('Backend ignored scheduled_at and sent the message immediately'); + } + + return $scheduled; + } +} diff --git a/tests/WebhookTest.php b/tests/WebhookTest.php index 3d0ff02..ea641ad 100644 --- a/tests/WebhookTest.php +++ b/tests/WebhookTest.php @@ -125,6 +125,7 @@ public static function webhookEventProvider(): array 'call.recording_stopped' => ['call.recording_stopped', 'CallRecordingStoppedEvent'], 'call.rejected' => ['call.rejected', 'CallRejectedEvent'], 'call.ring' => ['call.ring', 'CallRingEvent'], + 'call.ring_settled' => ['call.ring_settled', 'CallRingSettledEvent'], 'call.rtmp_broadcast_failed' => ['call.rtmp_broadcast_failed', 'CallRtmpBroadcastFailedEvent'], 'call.rtmp_broadcast_started' => ['call.rtmp_broadcast_started', 'CallRtmpBroadcastStartedEvent'], 'call.rtmp_broadcast_stopped' => ['call.rtmp_broadcast_stopped', 'CallRtmpBroadcastStoppedEvent'], @@ -162,6 +163,8 @@ public static function webhookEventProvider(): array 'export.bulk_image_moderation.success' => ['export.bulk_image_moderation.success', 'AsyncBulkImageModerationEvent'], 'export.channels.error' => ['export.channels.error', 'AsyncExportErrorEvent'], 'export.channels.success' => ['export.channels.success', 'AsyncExportChannelsEvent'], + 'export.label_results.error' => ['export.label_results.error', 'AsyncExportErrorEvent'], + 'export.label_results.success' => ['export.label_results.success', 'AsyncExportLabelResultsEvent'], 'export.moderation_logs.error' => ['export.moderation_logs.error', 'AsyncExportErrorEvent'], 'export.moderation_logs.success' => ['export.moderation_logs.success', 'AsyncExportModerationLogsEvent'], 'export.review_queue.error' => ['export.review_queue.error', 'AsyncExportErrorEvent'], @@ -187,6 +190,7 @@ public static function webhookEventProvider(): array 'feeds.bookmark_folder.updated' => ['feeds.bookmark_folder.updated', 'BookmarkFolderUpdatedEvent'], 'feeds.comment.added' => ['feeds.comment.added', 'CommentAddedEvent'], 'feeds.comment.deleted' => ['feeds.comment.deleted', 'CommentDeletedEvent'], + 'feeds.comment.feedback' => ['feeds.comment.feedback', 'CommentFeedbackEvent'], 'feeds.comment.reaction.added' => ['feeds.comment.reaction.added', 'CommentReactionAddedEvent'], 'feeds.comment.reaction.deleted' => ['feeds.comment.reaction.deleted', 'CommentReactionDeletedEvent'], 'feeds.comment.reaction.updated' => ['feeds.comment.reaction.updated', 'CommentReactionUpdatedEvent'], @@ -207,6 +211,8 @@ public static function webhookEventProvider(): array 'feeds.notification_feed.updated' => ['feeds.notification_feed.updated', 'NotificationFeedUpdatedEvent'], 'feeds.stories_feed.updated' => ['feeds.stories_feed.updated', 'StoriesFeedUpdatedEvent'], 'flag.updated' => ['flag.updated', 'FlagUpdatedEvent'], + 'import.error' => ['import.error', 'AsyncImportErrorEvent'], + 'import.success' => ['import.success', 'AsyncImportSuccessEvent'], 'ingress.error' => ['ingress.error', 'IngressErrorEvent'], 'ingress.started' => ['ingress.started', 'IngressStartedEvent'], 'ingress.stopped' => ['ingress.stopped', 'IngressStoppedEvent'], @@ -232,6 +238,12 @@ public static function webhookEventProvider(): array 'notification.mark_unread' => ['notification.mark_unread', 'NotificationMarkUnreadEvent'], 'notification.reminder_due' => ['notification.reminder_due', 'ReminderNotificationEvent'], 'notification.thread_message_new' => ['notification.thread_message_new', 'NotificationThreadMessageNewEvent'], + 'poll.closed' => ['poll.closed', 'PollClosedEvent'], + 'poll.deleted' => ['poll.deleted', 'PollDeletedEvent'], + 'poll.updated' => ['poll.updated', 'PollUpdatedEvent'], + 'poll.vote_casted' => ['poll.vote_casted', 'PollVoteCastedEvent'], + 'poll.vote_changed' => ['poll.vote_changed', 'PollVoteChangedEvent'], + 'poll.vote_removed' => ['poll.vote_removed', 'PollVoteRemovedEvent'], 'reaction.deleted' => ['reaction.deleted', 'ReactionDeletedEvent'], 'reaction.new' => ['reaction.new', 'ReactionNewEvent'], 'reaction.updated' => ['reaction.updated', 'ReactionUpdatedEvent'], @@ -240,6 +252,8 @@ public static function webhookEventProvider(): array 'reminder.updated' => ['reminder.updated', 'ReminderUpdatedEvent'], 'review_queue_item.new' => ['review_queue_item.new', 'ReviewQueueItemNewEvent'], 'review_queue_item.updated' => ['review_queue_item.updated', 'ReviewQueueItemUpdatedEvent'], + 'scheduled_message.failed' => ['scheduled_message.failed', 'ScheduledMessageFailedEvent'], + 'scheduled_message.sent' => ['scheduled_message.sent', 'ScheduledMessageSentEvent'], 'thread.updated' => ['thread.updated', 'ThreadUpdatedEvent'], 'user.banned' => ['user.banned', 'UserBannedEvent'], 'user.deactivated' => ['user.deactivated', 'UserDeactivatedEvent'],