import os from functools import lru_cache from pathlib import Path from typing import Optional from generalresearch.models.custom_types import InfluxDsn from pydantic import Field, PostgresDsn, HttpUrl, RedisDsn, SecretStr from pydantic_settings import BaseSettings, SettingsConfigDict from jb.models.custom_types import UUIDStr BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_HTML_PATH = Path(BASE_DIR) / "templates" / "base.html" BASE_HTML = BASE_HTML_PATH.read_text() class AmtJbBaseSettings(BaseSettings): debug: bool = Field(default=True) redis: Optional[RedisDsn] = Field(default=None) redis_timeout: float = Field(default=0.10) amt_jb_db: PostgresDsn = Field() amt_endpoint: Optional[HttpUrl] = Field(default=None) amt_access_id: Optional[str] = Field(default=None) amt_secret_key: Optional[str] = Field(default=None) aws_owner_id: str = Field() aws_subscription_arn: str = Field() class Settings(AmtJbBaseSettings): model_config = SettingsConfigDict( env_prefix="", case_sensitive=False, env_file=os.path.join(BASE_DIR, ".env"), extra="allow", cli_parse_args=False, ) debug: bool = False app_name: str = "AMT JB API" fsb_host: HttpUrl = Field(default=HttpUrl("https://fsb.generalresearch.com/")) # Needed for admin function on fsb w/o authentication fsb_host_private_route: Optional[str] = Field(default=None) product_id: UUIDStr = Field() influx_db: Optional[InfluxDsn] = Field(default=None) sns_path: str = Field() session_token_ttl_seconds: int = Field(default=30 * 24 * 60 * 60, gt=0) session_jwt_secret: SecretStr = Field(min_length=32) magic_token_salt: SecretStr = Field(min_length=32) gr_api_host: HttpUrl = Field( default=HttpUrl("https://generalresearch.com/api/v2/") ) gr_api_token: SecretStr = Field(min_length=1) class TestSettings(Settings): model_config = SettingsConfigDict( env_prefix="", case_sensitive=False, env_file=os.path.join(BASE_DIR, ".env.test"), extra="allow", cli_parse_args=False, ) debug: bool = True app_name: str = "AMT JB API Test" @lru_cache def get_settings(): return Settings() @lru_cache def get_test_settings(): return TestSettings()