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.
Files changed (231) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +305 -0
  3. data/SECURITY.md +27 -0
  4. data/lib/notiflows/client.rb +117 -0
  5. data/lib/notiflows/errors.rb +228 -0
  6. data/lib/notiflows/file_part.rb +58 -0
  7. data/lib/notiflows/internal/cursor_page.rb +100 -0
  8. data/lib/notiflows/internal/transport/base_client.rb +573 -0
  9. data/lib/notiflows/internal/transport/pooled_net_requester.rb +210 -0
  10. data/lib/notiflows/internal/type/array_of.rb +168 -0
  11. data/lib/notiflows/internal/type/base_model.rb +531 -0
  12. data/lib/notiflows/internal/type/base_page.rb +55 -0
  13. data/lib/notiflows/internal/type/boolean.rb +77 -0
  14. data/lib/notiflows/internal/type/converter.rb +327 -0
  15. data/lib/notiflows/internal/type/enum.rb +131 -0
  16. data/lib/notiflows/internal/type/file_input.rb +111 -0
  17. data/lib/notiflows/internal/type/hash_of.rb +188 -0
  18. data/lib/notiflows/internal/type/request_parameters.rb +42 -0
  19. data/lib/notiflows/internal/type/union.rb +237 -0
  20. data/lib/notiflows/internal/type/unknown.rb +81 -0
  21. data/lib/notiflows/internal/util.rb +920 -0
  22. data/lib/notiflows/internal.rb +20 -0
  23. data/lib/notiflows/models/delivery.rb +189 -0
  24. data/lib/notiflows/models/delivery_list_params.rb +78 -0
  25. data/lib/notiflows/models/delivery_retrieve_params.rb +14 -0
  26. data/lib/notiflows/models/notification.rb +151 -0
  27. data/lib/notiflows/models/notification_list_deliveries_params.rb +78 -0
  28. data/lib/notiflows/models/notification_list_params.rb +70 -0
  29. data/lib/notiflows/models/notification_retrieve_params.rb +14 -0
  30. data/lib/notiflows/models/notiflow_run_params.rb +197 -0
  31. data/lib/notiflows/models/notiflow_run_response.rb +19 -0
  32. data/lib/notiflows/models/topic.rb +27 -0
  33. data/lib/notiflows/models/topic_delete_params.rb +14 -0
  34. data/lib/notiflows/models/topic_list_params.rb +38 -0
  35. data/lib/notiflows/models/topic_retrieve_params.rb +14 -0
  36. data/lib/notiflows/models/topics/bulk_operation_response.rb +51 -0
  37. data/lib/notiflows/models/topics/bulk_subscribe_request.rb +20 -0
  38. data/lib/notiflows/models/topics/subscription_list_params.rb +56 -0
  39. data/lib/notiflows/models/topics/subscription_subscribe_bulk_params.rb +16 -0
  40. data/lib/notiflows/models/topics/subscription_unsubscribe_bulk_params.rb +16 -0
  41. data/lib/notiflows/models/user.rb +111 -0
  42. data/lib/notiflows/models/user_delete_params.rb +14 -0
  43. data/lib/notiflows/models/user_list_params.rb +54 -0
  44. data/lib/notiflows/models/user_retrieve_params.rb +14 -0
  45. data/lib/notiflows/models/user_upsert_params.rb +122 -0
  46. data/lib/notiflows/models/users/channel_setting_delete_params.rb +22 -0
  47. data/lib/notiflows/models/users/channel_setting_retrieve_params.rb +22 -0
  48. data/lib/notiflows/models/users/channel_setting_update_params.rb +45 -0
  49. data/lib/notiflows/models/users/channel_settings.rb +91 -0
  50. data/lib/notiflows/models/users/delivery_list_params.rb +80 -0
  51. data/lib/notiflows/models/users/delivery_retrieve_params.rb +22 -0
  52. data/lib/notiflows/models/users/mobile_push_settings.rb +20 -0
  53. data/lib/notiflows/models/users/notification_list_params.rb +72 -0
  54. data/lib/notiflows/models/users/notification_retrieve_params.rb +22 -0
  55. data/lib/notiflows/models/users/preference_retrieve_params.rb +16 -0
  56. data/lib/notiflows/models/users/preference_update_params.rb +16 -0
  57. data/lib/notiflows/models/users/preferences.rb +116 -0
  58. data/lib/notiflows/models/users/slack_settings.rb +29 -0
  59. data/lib/notiflows/models/users/subscription.rb +45 -0
  60. data/lib/notiflows/models/users/subscription_list_params.rb +56 -0
  61. data/lib/notiflows/models/users/subscription_retrieve_params.rb +22 -0
  62. data/lib/notiflows/models/users/subscription_subscribe_params.rb +28 -0
  63. data/lib/notiflows/models/users/subscription_unsubscribe_params.rb +22 -0
  64. data/lib/notiflows/models/users/update_preferences_request.rb +45 -0
  65. data/lib/notiflows/models.rb +79 -0
  66. data/lib/notiflows/request_options.rb +77 -0
  67. data/lib/notiflows/resources/deliveries.rb +77 -0
  68. data/lib/notiflows/resources/notifications.rb +112 -0
  69. data/lib/notiflows/resources/notiflows.rb +60 -0
  70. data/lib/notiflows/resources/topics/subscriptions.rb +106 -0
  71. data/lib/notiflows/resources/topics.rb +91 -0
  72. data/lib/notiflows/resources/users/channel_settings.rb +132 -0
  73. data/lib/notiflows/resources/users/deliveries.rb +82 -0
  74. data/lib/notiflows/resources/users/notifications.rb +80 -0
  75. data/lib/notiflows/resources/users/preferences.rb +86 -0
  76. data/lib/notiflows/resources/users/subscriptions.rb +135 -0
  77. data/lib/notiflows/resources/users.rb +167 -0
  78. data/lib/notiflows/version.rb +5 -0
  79. data/lib/notiflows.rb +109 -0
  80. data/manifest.yaml +17 -0
  81. data/rbi/notiflows/client.rbi +82 -0
  82. data/rbi/notiflows/errors.rbi +205 -0
  83. data/rbi/notiflows/file_part.rbi +37 -0
  84. data/rbi/notiflows/internal/cursor_page.rbi +37 -0
  85. data/rbi/notiflows/internal/transport/base_client.rbi +298 -0
  86. data/rbi/notiflows/internal/transport/pooled_net_requester.rbi +83 -0
  87. data/rbi/notiflows/internal/type/array_of.rbi +104 -0
  88. data/rbi/notiflows/internal/type/base_model.rbi +308 -0
  89. data/rbi/notiflows/internal/type/base_page.rbi +42 -0
  90. data/rbi/notiflows/internal/type/boolean.rbi +58 -0
  91. data/rbi/notiflows/internal/type/converter.rbi +216 -0
  92. data/rbi/notiflows/internal/type/enum.rbi +82 -0
  93. data/rbi/notiflows/internal/type/file_input.rbi +59 -0
  94. data/rbi/notiflows/internal/type/hash_of.rbi +104 -0
  95. data/rbi/notiflows/internal/type/request_parameters.rbi +29 -0
  96. data/rbi/notiflows/internal/type/union.rbi +128 -0
  97. data/rbi/notiflows/internal/type/unknown.rbi +58 -0
  98. data/rbi/notiflows/internal/util.rbi +487 -0
  99. data/rbi/notiflows/internal.rbi +18 -0
  100. data/rbi/notiflows/models/delivery.rbi +226 -0
  101. data/rbi/notiflows/models/delivery_list_params.rbi +123 -0
  102. data/rbi/notiflows/models/delivery_retrieve_params.rbi +27 -0
  103. data/rbi/notiflows/models/notification.rbi +190 -0
  104. data/rbi/notiflows/models/notification_list_deliveries_params.rbi +126 -0
  105. data/rbi/notiflows/models/notification_list_params.rbi +112 -0
  106. data/rbi/notiflows/models/notification_retrieve_params.rbi +30 -0
  107. data/rbi/notiflows/models/notiflow_run_params.rbi +320 -0
  108. data/rbi/notiflows/models/notiflow_run_response.rbi +31 -0
  109. data/rbi/notiflows/models/topic.rbi +32 -0
  110. data/rbi/notiflows/models/topic_delete_params.rbi +27 -0
  111. data/rbi/notiflows/models/topic_list_params.rbi +68 -0
  112. data/rbi/notiflows/models/topic_retrieve_params.rbi +27 -0
  113. data/rbi/notiflows/models/topics/bulk_operation_response.rbi +93 -0
  114. data/rbi/notiflows/models/topics/bulk_subscribe_request.rbi +35 -0
  115. data/rbi/notiflows/models/topics/subscription_list_params.rbi +95 -0
  116. data/rbi/notiflows/models/topics/subscription_subscribe_bulk_params.rbi +32 -0
  117. data/rbi/notiflows/models/topics/subscription_unsubscribe_bulk_params.rbi +32 -0
  118. data/rbi/notiflows/models/user.rbi +126 -0
  119. data/rbi/notiflows/models/user_delete_params.rbi +27 -0
  120. data/rbi/notiflows/models/user_list_params.rbi +90 -0
  121. data/rbi/notiflows/models/user_retrieve_params.rbi +27 -0
  122. data/rbi/notiflows/models/user_upsert_params.rbi +203 -0
  123. data/rbi/notiflows/models/users/channel_setting_delete_params.rbi +43 -0
  124. data/rbi/notiflows/models/users/channel_setting_retrieve_params.rbi +43 -0
  125. data/rbi/notiflows/models/users/channel_setting_update_params.rbi +92 -0
  126. data/rbi/notiflows/models/users/channel_settings.rbi +156 -0
  127. data/rbi/notiflows/models/users/delivery_list_params.rbi +128 -0
  128. data/rbi/notiflows/models/users/delivery_retrieve_params.rbi +43 -0
  129. data/rbi/notiflows/models/users/mobile_push_settings.rbi +35 -0
  130. data/rbi/notiflows/models/users/notification_list_params.rbi +117 -0
  131. data/rbi/notiflows/models/users/notification_retrieve_params.rbi +43 -0
  132. data/rbi/notiflows/models/users/preference_retrieve_params.rbi +32 -0
  133. data/rbi/notiflows/models/users/preference_update_params.rbi +34 -0
  134. data/rbi/notiflows/models/users/preferences.rbi +241 -0
  135. data/rbi/notiflows/models/users/slack_settings.rbi +49 -0
  136. data/rbi/notiflows/models/users/subscription.rbi +64 -0
  137. data/rbi/notiflows/models/users/subscription_list_params.rbi +95 -0
  138. data/rbi/notiflows/models/users/subscription_retrieve_params.rbi +43 -0
  139. data/rbi/notiflows/models/users/subscription_subscribe_params.rbi +47 -0
  140. data/rbi/notiflows/models/users/subscription_unsubscribe_params.rbi +43 -0
  141. data/rbi/notiflows/models/users/update_preferences_request.rbi +124 -0
  142. data/rbi/notiflows/models.rbi +42 -0
  143. data/rbi/notiflows/request_options.rbi +59 -0
  144. data/rbi/notiflows/resources/deliveries.rbi +67 -0
  145. data/rbi/notiflows/resources/notifications.rbi +100 -0
  146. data/rbi/notiflows/resources/notiflows.rbi +52 -0
  147. data/rbi/notiflows/resources/topics/subscriptions.rbi +88 -0
  148. data/rbi/notiflows/resources/topics.rbi +69 -0
  149. data/rbi/notiflows/resources/users/channel_settings.rbi +104 -0
  150. data/rbi/notiflows/resources/users/deliveries.rbi +69 -0
  151. data/rbi/notiflows/resources/users/notifications.rbi +66 -0
  152. data/rbi/notiflows/resources/users/preferences.rbi +76 -0
  153. data/rbi/notiflows/resources/users/subscriptions.rbi +102 -0
  154. data/rbi/notiflows/resources/users.rbi +147 -0
  155. data/rbi/notiflows/version.rbi +5 -0
  156. data/sig/notiflows/client.rbs +41 -0
  157. data/sig/notiflows/errors.rbs +117 -0
  158. data/sig/notiflows/file_part.rbs +21 -0
  159. data/sig/notiflows/internal/cursor_page.rbs +22 -0
  160. data/sig/notiflows/internal/transport/base_client.rbs +133 -0
  161. data/sig/notiflows/internal/transport/pooled_net_requester.rbs +48 -0
  162. data/sig/notiflows/internal/type/array_of.rbs +48 -0
  163. data/sig/notiflows/internal/type/base_model.rbs +102 -0
  164. data/sig/notiflows/internal/type/base_page.rbs +24 -0
  165. data/sig/notiflows/internal/type/boolean.rbs +26 -0
  166. data/sig/notiflows/internal/type/converter.rbs +79 -0
  167. data/sig/notiflows/internal/type/enum.rbs +32 -0
  168. data/sig/notiflows/internal/type/file_input.rbs +25 -0
  169. data/sig/notiflows/internal/type/hash_of.rbs +48 -0
  170. data/sig/notiflows/internal/type/request_parameters.rbs +19 -0
  171. data/sig/notiflows/internal/type/union.rbs +52 -0
  172. data/sig/notiflows/internal/type/unknown.rbs +26 -0
  173. data/sig/notiflows/internal/util.rbs +185 -0
  174. data/sig/notiflows/internal.rbs +9 -0
  175. data/sig/notiflows/models/delivery.rbs +130 -0
  176. data/sig/notiflows/models/delivery_list_params.rbs +77 -0
  177. data/sig/notiflows/models/delivery_retrieve_params.rbs +15 -0
  178. data/sig/notiflows/models/notification.rbs +104 -0
  179. data/sig/notiflows/models/notification_list_deliveries_params.rbs +77 -0
  180. data/sig/notiflows/models/notification_list_params.rbs +70 -0
  181. data/sig/notiflows/models/notification_retrieve_params.rbs +15 -0
  182. data/sig/notiflows/models/notiflow_run_params.rbs +199 -0
  183. data/sig/notiflows/models/notiflow_run_response.rbs +13 -0
  184. data/sig/notiflows/models/topic.rbs +15 -0
  185. data/sig/notiflows/models/topic_delete_params.rbs +15 -0
  186. data/sig/notiflows/models/topic_list_params.rbs +38 -0
  187. data/sig/notiflows/models/topic_retrieve_params.rbs +15 -0
  188. data/sig/notiflows/models/topics/bulk_operation_response.rbs +39 -0
  189. data/sig/notiflows/models/topics/bulk_subscribe_request.rbs +15 -0
  190. data/sig/notiflows/models/topics/subscription_list_params.rbs +58 -0
  191. data/sig/notiflows/models/topics/subscription_subscribe_bulk_params.rbs +17 -0
  192. data/sig/notiflows/models/topics/subscription_unsubscribe_bulk_params.rbs +17 -0
  193. data/sig/notiflows/models/user.rbs +75 -0
  194. data/sig/notiflows/models/user_delete_params.rbs +15 -0
  195. data/sig/notiflows/models/user_list_params.rbs +56 -0
  196. data/sig/notiflows/models/user_retrieve_params.rbs +15 -0
  197. data/sig/notiflows/models/user_upsert_params.rbs +112 -0
  198. data/sig/notiflows/models/users/channel_setting_delete_params.rbs +26 -0
  199. data/sig/notiflows/models/users/channel_setting_retrieve_params.rbs +26 -0
  200. data/sig/notiflows/models/users/channel_setting_update_params.rbs +42 -0
  201. data/sig/notiflows/models/users/channel_settings.rbs +68 -0
  202. data/sig/notiflows/models/users/delivery_list_params.rbs +79 -0
  203. data/sig/notiflows/models/users/delivery_retrieve_params.rbs +26 -0
  204. data/sig/notiflows/models/users/mobile_push_settings.rbs +15 -0
  205. data/sig/notiflows/models/users/notification_list_params.rbs +72 -0
  206. data/sig/notiflows/models/users/notification_retrieve_params.rbs +26 -0
  207. data/sig/notiflows/models/users/preference_retrieve_params.rbs +17 -0
  208. data/sig/notiflows/models/users/preference_update_params.rbs +17 -0
  209. data/sig/notiflows/models/users/preferences.rbs +118 -0
  210. data/sig/notiflows/models/users/slack_settings.rbs +24 -0
  211. data/sig/notiflows/models/users/subscription.rbs +32 -0
  212. data/sig/notiflows/models/users/subscription_list_params.rbs +58 -0
  213. data/sig/notiflows/models/users/subscription_retrieve_params.rbs +26 -0
  214. data/sig/notiflows/models/users/subscription_subscribe_params.rbs +25 -0
  215. data/sig/notiflows/models/users/subscription_unsubscribe_params.rbs +26 -0
  216. data/sig/notiflows/models/users/update_preferences_request.rbs +52 -0
  217. data/sig/notiflows/models.rbs +39 -0
  218. data/sig/notiflows/request_options.rbs +34 -0
  219. data/sig/notiflows/resources/deliveries.rbs +24 -0
  220. data/sig/notiflows/resources/notifications.rbs +36 -0
  221. data/sig/notiflows/resources/notiflows.rbs +16 -0
  222. data/sig/notiflows/resources/topics/subscriptions.rbs +31 -0
  223. data/sig/notiflows/resources/topics.rbs +23 -0
  224. data/sig/notiflows/resources/users/channel_settings.rbs +28 -0
  225. data/sig/notiflows/resources/users/deliveries.rbs +28 -0
  226. data/sig/notiflows/resources/users/notifications.rbs +27 -0
  227. data/sig/notiflows/resources/users/preferences.rbs +21 -0
  228. data/sig/notiflows/resources/users/subscriptions.rbs +37 -0
  229. data/sig/notiflows/resources/users.rbs +52 -0
  230. data/sig/notiflows/version.rbs +3 -0
  231. 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,5 @@
1
+ # typed: strong
2
+
3
+ module Notiflows
4
+ VERSION = T.let(T.unsafe(nil), String)
5
+ 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