Skip to main content

fakecloud_transfer/
state.rs

1//! Account-partitioned, serializable state for AWS Transfer Family's
2//! (`transfer`) control plane.
3//!
4//! Every Transfer resource is stored as an already-output-valid JSON object
5//! (`serde_json::Value`) keyed by its identifier. Storing the wire shape
6//! directly keeps nested configuration objects (endpoint details,
7//! identity-provider details, connector config, workflow steps) round-tripping
8//! verbatim and guarantees the `Describe` responses echo exactly what was
9//! persisted.
10
11use std::collections::BTreeMap;
12use std::sync::Arc;
13
14use parking_lot::RwLock;
15use serde::{Deserialize, Serialize};
16use serde_json::Value;
17
18use fakecloud_core::multi_account::{AccountState, MultiAccountState};
19
20pub const TRANSFER_SNAPSHOT_SCHEMA_VERSION: u32 = 1;
21
22/// Per-account Transfer Family state. Each resource is stored as its
23/// already-output-valid `DescribedX` JSON object.
24#[derive(Debug, Clone, Default, Serialize, Deserialize)]
25pub struct TransferData {
26    /// Servers keyed by `ServerId` (`s-...`).
27    #[serde(default)]
28    pub servers: BTreeMap<String, Value>,
29    /// Users keyed by `"{ServerId}/{UserName}"`.
30    #[serde(default)]
31    pub users: BTreeMap<String, Value>,
32    /// Service-managed accesses keyed by `"{ServerId}/{ExternalId}"`.
33    #[serde(default)]
34    pub accesses: BTreeMap<String, Value>,
35    /// Host keys keyed by `"{ServerId}/{HostKeyId}"`.
36    #[serde(default)]
37    pub host_keys: BTreeMap<String, Value>,
38    /// Workflows keyed by `WorkflowId` (`w-...`).
39    #[serde(default)]
40    pub workflows: BTreeMap<String, Value>,
41    /// Workflow executions keyed by `"{WorkflowId}/{ExecutionId}"`.
42    #[serde(default)]
43    pub executions: BTreeMap<String, Value>,
44    /// AS2 agreements keyed by `"{ServerId}/{AgreementId}"`.
45    #[serde(default)]
46    pub agreements: BTreeMap<String, Value>,
47    /// Connectors keyed by `ConnectorId` (`c-...`).
48    #[serde(default)]
49    pub connectors: BTreeMap<String, Value>,
50    /// AS2 profiles keyed by `ProfileId` (`p-...`).
51    #[serde(default)]
52    pub profiles: BTreeMap<String, Value>,
53    /// Certificates keyed by `CertificateId` (`cert-...`).
54    #[serde(default)]
55    pub certificates: BTreeMap<String, Value>,
56    /// Web apps keyed by `WebAppId` (`webapp-...`).
57    #[serde(default)]
58    pub web_apps: BTreeMap<String, Value>,
59    /// Web-app customizations keyed by `WebAppId`.
60    #[serde(default)]
61    pub web_app_customizations: BTreeMap<String, Value>,
62    /// Connector file-transfer results keyed by `"{ConnectorId}/{TransferId}"`.
63    #[serde(default)]
64    pub file_transfers: BTreeMap<String, Value>,
65    /// Resource tags keyed by `Arn` -> (key -> value).
66    #[serde(default)]
67    pub tags: BTreeMap<String, BTreeMap<String, String>>,
68}
69
70impl AccountState for TransferData {
71    fn new_for_account(_account_id: &str, _region: &str, _endpoint: &str) -> Self {
72        Self::default()
73    }
74}
75
76pub type SharedTransferState = Arc<RwLock<MultiAccountState<TransferData>>>;
77
78#[derive(Debug, Serialize, Deserialize)]
79pub struct TransferSnapshot {
80    pub schema_version: u32,
81    pub accounts: MultiAccountState<TransferData>,
82}