use std::collections::BTreeMap;
use std::sync::Arc;
use parking_lot::RwLock;
use serde::{Deserialize, Serialize};
use fakecloud_core::multi_account::{AccountState, MultiAccountState};
use serde_json::Value;
pub const APPSYNC_SNAPSHOT_SCHEMA_VERSION: u32 = 1;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SchemaState {
#[serde(default)]
pub definition: String,
#[serde(default)]
pub status: String,
#[serde(default)]
pub details: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AppSyncData {
#[serde(default)]
pub graphql_apis: BTreeMap<String, Value>,
#[serde(default)]
pub schemas: BTreeMap<String, SchemaState>,
#[serde(default)]
pub api_keys: BTreeMap<String, BTreeMap<String, Value>>,
#[serde(default)]
pub data_sources: BTreeMap<String, BTreeMap<String, Value>>,
#[serde(default)]
pub resolvers: BTreeMap<String, BTreeMap<String, Value>>,
#[serde(default)]
pub functions: BTreeMap<String, BTreeMap<String, Value>>,
#[serde(default)]
pub types: BTreeMap<String, BTreeMap<String, Value>>,
#[serde(default)]
pub api_caches: BTreeMap<String, Value>,
#[serde(default)]
pub env_vars: BTreeMap<String, BTreeMap<String, String>>,
#[serde(default)]
pub domain_names: BTreeMap<String, Value>,
#[serde(default)]
pub api_associations: BTreeMap<String, Value>,
#[serde(default)]
pub apis: BTreeMap<String, Value>,
#[serde(default)]
pub channel_namespaces: BTreeMap<String, BTreeMap<String, Value>>,
#[serde(default)]
pub source_api_associations: BTreeMap<String, Value>,
#[serde(default)]
pub introspections: BTreeMap<String, Value>,
#[serde(default)]
pub tags: BTreeMap<String, BTreeMap<String, String>>,
}
pub fn now_epoch() -> f64 {
chrono::Utc::now().timestamp_millis() as f64 / 1000.0
}
impl AccountState for AppSyncData {
fn new_for_account(_account_id: &str, _region: &str, _endpoint: &str) -> Self {
Self::default()
}
}
pub type SharedAppSyncState = Arc<RwLock<MultiAccountState<AppSyncData>>>;
#[derive(Debug, Serialize, Deserialize)]
pub struct AppSyncSnapshot {
pub schema_version: u32,
pub accounts: MultiAccountState<AppSyncData>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn new_account_is_empty() {
let data = AppSyncData::new_for_account("000000000000", "us-east-1", "");
assert!(data.graphql_apis.is_empty());
assert!(data.tags.is_empty());
}
}