1use std::collections::BTreeMap;
4use std::sync::Arc;
5
6use chrono::{DateTime, Utc};
7use parking_lot::RwLock;
8use serde::{Deserialize, Serialize};
9
10use crate::extras::{StoredAnycastIpList, StoredResourcePolicy, StoredTrustStore, StoredVpcOrigin};
11use crate::extras2::StoredConnectionGroup;
12use crate::fle::{
13 StoredFieldLevelEncryption, StoredFieldLevelEncryptionProfile, StoredRealtimeLogConfig,
14};
15use crate::functions::{
16 StoredFunction, StoredKeyGroup, StoredKeyValueStore, StoredMonitoringSubscription,
17 StoredOriginAccessIdentity, StoredPublicKey,
18};
19use crate::model::{DistributionConfig, InvalidationBatch};
20use crate::policies::{
21 StoredCachePolicy, StoredContinuousDeploymentPolicy, StoredOriginAccessControl,
22 StoredOriginRequestPolicy, StoredResponseHeadersPolicy,
23};
24use crate::streaming::StoredStreamingDistribution;
25
26pub type SharedCloudFrontState = Arc<RwLock<CloudFrontAccounts>>;
27
28#[derive(Debug, Default, Serialize, Deserialize)]
29pub struct CloudFrontAccounts {
30 pub accounts: BTreeMap<String, AccountState>,
31}
32
33impl CloudFrontAccounts {
34 pub fn new() -> Self {
35 Self::default()
36 }
37
38 pub fn account_count(&self) -> usize {
39 self.accounts.len()
40 }
41
42 pub fn entry(&mut self, account_id: &str) -> &mut AccountState {
43 self.accounts.entry(account_id.to_string()).or_default()
44 }
45
46 pub fn get(&self, account_id: &str) -> Option<&AccountState> {
47 self.accounts.get(account_id)
48 }
49}
50
51#[derive(Debug, Default, Serialize, Deserialize)]
52pub struct AccountState {
53 pub distributions: BTreeMap<String, StoredDistribution>,
54 pub invalidations: BTreeMap<String, StoredInvalidation>,
55 pub tags: BTreeMap<String, Vec<Tag>>,
57 pub origin_access_controls: BTreeMap<String, StoredOriginAccessControl>,
58 pub cache_policies: BTreeMap<String, StoredCachePolicy>,
59 pub origin_request_policies: BTreeMap<String, StoredOriginRequestPolicy>,
60 pub response_headers_policies: BTreeMap<String, StoredResponseHeadersPolicy>,
61 pub continuous_deployment_policies: BTreeMap<String, StoredContinuousDeploymentPolicy>,
62 pub functions: BTreeMap<String, StoredFunction>,
63 pub public_keys: BTreeMap<String, StoredPublicKey>,
64 pub key_groups: BTreeMap<String, StoredKeyGroup>,
65 pub key_value_stores: BTreeMap<String, StoredKeyValueStore>,
66 pub origin_access_identities: BTreeMap<String, StoredOriginAccessIdentity>,
67 pub monitoring_subscriptions: BTreeMap<String, StoredMonitoringSubscription>,
69 pub streaming_distributions: BTreeMap<String, StoredStreamingDistribution>,
70 pub field_level_encryptions: BTreeMap<String, StoredFieldLevelEncryption>,
71 pub field_level_encryption_profiles: BTreeMap<String, StoredFieldLevelEncryptionProfile>,
72 pub realtime_log_configs: BTreeMap<String, StoredRealtimeLogConfig>,
74 pub vpc_origins: BTreeMap<String, StoredVpcOrigin>,
75 pub anycast_ip_lists: BTreeMap<String, StoredAnycastIpList>,
76 pub trust_stores: BTreeMap<String, StoredTrustStore>,
77 pub resource_policies: BTreeMap<String, StoredResourcePolicy>,
79 pub connection_groups: BTreeMap<String, StoredConnectionGroup>,
80}
81
82impl CloudFrontAccounts {
83 pub fn seed_managed_policies(&mut self, account_id: &str) {
90 let account = self.entry(account_id);
91 crate::policies::seed_managed(account);
92 }
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct StoredDistribution {
97 pub id: String,
98 pub arn: String,
99 pub status: String,
100 pub last_modified_time: DateTime<Utc>,
101 pub domain_name: String,
102 pub in_progress_invalidation_batches: u32,
103 pub etag: String,
104 pub config: DistributionConfig,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
108pub struct StoredInvalidation {
109 pub id: String,
110 pub distribution_id: String,
111 pub status: String,
112 pub create_time: DateTime<Utc>,
113 pub batch: InvalidationBatch,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
117pub struct Tag {
118 pub key: String,
119 pub value: Option<String>,
120}