sentdm 0.0.2

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 (188) hide show
  1. checksums.yaml +7 -0
  2. data/.ignore +2 -0
  3. data/CHANGELOG.md +11 -0
  4. data/README.md +240 -0
  5. data/SECURITY.md +27 -0
  6. data/lib/sentdm/client.rb +115 -0
  7. data/lib/sentdm/errors.rb +228 -0
  8. data/lib/sentdm/file_part.rb +58 -0
  9. data/lib/sentdm/internal/transport/base_client.rb +573 -0
  10. data/lib/sentdm/internal/transport/pooled_net_requester.rb +210 -0
  11. data/lib/sentdm/internal/type/array_of.rb +168 -0
  12. data/lib/sentdm/internal/type/base_model.rb +531 -0
  13. data/lib/sentdm/internal/type/base_page.rb +55 -0
  14. data/lib/sentdm/internal/type/boolean.rb +77 -0
  15. data/lib/sentdm/internal/type/converter.rb +327 -0
  16. data/lib/sentdm/internal/type/enum.rb +131 -0
  17. data/lib/sentdm/internal/type/file_input.rb +111 -0
  18. data/lib/sentdm/internal/type/hash_of.rb +188 -0
  19. data/lib/sentdm/internal/type/request_parameters.rb +42 -0
  20. data/lib/sentdm/internal/type/union.rb +237 -0
  21. data/lib/sentdm/internal/type/unknown.rb +81 -0
  22. data/lib/sentdm/internal/util.rb +920 -0
  23. data/lib/sentdm/internal.rb +20 -0
  24. data/lib/sentdm/models/contact_list_item.rb +96 -0
  25. data/lib/sentdm/models/contact_list_params.rb +30 -0
  26. data/lib/sentdm/models/contact_list_response.rb +40 -0
  27. data/lib/sentdm/models/contact_retrieve_by_phone_params.rb +22 -0
  28. data/lib/sentdm/models/contact_retrieve_id_params.rb +22 -0
  29. data/lib/sentdm/models/message_retrieve_params.rb +14 -0
  30. data/lib/sentdm/models/message_retrieve_response.rb +227 -0
  31. data/lib/sentdm/models/message_send_quick_message_params.rb +34 -0
  32. data/lib/sentdm/models/message_send_to_contact_params.rb +46 -0
  33. data/lib/sentdm/models/message_send_to_phone_params.rb +47 -0
  34. data/lib/sentdm/models/number_lookup_retrieve_params.rb +20 -0
  35. data/lib/sentdm/models/number_lookup_retrieve_response.rb +83 -0
  36. data/lib/sentdm/models/organization_list_params.rb +14 -0
  37. data/lib/sentdm/models/organization_list_response.rb +57 -0
  38. data/lib/sentdm/models/organization_retrieve_profiles_params.rb +14 -0
  39. data/lib/sentdm/models/organization_retrieve_profiles_response.rb +22 -0
  40. data/lib/sentdm/models/organizations/customer_user.rb +96 -0
  41. data/lib/sentdm/models/organizations/user_delete_params.rb +22 -0
  42. data/lib/sentdm/models/organizations/user_invite_params.rb +40 -0
  43. data/lib/sentdm/models/organizations/user_list_params.rb +28 -0
  44. data/lib/sentdm/models/organizations/user_list_response.rb +36 -0
  45. data/lib/sentdm/models/organizations/user_retrieve_params.rb +22 -0
  46. data/lib/sentdm/models/organizations/user_update_role_params.rb +28 -0
  47. data/lib/sentdm/models/profile_summary.rb +45 -0
  48. data/lib/sentdm/models/template_body_content.rb +27 -0
  49. data/lib/sentdm/models/template_create_params.rb +53 -0
  50. data/lib/sentdm/models/template_definition.rb +310 -0
  51. data/lib/sentdm/models/template_delete_params.rb +14 -0
  52. data/lib/sentdm/models/template_list_params.rb +54 -0
  53. data/lib/sentdm/models/template_list_response.rb +40 -0
  54. data/lib/sentdm/models/template_response.rb +100 -0
  55. data/lib/sentdm/models/template_retrieve_params.rb +14 -0
  56. data/lib/sentdm/models/template_variable.rb +74 -0
  57. data/lib/sentdm/models.rb +83 -0
  58. data/lib/sentdm/request_options.rb +77 -0
  59. data/lib/sentdm/resources/contacts.rb +88 -0
  60. data/lib/sentdm/resources/messages.rb +130 -0
  61. data/lib/sentdm/resources/number_lookup.rb +37 -0
  62. data/lib/sentdm/resources/organizations/users.rb +150 -0
  63. data/lib/sentdm/resources/organizations.rb +58 -0
  64. data/lib/sentdm/resources/templates.rb +131 -0
  65. data/lib/sentdm/version.rb +5 -0
  66. data/lib/sentdm.rb +94 -0
  67. data/manifest.yaml +17 -0
  68. data/rbi/sentdm/client.rbi +80 -0
  69. data/rbi/sentdm/errors.rbi +205 -0
  70. data/rbi/sentdm/file_part.rbi +37 -0
  71. data/rbi/sentdm/internal/transport/base_client.rbi +297 -0
  72. data/rbi/sentdm/internal/transport/pooled_net_requester.rbi +82 -0
  73. data/rbi/sentdm/internal/type/array_of.rbi +104 -0
  74. data/rbi/sentdm/internal/type/base_model.rbi +299 -0
  75. data/rbi/sentdm/internal/type/base_page.rbi +42 -0
  76. data/rbi/sentdm/internal/type/boolean.rbi +58 -0
  77. data/rbi/sentdm/internal/type/converter.rbi +204 -0
  78. data/rbi/sentdm/internal/type/enum.rbi +82 -0
  79. data/rbi/sentdm/internal/type/file_input.rbi +59 -0
  80. data/rbi/sentdm/internal/type/hash_of.rbi +104 -0
  81. data/rbi/sentdm/internal/type/request_parameters.rbi +29 -0
  82. data/rbi/sentdm/internal/type/union.rbi +126 -0
  83. data/rbi/sentdm/internal/type/unknown.rbi +58 -0
  84. data/rbi/sentdm/internal/util.rbi +484 -0
  85. data/rbi/sentdm/internal.rbi +16 -0
  86. data/rbi/sentdm/models/contact_list_item.rbi +144 -0
  87. data/rbi/sentdm/models/contact_list_params.rbi +51 -0
  88. data/rbi/sentdm/models/contact_list_response.rbi +74 -0
  89. data/rbi/sentdm/models/contact_retrieve_by_phone_params.rbi +40 -0
  90. data/rbi/sentdm/models/contact_retrieve_id_params.rbi +40 -0
  91. data/rbi/sentdm/models/message_retrieve_params.rbi +27 -0
  92. data/rbi/sentdm/models/message_retrieve_response.rbi +376 -0
  93. data/rbi/sentdm/models/message_send_quick_message_params.rbi +56 -0
  94. data/rbi/sentdm/models/message_send_to_contact_params.rbi +63 -0
  95. data/rbi/sentdm/models/message_send_to_phone_params.rbi +65 -0
  96. data/rbi/sentdm/models/number_lookup_retrieve_params.rbi +35 -0
  97. data/rbi/sentdm/models/number_lookup_retrieve_response.rbi +132 -0
  98. data/rbi/sentdm/models/organization_list_params.rbi +27 -0
  99. data/rbi/sentdm/models/organization_list_response.rbi +131 -0
  100. data/rbi/sentdm/models/organization_retrieve_profiles_params.rbi +30 -0
  101. data/rbi/sentdm/models/organization_retrieve_profiles_response.rbi +47 -0
  102. data/rbi/sentdm/models/organizations/customer_user.rbi +129 -0
  103. data/rbi/sentdm/models/organizations/user_delete_params.rbi +40 -0
  104. data/rbi/sentdm/models/organizations/user_invite_params.rbi +73 -0
  105. data/rbi/sentdm/models/organizations/user_list_params.rbi +48 -0
  106. data/rbi/sentdm/models/organizations/user_list_response.rbi +71 -0
  107. data/rbi/sentdm/models/organizations/user_retrieve_params.rbi +40 -0
  108. data/rbi/sentdm/models/organizations/user_update_role_params.rbi +51 -0
  109. data/rbi/sentdm/models/profile_summary.rbi +74 -0
  110. data/rbi/sentdm/models/template_body_content.rbi +46 -0
  111. data/rbi/sentdm/models/template_create_params.rbi +81 -0
  112. data/rbi/sentdm/models/template_definition.rbi +497 -0
  113. data/rbi/sentdm/models/template_delete_params.rbi +27 -0
  114. data/rbi/sentdm/models/template_list_params.rbi +75 -0
  115. data/rbi/sentdm/models/template_list_response.rbi +74 -0
  116. data/rbi/sentdm/models/template_response.rbi +149 -0
  117. data/rbi/sentdm/models/template_retrieve_params.rbi +27 -0
  118. data/rbi/sentdm/models/template_variable.rbi +120 -0
  119. data/rbi/sentdm/models.rbi +46 -0
  120. data/rbi/sentdm/request_options.rbi +55 -0
  121. data/rbi/sentdm/resources/contacts.rbi +63 -0
  122. data/rbi/sentdm/resources/messages.rbi +97 -0
  123. data/rbi/sentdm/resources/number_lookup.rbi +24 -0
  124. data/rbi/sentdm/resources/organizations/users.rbi +95 -0
  125. data/rbi/sentdm/resources/organizations.rbi +37 -0
  126. data/rbi/sentdm/resources/templates.rbi +103 -0
  127. data/rbi/sentdm/version.rbi +5 -0
  128. data/sig/sentdm/client.rbs +41 -0
  129. data/sig/sentdm/errors.rbs +117 -0
  130. data/sig/sentdm/file_part.rbs +21 -0
  131. data/sig/sentdm/internal/transport/base_client.rbs +133 -0
  132. data/sig/sentdm/internal/transport/pooled_net_requester.rbs +48 -0
  133. data/sig/sentdm/internal/type/array_of.rbs +48 -0
  134. data/sig/sentdm/internal/type/base_model.rbs +102 -0
  135. data/sig/sentdm/internal/type/base_page.rbs +24 -0
  136. data/sig/sentdm/internal/type/boolean.rbs +26 -0
  137. data/sig/sentdm/internal/type/converter.rbs +79 -0
  138. data/sig/sentdm/internal/type/enum.rbs +32 -0
  139. data/sig/sentdm/internal/type/file_input.rbs +25 -0
  140. data/sig/sentdm/internal/type/hash_of.rbs +48 -0
  141. data/sig/sentdm/internal/type/request_parameters.rbs +17 -0
  142. data/sig/sentdm/internal/type/union.rbs +52 -0
  143. data/sig/sentdm/internal/type/unknown.rbs +26 -0
  144. data/sig/sentdm/internal/util.rbs +185 -0
  145. data/sig/sentdm/internal.rbs +9 -0
  146. data/sig/sentdm/models/contact_list_item.rbs +85 -0
  147. data/sig/sentdm/models/contact_list_params.rbs +28 -0
  148. data/sig/sentdm/models/contact_list_response.rbs +52 -0
  149. data/sig/sentdm/models/contact_retrieve_by_phone_params.rbs +23 -0
  150. data/sig/sentdm/models/contact_retrieve_id_params.rbs +20 -0
  151. data/sig/sentdm/models/message_retrieve_params.rbs +15 -0
  152. data/sig/sentdm/models/message_retrieve_response.rbs +188 -0
  153. data/sig/sentdm/models/message_send_quick_message_params.rbs +28 -0
  154. data/sig/sentdm/models/message_send_to_contact_params.rbs +36 -0
  155. data/sig/sentdm/models/message_send_to_phone_params.rbs +36 -0
  156. data/sig/sentdm/models/number_lookup_retrieve_params.rbs +23 -0
  157. data/sig/sentdm/models/number_lookup_retrieve_response.rbs +78 -0
  158. data/sig/sentdm/models/organization_list_params.rbs +15 -0
  159. data/sig/sentdm/models/organization_list_response.rbs +76 -0
  160. data/sig/sentdm/models/organization_retrieve_profiles_params.rbs +15 -0
  161. data/sig/sentdm/models/organization_retrieve_profiles_response.rbs +28 -0
  162. data/sig/sentdm/models/organizations/customer_user.rbs +91 -0
  163. data/sig/sentdm/models/organizations/user_delete_params.rbs +25 -0
  164. data/sig/sentdm/models/organizations/user_invite_params.rbs +44 -0
  165. data/sig/sentdm/models/organizations/user_list_params.rbs +30 -0
  166. data/sig/sentdm/models/organizations/user_list_response.rbs +47 -0
  167. data/sig/sentdm/models/organizations/user_retrieve_params.rbs +25 -0
  168. data/sig/sentdm/models/organizations/user_update_role_params.rbs +32 -0
  169. data/sig/sentdm/models/profile_summary.rbs +51 -0
  170. data/sig/sentdm/models/template_body_content.rbs +32 -0
  171. data/sig/sentdm/models/template_create_params.rbs +43 -0
  172. data/sig/sentdm/models/template_definition.rbs +258 -0
  173. data/sig/sentdm/models/template_delete_params.rbs +15 -0
  174. data/sig/sentdm/models/template_list_params.rbs +46 -0
  175. data/sig/sentdm/models/template_list_response.rbs +52 -0
  176. data/sig/sentdm/models/template_response.rbs +92 -0
  177. data/sig/sentdm/models/template_retrieve_params.rbs +15 -0
  178. data/sig/sentdm/models/template_variable.rbs +87 -0
  179. data/sig/sentdm/models.rbs +43 -0
  180. data/sig/sentdm/request_options.rbs +34 -0
  181. data/sig/sentdm/resources/contacts.rbs +23 -0
  182. data/sig/sentdm/resources/messages.rbs +32 -0
  183. data/sig/sentdm/resources/number_lookup.rbs +12 -0
  184. data/sig/sentdm/resources/organizations/users.rbs +44 -0
  185. data/sig/sentdm/resources/organizations.rbs +18 -0
  186. data/sig/sentdm/resources/templates.rbs +31 -0
  187. data/sig/sentdm/version.rbs +3 -0
  188. metadata +259 -0
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sentdm
4
+ # Specify HTTP behaviour to use for a specific request. These options supplement
5
+ # or override those provided at the client level.
6
+ #
7
+ # When making a request, you can pass an actual {RequestOptions} instance, or
8
+ # simply pass a Hash with symbol keys matching the attributes on this class.
9
+ class RequestOptions < Sentdm::Internal::Type::BaseModel
10
+ # @api private
11
+ #
12
+ # @param opts [Sentdm::RequestOptions, Hash{Symbol=>Object}]
13
+ #
14
+ # @raise [ArgumentError]
15
+ def self.validate!(opts)
16
+ case opts
17
+ in Sentdm::RequestOptions | Hash
18
+ opts.to_h.each_key do |k|
19
+ unless fields.include?(k)
20
+ raise ArgumentError.new("Request `opts` keys must be one of #{fields.keys}, got #{k.inspect}")
21
+ end
22
+ end
23
+ else
24
+ raise ArgumentError.new("Request `opts` must be a Hash or RequestOptions, got #{opts.inspect}")
25
+ end
26
+ end
27
+
28
+ # @!attribute idempotency_key
29
+ # Idempotency key to send with request and all associated retries. Will only be
30
+ # sent for write requests.
31
+ #
32
+ # @return [String, nil]
33
+ optional :idempotency_key, String
34
+
35
+ # @!attribute extra_query
36
+ # Extra query params to send with the request. These are `.merge`’d into any
37
+ # `query` given at the client level.
38
+ #
39
+ # @return [Hash{String=>Array<String>, String, nil}, nil]
40
+ optional :extra_query, Sentdm::Internal::Type::HashOf[Sentdm::Internal::Type::ArrayOf[String]]
41
+
42
+ # @!attribute extra_headers
43
+ # Extra headers to send with the request. These are `.merged`’d into any
44
+ # `extra_headers` given at the client level.
45
+ #
46
+ # @return [Hash{String=>String, nil}, nil]
47
+ optional :extra_headers, Sentdm::Internal::Type::HashOf[String, nil?: true]
48
+
49
+ # @!attribute extra_body
50
+ # Extra data to send with the request. These are deep merged into any data
51
+ # generated as part of the normal request.
52
+ #
53
+ # @return [Object, nil]
54
+ optional :extra_body, Sentdm::Internal::Type::HashOf[Sentdm::Internal::Type::Unknown]
55
+
56
+ # @!attribute max_retries
57
+ # Maximum number of retries to attempt after a failed initial request.
58
+ #
59
+ # @return [Integer, nil]
60
+ optional :max_retries, Integer
61
+
62
+ # @!attribute timeout
63
+ # Request timeout in seconds.
64
+ #
65
+ # @return [Float, nil]
66
+ optional :timeout, Float
67
+
68
+ # @!method initialize(values = {})
69
+ # Returns a new instance of RequestOptions.
70
+ #
71
+ # @param values [Hash{Symbol=>Object}]
72
+
73
+ define_sorbet_constant!(:OrHash) do
74
+ T.type_alias { T.any(Sentdm::RequestOptions, Sentdm::Internal::AnyHash) }
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sentdm
4
+ module Resources
5
+ class Contacts
6
+ # Retrieves a paginated list of contacts for the authenticated customer. Supports
7
+ # server-side pagination with configurable page size. The customer ID is extracted
8
+ # from the authentication token.
9
+ #
10
+ # @overload list(page:, page_size:, request_options: {})
11
+ #
12
+ # @param page [Integer] The page number (zero-indexed). Default is 0.
13
+ #
14
+ # @param page_size [Integer] The number of items per page. Default is 20.
15
+ #
16
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
17
+ #
18
+ # @return [Sentdm::Models::ContactListResponse]
19
+ #
20
+ # @see Sentdm::Models::ContactListParams
21
+ def list(params)
22
+ parsed, options = Sentdm::ContactListParams.dump_request(params)
23
+ @client.request(
24
+ method: :get,
25
+ path: "v2/contacts",
26
+ query: parsed.transform_keys(page_size: "pageSize"),
27
+ model: Sentdm::Models::ContactListResponse,
28
+ options: options
29
+ )
30
+ end
31
+
32
+ # Retrieves a contact by their phone number for the authenticated customer. Phone
33
+ # number should be in international format (e.g., +1234567890). The customer ID is
34
+ # extracted from the authentication token.
35
+ #
36
+ # @overload retrieve_by_phone(phone_number:, request_options: {})
37
+ #
38
+ # @param phone_number [String] The phone number in international format (e.g., +1234567890)
39
+ #
40
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
41
+ #
42
+ # @return [Sentdm::Models::ContactListItem]
43
+ #
44
+ # @see Sentdm::Models::ContactRetrieveByPhoneParams
45
+ def retrieve_by_phone(params)
46
+ parsed, options = Sentdm::ContactRetrieveByPhoneParams.dump_request(params)
47
+ @client.request(
48
+ method: :get,
49
+ path: "v2/contacts/phone",
50
+ query: parsed.transform_keys(phone_number: "phoneNumber"),
51
+ model: Sentdm::ContactListItem,
52
+ options: options
53
+ )
54
+ end
55
+
56
+ # Retrieves a specific contact by their unique identifier for the authenticated
57
+ # customer. The customer ID is extracted from the authentication token. Returns
58
+ # detailed contact information including phone number and creation timestamp.
59
+ #
60
+ # @overload retrieve_id(id:, request_options: {})
61
+ #
62
+ # @param id [String] The unique identifier (GUID) of the resource to retrieve
63
+ #
64
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
65
+ #
66
+ # @return [Sentdm::Models::ContactListItem]
67
+ #
68
+ # @see Sentdm::Models::ContactRetrieveIDParams
69
+ def retrieve_id(params)
70
+ parsed, options = Sentdm::ContactRetrieveIDParams.dump_request(params)
71
+ @client.request(
72
+ method: :get,
73
+ path: "v2/contacts/id",
74
+ query: parsed,
75
+ model: Sentdm::ContactListItem,
76
+ options: options
77
+ )
78
+ end
79
+
80
+ # @api private
81
+ #
82
+ # @param client [Sentdm::Client]
83
+ def initialize(client:)
84
+ @client = client
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sentdm
4
+ module Resources
5
+ class Messages
6
+ # Retrieves comprehensive details about a specific message using the message ID.
7
+ # Returns complete message data including delivery status, channel information,
8
+ # template details, contact information, and pricing. The customer ID is extracted
9
+ # from the authentication token to ensure the message belongs to the authenticated
10
+ # customer.
11
+ #
12
+ # @overload retrieve(id, request_options: {})
13
+ #
14
+ # @param id [String]
15
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
16
+ #
17
+ # @return [Sentdm::Models::MessageRetrieveResponse]
18
+ #
19
+ # @see Sentdm::Models::MessageRetrieveParams
20
+ def retrieve(id, params = {})
21
+ @client.request(
22
+ method: :get,
23
+ path: ["v2/messages/%1$s", id],
24
+ model: Sentdm::Models::MessageRetrieveResponse,
25
+ options: params[:request_options]
26
+ )
27
+ end
28
+
29
+ # Some parameter documentations has been truncated, see
30
+ # {Sentdm::Models::MessageSendQuickMessageParams} for more details.
31
+ #
32
+ # Sends a message to a phone number using the default template. This endpoint is
33
+ # rate limited to 5 messages per customer per day. The customer ID is extracted
34
+ # from the authentication token.
35
+ #
36
+ # @overload send_quick_message(custom_message:, phone_number:, request_options: {})
37
+ #
38
+ # @param custom_message [String] The custom message content to include in the template
39
+ #
40
+ # @param phone_number [String] The phone number to send the message to, in international format (e.g., +1234567
41
+ #
42
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
43
+ #
44
+ # @return [nil]
45
+ #
46
+ # @see Sentdm::Models::MessageSendQuickMessageParams
47
+ def send_quick_message(params)
48
+ parsed, options = Sentdm::MessageSendQuickMessageParams.dump_request(params)
49
+ @client.request(
50
+ method: :post,
51
+ path: "v2/messages/quick-message",
52
+ body: parsed,
53
+ model: NilClass,
54
+ options: options
55
+ )
56
+ end
57
+
58
+ # Some parameter documentations has been truncated, see
59
+ # {Sentdm::Models::MessageSendToContactParams} for more details.
60
+ #
61
+ # Sends a message to a specific contact using a template. The message can be sent
62
+ # via SMS or WhatsApp depending on the contact's capabilities. Optionally specify
63
+ # a webhook URL to receive delivery status updates. The customer ID is extracted
64
+ # from the authentication token.
65
+ #
66
+ # @overload send_to_contact(contact_id:, template_id:, template_variables: nil, request_options: {})
67
+ #
68
+ # @param contact_id [String] The unique identifier of the contact to send the message to
69
+ #
70
+ # @param template_id [String] The unique identifier of the template to use for the message
71
+ #
72
+ # @param template_variables [Hash{Symbol=>String}, nil] Optional key-value pairs of template variables to replace in the template body.
73
+ #
74
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
75
+ #
76
+ # @return [nil]
77
+ #
78
+ # @see Sentdm::Models::MessageSendToContactParams
79
+ def send_to_contact(params)
80
+ parsed, options = Sentdm::MessageSendToContactParams.dump_request(params)
81
+ @client.request(
82
+ method: :post,
83
+ path: "v2/messages/contact",
84
+ body: parsed,
85
+ model: NilClass,
86
+ options: options
87
+ )
88
+ end
89
+
90
+ # Some parameter documentations has been truncated, see
91
+ # {Sentdm::Models::MessageSendToPhoneParams} for more details.
92
+ #
93
+ # Sends a message to a phone number using a template. The phone number doesn't
94
+ # need to be a pre-existing contact. The message can be sent via SMS or WhatsApp.
95
+ # Optionally specify a webhook URL to receive delivery status updates. The
96
+ # customer ID is extracted from the authentication token.
97
+ #
98
+ # @overload send_to_phone(phone_number:, template_id:, template_variables: nil, request_options: {})
99
+ #
100
+ # @param phone_number [String] The phone number to send the message to, in international format (e.g., +1234567
101
+ #
102
+ # @param template_id [String] The unique identifier of the template to use for the message
103
+ #
104
+ # @param template_variables [Hash{Symbol=>String}, nil] Optional key-value pairs of template variables to replace in the template body.
105
+ #
106
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
107
+ #
108
+ # @return [nil]
109
+ #
110
+ # @see Sentdm::Models::MessageSendToPhoneParams
111
+ def send_to_phone(params)
112
+ parsed, options = Sentdm::MessageSendToPhoneParams.dump_request(params)
113
+ @client.request(
114
+ method: :post,
115
+ path: "v2/messages/phone",
116
+ body: parsed,
117
+ model: NilClass,
118
+ options: options
119
+ )
120
+ end
121
+
122
+ # @api private
123
+ #
124
+ # @param client [Sentdm::Client]
125
+ def initialize(client:)
126
+ @client = client
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sentdm
4
+ module Resources
5
+ class NumberLookup
6
+ # Retrieves detailed information about a phone number including validation,
7
+ # formatting, country information, and available messaging channels. The customer
8
+ # ID is extracted from the authentication token.
9
+ #
10
+ # @overload retrieve(phone_number:, request_options: {})
11
+ #
12
+ # @param phone_number [String]
13
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
14
+ #
15
+ # @return [Sentdm::Models::NumberLookupRetrieveResponse]
16
+ #
17
+ # @see Sentdm::Models::NumberLookupRetrieveParams
18
+ def retrieve(params)
19
+ parsed, options = Sentdm::NumberLookupRetrieveParams.dump_request(params)
20
+ @client.request(
21
+ method: :get,
22
+ path: "v2/number-lookup",
23
+ query: parsed.transform_keys(phone_number: "phoneNumber"),
24
+ model: Sentdm::Models::NumberLookupRetrieveResponse,
25
+ options: options
26
+ )
27
+ end
28
+
29
+ # @api private
30
+ #
31
+ # @param client [Sentdm::Client]
32
+ def initialize(client:)
33
+ @client = client
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sentdm
4
+ module Resources
5
+ class Organizations
6
+ class Users
7
+ # Retrieves a specific user by their ID. Requires appropriate permissions. The
8
+ # customerId can be either an organization ID or a profile ID.
9
+ #
10
+ # @overload retrieve(user_id, customer_id:, request_options: {})
11
+ #
12
+ # @param user_id [String]
13
+ # @param customer_id [String]
14
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
15
+ #
16
+ # @return [Sentdm::Models::Organizations::CustomerUser]
17
+ #
18
+ # @see Sentdm::Models::Organizations::UserRetrieveParams
19
+ def retrieve(user_id, params)
20
+ parsed, options = Sentdm::Organizations::UserRetrieveParams.dump_request(params)
21
+ customer_id =
22
+ parsed.delete(:customer_id) do
23
+ raise ArgumentError.new("missing required path argument #{_1}")
24
+ end
25
+ @client.request(
26
+ method: :get,
27
+ path: ["v2/organizations/%1$s/users/%2$s", customer_id, user_id],
28
+ model: Sentdm::Organizations::CustomerUser,
29
+ options: options
30
+ )
31
+ end
32
+
33
+ # Retrieves all users associated with an organization or sender profile. Requires
34
+ # appropriate permissions. Supports pagination.
35
+ #
36
+ # @overload list(customer_id, page:, page_size:, request_options: {})
37
+ #
38
+ # @param customer_id [String]
39
+ # @param page [Integer]
40
+ # @param page_size [Integer]
41
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
42
+ #
43
+ # @return [Sentdm::Models::Organizations::UserListResponse]
44
+ #
45
+ # @see Sentdm::Models::Organizations::UserListParams
46
+ def list(customer_id, params)
47
+ parsed, options = Sentdm::Organizations::UserListParams.dump_request(params)
48
+ @client.request(
49
+ method: :get,
50
+ path: ["v2/organizations/%1$s/users", customer_id],
51
+ query: parsed.transform_keys(page_size: "pageSize"),
52
+ model: Sentdm::Models::Organizations::UserListResponse,
53
+ options: options
54
+ )
55
+ end
56
+
57
+ # Removes a user from an organization or sender profile. Requires admin
58
+ # permissions. This action permanently deletes the user association.
59
+ #
60
+ # @overload delete(user_id, customer_id:, request_options: {})
61
+ #
62
+ # @param user_id [String]
63
+ # @param customer_id [String]
64
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
65
+ #
66
+ # @return [nil]
67
+ #
68
+ # @see Sentdm::Models::Organizations::UserDeleteParams
69
+ def delete(user_id, params)
70
+ parsed, options = Sentdm::Organizations::UserDeleteParams.dump_request(params)
71
+ customer_id =
72
+ parsed.delete(:customer_id) do
73
+ raise ArgumentError.new("missing required path argument #{_1}")
74
+ end
75
+ @client.request(
76
+ method: :delete,
77
+ path: ["v2/organizations/%1$s/users/%2$s", customer_id, user_id],
78
+ model: NilClass,
79
+ options: options
80
+ )
81
+ end
82
+
83
+ # Invites a user to an organization or sender profile with a specified role.
84
+ # Requires appropriate permissions. The customerId can be either an organization
85
+ # ID or a profile ID.
86
+ #
87
+ # @overload invite(customer_id, email: nil, invited_by: nil, name: nil, role: nil, request_options: {})
88
+ #
89
+ # @param customer_id [String]
90
+ # @param email [String]
91
+ # @param invited_by [String, nil]
92
+ # @param name [String]
93
+ # @param role [String]
94
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
95
+ #
96
+ # @return [Sentdm::Models::Organizations::CustomerUser]
97
+ #
98
+ # @see Sentdm::Models::Organizations::UserInviteParams
99
+ def invite(customer_id, params = {})
100
+ parsed, options = Sentdm::Organizations::UserInviteParams.dump_request(params)
101
+ @client.request(
102
+ method: :post,
103
+ path: ["v2/organizations/%1$s/users", customer_id],
104
+ body: parsed,
105
+ model: Sentdm::Organizations::CustomerUser,
106
+ options: options
107
+ )
108
+ end
109
+
110
+ # Updates a user's role within an organization or sender profile. Requires admin
111
+ # permissions. Valid roles are: admin, billing, developer.
112
+ #
113
+ # @overload update_role(user_id, customer_id:, role: nil, request_options: {})
114
+ #
115
+ # @param user_id [String] Path param
116
+ #
117
+ # @param customer_id [String] Path param
118
+ #
119
+ # @param role [String] Body param
120
+ #
121
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
122
+ #
123
+ # @return [Sentdm::Models::Organizations::CustomerUser]
124
+ #
125
+ # @see Sentdm::Models::Organizations::UserUpdateRoleParams
126
+ def update_role(user_id, params)
127
+ parsed, options = Sentdm::Organizations::UserUpdateRoleParams.dump_request(params)
128
+ customer_id =
129
+ parsed.delete(:customer_id) do
130
+ raise ArgumentError.new("missing required path argument #{_1}")
131
+ end
132
+ @client.request(
133
+ method: :put,
134
+ path: ["v2/organizations/%1$s/users/%2$s", customer_id, user_id],
135
+ body: parsed,
136
+ model: Sentdm::Organizations::CustomerUser,
137
+ options: options
138
+ )
139
+ end
140
+
141
+ # @api private
142
+ #
143
+ # @param client [Sentdm::Client]
144
+ def initialize(client:)
145
+ @client = client
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sentdm
4
+ module Resources
5
+ class Organizations
6
+ # @return [Sentdm::Resources::Organizations::Users]
7
+ attr_reader :users
8
+
9
+ # Retrieves all organizations that the authenticated user has access to, including
10
+ # the sender profiles within each organization that the user can access. Returns
11
+ # organization details with nested profiles filtered by user permissions.
12
+ #
13
+ # @overload list(request_options: {})
14
+ #
15
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
16
+ #
17
+ # @return [Sentdm::Models::OrganizationListResponse]
18
+ #
19
+ # @see Sentdm::Models::OrganizationListParams
20
+ def list(params = {})
21
+ @client.request(
22
+ method: :get,
23
+ path: "v2/organizations",
24
+ model: Sentdm::Models::OrganizationListResponse,
25
+ options: params[:request_options]
26
+ )
27
+ end
28
+
29
+ # Retrieves all sender profiles within an organization that the authenticated user
30
+ # has access to. Returns filtered list based on user's permissions.
31
+ #
32
+ # @overload retrieve_profiles(org_id, request_options: {})
33
+ #
34
+ # @param org_id [String]
35
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
36
+ #
37
+ # @return [Sentdm::Models::OrganizationRetrieveProfilesResponse]
38
+ #
39
+ # @see Sentdm::Models::OrganizationRetrieveProfilesParams
40
+ def retrieve_profiles(org_id, params = {})
41
+ @client.request(
42
+ method: :get,
43
+ path: ["v2/organizations/%1$s/profiles", org_id],
44
+ model: Sentdm::Models::OrganizationRetrieveProfilesResponse,
45
+ options: params[:request_options]
46
+ )
47
+ end
48
+
49
+ # @api private
50
+ #
51
+ # @param client [Sentdm::Client]
52
+ def initialize(client:)
53
+ @client = client
54
+ @users = Sentdm::Resources::Organizations::Users.new(client: client)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,131 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sentdm
4
+ module Resources
5
+ class Templates
6
+ # Some parameter documentations has been truncated, see
7
+ # {Sentdm::Models::TemplateCreateParams} for more details.
8
+ #
9
+ # Creates a new message template for the authenticated customer with comprehensive
10
+ # template definitions including headers, body, footer, and interactive buttons.
11
+ # Supports automatic metadata generation using AI (display name, language,
12
+ # category). Optionally submits the template for WhatsApp review. The customer ID
13
+ # is extracted from the authentication token.
14
+ #
15
+ # @overload create(definition:, category: nil, language: nil, submit_for_review: nil, request_options: {})
16
+ #
17
+ # @param definition [Sentdm::Models::TemplateDefinition] Template definition containing header, body, footer, and buttons
18
+ #
19
+ # @param category [String, nil] The template category (e.g., MARKETING, UTILITY, AUTHENTICATION). Can only be se
20
+ #
21
+ # @param language [String, nil] The template language code (e.g., en_US, es_ES). Can only be set when creating a
22
+ #
23
+ # @param submit_for_review [Boolean] When false, the template will be saved as draft.
24
+ #
25
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
26
+ #
27
+ # @return [Sentdm::Models::TemplateResponse]
28
+ #
29
+ # @see Sentdm::Models::TemplateCreateParams
30
+ def create(params)
31
+ parsed, options = Sentdm::TemplateCreateParams.dump_request(params)
32
+ @client.request(
33
+ method: :post,
34
+ path: "v2/templates",
35
+ body: parsed,
36
+ model: Sentdm::TemplateResponse,
37
+ options: options
38
+ )
39
+ end
40
+
41
+ # Retrieves a specific message template by its unique identifier for the
42
+ # authenticated customer with comprehensive template definitions including
43
+ # headers, body, footer, and interactive buttons. The customer ID is extracted
44
+ # from the authentication token.
45
+ #
46
+ # @overload retrieve(id, request_options: {})
47
+ #
48
+ # @param id [String]
49
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
50
+ #
51
+ # @return [Sentdm::Models::TemplateResponse]
52
+ #
53
+ # @see Sentdm::Models::TemplateRetrieveParams
54
+ def retrieve(id, params = {})
55
+ @client.request(
56
+ method: :get,
57
+ path: ["v2/templates/%1$s", id],
58
+ model: Sentdm::TemplateResponse,
59
+ options: params[:request_options]
60
+ )
61
+ end
62
+
63
+ # Retrieves all message templates available for the authenticated customer with
64
+ # comprehensive template definitions including headers, body, footer, and
65
+ # interactive buttons. Supports advanced filtering by search term, status, and
66
+ # category, plus pagination. The customer ID is extracted from the authentication
67
+ # token.
68
+ #
69
+ # @overload list(page:, page_size:, category: nil, search: nil, status: nil, request_options: {})
70
+ #
71
+ # @param page [Integer] The page number (zero-indexed). Default is 0.
72
+ #
73
+ # @param page_size [Integer] The number of items per page (1-1000). Default is 100.
74
+ #
75
+ # @param category [String, nil] Optional filter by template category (e.g., MARKETING, UTILITY, AUTHENTICATION)
76
+ #
77
+ # @param search [String, nil] Optional search term to filter templates by name or content
78
+ #
79
+ # @param status [String, nil] Optional filter by template status (e.g., APPROVED, PENDING, REJECTED, DRAFT)
80
+ #
81
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
82
+ #
83
+ # @return [Sentdm::Models::TemplateListResponse]
84
+ #
85
+ # @see Sentdm::Models::TemplateListParams
86
+ def list(params)
87
+ parsed, options = Sentdm::TemplateListParams.dump_request(params)
88
+ @client.request(
89
+ method: :get,
90
+ path: "v2/templates",
91
+ query: parsed.transform_keys(page_size: "pageSize"),
92
+ model: Sentdm::Models::TemplateListResponse,
93
+ options: options
94
+ )
95
+ end
96
+
97
+ # Deletes a specific message template by its unique identifier for the
98
+ # authenticated customer with smart deletion strategy. Deletion behavior: - If
99
+ # template has NO messages: Permanently deleted from database (hard delete). - If
100
+ # template has messages: Marked as deleted but preserved for message history (soft
101
+ # delete with snapshot). The template must exist and belong to the authenticated
102
+ # customer to be deleted successfully. The customer ID is extracted from the
103
+ # authentication token.
104
+ #
105
+ # @overload delete(id, request_options: {})
106
+ #
107
+ # @param id [String] The unique identifier (GUID) of the resource to retrieve
108
+ #
109
+ # @param request_options [Sentdm::RequestOptions, Hash{Symbol=>Object}, nil]
110
+ #
111
+ # @return [nil]
112
+ #
113
+ # @see Sentdm::Models::TemplateDeleteParams
114
+ def delete(id, params = {})
115
+ @client.request(
116
+ method: :delete,
117
+ path: ["v2/templates/%1$s", id],
118
+ model: NilClass,
119
+ options: params[:request_options]
120
+ )
121
+ end
122
+
123
+ # @api private
124
+ #
125
+ # @param client [Sentdm::Client]
126
+ def initialize(client:)
127
+ @client = client
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sentdm
4
+ VERSION = "0.0.2"
5
+ end