fakecloud_appsync/
state.rs1use std::collections::BTreeMap;
12use std::sync::Arc;
13
14use parking_lot::RwLock;
15use serde::{Deserialize, Serialize};
16
17use fakecloud_core::multi_account::{AccountState, MultiAccountState};
18use serde_json::Value;
19
20pub const APPSYNC_SNAPSHOT_SCHEMA_VERSION: u32 = 1;
21
22#[derive(Debug, Clone, Default, Serialize, Deserialize)]
24pub struct SchemaState {
25 #[serde(default)]
27 pub definition: String,
28 #[serde(default)]
31 pub status: String,
32 #[serde(default)]
34 pub details: String,
35}
36
37#[derive(Debug, Clone, Default, Serialize, Deserialize)]
39pub struct AppSyncData {
40 #[serde(default)]
42 pub graphql_apis: BTreeMap<String, Value>,
43 #[serde(default)]
45 pub schemas: BTreeMap<String, SchemaState>,
46 #[serde(default)]
48 pub api_keys: BTreeMap<String, BTreeMap<String, Value>>,
49 #[serde(default)]
51 pub data_sources: BTreeMap<String, BTreeMap<String, Value>>,
52 #[serde(default)]
54 pub resolvers: BTreeMap<String, BTreeMap<String, Value>>,
55 #[serde(default)]
57 pub functions: BTreeMap<String, BTreeMap<String, Value>>,
58 #[serde(default)]
60 pub types: BTreeMap<String, BTreeMap<String, Value>>,
61 #[serde(default)]
63 pub api_caches: BTreeMap<String, Value>,
64 #[serde(default)]
66 pub env_vars: BTreeMap<String, BTreeMap<String, String>>,
67 #[serde(default)]
69 pub domain_names: BTreeMap<String, Value>,
70 #[serde(default)]
72 pub api_associations: BTreeMap<String, Value>,
73 #[serde(default)]
75 pub apis: BTreeMap<String, Value>,
76 #[serde(default)]
78 pub channel_namespaces: BTreeMap<String, BTreeMap<String, Value>>,
79 #[serde(default)]
81 pub source_api_associations: BTreeMap<String, Value>,
82 #[serde(default)]
84 pub introspections: BTreeMap<String, Value>,
85 #[serde(default)]
87 pub tags: BTreeMap<String, BTreeMap<String, String>>,
88}
89
90pub fn now_epoch() -> f64 {
94 chrono::Utc::now().timestamp_millis() as f64 / 1000.0
95}
96
97impl AccountState for AppSyncData {
98 fn new_for_account(_account_id: &str, _region: &str, _endpoint: &str) -> Self {
99 Self::default()
100 }
101}
102
103pub type SharedAppSyncState = Arc<RwLock<MultiAccountState<AppSyncData>>>;
104
105#[derive(Debug, Serialize, Deserialize)]
106pub struct AppSyncSnapshot {
107 pub schema_version: u32,
108 pub accounts: MultiAccountState<AppSyncData>,
109}
110
111#[cfg(test)]
112mod tests {
113 use super::*;
114
115 #[test]
116 fn new_account_is_empty() {
117 let data = AppSyncData::new_for_account("000000000000", "us-east-1", "");
118 assert!(data.graphql_apis.is_empty());
119 assert!(data.tags.is_empty());
120 }
121}