rusty_cdk_core/s3/
dto.rs

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