Skip to main content

messaging_api/
control.rs

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