Skip to main content

rusty_cdk_core/s3/
dto.rs

1use crate::iam::PolicyDocument;
2use crate::shared::{Id, UpdateDeletePolicyDTO};
3use crate::{dto_methods, ref_struct};
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7#[derive(Debug, Serialize, Deserialize)]
8pub(crate) enum BucketPolicyType {
9    #[serde(rename = "AWS::S3::BucketPolicy")]
10    BucketPolicyType
11}
12
13ref_struct!(BucketPolicyRef);
14
15#[derive(Debug, Serialize, Deserialize)]
16pub struct BucketPolicy {
17    #[serde(skip)]
18    pub(super) id: Id,
19    #[serde(skip)]
20    pub(super) resource_id: String,
21    #[serde(rename = "Type")]
22    pub(super) r#type: BucketPolicyType,
23    #[serde(rename = "Properties")]
24    pub(crate) properties: S3BucketPolicyProperties,
25}
26dto_methods!(BucketPolicy);
27
28#[derive(Debug, Serialize, Deserialize)]
29pub struct S3BucketPolicyProperties {
30    #[serde(rename = "Bucket")]
31    pub(crate) bucket_name: Value,
32    #[serde(rename = "PolicyDocument")]
33    pub(crate) policy_document: PolicyDocument,
34}
35
36#[derive(Debug, Serialize, Deserialize)]
37pub(crate) enum BucketType {
38    #[serde(rename = "AWS::S3::Bucket")]
39    BucketType
40}
41
42ref_struct!(BucketRef);
43
44#[derive(Debug, Serialize, Deserialize)]
45pub struct Bucket {
46    #[serde(skip)]
47    pub(super) id: Id,
48    #[serde(skip)]
49    pub(super) resource_id: String,
50    #[serde(rename = "Type")]
51    pub(super) r#type: BucketType,
52    #[serde(rename = "Properties")]
53    pub(super) properties: BucketProperties,
54    #[serde(flatten)]
55    pub(crate) update_delete_policy_dto: UpdateDeletePolicyDTO
56}
57dto_methods!(Bucket);
58
59#[derive(Debug, Serialize, Deserialize)]
60pub struct BucketProperties {
61    #[serde(rename = "AbacStatus", skip_serializing_if = "Option::is_none")]
62    pub(super) abac_status: Option<String>,
63    #[serde(rename = "AccelerateConfiguration", skip_serializing_if = "Option::is_none")]
64    pub(super) accelerate_configuration: Option<AccelerateConfiguration>,
65    #[serde(rename = "BucketName", skip_serializing_if = "Option::is_none")]
66    pub(super) bucket_name: Option<String>,
67    #[serde(rename = "BucketEncryption", skip_serializing_if = "Option::is_none")]
68    pub(super) bucket_encryption: Option<BucketEncryption>,
69    #[serde(rename = "CorsConfiguration", skip_serializing_if = "Option::is_none")]
70    pub(super) cors_configuration: Option<CorsConfiguration>,
71    #[serde(rename = "IntelligentTieringConfigurations", skip_serializing_if = "Option::is_none")]
72    pub(super) intelligent_tiering_configurations: Option<Vec<IntelligentTieringConfiguration>>,
73    #[serde(rename = "LifecycleConfiguration", skip_serializing_if = "Option::is_none")]
74    pub(super) lifecycle_configuration: Option<LifecycleConfiguration>,
75    #[serde(rename = "MetadataConfiguration", skip_serializing_if = "Option::is_none")]
76    pub(super) metadata_configuration: Option<MetadataConfiguration>,
77    // notification_configuration is handled by a custom resource
78    #[serde(rename = "PublicAccessBlockConfiguration", skip_serializing_if = "Option::is_none")]
79    pub(super) public_access_block_configuration: Option<PublicAccessBlockConfiguration>,
80    #[serde(rename = "VersioningConfiguration", skip_serializing_if = "Option::is_none")]
81    pub(super) versioning_configuration: Option<VersioningConfig>,
82    #[serde(rename = "WebsiteConfiguration", skip_serializing_if = "Option::is_none")]
83    pub(super) website_configuration: Option<WebsiteConfiguration>,
84    // to add //
85    // "AnalyticsConfigurations" : [ AnalyticsConfiguration, ... ],
86    // "InventoryConfigurations" : [ InventoryConfiguration, ... ],
87    // "ReplicationConfiguration" : ReplicationConfiguration,
88    // "LoggingConfiguration" : LoggingConfiguration,
89    // "MetricsConfigurations" : [ MetricsConfiguration, ... ],
90
91    // less important //
92    // "ObjectLockConfiguration" : ObjectLockConfiguration,
93    // "ObjectLockEnabled" : Boolean,
94    // "OwnershipControls" : OwnershipControls,
95}
96
97#[derive(Debug, Serialize, Deserialize)]
98pub struct MetadataConfiguration {
99    #[serde(rename = "Destination")]
100    pub(super) destination: Option<MetadataDestination>,
101    #[serde(rename = "InventoryTableConfiguration")]
102    pub(super) inventory_table_configuration: Option<InventoryTableConfiguration>,
103    #[serde(rename = "JournalTableConfiguration")]
104    pub(super) journal_table_configuration: JournalTableConfiguration,
105}
106
107#[derive(Debug, Serialize, Deserialize)]
108pub struct MetadataDestination {
109    #[serde(rename = "TableBucketArn", skip_serializing_if = "Option::is_none")]
110    pub(super) table_bucket_arn: Option<Value>,
111    #[serde(rename = "TableBucketType")]
112    pub(super) table_bucket_type: String,
113    #[serde(rename = "TableNamespace", skip_serializing_if = "Option::is_none")]
114    pub(super) table_namespace: Option<String>,
115}
116
117#[derive(Debug, Serialize, Deserialize)]
118pub struct InventoryTableConfiguration {
119    #[serde(rename = "ConfigurationState")]
120    pub(super) configuration_state: String,
121    #[serde(rename = "TableArn", skip_serializing_if = "Option::is_none")]
122    pub(super) table_arn: Option<Value>,
123    #[serde(rename = "TableName", skip_serializing_if = "Option::is_none")]
124    pub(super) table_name: Option<String>,
125    // #[serde(rename = "EncryptionConfiguration", skip_serializing_if = "Option::is_none")]
126    // pub(super) encryption_configuration: MetadataTableEncryptionConfiguration,
127}
128
129#[derive(Debug, Serialize, Deserialize)]
130pub struct JournalTableConfiguration {
131    #[serde(rename = "RecordExpiration")]
132    pub(super) record_expiration: RecordExpiration,
133    #[serde(rename = "TableArn", skip_serializing_if = "Option::is_none")]
134    pub(super) table_arn: Option<Value>,
135    #[serde(rename = "TableName", skip_serializing_if = "Option::is_none")]
136    pub(super) table_name: Option<String>,
137    // #[serde(rename = "EncryptionConfiguration", skip_serializing_if = "Option::is_none")]
138    // pub(super) encryption_configuration: MetadataTableEncryptionConfiguration,
139}
140
141#[derive(Debug, Serialize, Deserialize)]
142pub struct RecordExpiration {
143    #[serde(rename = "Days", skip_serializing_if = "Option::is_none")]
144    pub(super) days: Option<u32>,
145    #[serde(rename = "Expiration")]
146    pub(super) expiration: String,
147}
148
149#[derive(Debug, Serialize, Deserialize)]
150pub struct IntelligentTieringConfiguration {
151    #[serde(rename = "Id")]
152    pub(super) id: String,
153    #[serde(rename = "Prefix", skip_serializing_if = "Option::is_none")]
154    pub(super) prefix: Option<String>,
155    #[serde(rename = "Status")]
156    pub(super) status: String,
157    #[serde(rename = "TagFilters", skip_serializing_if = "Option::is_none")]
158    pub(super) tag_filters: Option<Vec<TagFilter>>,
159    #[serde(rename = "Tierings")]
160    pub(super) tierings: Vec<Tiering>,
161}
162
163#[derive(Debug, Serialize, Deserialize)]
164pub struct Tiering {
165    #[serde(rename = "AccessTier")]
166    pub(super) access_tier: String,
167    #[serde(rename = "Days")]
168    pub(super) days: u16,
169}
170
171#[derive(Debug, Serialize, Deserialize)]
172pub struct TagFilter {
173    #[serde(rename = "Key")]
174    pub(super) key: String,
175    #[serde(rename = "Value")]
176    pub(super) value: String,
177}
178
179#[derive(Debug, Serialize, Deserialize)]
180pub struct AccelerateConfiguration {
181    #[serde(rename = "AccelerationStatus")]
182    pub(super) acceleration_status: String,
183}
184
185#[derive(Debug, Serialize, Deserialize)]
186pub struct BucketEncryption {
187    #[serde(rename = "ServerSideEncryptionConfiguration")]
188    pub(super) server_side_encryption_configuration: Vec<ServerSideEncryptionRule>,
189}
190
191#[derive(Debug, Serialize, Deserialize)]
192pub struct ServerSideEncryptionRule {
193    #[serde(rename = "ServerSideEncryptionByDefault")]
194    pub(super) server_side_encryption_by_default: ServerSideEncryptionByDefault,
195    #[serde(rename = "BucketKeyEnabled", skip_serializing_if = "Option::is_none")]
196    pub(super) bucket_key_enabled: Option<bool>,
197}
198
199#[derive(Debug, Serialize, Deserialize)]
200pub struct ServerSideEncryptionByDefault {
201    #[serde(rename = "SSEAlgorithm")]
202    pub(super) sse_algorithm: String,
203    #[serde(rename = "KMSMasterKeyID", skip_serializing_if = "Option::is_none")]
204    pub(super) kms_master_key_id: Option<String>,
205}
206
207#[derive(Debug, Serialize, Deserialize)]
208pub struct CorsConfiguration {
209    #[serde(rename = "CorsRules")]
210    pub(super) cors_rules: Vec<CorsRule>,
211}
212
213#[derive(Debug, Serialize, Deserialize)]
214pub struct CorsRule {
215    #[serde(rename = "AllowedHeaders", skip_serializing_if = "Option::is_none")]
216    pub(super) allowed_headers: Option<Vec<String>>,
217    #[serde(rename = "AllowedMethods")]
218    pub(super) allowed_methods: Vec<String>,
219    #[serde(rename = "AllowedOrigins")]
220    pub(super) allowed_origins: Vec<String>,
221    #[serde(rename = "ExposedHeaders", skip_serializing_if = "Option::is_none")]
222    pub(super) exposed_headers: Option<Vec<String>>,
223    #[serde(rename = "MaxAge", skip_serializing_if = "Option::is_none")]
224    pub(super) max_age: Option<u64>,
225}
226
227#[derive(Debug, Serialize, Deserialize)]
228pub struct LifecycleConfiguration {
229    #[serde(rename = "Rules")]
230    pub(super) rules: Vec<LifecycleRule>,
231    #[serde(rename = "TransitionDefaultMinimumObjectSize", skip_serializing_if = "Option::is_none")]
232    pub(super) transition_minimum_size: Option<String>,
233}
234
235#[derive(Debug, Serialize, Deserialize)]
236pub struct LifecycleRuleTransition {
237    #[serde(rename = "StorageClass")]
238    pub(super) storage_class: String,
239    #[serde(rename = "TransitionInDays")]
240    pub(super) transition_in_days: u16, // will become optional once `TransitionDate` is added!
241                                        // #[serde(rename = "TransitionDate")]
242                                        // pub(super transition_date: String => add and check the regex
243}
244
245#[derive(Debug, Serialize, Deserialize)]
246pub struct NonCurrentVersionTransition {
247    #[serde(rename = "StorageClass")]
248    pub(super) storage_class: String,
249    #[serde(rename = "TransitionInDays")]
250    pub(super) transition_in_days: u32,
251    #[serde(rename = "NewerNoncurrentVersions")]
252    pub(super) newer_non_current_versions: Option<u32>,
253}
254
255#[derive(Debug, Serialize, Deserialize)]
256pub struct LifecycleRule {
257    #[serde(rename = "Id", skip_serializing_if = "Option::is_none")]
258    pub(super) id: Option<String>,
259    #[serde(rename = "Status")]
260    pub(super) status: String,
261    #[serde(rename = "ExpirationInDays", skip_serializing_if = "Option::is_none")]
262    pub(super) expiration_in_days: Option<u16>,
263    #[serde(rename = "Prefix", skip_serializing_if = "Option::is_none")]
264    pub(super) prefix: Option<String>,
265    #[serde(rename = "ObjectSizeGreaterThan", skip_serializing_if = "Option::is_none")]
266    pub(super) object_size_greater_than: Option<u32>,
267    #[serde(rename = "ObjectSizeLessThan", skip_serializing_if = "Option::is_none")]
268    pub(super) object_size_less_than: Option<u32>,
269    #[serde(rename = "AbortIncompleteMultipartUpload", skip_serializing_if = "Option::is_none")]
270    pub(super) abort_incomplete_multipart_upload: Option<u16>,
271    #[serde(rename = "NoncurrentVersionExpiration", skip_serializing_if = "Option::is_none")]
272    pub(super) non_current_version_expiration: Option<u16>,
273    #[serde(rename = "Transitions", skip_serializing_if = "Option::is_none")]
274    pub(super) transitions: Option<Vec<LifecycleRuleTransition>>,
275    #[serde(rename = "NoncurrentVersionTransitions", skip_serializing_if = "Option::is_none")]
276    pub(super) non_current_version_transitions: Option<Vec<NonCurrentVersionTransition>>, 
277    // #[serde(rename = "ExpiredObjectDeleteMarker", skip_serializing_if = "Option::is_none")]
278    // pub(super) expire_object_delete_marker: Option<bool> => cannot be specified with ExpirationInDays, ExpirationDate, or TagFilters.
279    // "ExpirationDate": String => check the regex
280}
281
282#[derive(Debug, Serialize, Deserialize)]
283pub struct TopicConfiguration {
284    #[serde(rename = "Event")]
285    pub(super) event: String,
286    #[serde(rename = "Topic")]
287    pub(super) topic: String,
288    #[serde(rename = "Filter", skip_serializing_if = "Option::is_none")]
289    pub(super) filter: Option<NotificationFilter>,
290}
291
292#[derive(Debug, Serialize, Deserialize)]
293pub struct QueueConfiguration {
294    #[serde(rename = "Event")]
295    pub(super) event: String,
296    #[serde(rename = "Queue")]
297    pub(super) queue: String,
298    #[serde(rename = "Filter", skip_serializing_if = "Option::is_none")]
299    pub(super) filter: Option<NotificationFilter>,
300}
301
302#[derive(Debug, Serialize, Deserialize)]
303pub struct LambdaConfiguration {
304    #[serde(rename = "Event")]
305    pub(super) event: String,
306    #[serde(rename = "Function")]
307    pub(super) function: String,
308    #[serde(rename = "Filter", skip_serializing_if = "Option::is_none")]
309    pub(super) filter: Option<NotificationFilter>,
310}
311
312#[derive(Debug, Serialize, Deserialize)]
313pub struct NotificationFilter {
314    #[serde(rename = "S3Key", skip_serializing_if = "Option::is_none")]
315    pub(super) s3_key: Option<S3KeyFilter>,
316}
317
318#[derive(Debug, Serialize, Deserialize)]
319pub struct S3KeyFilter {
320    #[serde(rename = "Rules")]
321    pub(super) rules: Vec<FilterRule>,
322}
323
324#[derive(Debug, Serialize, Deserialize)]
325pub struct FilterRule {
326    #[serde(rename = "Name")]
327    pub(super) name: String,
328    #[serde(rename = "Value")]
329    pub(super) value: String,
330}
331
332#[derive(Debug, Serialize, Deserialize)]
333pub struct PublicAccessBlockConfiguration {
334    #[serde(rename = "BlockPublicAcls", skip_serializing_if = "Option::is_none")]
335    pub(super) block_public_acls: Option<bool>,
336    #[serde(rename = "BlockPublicPolicy", skip_serializing_if = "Option::is_none")]
337    pub(super) block_public_policy: Option<bool>,
338    #[serde(rename = "IgnorePublicAcls", skip_serializing_if = "Option::is_none")]
339    pub(super) ignore_public_acls: Option<bool>,
340    #[serde(rename = "RestrictPublicBuckets", skip_serializing_if = "Option::is_none")]
341    pub(super) restrict_public_buckets: Option<bool>,
342}
343
344#[derive(Debug, Serialize, Deserialize)]
345pub struct VersioningConfig {
346    #[serde(rename = "Status")]
347    pub(super) status: String,
348}
349
350#[derive(Debug, Serialize, Deserialize)]
351pub struct WebsiteConfiguration {
352    #[serde(rename = "IndexDocument", skip_serializing_if = "Option::is_none")]
353    pub(super) index_document: Option<String>,
354    #[serde(rename = "ErrorDocument", skip_serializing_if = "Option::is_none")]
355    pub(super) error_document: Option<String>,
356    #[serde(rename = "RedirectAllRequestsTo", skip_serializing_if = "Option::is_none")]
357    pub(super) redirect_all_requests_to: Option<RedirectAllRequestsTo>,
358}
359
360#[derive(Debug, Serialize, Deserialize)]
361pub struct RedirectAllRequestsTo {
362    #[serde(rename = "HostName")]
363    pub(super) host_name: String,
364    #[serde(rename = "Protocol", skip_serializing_if = "Option::is_none")]
365    pub(super) protocol: Option<String>,
366}