cosmo/backend/app/config.py

82 lines
2.5 KiB
Python

"""
Application configuration
"""
from typing import Union
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import Field, field_validator, ValidationInfo
def parse_cors_origins(v: Union[str, list]) -> list[str]:
"""Parse CORS origins from comma-separated string or list"""
if isinstance(v, str):
# Parse comma-separated string
return [origin.strip() for origin in v.split(',') if origin.strip()]
if isinstance(v, list):
return v
return ["*"]
class Settings(BaseSettings):
"""Application settings"""
model_config = SettingsConfigDict(env_file=".env")
# Application
app_name: str = "Cosmo - Deep Space Explorer"
api_prefix: str = "/api"
# CORS settings - allow all origins for development (IP access support)
cors_origins: list[str] = Field(default_factory=lambda: ["*"])
@field_validator('cors_origins', mode='before')
@classmethod
def validate_cors_origins(cls, v: Union[str, list], info: ValidationInfo) -> list[str]:
"""Parse CORS origins from comma-separated string or JSON array"""
return parse_cors_origins(v)
# Cache settings
cache_ttl_days: int = 3
# JWT settings
jwt_secret_key: str = "your-secret-key-change-this-in-production"
jwt_algorithm: str = "HS256"
jwt_access_token_expire_minutes: int = 60 * 24 # 24 hours
# Database settings (PostgreSQL)
database_host: str = "localhost"
database_port: int = 5432
database_name: str = "cosmo_db"
database_user: str = "postgres"
database_password: str = "postgres"
database_pool_size: int = 20
database_max_overflow: int = 10
# Redis settings
redis_host: str = "localhost"
redis_port: int = 6379
redis_db: int = 0
redis_password: str = ""
redis_max_connections: int = 50
# File upload settings
upload_dir: str = "upload"
max_upload_size: int = 10485760 # 10MB
@property
def database_url(self) -> str:
"""Construct database URL for SQLAlchemy"""
return (
f"postgresql+asyncpg://{self.database_user}:{self.database_password}"
f"@{self.database_host}:{self.database_port}/{self.database_name}"
)
@property
def redis_url(self) -> str:
"""Construct Redis URL"""
if self.redis_password:
return f"redis://:{self.redis_password}@{self.redis_host}:{self.redis_port}/{self.redis_db}"
return f"redis://{self.redis_host}:{self.redis_port}/{self.redis_db}"
settings = Settings()