notiflows 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +305 -0
- data/SECURITY.md +27 -0
- data/lib/notiflows/client.rb +117 -0
- data/lib/notiflows/errors.rb +228 -0
- data/lib/notiflows/file_part.rb +58 -0
- data/lib/notiflows/internal/cursor_page.rb +100 -0
- data/lib/notiflows/internal/transport/base_client.rb +573 -0
- data/lib/notiflows/internal/transport/pooled_net_requester.rb +210 -0
- data/lib/notiflows/internal/type/array_of.rb +168 -0
- data/lib/notiflows/internal/type/base_model.rb +531 -0
- data/lib/notiflows/internal/type/base_page.rb +55 -0
- data/lib/notiflows/internal/type/boolean.rb +77 -0
- data/lib/notiflows/internal/type/converter.rb +327 -0
- data/lib/notiflows/internal/type/enum.rb +131 -0
- data/lib/notiflows/internal/type/file_input.rb +111 -0
- data/lib/notiflows/internal/type/hash_of.rb +188 -0
- data/lib/notiflows/internal/type/request_parameters.rb +42 -0
- data/lib/notiflows/internal/type/union.rb +237 -0
- data/lib/notiflows/internal/type/unknown.rb +81 -0
- data/lib/notiflows/internal/util.rb +920 -0
- data/lib/notiflows/internal.rb +20 -0
- data/lib/notiflows/models/delivery.rb +189 -0
- data/lib/notiflows/models/delivery_list_params.rb +78 -0
- data/lib/notiflows/models/delivery_retrieve_params.rb +14 -0
- data/lib/notiflows/models/notification.rb +151 -0
- data/lib/notiflows/models/notification_list_deliveries_params.rb +78 -0
- data/lib/notiflows/models/notification_list_params.rb +70 -0
- data/lib/notiflows/models/notification_retrieve_params.rb +14 -0
- data/lib/notiflows/models/notiflow_run_params.rb +197 -0
- data/lib/notiflows/models/notiflow_run_response.rb +19 -0
- data/lib/notiflows/models/topic.rb +27 -0
- data/lib/notiflows/models/topic_delete_params.rb +14 -0
- data/lib/notiflows/models/topic_list_params.rb +38 -0
- data/lib/notiflows/models/topic_retrieve_params.rb +14 -0
- data/lib/notiflows/models/topics/bulk_operation_response.rb +51 -0
- data/lib/notiflows/models/topics/bulk_subscribe_request.rb +20 -0
- data/lib/notiflows/models/topics/subscription_list_params.rb +56 -0
- data/lib/notiflows/models/topics/subscription_subscribe_bulk_params.rb +16 -0
- data/lib/notiflows/models/topics/subscription_unsubscribe_bulk_params.rb +16 -0
- data/lib/notiflows/models/user.rb +111 -0
- data/lib/notiflows/models/user_delete_params.rb +14 -0
- data/lib/notiflows/models/user_list_params.rb +54 -0
- data/lib/notiflows/models/user_retrieve_params.rb +14 -0
- data/lib/notiflows/models/user_upsert_params.rb +122 -0
- data/lib/notiflows/models/users/channel_setting_delete_params.rb +22 -0
- data/lib/notiflows/models/users/channel_setting_retrieve_params.rb +22 -0
- data/lib/notiflows/models/users/channel_setting_update_params.rb +45 -0
- data/lib/notiflows/models/users/channel_settings.rb +91 -0
- data/lib/notiflows/models/users/delivery_list_params.rb +80 -0
- data/lib/notiflows/models/users/delivery_retrieve_params.rb +22 -0
- data/lib/notiflows/models/users/mobile_push_settings.rb +20 -0
- data/lib/notiflows/models/users/notification_list_params.rb +72 -0
- data/lib/notiflows/models/users/notification_retrieve_params.rb +22 -0
- data/lib/notiflows/models/users/preference_retrieve_params.rb +16 -0
- data/lib/notiflows/models/users/preference_update_params.rb +16 -0
- data/lib/notiflows/models/users/preferences.rb +116 -0
- data/lib/notiflows/models/users/slack_settings.rb +29 -0
- data/lib/notiflows/models/users/subscription.rb +45 -0
- data/lib/notiflows/models/users/subscription_list_params.rb +56 -0
- data/lib/notiflows/models/users/subscription_retrieve_params.rb +22 -0
- data/lib/notiflows/models/users/subscription_subscribe_params.rb +28 -0
- data/lib/notiflows/models/users/subscription_unsubscribe_params.rb +22 -0
- data/lib/notiflows/models/users/update_preferences_request.rb +45 -0
- data/lib/notiflows/models.rb +79 -0
- data/lib/notiflows/request_options.rb +77 -0
- data/lib/notiflows/resources/deliveries.rb +77 -0
- data/lib/notiflows/resources/notifications.rb +112 -0
- data/lib/notiflows/resources/notiflows.rb +60 -0
- data/lib/notiflows/resources/topics/subscriptions.rb +106 -0
- data/lib/notiflows/resources/topics.rb +91 -0
- data/lib/notiflows/resources/users/channel_settings.rb +132 -0
- data/lib/notiflows/resources/users/deliveries.rb +82 -0
- data/lib/notiflows/resources/users/notifications.rb +80 -0
- data/lib/notiflows/resources/users/preferences.rb +86 -0
- data/lib/notiflows/resources/users/subscriptions.rb +135 -0
- data/lib/notiflows/resources/users.rb +167 -0
- data/lib/notiflows/version.rb +5 -0
- data/lib/notiflows.rb +109 -0
- data/manifest.yaml +17 -0
- data/rbi/notiflows/client.rbi +82 -0
- data/rbi/notiflows/errors.rbi +205 -0
- data/rbi/notiflows/file_part.rbi +37 -0
- data/rbi/notiflows/internal/cursor_page.rbi +37 -0
- data/rbi/notiflows/internal/transport/base_client.rbi +298 -0
- data/rbi/notiflows/internal/transport/pooled_net_requester.rbi +83 -0
- data/rbi/notiflows/internal/type/array_of.rbi +104 -0
- data/rbi/notiflows/internal/type/base_model.rbi +308 -0
- data/rbi/notiflows/internal/type/base_page.rbi +42 -0
- data/rbi/notiflows/internal/type/boolean.rbi +58 -0
- data/rbi/notiflows/internal/type/converter.rbi +216 -0
- data/rbi/notiflows/internal/type/enum.rbi +82 -0
- data/rbi/notiflows/internal/type/file_input.rbi +59 -0
- data/rbi/notiflows/internal/type/hash_of.rbi +104 -0
- data/rbi/notiflows/internal/type/request_parameters.rbi +29 -0
- data/rbi/notiflows/internal/type/union.rbi +128 -0
- data/rbi/notiflows/internal/type/unknown.rbi +58 -0
- data/rbi/notiflows/internal/util.rbi +487 -0
- data/rbi/notiflows/internal.rbi +18 -0
- data/rbi/notiflows/models/delivery.rbi +226 -0
- data/rbi/notiflows/models/delivery_list_params.rbi +123 -0
- data/rbi/notiflows/models/delivery_retrieve_params.rbi +27 -0
- data/rbi/notiflows/models/notification.rbi +190 -0
- data/rbi/notiflows/models/notification_list_deliveries_params.rbi +126 -0
- data/rbi/notiflows/models/notification_list_params.rbi +112 -0
- data/rbi/notiflows/models/notification_retrieve_params.rbi +30 -0
- data/rbi/notiflows/models/notiflow_run_params.rbi +320 -0
- data/rbi/notiflows/models/notiflow_run_response.rbi +31 -0
- data/rbi/notiflows/models/topic.rbi +32 -0
- data/rbi/notiflows/models/topic_delete_params.rbi +27 -0
- data/rbi/notiflows/models/topic_list_params.rbi +68 -0
- data/rbi/notiflows/models/topic_retrieve_params.rbi +27 -0
- data/rbi/notiflows/models/topics/bulk_operation_response.rbi +93 -0
- data/rbi/notiflows/models/topics/bulk_subscribe_request.rbi +35 -0
- data/rbi/notiflows/models/topics/subscription_list_params.rbi +95 -0
- data/rbi/notiflows/models/topics/subscription_subscribe_bulk_params.rbi +32 -0
- data/rbi/notiflows/models/topics/subscription_unsubscribe_bulk_params.rbi +32 -0
- data/rbi/notiflows/models/user.rbi +126 -0
- data/rbi/notiflows/models/user_delete_params.rbi +27 -0
- data/rbi/notiflows/models/user_list_params.rbi +90 -0
- data/rbi/notiflows/models/user_retrieve_params.rbi +27 -0
- data/rbi/notiflows/models/user_upsert_params.rbi +203 -0
- data/rbi/notiflows/models/users/channel_setting_delete_params.rbi +43 -0
- data/rbi/notiflows/models/users/channel_setting_retrieve_params.rbi +43 -0
- data/rbi/notiflows/models/users/channel_setting_update_params.rbi +92 -0
- data/rbi/notiflows/models/users/channel_settings.rbi +156 -0
- data/rbi/notiflows/models/users/delivery_list_params.rbi +128 -0
- data/rbi/notiflows/models/users/delivery_retrieve_params.rbi +43 -0
- data/rbi/notiflows/models/users/mobile_push_settings.rbi +35 -0
- data/rbi/notiflows/models/users/notification_list_params.rbi +117 -0
- data/rbi/notiflows/models/users/notification_retrieve_params.rbi +43 -0
- data/rbi/notiflows/models/users/preference_retrieve_params.rbi +32 -0
- data/rbi/notiflows/models/users/preference_update_params.rbi +34 -0
- data/rbi/notiflows/models/users/preferences.rbi +241 -0
- data/rbi/notiflows/models/users/slack_settings.rbi +49 -0
- data/rbi/notiflows/models/users/subscription.rbi +64 -0
- data/rbi/notiflows/models/users/subscription_list_params.rbi +95 -0
- data/rbi/notiflows/models/users/subscription_retrieve_params.rbi +43 -0
- data/rbi/notiflows/models/users/subscription_subscribe_params.rbi +47 -0
- data/rbi/notiflows/models/users/subscription_unsubscribe_params.rbi +43 -0
- data/rbi/notiflows/models/users/update_preferences_request.rbi +124 -0
- data/rbi/notiflows/models.rbi +42 -0
- data/rbi/notiflows/request_options.rbi +59 -0
- data/rbi/notiflows/resources/deliveries.rbi +67 -0
- data/rbi/notiflows/resources/notifications.rbi +100 -0
- data/rbi/notiflows/resources/notiflows.rbi +52 -0
- data/rbi/notiflows/resources/topics/subscriptions.rbi +88 -0
- data/rbi/notiflows/resources/topics.rbi +69 -0
- data/rbi/notiflows/resources/users/channel_settings.rbi +104 -0
- data/rbi/notiflows/resources/users/deliveries.rbi +69 -0
- data/rbi/notiflows/resources/users/notifications.rbi +66 -0
- data/rbi/notiflows/resources/users/preferences.rbi +76 -0
- data/rbi/notiflows/resources/users/subscriptions.rbi +102 -0
- data/rbi/notiflows/resources/users.rbi +147 -0
- data/rbi/notiflows/version.rbi +5 -0
- data/sig/notiflows/client.rbs +41 -0
- data/sig/notiflows/errors.rbs +117 -0
- data/sig/notiflows/file_part.rbs +21 -0
- data/sig/notiflows/internal/cursor_page.rbs +22 -0
- data/sig/notiflows/internal/transport/base_client.rbs +133 -0
- data/sig/notiflows/internal/transport/pooled_net_requester.rbs +48 -0
- data/sig/notiflows/internal/type/array_of.rbs +48 -0
- data/sig/notiflows/internal/type/base_model.rbs +102 -0
- data/sig/notiflows/internal/type/base_page.rbs +24 -0
- data/sig/notiflows/internal/type/boolean.rbs +26 -0
- data/sig/notiflows/internal/type/converter.rbs +79 -0
- data/sig/notiflows/internal/type/enum.rbs +32 -0
- data/sig/notiflows/internal/type/file_input.rbs +25 -0
- data/sig/notiflows/internal/type/hash_of.rbs +48 -0
- data/sig/notiflows/internal/type/request_parameters.rbs +19 -0
- data/sig/notiflows/internal/type/union.rbs +52 -0
- data/sig/notiflows/internal/type/unknown.rbs +26 -0
- data/sig/notiflows/internal/util.rbs +185 -0
- data/sig/notiflows/internal.rbs +9 -0
- data/sig/notiflows/models/delivery.rbs +130 -0
- data/sig/notiflows/models/delivery_list_params.rbs +77 -0
- data/sig/notiflows/models/delivery_retrieve_params.rbs +15 -0
- data/sig/notiflows/models/notification.rbs +104 -0
- data/sig/notiflows/models/notification_list_deliveries_params.rbs +77 -0
- data/sig/notiflows/models/notification_list_params.rbs +70 -0
- data/sig/notiflows/models/notification_retrieve_params.rbs +15 -0
- data/sig/notiflows/models/notiflow_run_params.rbs +199 -0
- data/sig/notiflows/models/notiflow_run_response.rbs +13 -0
- data/sig/notiflows/models/topic.rbs +15 -0
- data/sig/notiflows/models/topic_delete_params.rbs +15 -0
- data/sig/notiflows/models/topic_list_params.rbs +38 -0
- data/sig/notiflows/models/topic_retrieve_params.rbs +15 -0
- data/sig/notiflows/models/topics/bulk_operation_response.rbs +39 -0
- data/sig/notiflows/models/topics/bulk_subscribe_request.rbs +15 -0
- data/sig/notiflows/models/topics/subscription_list_params.rbs +58 -0
- data/sig/notiflows/models/topics/subscription_subscribe_bulk_params.rbs +17 -0
- data/sig/notiflows/models/topics/subscription_unsubscribe_bulk_params.rbs +17 -0
- data/sig/notiflows/models/user.rbs +75 -0
- data/sig/notiflows/models/user_delete_params.rbs +15 -0
- data/sig/notiflows/models/user_list_params.rbs +56 -0
- data/sig/notiflows/models/user_retrieve_params.rbs +15 -0
- data/sig/notiflows/models/user_upsert_params.rbs +112 -0
- data/sig/notiflows/models/users/channel_setting_delete_params.rbs +26 -0
- data/sig/notiflows/models/users/channel_setting_retrieve_params.rbs +26 -0
- data/sig/notiflows/models/users/channel_setting_update_params.rbs +42 -0
- data/sig/notiflows/models/users/channel_settings.rbs +68 -0
- data/sig/notiflows/models/users/delivery_list_params.rbs +79 -0
- data/sig/notiflows/models/users/delivery_retrieve_params.rbs +26 -0
- data/sig/notiflows/models/users/mobile_push_settings.rbs +15 -0
- data/sig/notiflows/models/users/notification_list_params.rbs +72 -0
- data/sig/notiflows/models/users/notification_retrieve_params.rbs +26 -0
- data/sig/notiflows/models/users/preference_retrieve_params.rbs +17 -0
- data/sig/notiflows/models/users/preference_update_params.rbs +17 -0
- data/sig/notiflows/models/users/preferences.rbs +118 -0
- data/sig/notiflows/models/users/slack_settings.rbs +24 -0
- data/sig/notiflows/models/users/subscription.rbs +32 -0
- data/sig/notiflows/models/users/subscription_list_params.rbs +58 -0
- data/sig/notiflows/models/users/subscription_retrieve_params.rbs +26 -0
- data/sig/notiflows/models/users/subscription_subscribe_params.rbs +25 -0
- data/sig/notiflows/models/users/subscription_unsubscribe_params.rbs +26 -0
- data/sig/notiflows/models/users/update_preferences_request.rbs +52 -0
- data/sig/notiflows/models.rbs +39 -0
- data/sig/notiflows/request_options.rbs +34 -0
- data/sig/notiflows/resources/deliveries.rbs +24 -0
- data/sig/notiflows/resources/notifications.rbs +36 -0
- data/sig/notiflows/resources/notiflows.rbs +16 -0
- data/sig/notiflows/resources/topics/subscriptions.rbs +31 -0
- data/sig/notiflows/resources/topics.rbs +23 -0
- data/sig/notiflows/resources/users/channel_settings.rbs +28 -0
- data/sig/notiflows/resources/users/deliveries.rbs +28 -0
- data/sig/notiflows/resources/users/notifications.rbs +27 -0
- data/sig/notiflows/resources/users/preferences.rbs +21 -0
- data/sig/notiflows/resources/users/subscriptions.rbs +37 -0
- data/sig/notiflows/resources/users.rbs +52 -0
- data/sig/notiflows/version.rbs +3 -0
- metadata +302 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Notiflows
|
|
4
|
+
module Resources
|
|
5
|
+
class Topics
|
|
6
|
+
sig { returns(Notiflows::Resources::Topics::Subscriptions) }
|
|
7
|
+
attr_reader :subscriptions
|
|
8
|
+
|
|
9
|
+
# Retrieve a topic by name.
|
|
10
|
+
sig do
|
|
11
|
+
params(
|
|
12
|
+
id: String,
|
|
13
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
14
|
+
).returns(Notiflows::Topic)
|
|
15
|
+
end
|
|
16
|
+
def retrieve(
|
|
17
|
+
# Topic name
|
|
18
|
+
id,
|
|
19
|
+
request_options: {}
|
|
20
|
+
)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Retrieve a paginated list of all topics in your project.
|
|
24
|
+
#
|
|
25
|
+
# Topics are used for pub/sub notification patterns. Users subscribe to topics,
|
|
26
|
+
# and you can run notiflows for all subscribers of a topic.
|
|
27
|
+
sig do
|
|
28
|
+
params(
|
|
29
|
+
after: String,
|
|
30
|
+
before: String,
|
|
31
|
+
limit: Integer,
|
|
32
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
33
|
+
).returns(Notiflows::Internal::CursorPage[Notiflows::Topic])
|
|
34
|
+
end
|
|
35
|
+
def list(
|
|
36
|
+
# Cursor for fetching the next page
|
|
37
|
+
after: nil,
|
|
38
|
+
# Cursor for fetching the previous page
|
|
39
|
+
before: nil,
|
|
40
|
+
# Number of items per page (default: 25, max: 1000)
|
|
41
|
+
limit: nil,
|
|
42
|
+
request_options: {}
|
|
43
|
+
)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Delete a topic and all its subscriptions.
|
|
47
|
+
#
|
|
48
|
+
# **Warning:** This removes all user subscriptions to this topic. Users will need
|
|
49
|
+
# to re-subscribe if the topic is recreated.
|
|
50
|
+
sig do
|
|
51
|
+
params(
|
|
52
|
+
id: String,
|
|
53
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
54
|
+
).void
|
|
55
|
+
end
|
|
56
|
+
def delete(
|
|
57
|
+
# Topic name
|
|
58
|
+
id,
|
|
59
|
+
request_options: {}
|
|
60
|
+
)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# @api private
|
|
64
|
+
sig { params(client: Notiflows::Client).returns(T.attached_class) }
|
|
65
|
+
def self.new(client:)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Notiflows
|
|
4
|
+
module Resources
|
|
5
|
+
class Users
|
|
6
|
+
class ChannelSettings
|
|
7
|
+
# Retrieve a user's settings for a specific channel.
|
|
8
|
+
#
|
|
9
|
+
# Channel settings store provider-specific data like device tokens (for push) or
|
|
10
|
+
# Slack user IDs (for chat).
|
|
11
|
+
sig do
|
|
12
|
+
params(
|
|
13
|
+
channel_id: String,
|
|
14
|
+
user_external_id: String,
|
|
15
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
16
|
+
).returns(Notiflows::Users::UsersChannelSettings)
|
|
17
|
+
end
|
|
18
|
+
def retrieve(
|
|
19
|
+
# Channel ID (UUID)
|
|
20
|
+
channel_id,
|
|
21
|
+
# User external ID
|
|
22
|
+
user_external_id:,
|
|
23
|
+
request_options: {}
|
|
24
|
+
)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Update a user's settings for a specific channel. Creates the settings if they
|
|
28
|
+
# don't exist.
|
|
29
|
+
#
|
|
30
|
+
# **Provider-specific settings:**
|
|
31
|
+
#
|
|
32
|
+
# **Mobile Push (APNS/FCM):**
|
|
33
|
+
#
|
|
34
|
+
# ```json
|
|
35
|
+
# {
|
|
36
|
+
# "settings": {
|
|
37
|
+
# "device_tokens": ["token1", "token2"]
|
|
38
|
+
# }
|
|
39
|
+
# }
|
|
40
|
+
# ```
|
|
41
|
+
#
|
|
42
|
+
# **Slack:**
|
|
43
|
+
#
|
|
44
|
+
# ```json
|
|
45
|
+
# {
|
|
46
|
+
# "settings": {
|
|
47
|
+
# "slack_channel_id": "C0123456789",
|
|
48
|
+
# "slack_user_id": "U0123456789"
|
|
49
|
+
# }
|
|
50
|
+
# }
|
|
51
|
+
# ```
|
|
52
|
+
#
|
|
53
|
+
# At least one of `slack_channel_id` or `slack_user_id` must be provided.
|
|
54
|
+
sig do
|
|
55
|
+
params(
|
|
56
|
+
channel_id: String,
|
|
57
|
+
user_external_id: String,
|
|
58
|
+
settings:
|
|
59
|
+
T.any(
|
|
60
|
+
Notiflows::Users::MobilePushSettings::OrHash,
|
|
61
|
+
Notiflows::Users::SlackSettings::OrHash
|
|
62
|
+
),
|
|
63
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
64
|
+
).returns(Notiflows::Users::UsersChannelSettings)
|
|
65
|
+
end
|
|
66
|
+
def update(
|
|
67
|
+
# Path param: Channel ID (UUID)
|
|
68
|
+
channel_id,
|
|
69
|
+
# Path param: User external ID
|
|
70
|
+
user_external_id:,
|
|
71
|
+
# Body param: Provider-specific settings. Structure depends on channel provider.
|
|
72
|
+
settings:,
|
|
73
|
+
request_options: {}
|
|
74
|
+
)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Remove a user's settings for a specific channel.
|
|
78
|
+
#
|
|
79
|
+
# After deletion, the user will no longer receive notifications through this
|
|
80
|
+
# channel until new settings are configured.
|
|
81
|
+
sig do
|
|
82
|
+
params(
|
|
83
|
+
channel_id: String,
|
|
84
|
+
user_external_id: String,
|
|
85
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
86
|
+
).void
|
|
87
|
+
end
|
|
88
|
+
def delete(
|
|
89
|
+
# Channel ID (UUID)
|
|
90
|
+
channel_id,
|
|
91
|
+
# User external ID
|
|
92
|
+
user_external_id:,
|
|
93
|
+
request_options: {}
|
|
94
|
+
)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# @api private
|
|
98
|
+
sig { params(client: Notiflows::Client).returns(T.attached_class) }
|
|
99
|
+
def self.new(client:)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Notiflows
|
|
4
|
+
module Resources
|
|
5
|
+
class Users
|
|
6
|
+
class Deliveries
|
|
7
|
+
# Retrieve details of a specific delivery attempt for a user.
|
|
8
|
+
sig do
|
|
9
|
+
params(
|
|
10
|
+
delivery_id: String,
|
|
11
|
+
user_external_id: String,
|
|
12
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
13
|
+
).returns(Notiflows::Delivery)
|
|
14
|
+
end
|
|
15
|
+
def retrieve(
|
|
16
|
+
# Delivery ID (UUID)
|
|
17
|
+
delivery_id,
|
|
18
|
+
# User external ID
|
|
19
|
+
user_external_id:,
|
|
20
|
+
request_options: {}
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Retrieve all delivery attempts for a user across all channels.
|
|
25
|
+
sig do
|
|
26
|
+
params(
|
|
27
|
+
user_external_id: String,
|
|
28
|
+
after: String,
|
|
29
|
+
before: String,
|
|
30
|
+
channel_id: String,
|
|
31
|
+
created_after: String,
|
|
32
|
+
created_before: String,
|
|
33
|
+
limit: Integer,
|
|
34
|
+
status: String,
|
|
35
|
+
topic: String,
|
|
36
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
37
|
+
).returns(Notiflows::Internal::CursorPage[Notiflows::Delivery])
|
|
38
|
+
end
|
|
39
|
+
def list(
|
|
40
|
+
# User external ID
|
|
41
|
+
user_external_id,
|
|
42
|
+
# Cursor for fetching the next page
|
|
43
|
+
after: nil,
|
|
44
|
+
# Cursor for fetching the previous page
|
|
45
|
+
before: nil,
|
|
46
|
+
# Filter by channel ID (UUID)
|
|
47
|
+
channel_id: nil,
|
|
48
|
+
# Filter by created after (ISO 8601 datetime)
|
|
49
|
+
created_after: nil,
|
|
50
|
+
# Filter by created before (ISO 8601 datetime)
|
|
51
|
+
created_before: nil,
|
|
52
|
+
# Number of items per page (default: 25, max: 1000)
|
|
53
|
+
limit: nil,
|
|
54
|
+
# Filter by status (pending, sent, failed)
|
|
55
|
+
status: nil,
|
|
56
|
+
# Filter by topic name
|
|
57
|
+
topic: nil,
|
|
58
|
+
request_options: {}
|
|
59
|
+
)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# @api private
|
|
63
|
+
sig { params(client: Notiflows::Client).returns(T.attached_class) }
|
|
64
|
+
def self.new(client:)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Notiflows
|
|
4
|
+
module Resources
|
|
5
|
+
class Users
|
|
6
|
+
class Notifications
|
|
7
|
+
# Retrieve a specific notification for a user, including all delivery attempts.
|
|
8
|
+
sig do
|
|
9
|
+
params(
|
|
10
|
+
notification_id: String,
|
|
11
|
+
user_external_id: String,
|
|
12
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
13
|
+
).returns(Notiflows::Notification)
|
|
14
|
+
end
|
|
15
|
+
def retrieve(
|
|
16
|
+
# Notification ID (UUID)
|
|
17
|
+
notification_id,
|
|
18
|
+
# User external ID
|
|
19
|
+
user_external_id:,
|
|
20
|
+
request_options: {}
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Retrieve all notifications sent to a specific user.
|
|
25
|
+
sig do
|
|
26
|
+
params(
|
|
27
|
+
user_external_id: String,
|
|
28
|
+
after: String,
|
|
29
|
+
before: String,
|
|
30
|
+
created_after: String,
|
|
31
|
+
created_before: String,
|
|
32
|
+
limit: Integer,
|
|
33
|
+
status: String,
|
|
34
|
+
topic: String,
|
|
35
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
36
|
+
).returns(Notiflows::Internal::CursorPage[Notiflows::Notification])
|
|
37
|
+
end
|
|
38
|
+
def list(
|
|
39
|
+
# User external ID
|
|
40
|
+
user_external_id,
|
|
41
|
+
# Cursor for fetching the next page
|
|
42
|
+
after: nil,
|
|
43
|
+
# Cursor for fetching the previous page
|
|
44
|
+
before: nil,
|
|
45
|
+
# Filter by created after (ISO 8601 datetime)
|
|
46
|
+
created_after: nil,
|
|
47
|
+
# Filter by created before (ISO 8601 datetime)
|
|
48
|
+
created_before: nil,
|
|
49
|
+
# Number of items per page (default: 25, max: 1000)
|
|
50
|
+
limit: nil,
|
|
51
|
+
# Filter by status
|
|
52
|
+
status: nil,
|
|
53
|
+
# Filter by topic
|
|
54
|
+
topic: nil,
|
|
55
|
+
request_options: {}
|
|
56
|
+
)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# @api private
|
|
60
|
+
sig { params(client: Notiflows::Client).returns(T.attached_class) }
|
|
61
|
+
def self.new(client:)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Notiflows
|
|
4
|
+
module Resources
|
|
5
|
+
class Users
|
|
6
|
+
class Preferences
|
|
7
|
+
# Retrieve a user's notification preferences.
|
|
8
|
+
#
|
|
9
|
+
# Preferences control which notifications the user receives:
|
|
10
|
+
#
|
|
11
|
+
# - `channel_types`: Global opt-in/opt-out per channel type (email, sms, push,
|
|
12
|
+
# etc.)
|
|
13
|
+
# - `notiflows`: Per-notiflow preferences with optional channel overrides
|
|
14
|
+
sig do
|
|
15
|
+
params(
|
|
16
|
+
user_external_id: String,
|
|
17
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
18
|
+
).returns(::Notiflows::Users::UsersPreferences)
|
|
19
|
+
end
|
|
20
|
+
def retrieve(
|
|
21
|
+
# User external ID
|
|
22
|
+
user_external_id,
|
|
23
|
+
request_options: {}
|
|
24
|
+
)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Update a user's notification preferences. Only provided fields are updated
|
|
28
|
+
# (partial update).
|
|
29
|
+
#
|
|
30
|
+
# **Channel types:** Set to `false` to opt the user out of a channel globally.
|
|
31
|
+
#
|
|
32
|
+
# **Notiflow preferences:** Override settings for specific notiflows:
|
|
33
|
+
#
|
|
34
|
+
# ```json
|
|
35
|
+
# {
|
|
36
|
+
# "notiflows": {
|
|
37
|
+
# "notiflow_uuid": {
|
|
38
|
+
# "enabled": true,
|
|
39
|
+
# "channel_types": {
|
|
40
|
+
# "email": false
|
|
41
|
+
# }
|
|
42
|
+
# }
|
|
43
|
+
# }
|
|
44
|
+
# }
|
|
45
|
+
# ```
|
|
46
|
+
sig do
|
|
47
|
+
params(
|
|
48
|
+
user_external_id: String,
|
|
49
|
+
channel_types: T::Hash[Symbol, T::Boolean],
|
|
50
|
+
notiflows:
|
|
51
|
+
T::Hash[
|
|
52
|
+
Symbol,
|
|
53
|
+
::Notiflows::Users::UpdatePreferencesRequest::Notiflow::OrHash
|
|
54
|
+
],
|
|
55
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
56
|
+
).returns(::Notiflows::Users::UsersPreferences)
|
|
57
|
+
end
|
|
58
|
+
def update(
|
|
59
|
+
# User external ID
|
|
60
|
+
user_external_id,
|
|
61
|
+
# Global channel type preferences
|
|
62
|
+
channel_types: nil,
|
|
63
|
+
# Per-notiflow preferences (keyed by notiflow ID)
|
|
64
|
+
notiflows: nil,
|
|
65
|
+
request_options: {}
|
|
66
|
+
)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# @api private
|
|
70
|
+
sig { params(client: Notiflows::Client).returns(T.attached_class) }
|
|
71
|
+
def self.new(client:)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Notiflows
|
|
4
|
+
module Resources
|
|
5
|
+
class Users
|
|
6
|
+
class Subscriptions
|
|
7
|
+
# Check if a user is subscribed to a specific topic.
|
|
8
|
+
sig do
|
|
9
|
+
params(
|
|
10
|
+
topic_name: String,
|
|
11
|
+
user_external_id: String,
|
|
12
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
13
|
+
).returns(Notiflows::Users::Subscription)
|
|
14
|
+
end
|
|
15
|
+
def retrieve(
|
|
16
|
+
# Topic name
|
|
17
|
+
topic_name,
|
|
18
|
+
# User external ID
|
|
19
|
+
user_external_id:,
|
|
20
|
+
request_options: {}
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Retrieve all topic subscriptions for a user.
|
|
25
|
+
sig do
|
|
26
|
+
params(
|
|
27
|
+
user_external_id: String,
|
|
28
|
+
after: String,
|
|
29
|
+
before: String,
|
|
30
|
+
created_after: String,
|
|
31
|
+
created_before: String,
|
|
32
|
+
limit: Integer,
|
|
33
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
34
|
+
).returns(
|
|
35
|
+
Notiflows::Internal::CursorPage[Notiflows::Users::Subscription]
|
|
36
|
+
)
|
|
37
|
+
end
|
|
38
|
+
def list(
|
|
39
|
+
# User external ID
|
|
40
|
+
user_external_id,
|
|
41
|
+
# Cursor for fetching the next page
|
|
42
|
+
after: nil,
|
|
43
|
+
# Cursor for fetching the previous page
|
|
44
|
+
before: nil,
|
|
45
|
+
# Filter by created after (ISO 8601 datetime)
|
|
46
|
+
created_after: nil,
|
|
47
|
+
# Filter by created before (ISO 8601 datetime)
|
|
48
|
+
created_before: nil,
|
|
49
|
+
# Number of items per page (default: 25, max: 1000)
|
|
50
|
+
limit: nil,
|
|
51
|
+
request_options: {}
|
|
52
|
+
)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Subscribe a user to a topic. Topics are created automatically if they don't
|
|
56
|
+
# exist.
|
|
57
|
+
#
|
|
58
|
+
# **Idempotent:** If the user is already subscribed, returns the existing
|
|
59
|
+
# subscription with `200 OK`.
|
|
60
|
+
sig do
|
|
61
|
+
params(
|
|
62
|
+
user_external_id: String,
|
|
63
|
+
topic_name: String,
|
|
64
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
65
|
+
).returns(Notiflows::Users::Subscription)
|
|
66
|
+
end
|
|
67
|
+
def subscribe(
|
|
68
|
+
# User external ID
|
|
69
|
+
user_external_id,
|
|
70
|
+
# Name of the topic to subscribe to. Topics are created automatically if they
|
|
71
|
+
# don't exist.
|
|
72
|
+
topic_name:,
|
|
73
|
+
request_options: {}
|
|
74
|
+
)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Remove a user's subscription from a topic. The user will no longer receive
|
|
78
|
+
# notifications triggered for this topic.
|
|
79
|
+
sig do
|
|
80
|
+
params(
|
|
81
|
+
topic_name: String,
|
|
82
|
+
user_external_id: String,
|
|
83
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
84
|
+
).void
|
|
85
|
+
end
|
|
86
|
+
def unsubscribe(
|
|
87
|
+
# Topic name
|
|
88
|
+
topic_name,
|
|
89
|
+
# User external ID
|
|
90
|
+
user_external_id:,
|
|
91
|
+
request_options: {}
|
|
92
|
+
)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# @api private
|
|
96
|
+
sig { params(client: Notiflows::Client).returns(T.attached_class) }
|
|
97
|
+
def self.new(client:)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Notiflows
|
|
4
|
+
module Resources
|
|
5
|
+
class Users
|
|
6
|
+
sig { returns(Notiflows::Resources::Users::ChannelSettings) }
|
|
7
|
+
attr_reader :channel_settings
|
|
8
|
+
|
|
9
|
+
sig { returns(Notiflows::Resources::Users::Deliveries) }
|
|
10
|
+
attr_reader :deliveries
|
|
11
|
+
|
|
12
|
+
sig { returns(Notiflows::Resources::Users::Notifications) }
|
|
13
|
+
attr_reader :notifications
|
|
14
|
+
|
|
15
|
+
sig { returns(Notiflows::Resources::Users::Preferences) }
|
|
16
|
+
attr_reader :preferences
|
|
17
|
+
|
|
18
|
+
sig { returns(Notiflows::Resources::Users::Subscriptions) }
|
|
19
|
+
attr_reader :subscriptions
|
|
20
|
+
|
|
21
|
+
# Retrieve a single user by their external ID. The external ID is the identifier
|
|
22
|
+
# you assigned when creating the user.
|
|
23
|
+
sig do
|
|
24
|
+
params(
|
|
25
|
+
user_external_id: String,
|
|
26
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
27
|
+
).returns(Notiflows::User)
|
|
28
|
+
end
|
|
29
|
+
def retrieve(
|
|
30
|
+
# User external ID (your system's user identifier)
|
|
31
|
+
user_external_id,
|
|
32
|
+
request_options: {}
|
|
33
|
+
)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Retrieve a paginated list of users in your project. Users are sorted by creation
|
|
37
|
+
# date (newest first).
|
|
38
|
+
sig do
|
|
39
|
+
params(
|
|
40
|
+
after: String,
|
|
41
|
+
before: String,
|
|
42
|
+
created_after: String,
|
|
43
|
+
created_before: String,
|
|
44
|
+
limit: Integer,
|
|
45
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
46
|
+
).returns(Notiflows::Internal::CursorPage[Notiflows::User])
|
|
47
|
+
end
|
|
48
|
+
def list(
|
|
49
|
+
# Cursor for fetching the next page
|
|
50
|
+
after: nil,
|
|
51
|
+
# Cursor for fetching the previous page
|
|
52
|
+
before: nil,
|
|
53
|
+
# Filter users created after this datetime (ISO 8601)
|
|
54
|
+
created_after: nil,
|
|
55
|
+
# Filter users created before this datetime (ISO 8601)
|
|
56
|
+
created_before: nil,
|
|
57
|
+
# Number of items per page (default: 25, max: 1000)
|
|
58
|
+
limit: nil,
|
|
59
|
+
request_options: {}
|
|
60
|
+
)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Permanently delete a user and all their associated data including:
|
|
64
|
+
#
|
|
65
|
+
# - Subscriptions
|
|
66
|
+
# - Preferences
|
|
67
|
+
# - Channel settings
|
|
68
|
+
# - Notifications and deliveries
|
|
69
|
+
#
|
|
70
|
+
# **This action cannot be undone.**
|
|
71
|
+
sig do
|
|
72
|
+
params(
|
|
73
|
+
user_external_id: String,
|
|
74
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
75
|
+
).void
|
|
76
|
+
end
|
|
77
|
+
def delete(
|
|
78
|
+
# User external ID
|
|
79
|
+
user_external_id,
|
|
80
|
+
request_options: {}
|
|
81
|
+
)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Create a new user or update an existing user by external ID (upsert operation).
|
|
85
|
+
#
|
|
86
|
+
# - If the user doesn't exist, they will be created with the provided attributes.
|
|
87
|
+
# - If the user exists, their attributes will be updated (merge behavior).
|
|
88
|
+
# - `custom_fields` are deep-merged with existing values.
|
|
89
|
+
#
|
|
90
|
+
# **Returns:**
|
|
91
|
+
#
|
|
92
|
+
# - `201 Created` when a new user is created
|
|
93
|
+
# - `200 OK` when an existing user is updated
|
|
94
|
+
sig do
|
|
95
|
+
params(
|
|
96
|
+
user_external_id: String,
|
|
97
|
+
external_id: String,
|
|
98
|
+
avatar: String,
|
|
99
|
+
channel_settings:
|
|
100
|
+
T::Array[Notiflows::UserUpsertParams::ChannelSetting::OrHash],
|
|
101
|
+
custom_fields: T.anything,
|
|
102
|
+
email: String,
|
|
103
|
+
first_name: String,
|
|
104
|
+
last_name: String,
|
|
105
|
+
locale: String,
|
|
106
|
+
phone: String,
|
|
107
|
+
preferences: ::Notiflows::Users::UpdatePreferencesRequest::OrHash,
|
|
108
|
+
timezone: String,
|
|
109
|
+
request_options: Notiflows::RequestOptions::OrHash
|
|
110
|
+
).returns(Notiflows::User)
|
|
111
|
+
end
|
|
112
|
+
def upsert(
|
|
113
|
+
# User external ID
|
|
114
|
+
user_external_id,
|
|
115
|
+
# Your system's unique identifier for this user. Required for creating new users.
|
|
116
|
+
external_id:,
|
|
117
|
+
# URL to user's avatar image (must start with http:// or https://)
|
|
118
|
+
avatar: nil,
|
|
119
|
+
# Initial channel settings (e.g., device tokens for push)
|
|
120
|
+
channel_settings: nil,
|
|
121
|
+
# Custom attributes. Deep-merged with existing values on update.
|
|
122
|
+
custom_fields: nil,
|
|
123
|
+
# User's email address
|
|
124
|
+
email: nil,
|
|
125
|
+
# User's first name
|
|
126
|
+
first_name: nil,
|
|
127
|
+
# User's last name
|
|
128
|
+
last_name: nil,
|
|
129
|
+
# BCP 47 locale code (e.g., en-US, es-ES, fr-FR)
|
|
130
|
+
locale: nil,
|
|
131
|
+
# User's phone number in E.164 format
|
|
132
|
+
phone: nil,
|
|
133
|
+
# Request body for updating user preferences. Only provided fields are updated.
|
|
134
|
+
preferences: nil,
|
|
135
|
+
# IANA timezone (e.g., America/New_York, Europe/London)
|
|
136
|
+
timezone: nil,
|
|
137
|
+
request_options: {}
|
|
138
|
+
)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# @api private
|
|
142
|
+
sig { params(client: Notiflows::Client).returns(T.attached_class) }
|
|
143
|
+
def self.new(client:)
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Notiflows
|
|
2
|
+
class Client < Notiflows::Internal::Transport::BaseClient
|
|
3
|
+
DEFAULT_MAX_RETRIES: 2
|
|
4
|
+
|
|
5
|
+
DEFAULT_TIMEOUT_IN_SECONDS: Float
|
|
6
|
+
|
|
7
|
+
DEFAULT_INITIAL_RETRY_DELAY: Float
|
|
8
|
+
|
|
9
|
+
DEFAULT_MAX_RETRY_DELAY: Float
|
|
10
|
+
|
|
11
|
+
attr_reader api_key: String
|
|
12
|
+
|
|
13
|
+
attr_reader secret: String
|
|
14
|
+
|
|
15
|
+
attr_reader deliveries: Notiflows::Resources::Deliveries
|
|
16
|
+
|
|
17
|
+
attr_reader notifications: Notiflows::Resources::Notifications
|
|
18
|
+
|
|
19
|
+
attr_reader notiflows: Notiflows::Resources::Notiflows
|
|
20
|
+
|
|
21
|
+
attr_reader topics: Notiflows::Resources::Topics
|
|
22
|
+
|
|
23
|
+
attr_reader users: Notiflows::Resources::Users
|
|
24
|
+
|
|
25
|
+
private def auth_headers: -> ::Hash[String, String]
|
|
26
|
+
|
|
27
|
+
private def api_key_auth: -> ::Hash[String, String]
|
|
28
|
+
|
|
29
|
+
private def secret_key_auth: -> ::Hash[String, String]
|
|
30
|
+
|
|
31
|
+
def initialize: (
|
|
32
|
+
?api_key: String?,
|
|
33
|
+
?secret: String?,
|
|
34
|
+
?base_url: String?,
|
|
35
|
+
?max_retries: Integer,
|
|
36
|
+
?timeout: Float,
|
|
37
|
+
?initial_retry_delay: Float,
|
|
38
|
+
?max_retry_delay: Float
|
|
39
|
+
) -> void
|
|
40
|
+
end
|
|
41
|
+
end
|