sentdm 0.25.0 → 0.27.0
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 +4 -4
- data/CHANGELOG.md +39 -0
- data/README.md +7 -11
- data/lib/sentdm/client.rb +4 -0
- data/lib/sentdm/models/api_response_of_contact_message_summary.rb +43 -0
- data/lib/sentdm/models/api_response_of_conversation_messages_list.rb +43 -0
- data/lib/sentdm/models/{sent_dm_services_common_contracts_poc_os_authentication_config.rb → authentication_config.rb} +2 -3
- data/lib/sentdm/models/{sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info.rb → brand_business_info.rb} +5 -7
- data/lib/sentdm/models/{sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info.rb → brand_compliance_info.rb} +2 -10
- data/lib/sentdm/models/{sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info.rb → brand_contact_info.rb} +1 -1
- data/lib/sentdm/models/brands_brand_data.rb +9 -13
- data/lib/sentdm/models/contact_message_summary.rb +76 -0
- data/lib/sentdm/models/contact_retrieve_message_summary_params.rb +26 -0
- data/lib/sentdm/models/conversation_list_messages_params.rb +38 -0
- data/lib/sentdm/models/conversation_list_params.rb +32 -0
- data/lib/sentdm/models/conversation_messages_list.rb +245 -0
- data/lib/sentdm/models/inbound_message_event.rb +52 -0
- data/lib/sentdm/models/inbound_message_event_payload.rb +81 -0
- data/lib/sentdm/models/message_event.rb +53 -0
- data/lib/sentdm/models/message_event_payload.rb +92 -0
- data/lib/sentdm/models/message_send_response.rb +2 -6
- data/lib/sentdm/models/profile_detail.rb +13 -13
- data/lib/sentdm/models/profile_update_params.rb +2 -2
- data/lib/sentdm/models/profiles/{api_response_of_tcr_campaign_with_use_cases.rb → api_response_of_brand_campaign.rb} +5 -5
- data/lib/sentdm/models/profiles/{campaign_list_response.rb → api_response_of_list_of_brand_campaign.rb} +4 -6
- data/lib/sentdm/models/profiles/{tcr_campaign_with_use_cases.rb → brand_campaign.rb} +63 -111
- data/lib/sentdm/models/profiles/campaign_data.rb +13 -6
- data/lib/sentdm/models/profiles/campaign_use_case.rb +71 -0
- data/lib/sentdm/models/profiles/{sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data.rb → campaign_use_case_data.rb} +1 -1
- data/lib/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_body.rb → template_body.rb} +2 -3
- data/lib/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_button.rb → template_button.rb} +5 -6
- data/lib/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_button_props.rb → template_button_props.rb} +2 -3
- data/lib/sentdm/models/template_definition.rb +15 -19
- data/lib/sentdm/models/template_event.rb +52 -0
- data/lib/sentdm/models/template_event_payload.rb +88 -0
- data/lib/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_footer.rb → template_footer.rb} +1 -1
- data/lib/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_header.rb → template_header.rb} +2 -3
- data/lib/sentdm/models/webhook_list_events_response.rb +45 -3
- data/lib/sentdm/models.rb +44 -27
- data/lib/sentdm/resources/contacts.rb +30 -0
- data/lib/sentdm/resources/conversations.rb +82 -0
- data/lib/sentdm/resources/messages.rb +6 -1
- data/lib/sentdm/resources/profiles/campaigns.rb +6 -6
- data/lib/sentdm/resources/profiles.rb +34 -22
- data/lib/sentdm/resources/users.rb +3 -3
- data/lib/sentdm/version.rb +1 -1
- data/lib/sentdm.rb +28 -14
- data/rbi/sentdm/client.rbi +3 -0
- data/rbi/sentdm/models/api_response_of_contact_message_summary.rbi +79 -0
- data/rbi/sentdm/models/api_response_of_conversation_messages_list.rbi +79 -0
- data/rbi/sentdm/models/{sent_dm_services_common_contracts_poc_os_authentication_config.rbi → authentication_config.rbi} +2 -5
- data/rbi/sentdm/models/{sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info.rbi → brand_business_info.rbi} +12 -30
- data/rbi/sentdm/models/{sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info.rbi → brand_compliance_info.rbi} +2 -13
- data/rbi/sentdm/models/{sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info.rbi → brand_contact_info.rbi} +2 -5
- data/rbi/sentdm/models/brands_brand_data.rbi +12 -51
- data/rbi/sentdm/models/contact_message_summary.rbi +144 -0
- data/rbi/sentdm/models/contact_retrieve_message_summary_params.rbi +49 -0
- data/rbi/sentdm/models/conversation_list_messages_params.rbi +65 -0
- data/rbi/sentdm/models/conversation_list_params.rbi +51 -0
- data/rbi/sentdm/models/conversation_messages_list.rbi +419 -0
- data/rbi/sentdm/models/inbound_message_event.rbi +88 -0
- data/rbi/sentdm/models/inbound_message_event_payload.rbi +122 -0
- data/rbi/sentdm/models/message_event.rbi +86 -0
- data/rbi/sentdm/models/message_event_payload.rbi +132 -0
- data/rbi/sentdm/models/message_send_response.rbi +2 -4
- data/rbi/sentdm/models/profile_detail.rbi +10 -12
- data/rbi/sentdm/models/profile_update_params.rbi +2 -2
- data/rbi/sentdm/models/profiles/{api_response_of_tcr_campaign_with_use_cases.rbi → api_response_of_brand_campaign.rbi} +8 -10
- data/rbi/sentdm/models/profiles/{campaign_list_response.rbi → api_response_of_list_of_brand_campaign.rbi} +5 -13
- data/rbi/sentdm/models/profiles/brand_campaign.rbi +299 -0
- data/rbi/sentdm/models/profiles/campaign_data.rbi +16 -18
- data/rbi/sentdm/models/profiles/campaign_use_case.rbi +110 -0
- data/rbi/sentdm/models/profiles/{sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data.rbi → campaign_use_case_data.rbi} +2 -2
- data/rbi/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_body.rbi → template_body.rbi} +2 -7
- data/rbi/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_button.rbi → template_button.rbi} +6 -22
- data/rbi/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_button_props.rbi → template_button_props.rbi} +2 -5
- data/rbi/sentdm/models/template_definition.rbi +19 -87
- data/rbi/sentdm/models/template_event.rbi +84 -0
- data/rbi/sentdm/models/template_event_payload.rbi +131 -0
- data/rbi/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_footer.rbi → template_footer.rbi} +2 -5
- data/rbi/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_header.rbi → template_header.rbi} +2 -5
- data/rbi/sentdm/models/webhook_list_events_response.rbi +60 -4
- data/rbi/sentdm/models.rbi +48 -27
- data/rbi/sentdm/resources/contacts.rbi +20 -0
- data/rbi/sentdm/resources/conversations.rbi +61 -0
- data/rbi/sentdm/resources/messages.rbi +6 -1
- data/rbi/sentdm/resources/profiles/campaigns.rbi +3 -3
- data/rbi/sentdm/resources/profiles.rbi +32 -20
- data/rbi/sentdm/resources/users.rbi +3 -2
- data/sig/sentdm/client.rbs +2 -0
- data/sig/sentdm/models/api_response_of_contact_message_summary.rbs +39 -0
- data/sig/sentdm/models/api_response_of_conversation_messages_list.rbs +39 -0
- data/sig/sentdm/models/{sent_dm_services_common_contracts_poc_os_authentication_config.rbs → authentication_config.rbs} +2 -2
- data/sig/sentdm/models/{sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_business_info.rbs → brand_business_info.rbs} +7 -7
- data/sig/sentdm/models/{sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_compliance_info.rbs → brand_compliance_info.rbs} +2 -7
- data/sig/sentdm/models/{sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_brands_brand_contact_info.rbs → brand_contact_info.rbs} +2 -2
- data/sig/sentdm/models/brands_brand_data.rbs +12 -12
- data/sig/sentdm/models/contact_message_summary.rbs +84 -0
- data/sig/sentdm/models/contact_retrieve_message_summary_params.rbs +30 -0
- data/sig/sentdm/models/conversation_list_messages_params.rbs +38 -0
- data/sig/sentdm/models/conversation_list_params.rbs +34 -0
- data/sig/sentdm/models/conversation_messages_list.rbs +240 -0
- data/sig/sentdm/models/inbound_message_event.rbs +39 -0
- data/sig/sentdm/models/inbound_message_event_payload.rbs +69 -0
- data/sig/sentdm/models/message_event.rbs +39 -0
- data/sig/sentdm/models/message_event_payload.rbs +72 -0
- data/sig/sentdm/models/profile_detail.rbs +0 -5
- data/sig/sentdm/models/profiles/{campaign_list_response.rbs → api_response_of_brand_campaign.rbs} +6 -6
- data/sig/sentdm/models/profiles/{api_response_of_tcr_campaign_with_use_cases.rbs → api_response_of_list_of_brand_campaign.rbs} +6 -6
- data/sig/sentdm/models/profiles/brand_campaign.rbs +194 -0
- data/sig/sentdm/models/profiles/campaign_data.rbs +12 -7
- data/sig/sentdm/models/profiles/campaign_use_case.rbs +66 -0
- data/sig/sentdm/models/profiles/{sent_dm_services_endpoints_customer_ap_iv3_contracts_requests_campaigns_campaign_use_case_data.rbs → campaign_use_case_data.rbs} +2 -2
- data/sig/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_body.rbs → template_body.rbs} +2 -2
- data/sig/sentdm/models/template_button.rbs +28 -0
- data/sig/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_button_props.rbs → template_button_props.rbs} +2 -2
- data/sig/sentdm/models/template_definition.rbs +20 -20
- data/sig/sentdm/models/template_event.rbs +39 -0
- data/sig/sentdm/models/template_event_payload.rbs +76 -0
- data/sig/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_footer.rbs → template_footer.rbs} +2 -2
- data/sig/sentdm/models/{sent_dm_services_common_contracts_poc_os_template_header.rbs → template_header.rbs} +2 -2
- data/sig/sentdm/models/webhook_list_events_response.rbs +18 -5
- data/sig/sentdm/models.rbs +44 -18
- data/sig/sentdm/resources/contacts.rbs +6 -0
- data/sig/sentdm/resources/conversations.rbs +22 -0
- data/sig/sentdm/resources/profiles/campaigns.rbs +3 -3
- metadata +86 -44
- data/lib/sentdm/models/profiles/base_dto.rb +0 -32
- data/rbi/sentdm/models/profiles/base_dto.rbi +0 -53
- data/rbi/sentdm/models/profiles/tcr_campaign_with_use_cases.rbi +0 -425
- data/sig/sentdm/models/profiles/base_dto.rbs +0 -27
- data/sig/sentdm/models/profiles/tcr_campaign_with_use_cases.rbs +0 -306
- data/sig/sentdm/models/sent_dm_services_common_contracts_poc_os_template_button.rbs +0 -32
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Sentdm
|
|
4
|
+
module Models
|
|
5
|
+
class ConversationMessagesList < Sentdm::Internal::Type::BaseModel
|
|
6
|
+
OrHash =
|
|
7
|
+
T.type_alias do
|
|
8
|
+
T.any(Sentdm::ConversationMessagesList, Sentdm::Internal::AnyHash)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# The messages on this page, most recent first.
|
|
12
|
+
sig do
|
|
13
|
+
returns(T.nilable(T::Array[Sentdm::ConversationMessagesList::Message]))
|
|
14
|
+
end
|
|
15
|
+
attr_reader :messages
|
|
16
|
+
|
|
17
|
+
sig do
|
|
18
|
+
params(
|
|
19
|
+
messages: T::Array[Sentdm::ConversationMessagesList::Message::OrHash]
|
|
20
|
+
).void
|
|
21
|
+
end
|
|
22
|
+
attr_writer :messages
|
|
23
|
+
|
|
24
|
+
# Pagination metadata for list responses
|
|
25
|
+
sig { returns(T.nilable(Sentdm::PaginationMeta)) }
|
|
26
|
+
attr_reader :pagination
|
|
27
|
+
|
|
28
|
+
sig { params(pagination: Sentdm::PaginationMeta::OrHash).void }
|
|
29
|
+
attr_writer :pagination
|
|
30
|
+
|
|
31
|
+
# A paginated list of messages — used by both conversation read endpoints.
|
|
32
|
+
sig do
|
|
33
|
+
params(
|
|
34
|
+
messages: T::Array[Sentdm::ConversationMessagesList::Message::OrHash],
|
|
35
|
+
pagination: Sentdm::PaginationMeta::OrHash
|
|
36
|
+
).returns(T.attached_class)
|
|
37
|
+
end
|
|
38
|
+
def self.new(
|
|
39
|
+
# The messages on this page, most recent first.
|
|
40
|
+
messages: nil,
|
|
41
|
+
# Pagination metadata for list responses
|
|
42
|
+
pagination: nil
|
|
43
|
+
)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
sig do
|
|
47
|
+
override.returns(
|
|
48
|
+
{
|
|
49
|
+
messages: T::Array[Sentdm::ConversationMessagesList::Message],
|
|
50
|
+
pagination: Sentdm::PaginationMeta
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
end
|
|
54
|
+
def to_hash
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
class Message < Sentdm::Internal::Type::BaseModel
|
|
58
|
+
OrHash =
|
|
59
|
+
T.type_alias do
|
|
60
|
+
T.any(
|
|
61
|
+
Sentdm::ConversationMessagesList::Message,
|
|
62
|
+
Sentdm::Internal::AnyHash
|
|
63
|
+
)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
sig { returns(T.nilable(String)) }
|
|
67
|
+
attr_reader :id
|
|
68
|
+
|
|
69
|
+
sig { params(id: String).void }
|
|
70
|
+
attr_writer :id
|
|
71
|
+
|
|
72
|
+
sig { returns(T.nilable(Float)) }
|
|
73
|
+
attr_accessor :active_contact_price
|
|
74
|
+
|
|
75
|
+
sig { returns(T.nilable(String)) }
|
|
76
|
+
attr_reader :channel
|
|
77
|
+
|
|
78
|
+
sig { params(channel: String).void }
|
|
79
|
+
attr_writer :channel
|
|
80
|
+
|
|
81
|
+
sig { returns(T.nilable(String)) }
|
|
82
|
+
attr_reader :contact_id
|
|
83
|
+
|
|
84
|
+
sig { params(contact_id: String).void }
|
|
85
|
+
attr_writer :contact_id
|
|
86
|
+
|
|
87
|
+
sig { returns(T.nilable(Time)) }
|
|
88
|
+
attr_reader :created_at
|
|
89
|
+
|
|
90
|
+
sig { params(created_at: Time).void }
|
|
91
|
+
attr_writer :created_at
|
|
92
|
+
|
|
93
|
+
sig { returns(T.nilable(String)) }
|
|
94
|
+
attr_reader :customer_id
|
|
95
|
+
|
|
96
|
+
sig { params(customer_id: String).void }
|
|
97
|
+
attr_writer :customer_id
|
|
98
|
+
|
|
99
|
+
sig { returns(T.nilable(String)) }
|
|
100
|
+
attr_reader :direction
|
|
101
|
+
|
|
102
|
+
sig { params(direction: String).void }
|
|
103
|
+
attr_writer :direction
|
|
104
|
+
|
|
105
|
+
sig do
|
|
106
|
+
returns(
|
|
107
|
+
T.nilable(
|
|
108
|
+
T::Array[Sentdm::ConversationMessagesList::Message::Event]
|
|
109
|
+
)
|
|
110
|
+
)
|
|
111
|
+
end
|
|
112
|
+
attr_accessor :events
|
|
113
|
+
|
|
114
|
+
# Structured message body format for database storage. Preserves channel-specific
|
|
115
|
+
# components (header, body, footer, buttons).
|
|
116
|
+
sig do
|
|
117
|
+
returns(
|
|
118
|
+
T.nilable(Sentdm::ConversationMessagesList::Message::MessageBody)
|
|
119
|
+
)
|
|
120
|
+
end
|
|
121
|
+
attr_reader :message_body
|
|
122
|
+
|
|
123
|
+
sig do
|
|
124
|
+
params(
|
|
125
|
+
message_body:
|
|
126
|
+
T.nilable(
|
|
127
|
+
Sentdm::ConversationMessagesList::Message::MessageBody::OrHash
|
|
128
|
+
)
|
|
129
|
+
).void
|
|
130
|
+
end
|
|
131
|
+
attr_writer :message_body
|
|
132
|
+
|
|
133
|
+
sig { returns(T.nilable(String)) }
|
|
134
|
+
attr_reader :phone
|
|
135
|
+
|
|
136
|
+
sig { params(phone: String).void }
|
|
137
|
+
attr_writer :phone
|
|
138
|
+
|
|
139
|
+
sig { returns(T.nilable(String)) }
|
|
140
|
+
attr_reader :phone_international
|
|
141
|
+
|
|
142
|
+
sig { params(phone_international: String).void }
|
|
143
|
+
attr_writer :phone_international
|
|
144
|
+
|
|
145
|
+
sig { returns(T.nilable(Float)) }
|
|
146
|
+
attr_accessor :price
|
|
147
|
+
|
|
148
|
+
sig { returns(T.nilable(String)) }
|
|
149
|
+
attr_reader :region_code
|
|
150
|
+
|
|
151
|
+
sig { params(region_code: String).void }
|
|
152
|
+
attr_writer :region_code
|
|
153
|
+
|
|
154
|
+
sig { returns(T.nilable(String)) }
|
|
155
|
+
attr_reader :status
|
|
156
|
+
|
|
157
|
+
sig { params(status: String).void }
|
|
158
|
+
attr_writer :status
|
|
159
|
+
|
|
160
|
+
sig { returns(T.nilable(String)) }
|
|
161
|
+
attr_accessor :template_category
|
|
162
|
+
|
|
163
|
+
sig { returns(T.nilable(String)) }
|
|
164
|
+
attr_accessor :template_id
|
|
165
|
+
|
|
166
|
+
sig { returns(T.nilable(String)) }
|
|
167
|
+
attr_accessor :template_name
|
|
168
|
+
|
|
169
|
+
# Message response for v3 API — same shape as v2 with snake_case JSON conventions
|
|
170
|
+
sig do
|
|
171
|
+
params(
|
|
172
|
+
id: String,
|
|
173
|
+
active_contact_price: T.nilable(Float),
|
|
174
|
+
channel: String,
|
|
175
|
+
contact_id: String,
|
|
176
|
+
created_at: Time,
|
|
177
|
+
customer_id: String,
|
|
178
|
+
direction: String,
|
|
179
|
+
events:
|
|
180
|
+
T.nilable(
|
|
181
|
+
T::Array[
|
|
182
|
+
Sentdm::ConversationMessagesList::Message::Event::OrHash
|
|
183
|
+
]
|
|
184
|
+
),
|
|
185
|
+
message_body:
|
|
186
|
+
T.nilable(
|
|
187
|
+
Sentdm::ConversationMessagesList::Message::MessageBody::OrHash
|
|
188
|
+
),
|
|
189
|
+
phone: String,
|
|
190
|
+
phone_international: String,
|
|
191
|
+
price: T.nilable(Float),
|
|
192
|
+
region_code: String,
|
|
193
|
+
status: String,
|
|
194
|
+
template_category: T.nilable(String),
|
|
195
|
+
template_id: T.nilable(String),
|
|
196
|
+
template_name: T.nilable(String)
|
|
197
|
+
).returns(T.attached_class)
|
|
198
|
+
end
|
|
199
|
+
def self.new(
|
|
200
|
+
id: nil,
|
|
201
|
+
active_contact_price: nil,
|
|
202
|
+
channel: nil,
|
|
203
|
+
contact_id: nil,
|
|
204
|
+
created_at: nil,
|
|
205
|
+
customer_id: nil,
|
|
206
|
+
direction: nil,
|
|
207
|
+
events: nil,
|
|
208
|
+
# Structured message body format for database storage. Preserves channel-specific
|
|
209
|
+
# components (header, body, footer, buttons).
|
|
210
|
+
message_body: nil,
|
|
211
|
+
phone: nil,
|
|
212
|
+
phone_international: nil,
|
|
213
|
+
price: nil,
|
|
214
|
+
region_code: nil,
|
|
215
|
+
status: nil,
|
|
216
|
+
template_category: nil,
|
|
217
|
+
template_id: nil,
|
|
218
|
+
template_name: nil
|
|
219
|
+
)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
sig do
|
|
223
|
+
override.returns(
|
|
224
|
+
{
|
|
225
|
+
id: String,
|
|
226
|
+
active_contact_price: T.nilable(Float),
|
|
227
|
+
channel: String,
|
|
228
|
+
contact_id: String,
|
|
229
|
+
created_at: Time,
|
|
230
|
+
customer_id: String,
|
|
231
|
+
direction: String,
|
|
232
|
+
events:
|
|
233
|
+
T.nilable(
|
|
234
|
+
T::Array[Sentdm::ConversationMessagesList::Message::Event]
|
|
235
|
+
),
|
|
236
|
+
message_body:
|
|
237
|
+
T.nilable(
|
|
238
|
+
Sentdm::ConversationMessagesList::Message::MessageBody
|
|
239
|
+
),
|
|
240
|
+
phone: String,
|
|
241
|
+
phone_international: String,
|
|
242
|
+
price: T.nilable(Float),
|
|
243
|
+
region_code: String,
|
|
244
|
+
status: String,
|
|
245
|
+
template_category: T.nilable(String),
|
|
246
|
+
template_id: T.nilable(String),
|
|
247
|
+
template_name: T.nilable(String)
|
|
248
|
+
}
|
|
249
|
+
)
|
|
250
|
+
end
|
|
251
|
+
def to_hash
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
class Event < Sentdm::Internal::Type::BaseModel
|
|
255
|
+
OrHash =
|
|
256
|
+
T.type_alias do
|
|
257
|
+
T.any(
|
|
258
|
+
Sentdm::ConversationMessagesList::Message::Event,
|
|
259
|
+
Sentdm::Internal::AnyHash
|
|
260
|
+
)
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
sig { returns(String) }
|
|
264
|
+
attr_accessor :status
|
|
265
|
+
|
|
266
|
+
sig { returns(Time) }
|
|
267
|
+
attr_accessor :timestamp
|
|
268
|
+
|
|
269
|
+
sig { returns(T.nilable(String)) }
|
|
270
|
+
attr_accessor :description
|
|
271
|
+
|
|
272
|
+
# Represents a status change event in a message's lifecycle (v3)
|
|
273
|
+
sig do
|
|
274
|
+
params(
|
|
275
|
+
status: String,
|
|
276
|
+
timestamp: Time,
|
|
277
|
+
description: T.nilable(String)
|
|
278
|
+
).returns(T.attached_class)
|
|
279
|
+
end
|
|
280
|
+
def self.new(status:, timestamp:, description: nil)
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
sig do
|
|
284
|
+
override.returns(
|
|
285
|
+
{
|
|
286
|
+
status: String,
|
|
287
|
+
timestamp: Time,
|
|
288
|
+
description: T.nilable(String)
|
|
289
|
+
}
|
|
290
|
+
)
|
|
291
|
+
end
|
|
292
|
+
def to_hash
|
|
293
|
+
end
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
class MessageBody < Sentdm::Internal::Type::BaseModel
|
|
297
|
+
OrHash =
|
|
298
|
+
T.type_alias do
|
|
299
|
+
T.any(
|
|
300
|
+
Sentdm::ConversationMessagesList::Message::MessageBody,
|
|
301
|
+
Sentdm::Internal::AnyHash
|
|
302
|
+
)
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
sig do
|
|
306
|
+
returns(
|
|
307
|
+
T.nilable(
|
|
308
|
+
T::Array[
|
|
309
|
+
Sentdm::ConversationMessagesList::Message::MessageBody::Button
|
|
310
|
+
]
|
|
311
|
+
)
|
|
312
|
+
)
|
|
313
|
+
end
|
|
314
|
+
attr_accessor :buttons
|
|
315
|
+
|
|
316
|
+
sig { returns(T.nilable(String)) }
|
|
317
|
+
attr_reader :content
|
|
318
|
+
|
|
319
|
+
sig { params(content: String).void }
|
|
320
|
+
attr_writer :content
|
|
321
|
+
|
|
322
|
+
sig { returns(T.nilable(String)) }
|
|
323
|
+
attr_accessor :footer
|
|
324
|
+
|
|
325
|
+
sig { returns(T.nilable(String)) }
|
|
326
|
+
attr_accessor :header
|
|
327
|
+
|
|
328
|
+
# Structured message body format for database storage. Preserves channel-specific
|
|
329
|
+
# components (header, body, footer, buttons).
|
|
330
|
+
sig do
|
|
331
|
+
params(
|
|
332
|
+
buttons:
|
|
333
|
+
T.nilable(
|
|
334
|
+
T::Array[
|
|
335
|
+
Sentdm::ConversationMessagesList::Message::MessageBody::Button::OrHash
|
|
336
|
+
]
|
|
337
|
+
),
|
|
338
|
+
content: String,
|
|
339
|
+
footer: T.nilable(String),
|
|
340
|
+
header: T.nilable(String)
|
|
341
|
+
).returns(T.attached_class)
|
|
342
|
+
end
|
|
343
|
+
def self.new(buttons: nil, content: nil, footer: nil, header: nil)
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
sig do
|
|
347
|
+
override.returns(
|
|
348
|
+
{
|
|
349
|
+
buttons:
|
|
350
|
+
T.nilable(
|
|
351
|
+
T::Array[
|
|
352
|
+
Sentdm::ConversationMessagesList::Message::MessageBody::Button
|
|
353
|
+
]
|
|
354
|
+
),
|
|
355
|
+
content: String,
|
|
356
|
+
footer: T.nilable(String),
|
|
357
|
+
header: T.nilable(String)
|
|
358
|
+
}
|
|
359
|
+
)
|
|
360
|
+
end
|
|
361
|
+
def to_hash
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
class Button < Sentdm::Internal::Type::BaseModel
|
|
365
|
+
OrHash =
|
|
366
|
+
T.type_alias do
|
|
367
|
+
T.any(
|
|
368
|
+
Sentdm::ConversationMessagesList::Message::MessageBody::Button,
|
|
369
|
+
Sentdm::Internal::AnyHash
|
|
370
|
+
)
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
sig { returns(T.nilable(String)) }
|
|
374
|
+
attr_accessor :postback_data
|
|
375
|
+
|
|
376
|
+
sig { returns(T.nilable(String)) }
|
|
377
|
+
attr_accessor :text
|
|
378
|
+
|
|
379
|
+
sig { returns(T.nilable(String)) }
|
|
380
|
+
attr_reader :type
|
|
381
|
+
|
|
382
|
+
sig { params(type: String).void }
|
|
383
|
+
attr_writer :type
|
|
384
|
+
|
|
385
|
+
sig { returns(T.nilable(String)) }
|
|
386
|
+
attr_reader :value
|
|
387
|
+
|
|
388
|
+
sig { params(value: String).void }
|
|
389
|
+
attr_writer :value
|
|
390
|
+
|
|
391
|
+
sig do
|
|
392
|
+
params(
|
|
393
|
+
postback_data: T.nilable(String),
|
|
394
|
+
text: T.nilable(String),
|
|
395
|
+
type: String,
|
|
396
|
+
value: String
|
|
397
|
+
).returns(T.attached_class)
|
|
398
|
+
end
|
|
399
|
+
def self.new(postback_data: nil, text: nil, type: nil, value: nil)
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
sig do
|
|
403
|
+
override.returns(
|
|
404
|
+
{
|
|
405
|
+
postback_data: T.nilable(String),
|
|
406
|
+
text: T.nilable(String),
|
|
407
|
+
type: String,
|
|
408
|
+
value: String
|
|
409
|
+
}
|
|
410
|
+
)
|
|
411
|
+
end
|
|
412
|
+
def to_hash
|
|
413
|
+
end
|
|
414
|
+
end
|
|
415
|
+
end
|
|
416
|
+
end
|
|
417
|
+
end
|
|
418
|
+
end
|
|
419
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Sentdm
|
|
4
|
+
module Models
|
|
5
|
+
class InboundMessageEvent < Sentdm::Internal::Type::BaseModel
|
|
6
|
+
OrHash =
|
|
7
|
+
T.type_alias do
|
|
8
|
+
T.any(Sentdm::InboundMessageEvent, Sentdm::Internal::AnyHash)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# The specific event within the family, for example message.delivered or
|
|
12
|
+
# message.received. Absent on events that have no subtype, so treat it as
|
|
13
|
+
# optional.
|
|
14
|
+
sig { returns(T.nilable(String)) }
|
|
15
|
+
attr_accessor :event
|
|
16
|
+
|
|
17
|
+
# The event family, for example message or templates. Route on this first, then on
|
|
18
|
+
# event for the specific change.
|
|
19
|
+
sig { returns(T.nilable(String)) }
|
|
20
|
+
attr_reader :field
|
|
21
|
+
|
|
22
|
+
sig { params(field: String).void }
|
|
23
|
+
attr_writer :field
|
|
24
|
+
|
|
25
|
+
# Body of a message.received event. Delivered when a contact messages one of your
|
|
26
|
+
# numbers.
|
|
27
|
+
sig { returns(T.nilable(Sentdm::InboundMessageEventPayload)) }
|
|
28
|
+
attr_reader :payload
|
|
29
|
+
|
|
30
|
+
sig do
|
|
31
|
+
params(
|
|
32
|
+
payload: T.nilable(Sentdm::InboundMessageEventPayload::OrHash)
|
|
33
|
+
).void
|
|
34
|
+
end
|
|
35
|
+
attr_writer :payload
|
|
36
|
+
|
|
37
|
+
# When Sent emitted the event, in UTC (yyyy-MM-ddTHH:mm:ssZ). This is the emission
|
|
38
|
+
# time, not the time the underlying change happened. Use the timestamp inside the
|
|
39
|
+
# payload for the latter.
|
|
40
|
+
sig { returns(T.nilable(String)) }
|
|
41
|
+
attr_reader :timestamp
|
|
42
|
+
|
|
43
|
+
sig { params(timestamp: String).void }
|
|
44
|
+
attr_writer :timestamp
|
|
45
|
+
|
|
46
|
+
# The envelope Sent POSTs to a subscribed webhook endpoint. Every event shares
|
|
47
|
+
# this shape and varies only in Payload.
|
|
48
|
+
sig do
|
|
49
|
+
params(
|
|
50
|
+
event: T.nilable(String),
|
|
51
|
+
field: String,
|
|
52
|
+
payload: T.nilable(Sentdm::InboundMessageEventPayload::OrHash),
|
|
53
|
+
timestamp: String
|
|
54
|
+
).returns(T.attached_class)
|
|
55
|
+
end
|
|
56
|
+
def self.new(
|
|
57
|
+
# The specific event within the family, for example message.delivered or
|
|
58
|
+
# message.received. Absent on events that have no subtype, so treat it as
|
|
59
|
+
# optional.
|
|
60
|
+
event: nil,
|
|
61
|
+
# The event family, for example message or templates. Route on this first, then on
|
|
62
|
+
# event for the specific change.
|
|
63
|
+
field: nil,
|
|
64
|
+
# Body of a message.received event. Delivered when a contact messages one of your
|
|
65
|
+
# numbers.
|
|
66
|
+
payload: nil,
|
|
67
|
+
# When Sent emitted the event, in UTC (yyyy-MM-ddTHH:mm:ssZ). This is the emission
|
|
68
|
+
# time, not the time the underlying change happened. Use the timestamp inside the
|
|
69
|
+
# payload for the latter.
|
|
70
|
+
timestamp: nil
|
|
71
|
+
)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
sig do
|
|
75
|
+
override.returns(
|
|
76
|
+
{
|
|
77
|
+
event: T.nilable(String),
|
|
78
|
+
field: String,
|
|
79
|
+
payload: T.nilable(Sentdm::InboundMessageEventPayload),
|
|
80
|
+
timestamp: String
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
end
|
|
84
|
+
def to_hash
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Sentdm
|
|
4
|
+
module Models
|
|
5
|
+
class InboundMessageEventPayload < Sentdm::Internal::Type::BaseModel
|
|
6
|
+
OrHash =
|
|
7
|
+
T.type_alias do
|
|
8
|
+
T.any(Sentdm::InboundMessageEventPayload, Sentdm::Internal::AnyHash)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# The account the message belongs to.
|
|
12
|
+
sig { returns(T.nilable(String)) }
|
|
13
|
+
attr_reader :account_id
|
|
14
|
+
|
|
15
|
+
sig { params(account_id: String).void }
|
|
16
|
+
attr_writer :account_id
|
|
17
|
+
|
|
18
|
+
# The channel the message arrived on, for example sms or whatsapp.
|
|
19
|
+
sig { returns(T.nilable(String)) }
|
|
20
|
+
attr_reader :channel
|
|
21
|
+
|
|
22
|
+
sig { params(channel: String).void }
|
|
23
|
+
attr_writer :channel
|
|
24
|
+
|
|
25
|
+
# The contact's number in E.164 format, meaning the number the message came from.
|
|
26
|
+
sig { returns(T.nilable(String)) }
|
|
27
|
+
attr_reader :inbound_number
|
|
28
|
+
|
|
29
|
+
sig { params(inbound_number: String).void }
|
|
30
|
+
attr_writer :inbound_number
|
|
31
|
+
|
|
32
|
+
# The inbound message.
|
|
33
|
+
sig { returns(T.nilable(String)) }
|
|
34
|
+
attr_reader :message_id
|
|
35
|
+
|
|
36
|
+
sig { params(message_id: String).void }
|
|
37
|
+
attr_writer :message_id
|
|
38
|
+
|
|
39
|
+
# Your number in E.164 format, meaning the number the message was addressed to.
|
|
40
|
+
sig { returns(T.nilable(String)) }
|
|
41
|
+
attr_reader :outbound_number
|
|
42
|
+
|
|
43
|
+
sig { params(outbound_number: String).void }
|
|
44
|
+
attr_writer :outbound_number
|
|
45
|
+
|
|
46
|
+
# When the message was received, in UTC (yyyy-MM-ddTHH:mm:ssZ).
|
|
47
|
+
sig { returns(T.nilable(String)) }
|
|
48
|
+
attr_reader :received_at
|
|
49
|
+
|
|
50
|
+
sig { params(received_at: String).void }
|
|
51
|
+
attr_writer :received_at
|
|
52
|
+
|
|
53
|
+
# The message body. Sent as null when the inbound message carried no text, for
|
|
54
|
+
# example a media-only message. The field is always present, so read it and check
|
|
55
|
+
# for null rather than checking whether the key exists.
|
|
56
|
+
sig { returns(T.nilable(String)) }
|
|
57
|
+
attr_accessor :text
|
|
58
|
+
|
|
59
|
+
# When the message was received, in UTC (yyyy-MM-ddTHH:mm:ssZ). Same value as
|
|
60
|
+
# ReceivedAt, kept for envelope consistency with outbound events.
|
|
61
|
+
sig { returns(T.nilable(String)) }
|
|
62
|
+
attr_reader :updated_at
|
|
63
|
+
|
|
64
|
+
sig { params(updated_at: String).void }
|
|
65
|
+
attr_writer :updated_at
|
|
66
|
+
|
|
67
|
+
# Body of a message.received event. Delivered when a contact messages one of your
|
|
68
|
+
# numbers.
|
|
69
|
+
sig do
|
|
70
|
+
params(
|
|
71
|
+
account_id: String,
|
|
72
|
+
channel: String,
|
|
73
|
+
inbound_number: String,
|
|
74
|
+
message_id: String,
|
|
75
|
+
outbound_number: String,
|
|
76
|
+
received_at: String,
|
|
77
|
+
text: T.nilable(String),
|
|
78
|
+
updated_at: String
|
|
79
|
+
).returns(T.attached_class)
|
|
80
|
+
end
|
|
81
|
+
def self.new(
|
|
82
|
+
# The account the message belongs to.
|
|
83
|
+
account_id: nil,
|
|
84
|
+
# The channel the message arrived on, for example sms or whatsapp.
|
|
85
|
+
channel: nil,
|
|
86
|
+
# The contact's number in E.164 format, meaning the number the message came from.
|
|
87
|
+
inbound_number: nil,
|
|
88
|
+
# The inbound message.
|
|
89
|
+
message_id: nil,
|
|
90
|
+
# Your number in E.164 format, meaning the number the message was addressed to.
|
|
91
|
+
outbound_number: nil,
|
|
92
|
+
# When the message was received, in UTC (yyyy-MM-ddTHH:mm:ssZ).
|
|
93
|
+
received_at: nil,
|
|
94
|
+
# The message body. Sent as null when the inbound message carried no text, for
|
|
95
|
+
# example a media-only message. The field is always present, so read it and check
|
|
96
|
+
# for null rather than checking whether the key exists.
|
|
97
|
+
text: nil,
|
|
98
|
+
# When the message was received, in UTC (yyyy-MM-ddTHH:mm:ssZ). Same value as
|
|
99
|
+
# ReceivedAt, kept for envelope consistency with outbound events.
|
|
100
|
+
updated_at: nil
|
|
101
|
+
)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
sig do
|
|
105
|
+
override.returns(
|
|
106
|
+
{
|
|
107
|
+
account_id: String,
|
|
108
|
+
channel: String,
|
|
109
|
+
inbound_number: String,
|
|
110
|
+
message_id: String,
|
|
111
|
+
outbound_number: String,
|
|
112
|
+
received_at: String,
|
|
113
|
+
text: T.nilable(String),
|
|
114
|
+
updated_at: String
|
|
115
|
+
}
|
|
116
|
+
)
|
|
117
|
+
end
|
|
118
|
+
def to_hash
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module Sentdm
|
|
4
|
+
module Models
|
|
5
|
+
class MessageEvent < Sentdm::Internal::Type::BaseModel
|
|
6
|
+
OrHash =
|
|
7
|
+
T.type_alias { T.any(Sentdm::MessageEvent, Sentdm::Internal::AnyHash) }
|
|
8
|
+
|
|
9
|
+
# The specific event within the family, for example message.delivered or
|
|
10
|
+
# message.received. Absent on events that have no subtype, so treat it as
|
|
11
|
+
# optional.
|
|
12
|
+
sig { returns(T.nilable(String)) }
|
|
13
|
+
attr_accessor :event
|
|
14
|
+
|
|
15
|
+
# The event family, for example message or templates. Route on this first, then on
|
|
16
|
+
# event for the specific change.
|
|
17
|
+
sig { returns(T.nilable(String)) }
|
|
18
|
+
attr_reader :field
|
|
19
|
+
|
|
20
|
+
sig { params(field: String).void }
|
|
21
|
+
attr_writer :field
|
|
22
|
+
|
|
23
|
+
# Body of an outbound message lifecycle event. Delivered once per status change,
|
|
24
|
+
# so a single message produces several of these as it moves toward a terminal
|
|
25
|
+
# status.
|
|
26
|
+
sig { returns(T.nilable(Sentdm::MessageEventPayload)) }
|
|
27
|
+
attr_reader :payload
|
|
28
|
+
|
|
29
|
+
sig do
|
|
30
|
+
params(payload: T.nilable(Sentdm::MessageEventPayload::OrHash)).void
|
|
31
|
+
end
|
|
32
|
+
attr_writer :payload
|
|
33
|
+
|
|
34
|
+
# When Sent emitted the event, in UTC (yyyy-MM-ddTHH:mm:ssZ). This is the emission
|
|
35
|
+
# time, not the time the underlying change happened. Use the timestamp inside the
|
|
36
|
+
# payload for the latter.
|
|
37
|
+
sig { returns(T.nilable(String)) }
|
|
38
|
+
attr_reader :timestamp
|
|
39
|
+
|
|
40
|
+
sig { params(timestamp: String).void }
|
|
41
|
+
attr_writer :timestamp
|
|
42
|
+
|
|
43
|
+
# The envelope Sent POSTs to a subscribed webhook endpoint. Every event shares
|
|
44
|
+
# this shape and varies only in Payload.
|
|
45
|
+
sig do
|
|
46
|
+
params(
|
|
47
|
+
event: T.nilable(String),
|
|
48
|
+
field: String,
|
|
49
|
+
payload: T.nilable(Sentdm::MessageEventPayload::OrHash),
|
|
50
|
+
timestamp: String
|
|
51
|
+
).returns(T.attached_class)
|
|
52
|
+
end
|
|
53
|
+
def self.new(
|
|
54
|
+
# The specific event within the family, for example message.delivered or
|
|
55
|
+
# message.received. Absent on events that have no subtype, so treat it as
|
|
56
|
+
# optional.
|
|
57
|
+
event: nil,
|
|
58
|
+
# The event family, for example message or templates. Route on this first, then on
|
|
59
|
+
# event for the specific change.
|
|
60
|
+
field: nil,
|
|
61
|
+
# Body of an outbound message lifecycle event. Delivered once per status change,
|
|
62
|
+
# so a single message produces several of these as it moves toward a terminal
|
|
63
|
+
# status.
|
|
64
|
+
payload: nil,
|
|
65
|
+
# When Sent emitted the event, in UTC (yyyy-MM-ddTHH:mm:ssZ). This is the emission
|
|
66
|
+
# time, not the time the underlying change happened. Use the timestamp inside the
|
|
67
|
+
# payload for the latter.
|
|
68
|
+
timestamp: nil
|
|
69
|
+
)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
sig do
|
|
73
|
+
override.returns(
|
|
74
|
+
{
|
|
75
|
+
event: T.nilable(String),
|
|
76
|
+
field: String,
|
|
77
|
+
payload: T.nilable(Sentdm::MessageEventPayload),
|
|
78
|
+
timestamp: String
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
end
|
|
82
|
+
def to_hash
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|