from uuid import UUID from pydantic import ( UUID4, BaseModel, ConfigDict, Field, TypeAdapter, field_serializer, ) from m2mconfig import constants class ClientMetadata(BaseModel): """Model for client_metadata info.""" m2m_identity_uuid: UUID4 can_impersonate: bool = False @field_serializer("m2m_identity_uuid", mode="plain") def serialize_uuid(self, value: UUID) -> str: """For model_dump, convert uuid type to string.""" return str(value) @field_serializer("can_impersonate", mode="plain") def serialize_bool(self, value: bool) -> str: """For model_dump, convert boolean to lowercase string.""" return str(value).lower() class NoAwsAccountException(Exception): """NoAwsAccountException.""" pass class RegistryEntry(BaseModel): """Model for each M2M application configuration.""" model_config = ConfigDict( str_strip_whitespace=True, ) name: str = Field(min_length=1) prod_aws_account: str = Field(min_length=12, max_length=12) qa_aws_account: str = Field(min_length=12, max_length=12) uat_aws_account: str | None = Field(min_length=12, max_length=12, default=None) client_metadata: ClientMetadata def get_aws_account(self, environment: str) -> str: """Get AWS Account by environment. Use the QA AWS Account ID for the RegistryEntry whenever the environment is not prod. """ if environment == constants.PROD_ENVIRONMENT: return self.prod_aws_account if environment == constants.UAT_ENVIRONMENT: if not self.uat_aws_account: raise NoAwsAccountException( f"{self.name} has no uat_aws_account configured." ) return self.uat_aws_account return self.qa_aws_account class ClientCredentials(BaseModel): """Model for M2M Client Credentials.""" audience: str client_id: str client_secret: str grant_type: str = "client_credentials" class ClientGrants(BaseModel): """Model for Auth0 Client Grants for M2M.""" id: str client_id: str audience: str scope: list[str] ClientGrantsValidator = TypeAdapter(list[ClientGrants])