1+ from typing import Self
2+
3+ from pydantic import model_validator
14from pydantic_settings import BaseSettings , SettingsConfigDict
25
36from config import CDNSettings
47
58
69class StorageConfig (BaseSettings ):
7- """Configuration class for storage service. Convenience layer between application and object storage."""
10+ """
11+ Configuration class for storage service. Convenience layer between application and object storage.
12+ This class represents that storage settings to connect with a single object store (i.e., S3 bucket)
13+ """
814
915 # Custom (S3 or other) endpoint URL
1016 endpoint_url : str | None = None
@@ -13,6 +19,9 @@ class StorageConfig(BaseSettings):
1319 secret_key : str | None = None
1420 access_key : str | None = None
1521
22+ kms_enabled : bool = False
23+ kms_key_id : str | None = None
24+
1625 # Public domain to front storage keys without scheme
1726 # TODO Default to null??
1827 domain : str = ""
@@ -27,6 +36,12 @@ class StorageConfig(BaseSettings):
2736
2837 model_config = SettingsConfigDict (extra = "ignore" )
2938
39+ @model_validator (mode = "after" )
40+ def validate_settings (self ) -> Self :
41+ if self .kms_enabled and not self .kms_key_id :
42+ raise ValueError ("kms_key_id must be set if kms_enabled is True" )
43+ return self
44+
3045 @classmethod
3146 def generate_media_settings (cls , cdn_settings : CDNSettings ) -> "StorageConfig" :
3247 return cls (
@@ -39,6 +54,8 @@ def generate_media_settings(cls, cdn_settings: CDNSettings) -> "StorageConfig":
3954 secret_key = cdn_settings .secret_key ,
4055 access_key = cdn_settings .access_key ,
4156 ttl_signed_urls = cdn_settings .ttl_signed_urls ,
57+ kms_enabled = cdn_settings .bucket_kms_enabled ,
58+ kms_key_id = cdn_settings .bucket_kms_key_id ,
4259 )
4360
4461 @classmethod
@@ -51,6 +68,8 @@ def generate_answer_settings(cls, cdn_settings: CDNSettings) -> "StorageConfig":
5168 secret_key = cdn_settings .secret_key ,
5269 access_key = cdn_settings .access_key ,
5370 ttl_signed_urls = cdn_settings .ttl_signed_urls ,
71+ kms_enabled = cdn_settings .bucket_answer_kms_enabled ,
72+ kms_key_id = cdn_settings .bucket_answer_kms_key_id ,
5473 )
5574
5675 @classmethod
@@ -63,6 +82,8 @@ def generate_operations_settings(cls, cdn_settings: CDNSettings) -> "StorageConf
6382 secret_key = cdn_settings .secret_key ,
6483 access_key = cdn_settings .access_key ,
6584 ttl_signed_urls = cdn_settings .ttl_signed_urls ,
85+ kms_enabled = cdn_settings .bucket_operation_kms_enabled ,
86+ kms_key_id = cdn_settings .bucket_operation_kms_key_id ,
6687 )
6788
6889 @classmethod
@@ -75,4 +96,6 @@ def generate_logs_settings(cls, cdn_settings: CDNSettings) -> "StorageConfig":
7596 secret_key = cdn_settings .secret_key ,
7697 access_key = cdn_settings .access_key ,
7798 ttl_signed_urls = cdn_settings .ttl_signed_urls ,
99+ kms_enabled = cdn_settings .bucket_answer_kms_enabled ,
100+ kms_key_id = cdn_settings .bucket_answer_kms_key_id ,
78101 )
0 commit comments