Skip to main content

app_facade_api/
control.rs

1use crate::messaging::{ConversationAudience, ExternalActor, MessagingAddress};
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
12impl Placement {
13    #[must_use]
14    pub const fn as_str(self) -> &'static str {
15        match self {
16            Self::Local => "local",
17            Self::Cloud => "cloud",
18        }
19    }
20}
21
22#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
23#[serde(rename_all = "camelCase", deny_unknown_fields)]
24pub struct FrontendProvider {
25    pub provider: String,
26    pub deprecated: bool,
27    pub supported_placements: Vec<Placement>,
28}
29
30#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
31#[serde(rename_all = "camelCase", deny_unknown_fields)]
32pub struct ProviderListRequest {
33    pub placement: Placement,
34    pub frontend_providers: Vec<FrontendProvider>,
35}
36
37#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
38#[serde(rename_all = "camelCase", deny_unknown_fields)]
39pub struct ProviderMetadata {
40    pub provider: String,
41    pub display_name: String,
42    pub placement: Placement,
43    pub deprecated: bool,
44    pub available: bool,
45    #[serde(default, skip_serializing_if = "Option::is_none")]
46    pub disabled_reason: Option<String>,
47    pub setup_flow: String,
48    pub audiences: Vec<ConversationAudience>,
49    pub inbound_capabilities: Vec<ContentCapability>,
50    pub outbound_capabilities: Vec<ContentCapability>,
51    pub delivery_mode: DeliveryMode,
52    pub projections: ProjectionCapabilities,
53    pub management_operations: Vec<ManagementOperation>,
54    pub provider_data: Value,
55}
56
57#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
58#[serde(rename_all = "camelCase", deny_unknown_fields)]
59pub struct ProjectionCapabilities {
60    pub notification: ProjectionCapability,
61    pub dialog: ProjectionCapability,
62}
63
64#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
65#[serde(rename_all = "camelCase", deny_unknown_fields)]
66pub struct ProjectionCapability {
67    pub supported: bool,
68    #[serde(default, skip_serializing_if = "Option::is_none")]
69    pub reason: Option<ProjectionUnsupportedReason>,
70}
71
72#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
73#[serde(rename_all = "snake_case")]
74pub enum ProjectionUnsupportedReason {
75    NoProactiveDelivery,
76    NoInteractiveActions,
77    SessionWindowOnly,
78    ProviderUnconfigured,
79}
80
81#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
82#[serde(rename_all = "camelCase", deny_unknown_fields)]
83pub struct RouteProjectionSettings {
84    pub notification: NotificationProjectionSetting,
85    pub dialog: DialogProjectionSetting,
86}
87
88#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
89#[serde(rename_all = "camelCase", deny_unknown_fields)]
90pub struct NotificationProjectionSetting {
91    pub enabled: bool,
92    pub levels: Vec<NotificationProjectionLevel>,
93}
94
95#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
96#[serde(rename_all = "snake_case")]
97pub enum NotificationProjectionLevel {
98    Alert,
99    Notify,
100    Chat,
101}
102
103#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
104#[serde(rename_all = "camelCase", deny_unknown_fields)]
105pub struct DialogProjectionSetting {
106    pub enabled: bool,
107}
108
109#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
110#[serde(rename_all = "camelCase", deny_unknown_fields)]
111pub struct RouteProjectionSettingsUpdate {
112    #[serde(default, skip_serializing_if = "Option::is_none")]
113    pub notification: Option<NotificationProjectionSettingUpdate>,
114    #[serde(default, skip_serializing_if = "Option::is_none")]
115    pub dialog: Option<DialogProjectionSettingUpdate>,
116}
117
118#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
119#[serde(rename_all = "camelCase", deny_unknown_fields)]
120pub struct NotificationProjectionSettingUpdate {
121    #[serde(default, skip_serializing_if = "Option::is_none")]
122    pub enabled: Option<bool>,
123    #[serde(default, skip_serializing_if = "Option::is_none")]
124    pub levels: Option<Vec<NotificationProjectionLevel>>,
125}
126
127#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
128#[serde(rename_all = "camelCase", deny_unknown_fields)]
129pub struct DialogProjectionSettingUpdate {
130    #[serde(default, skip_serializing_if = "Option::is_none")]
131    pub enabled: Option<bool>,
132}
133
134#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
135#[serde(rename_all = "snake_case")]
136pub enum ContentCapability {
137    Text,
138    Markdown,
139    Image,
140    Audio,
141    Video,
142    File,
143    Action,
144}
145
146#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
147#[serde(rename_all = "snake_case")]
148pub enum DeliveryMode {
149    Unrestricted,
150    SessionWindow,
151}
152
153#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
154pub enum ManagementOperation {
155    #[serde(rename = "provider_account.list")]
156    ProviderAccountList,
157    #[serde(rename = "provider_account.update")]
158    ProviderAccountUpdate,
159    #[serde(rename = "provider_account.delete")]
160    ProviderAccountDelete,
161    #[serde(rename = "provider_account.test")]
162    ProviderAccountTest,
163    #[serde(rename = "provider_account.status")]
164    ProviderAccountStatus,
165    #[serde(rename = "shared_account_grant.create")]
166    SharedAccountGrantCreate,
167    #[serde(rename = "shared_account_grant.delete")]
168    SharedAccountGrantDelete,
169    #[serde(rename = "shared_account_grant.list")]
170    SharedAccountGrantList,
171    #[serde(rename = "route.list")]
172    RouteList,
173    #[serde(rename = "route.update")]
174    RouteUpdate,
175    #[serde(rename = "route.delete")]
176    RouteDelete,
177    #[serde(rename = "setup.options")]
178    SetupOptions,
179    #[serde(rename = "setup.start")]
180    SetupStart,
181    #[serde(rename = "setup.status")]
182    SetupStatus,
183    #[serde(rename = "surface.list")]
184    SurfaceList,
185    #[serde(rename = "surface.dismiss")]
186    SurfaceDismiss,
187    #[serde(rename = "surface.bind_code.create")]
188    SurfaceBindCodeCreate,
189    #[serde(rename = "actor.link_code.create")]
190    ActorLinkCodeCreate,
191    #[serde(rename = "actor.link_claim.status")]
192    ActorLinkClaimStatus,
193    #[serde(rename = "actor.link_claim.confirm")]
194    ActorLinkClaimConfirm,
195    #[serde(rename = "actor.link.list")]
196    ActorLinkList,
197    #[serde(rename = "actor.link.delete")]
198    ActorLinkDelete,
199}
200
201#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
202#[serde(rename_all = "camelCase", deny_unknown_fields)]
203pub struct ProviderListResponse {
204    pub providers: Vec<ProviderMetadata>,
205}
206
207#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
208#[serde(rename_all = "camelCase", deny_unknown_fields)]
209pub struct ProviderPlacementRequest {
210    pub provider: String,
211    pub placement: Placement,
212}
213
214#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
215#[serde(rename_all = "camelCase", deny_unknown_fields)]
216pub struct ProviderAccountUpdateRequest {
217    pub provider: String,
218    pub placement: Placement,
219    pub account_id: String,
220    pub data: Value,
221}
222
223#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
224#[serde(rename_all = "camelCase", deny_unknown_fields)]
225pub struct ProviderAccountRequest {
226    pub provider: String,
227    pub placement: Placement,
228    pub account_id: String,
229}
230
231#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
232#[serde(rename_all = "camelCase", deny_unknown_fields)]
233pub struct ProviderAccountTestRequest {
234    pub provider: String,
235    pub placement: Placement,
236    pub data: Value,
237}
238
239#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
240#[serde(rename_all = "snake_case")]
241pub enum ProviderAccountOwnership {
242    System,
243    User,
244}
245
246#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
247#[serde(rename_all = "camelCase", deny_unknown_fields)]
248pub struct ProviderAccount {
249    pub provider: String,
250    pub placement: Placement,
251    pub account_id: String,
252    pub ownership: ProviderAccountOwnership,
253    #[serde(default, skip_serializing_if = "Option::is_none")]
254    pub display_name: Option<String>,
255    pub enabled: bool,
256    pub status: String,
257    #[serde(default, skip_serializing_if = "Option::is_none")]
258    pub status_message: Option<String>,
259    pub provider_data: Value,
260}
261
262#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
263#[serde(rename_all = "camelCase", deny_unknown_fields)]
264pub struct ProviderAccountListResponse {
265    pub accounts: Vec<ProviderAccount>,
266}
267
268#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
269#[serde(rename_all = "camelCase", deny_unknown_fields)]
270pub struct ProviderAccountUpdateResponse {
271    pub account: ProviderAccount,
272}
273
274#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
275#[serde(rename_all = "camelCase", deny_unknown_fields)]
276pub struct ProviderAccountTestResponse {
277    pub result: Value,
278}
279
280#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
281#[serde(rename_all = "camelCase", deny_unknown_fields)]
282pub struct ProviderStatus {
283    pub provider: String,
284    pub placement: Placement,
285    pub enabled: bool,
286    pub provider_data: Value,
287}
288
289#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
290#[serde(rename_all = "camelCase", deny_unknown_fields)]
291pub struct ProviderAccountStatusResponse {
292    pub status: ProviderStatus,
293}
294
295#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
296#[serde(rename_all = "camelCase", deny_unknown_fields)]
297pub struct MutationResponse {
298    pub success: bool,
299}
300
301#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
302#[serde(rename_all = "camelCase", deny_unknown_fields)]
303pub struct SharedAccountGrantRequest {
304    pub provider: String,
305    pub placement: Placement,
306    pub account_id: String,
307}
308
309#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
310#[serde(rename_all = "camelCase", deny_unknown_fields)]
311pub struct SharedAccountGrantListRequest {
312    pub provider: String,
313    pub placement: Placement,
314    #[serde(default, skip_serializing_if = "Option::is_none")]
315    pub account_id: Option<String>,
316}
317
318#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
319#[serde(rename_all = "camelCase", deny_unknown_fields)]
320pub struct SharedAccountGrant {
321    pub provider: String,
322    pub placement: Placement,
323    pub account_id: String,
324    pub tenant_id: String,
325    pub scope_id: String,
326    pub granted_by_user_id: String,
327    pub created_at_ms: i64,
328    pub updated_at_ms: i64,
329}
330
331#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
332#[serde(rename_all = "camelCase", deny_unknown_fields)]
333pub struct SharedAccountGrantListResponse {
334    pub grants: Vec<SharedAccountGrant>,
335}
336
337#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
338#[serde(rename_all = "camelCase", deny_unknown_fields)]
339pub struct RouteListRequest {
340    pub provider: String,
341    pub placement: Placement,
342    #[serde(default, skip_serializing_if = "Option::is_none")]
343    pub account_id: Option<String>,
344    #[serde(default, skip_serializing_if = "Option::is_none")]
345    pub audience: Option<ConversationAudience>,
346}
347
348#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
349#[serde(rename_all = "camelCase", deny_unknown_fields)]
350pub struct RouteRequest {
351    pub provider: String,
352    pub placement: Placement,
353    pub route_id: String,
354}
355
356#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
357#[serde(
358    tag = "audience",
359    rename_all = "lowercase",
360    rename_all_fields = "camelCase",
361    deny_unknown_fields
362)]
363pub enum RouteUpdateRequest {
364    Personal {
365        provider: String,
366        placement: Placement,
367        route_id: String,
368        #[serde(default, skip_serializing_if = "Option::is_none")]
369        scope_id: Option<String>,
370        #[serde(default, skip_serializing_if = "Option::is_none")]
371        enabled: Option<bool>,
372        #[serde(default, skip_serializing_if = "Option::is_none")]
373        projections: Option<RouteProjectionSettingsUpdate>,
374    },
375    Shared {
376        provider: String,
377        placement: Placement,
378        route_id: String,
379        #[serde(default, skip_serializing_if = "Option::is_none")]
380        enabled: Option<bool>,
381        #[serde(default, skip_serializing_if = "Option::is_none")]
382        projections: Option<RouteProjectionSettingsUpdate>,
383    },
384}
385
386#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
387#[serde(
388    tag = "audience",
389    rename_all = "lowercase",
390    rename_all_fields = "camelCase",
391    deny_unknown_fields
392)]
393pub enum MessagingRoute {
394    Personal {
395        provider: String,
396        placement: Placement,
397        route_id: String,
398        account_id: String,
399        conversation_id: String,
400        external_actor_id: String,
401        tenant_id: String,
402        user_id: String,
403        scope_id: String,
404        #[serde(default, skip_serializing_if = "Option::is_none")]
405        display_name: Option<String>,
406        enabled: bool,
407        projections: RouteProjectionSettings,
408        provider_data: Value,
409    },
410    Shared {
411        provider: String,
412        placement: Placement,
413        route_id: String,
414        account_id: String,
415        conversation_id: String,
416        tenant_id: String,
417        scope_id: String,
418        bound_by_user_id: String,
419        #[serde(default, skip_serializing_if = "Option::is_none")]
420        display_name: Option<String>,
421        enabled: bool,
422        projections: RouteProjectionSettings,
423        provider_data: Value,
424    },
425}
426
427#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
428#[serde(rename_all = "camelCase", deny_unknown_fields)]
429pub struct RouteListResponse {
430    pub routes: Vec<MessagingRoute>,
431}
432
433#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
434#[serde(rename_all = "camelCase", deny_unknown_fields)]
435pub struct RouteUpdateResponse {
436    pub route: MessagingRoute,
437}
438
439#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
440#[serde(rename_all = "camelCase", deny_unknown_fields)]
441pub struct SetupStartRequest {
442    pub provider: String,
443    pub placement: Placement,
444    pub data: Value,
445}
446
447#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
448#[serde(rename_all = "camelCase", deny_unknown_fields)]
449pub struct SetupOptionsResponse {
450    pub options: Value,
451}
452
453#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
454#[serde(rename_all = "camelCase", deny_unknown_fields)]
455pub struct SetupStatusRequest {
456    pub provider: String,
457    pub placement: Placement,
458    pub setup_id: String,
459}
460
461#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
462#[serde(rename_all = "camelCase", deny_unknown_fields)]
463pub struct SetupAction {
464    #[serde(rename = "type")]
465    pub kind: String,
466    #[serde(default, skip_serializing_if = "Option::is_none")]
467    pub url: Option<String>,
468}
469
470#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
471#[serde(rename_all = "camelCase", deny_unknown_fields)]
472pub struct SetupState {
473    #[serde(default, skip_serializing_if = "Option::is_none")]
474    pub setup_id: Option<String>,
475    pub status: String,
476    #[serde(default, skip_serializing_if = "Option::is_none")]
477    pub expires_at_ms: Option<i64>,
478    #[serde(default, skip_serializing_if = "Option::is_none")]
479    pub action: Option<SetupAction>,
480    pub provider_data: Value,
481    #[serde(default, skip_serializing_if = "Option::is_none")]
482    pub account_id: Option<String>,
483    #[serde(default, skip_serializing_if = "Option::is_none")]
484    pub route_id: Option<String>,
485    #[serde(default, skip_serializing_if = "Option::is_none")]
486    pub message: Option<String>,
487}
488
489#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
490#[serde(rename_all = "camelCase", deny_unknown_fields)]
491pub struct SetupResponse {
492    pub setup: SetupState,
493}
494
495#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
496#[serde(rename_all = "lowercase")]
497pub enum SurfaceState {
498    Pending,
499    Bound,
500    Dismissed,
501}
502
503#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
504#[serde(rename_all = "camelCase", deny_unknown_fields)]
505pub struct SurfaceListRequest {
506    pub provider: String,
507    pub placement: Placement,
508    #[serde(default, skip_serializing_if = "Option::is_none")]
509    pub account_id: Option<String>,
510    #[serde(default, skip_serializing_if = "Option::is_none")]
511    pub state: Option<SurfaceState>,
512}
513
514#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
515#[serde(rename_all = "camelCase", deny_unknown_fields)]
516pub struct MessagingSurface {
517    pub provider: String,
518    pub placement: Placement,
519    pub account_id: String,
520    pub surface_id: String,
521    #[serde(default, skip_serializing_if = "Option::is_none")]
522    pub display_name: Option<String>,
523    pub state: SurfaceState,
524    #[serde(default, skip_serializing_if = "Option::is_none")]
525    pub scope_id: Option<String>,
526    pub first_seen_at_ms: i64,
527    pub last_seen_at_ms: i64,
528}
529
530#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
531#[serde(rename_all = "camelCase", deny_unknown_fields)]
532pub struct SurfaceListResponse {
533    pub surfaces: Vec<MessagingSurface>,
534}
535
536#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
537#[serde(rename_all = "camelCase", deny_unknown_fields)]
538pub struct SurfaceRequest {
539    pub provider: String,
540    pub placement: Placement,
541    pub surface_id: String,
542}
543
544#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
545#[serde(rename_all = "camelCase", deny_unknown_fields)]
546pub struct SurfaceBindCodeCreateRequest {
547    pub provider: String,
548    pub placement: Placement,
549    pub surface_id: String,
550    pub scope_id: String,
551}
552
553#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
554#[serde(rename_all = "camelCase", deny_unknown_fields)]
555pub struct ActorLinkCodeCreateRequest {
556    pub provider: String,
557    pub placement: Placement,
558    pub account_id: String,
559    pub target: ActorLinkTarget,
560}
561
562#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
563#[serde(
564    tag = "audience",
565    rename_all = "lowercase",
566    rename_all_fields = "camelCase",
567    deny_unknown_fields
568)]
569pub enum ActorLinkTarget {
570    Personal,
571    Shared { surface_id: String },
572}
573
574#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
575#[serde(rename_all = "camelCase", deny_unknown_fields)]
576pub struct ChallengeCode {
577    pub code: String,
578    pub command: String,
579    pub expires_at_ms: i64,
580}
581
582#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
583#[serde(rename_all = "camelCase", deny_unknown_fields)]
584pub struct ActorLinkChallenge {
585    pub challenge_id: String,
586    pub code: String,
587    pub command: String,
588    pub target: ActorLinkTarget,
589    pub expires_at_ms: i64,
590}
591
592#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
593#[serde(rename_all = "camelCase", deny_unknown_fields)]
594pub struct ActorLinkChallengeResponse {
595    pub challenge: ActorLinkChallenge,
596}
597
598#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
599#[serde(rename_all = "camelCase", deny_unknown_fields)]
600pub struct ActorLinkCandidate {
601    pub actor: ExternalActor,
602    pub address: MessagingAddress,
603    pub event_id: String,
604}
605
606#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
607#[serde(rename_all = "camelCase", deny_unknown_fields)]
608pub struct ActorLinkClaim {
609    pub challenge_id: String,
610    pub provider: String,
611    pub placement: Placement,
612    pub account_id: String,
613    pub target: ActorLinkTarget,
614    pub expires_at_ms: i64,
615    pub lifecycle: ActorLinkClaimLifecycle,
616}
617
618#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
619#[serde(
620    tag = "state",
621    rename_all = "snake_case",
622    rename_all_fields = "camelCase",
623    deny_unknown_fields
624)]
625pub enum ActorLinkClaimLifecycle {
626    Issued,
627    AwaitingConfirmation {
628        candidate: ActorLinkCandidate,
629    },
630    Confirming {
631        candidate: ActorLinkCandidate,
632    },
633    Completed {
634        candidate: ActorLinkCandidate,
635        link_id: String,
636    },
637    Superseded,
638    Expired,
639}
640
641#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
642#[serde(rename_all = "camelCase", deny_unknown_fields)]
643pub struct ActorLinkClaimRequest {
644    pub provider: String,
645    pub placement: Placement,
646    pub challenge_id: String,
647}
648
649#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
650#[serde(rename_all = "camelCase", deny_unknown_fields)]
651pub struct ActorLinkClaimResponse {
652    pub claim: ActorLinkClaim,
653}
654
655#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
656#[serde(rename_all = "camelCase", deny_unknown_fields)]
657pub struct ActorLinkClaimEvent {
658    pub claim: ActorLinkClaim,
659}
660
661#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
662#[serde(rename_all = "camelCase", deny_unknown_fields)]
663pub struct ChallengeCodeResponse {
664    pub challenge: ChallengeCode,
665}
666
667#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
668#[serde(rename_all = "camelCase", deny_unknown_fields)]
669pub struct ActorLinkListRequest {
670    pub provider: String,
671    pub placement: Placement,
672    #[serde(default, skip_serializing_if = "Option::is_none")]
673    pub account_id: Option<String>,
674}
675
676#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
677#[serde(rename_all = "camelCase", deny_unknown_fields)]
678pub struct ActorLinkView {
679    pub link_id: String,
680    pub provider: String,
681    pub placement: Placement,
682    pub account_id: String,
683    pub external_user_id: String,
684    #[serde(default, skip_serializing_if = "Option::is_none")]
685    pub display_name: Option<String>,
686    pub created_at_ms: i64,
687    pub updated_at_ms: i64,
688}
689
690#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
691#[serde(rename_all = "camelCase", deny_unknown_fields)]
692pub struct ActorLinkListResponse {
693    pub links: Vec<ActorLinkView>,
694}
695
696#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
697#[serde(rename_all = "camelCase", deny_unknown_fields)]
698pub struct ActorLinkDeleteRequest {
699    pub provider: String,
700    pub placement: Placement,
701    pub link_id: String,
702}