Skip to main content

messaging_api/
control.rs

1use crate::ConversationAudience;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
6#[serde(rename_all = "lowercase")]
7pub enum Placement {
8    Local,
9    Cloud,
10}
11
12#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
13#[serde(rename_all = "camelCase", deny_unknown_fields)]
14pub struct FrontendProvider {
15    pub provider: String,
16    pub deprecated: bool,
17    pub supported_placements: Vec<Placement>,
18}
19
20#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
21#[serde(rename_all = "camelCase", deny_unknown_fields)]
22pub struct ProviderListRequest {
23    pub placement: Placement,
24    pub frontend_providers: Vec<FrontendProvider>,
25}
26
27#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
28#[serde(rename_all = "camelCase", deny_unknown_fields)]
29pub struct ProviderMetadata {
30    pub provider: String,
31    pub display_name: String,
32    pub placement: Placement,
33    pub deprecated: bool,
34    pub available: bool,
35    #[serde(default, skip_serializing_if = "Option::is_none")]
36    pub disabled_reason: Option<String>,
37    pub setup_flow: String,
38    pub audiences: Vec<ConversationAudience>,
39    pub inbound_capabilities: Vec<ContentCapability>,
40    pub outbound_capabilities: Vec<ContentCapability>,
41    pub delivery_mode: DeliveryMode,
42    pub management_operations: Vec<ManagementOperation>,
43    pub provider_data: Value,
44}
45
46#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
47#[serde(rename_all = "snake_case")]
48pub enum ContentCapability {
49    Text,
50    Markdown,
51    Image,
52    Audio,
53    Action,
54}
55
56#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
57#[serde(rename_all = "snake_case")]
58pub enum DeliveryMode {
59    Unrestricted,
60    SessionWindow,
61}
62
63#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
64pub enum ManagementOperation {
65    #[serde(rename = "connection.list")]
66    ConnectionList,
67    #[serde(rename = "connection.update")]
68    ConnectionUpdate,
69    #[serde(rename = "connection.delete")]
70    ConnectionDelete,
71    #[serde(rename = "connection.test")]
72    ConnectionTest,
73    #[serde(rename = "connection.status")]
74    ConnectionStatus,
75    #[serde(rename = "account.bind")]
76    AccountBind,
77    #[serde(rename = "account.unbind")]
78    AccountUnbind,
79    #[serde(rename = "account.binding.list")]
80    AccountBindingList,
81    #[serde(rename = "setup.options")]
82    SetupOptions,
83    #[serde(rename = "setup.start")]
84    SetupStart,
85    #[serde(rename = "setup.status")]
86    SetupStatus,
87    #[serde(rename = "surface.list")]
88    SurfaceList,
89    #[serde(rename = "surface.dismiss")]
90    SurfaceDismiss,
91    #[serde(rename = "surface.bind_code.create")]
92    SurfaceBindCodeCreate,
93    #[serde(rename = "actor.link_code.create")]
94    ActorLinkCodeCreate,
95    #[serde(rename = "actor.link.list")]
96    ActorLinkList,
97    #[serde(rename = "actor.link.delete")]
98    ActorLinkDelete,
99}
100
101#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
102#[serde(rename_all = "camelCase", deny_unknown_fields)]
103pub struct ProviderListResponse {
104    pub providers: Vec<ProviderMetadata>,
105}
106
107#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
108#[serde(rename_all = "camelCase", deny_unknown_fields)]
109pub struct ProviderPlacementRequest {
110    pub provider: String,
111    pub placement: Placement,
112}
113
114#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
115#[serde(rename_all = "camelCase", deny_unknown_fields)]
116pub struct ConnectionUpdateRequest {
117    pub provider: String,
118    pub placement: Placement,
119    #[serde(default, skip_serializing_if = "Option::is_none")]
120    pub connection_id: Option<String>,
121    pub data: Value,
122}
123
124#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
125#[serde(rename_all = "camelCase", deny_unknown_fields)]
126pub struct ConnectionRequest {
127    pub provider: String,
128    pub placement: Placement,
129    pub connection_id: String,
130}
131
132#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
133#[serde(rename_all = "camelCase", deny_unknown_fields)]
134pub struct ConnectionTestRequest {
135    pub provider: String,
136    pub placement: Placement,
137    pub data: Value,
138}
139
140#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
141#[serde(rename_all = "camelCase", deny_unknown_fields)]
142pub struct MessagingConnection {
143    pub provider: String,
144    pub placement: Placement,
145    pub connection_id: String,
146    pub account_id: String,
147    #[serde(default, skip_serializing_if = "Option::is_none")]
148    pub display_name: Option<String>,
149    pub enabled: bool,
150    pub status: String,
151    #[serde(default, skip_serializing_if = "Option::is_none")]
152    pub status_message: Option<String>,
153    pub bound_to_current_scope: bool,
154    pub provider_data: Value,
155}
156
157#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
158#[serde(rename_all = "camelCase", deny_unknown_fields)]
159pub struct ConnectionListResponse {
160    pub connections: Vec<MessagingConnection>,
161}
162
163#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
164#[serde(rename_all = "camelCase", deny_unknown_fields)]
165pub struct ConnectionUpdateResponse {
166    pub connection: MessagingConnection,
167}
168
169#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
170#[serde(rename_all = "camelCase", deny_unknown_fields)]
171pub struct ConnectionTestResponse {
172    pub result: Value,
173}
174
175#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
176#[serde(rename_all = "camelCase", deny_unknown_fields)]
177pub struct ProviderStatus {
178    pub provider: String,
179    pub placement: Placement,
180    pub enabled: bool,
181    pub provider_data: Value,
182}
183
184#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
185#[serde(rename_all = "camelCase", deny_unknown_fields)]
186pub struct ConnectionStatusResponse {
187    pub status: ProviderStatus,
188}
189
190#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
191#[serde(rename_all = "camelCase", deny_unknown_fields)]
192pub struct MutationResponse {
193    pub success: bool,
194}
195
196#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
197#[serde(rename_all = "camelCase", deny_unknown_fields)]
198pub struct AccountBindingRequest {
199    pub provider: String,
200    pub placement: Placement,
201    pub account_id: String,
202}
203
204#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
205#[serde(rename_all = "camelCase", deny_unknown_fields)]
206pub struct AccountBinding {
207    pub tenant_id: String,
208    pub scope_id: String,
209    pub user_id: String,
210    pub default: bool,
211}
212
213#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
214#[serde(rename_all = "camelCase", deny_unknown_fields)]
215pub struct AccountBindingListResponse {
216    pub bindings: Vec<AccountBinding>,
217}
218
219#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
220#[serde(rename_all = "camelCase", deny_unknown_fields)]
221pub struct SetupStartRequest {
222    pub provider: String,
223    pub placement: Placement,
224    pub data: Value,
225}
226
227#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
228#[serde(rename_all = "camelCase", deny_unknown_fields)]
229pub struct SetupOptionsResponse {
230    pub options: Value,
231}
232
233#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
234#[serde(rename_all = "camelCase", deny_unknown_fields)]
235pub struct SetupStatusRequest {
236    pub provider: String,
237    pub placement: Placement,
238    pub setup_id: String,
239}
240
241#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
242#[serde(rename_all = "camelCase", deny_unknown_fields)]
243pub struct SetupAction {
244    #[serde(rename = "type")]
245    pub kind: String,
246    #[serde(default, skip_serializing_if = "Option::is_none")]
247    pub url: Option<String>,
248}
249
250#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
251#[serde(rename_all = "camelCase", deny_unknown_fields)]
252pub struct SetupState {
253    #[serde(default, skip_serializing_if = "Option::is_none")]
254    pub setup_id: Option<String>,
255    pub status: String,
256    #[serde(default, skip_serializing_if = "Option::is_none")]
257    pub expires_at_ms: Option<i64>,
258    #[serde(default, skip_serializing_if = "Option::is_none")]
259    pub action: Option<SetupAction>,
260    pub provider_data: Value,
261    #[serde(default, skip_serializing_if = "Option::is_none")]
262    pub connection_id: Option<String>,
263    #[serde(default, skip_serializing_if = "Option::is_none")]
264    pub message: Option<String>,
265}
266
267#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
268#[serde(rename_all = "camelCase", deny_unknown_fields)]
269pub struct SetupResponse {
270    pub setup: SetupState,
271}
272
273#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
274#[serde(rename_all = "lowercase")]
275pub enum SurfaceState {
276    Pending,
277    Bound,
278    Dismissed,
279}
280
281#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
282#[serde(rename_all = "camelCase", deny_unknown_fields)]
283pub struct SurfaceListRequest {
284    pub provider: String,
285    pub placement: Placement,
286    #[serde(default, skip_serializing_if = "Option::is_none")]
287    pub account_id: Option<String>,
288    #[serde(default, skip_serializing_if = "Option::is_none")]
289    pub state: Option<SurfaceState>,
290}
291
292#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
293#[serde(rename_all = "camelCase", deny_unknown_fields)]
294pub struct MessagingSurface {
295    pub provider: String,
296    pub placement: Placement,
297    pub account_id: String,
298    pub surface_id: String,
299    #[serde(default, skip_serializing_if = "Option::is_none")]
300    pub display_name: Option<String>,
301    pub state: SurfaceState,
302    #[serde(default, skip_serializing_if = "Option::is_none")]
303    pub scope_id: Option<String>,
304    pub first_seen_at_ms: i64,
305    pub last_seen_at_ms: i64,
306}
307
308#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
309#[serde(rename_all = "camelCase", deny_unknown_fields)]
310pub struct SurfaceListResponse {
311    pub surfaces: Vec<MessagingSurface>,
312}
313
314#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
315#[serde(rename_all = "camelCase", deny_unknown_fields)]
316pub struct SurfaceRequest {
317    pub provider: String,
318    pub placement: Placement,
319    pub surface_id: String,
320}
321
322#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
323#[serde(rename_all = "camelCase", deny_unknown_fields)]
324pub struct SurfaceBindCodeCreateRequest {
325    pub provider: String,
326    pub placement: Placement,
327    pub surface_id: String,
328    pub scope_id: String,
329}
330
331#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
332#[serde(rename_all = "camelCase", deny_unknown_fields)]
333pub struct ActorLinkCodeCreateRequest {
334    pub provider: String,
335    pub placement: Placement,
336    pub surface_id: String,
337}
338
339#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
340#[serde(rename_all = "camelCase", deny_unknown_fields)]
341pub struct ChallengeCode {
342    pub code: String,
343    pub command: String,
344    pub expires_at_ms: i64,
345}
346
347#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
348#[serde(rename_all = "camelCase", deny_unknown_fields)]
349pub struct ChallengeCodeResponse {
350    pub challenge: ChallengeCode,
351}
352
353#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
354#[serde(rename_all = "camelCase", deny_unknown_fields)]
355pub struct ActorLinkListRequest {
356    pub provider: String,
357    pub placement: Placement,
358    #[serde(default, skip_serializing_if = "Option::is_none")]
359    pub surface_id: Option<String>,
360}
361
362#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
363#[serde(rename_all = "camelCase", deny_unknown_fields)]
364pub struct ActorLinkView {
365    pub link_id: String,
366    pub provider: String,
367    pub placement: Placement,
368    pub account_id: String,
369    #[serde(default, skip_serializing_if = "Option::is_none")]
370    pub display_name: Option<String>,
371    pub created_at_ms: i64,
372}
373
374#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
375#[serde(rename_all = "camelCase", deny_unknown_fields)]
376pub struct ActorLinkListResponse {
377    pub links: Vec<ActorLinkView>,
378}
379
380#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
381#[serde(rename_all = "camelCase", deny_unknown_fields)]
382pub struct ActorLinkDeleteRequest {
383    pub provider: String,
384    pub placement: Placement,
385    pub link_id: String,
386}