aboutsummaryrefslogtreecommitdiff
path: root/jb/settings.py
diff options
context:
space:
mode:
authorMax Nanis2026-09-13 19:03:55 +0000
committerMax Nanis2026-09-13 19:03:55 +0000
commit8fbe8d439b418796932aaa88297e006c714e4d13 (patch)
tree6c800476edc1e771fc570b559d483df8d59d4324 /jb/settings.py
parent12f6fee851b68e86af658dfa17e4a0daed457dd1 (diff)
parent2c94f248d2438071a918fa9a30bf114ef9aa29b4 (diff)
downloadamt-jb-8fbe8d439b418796932aaa88297e006c714e4d13.tar.gz
amt-jb-8fbe8d439b418796932aaa88297e006c714e4d13.zip
Merges pull request #3
Off of Amazon!!!
Diffstat (limited to 'jb/settings.py')
-rw-r--r--jb/settings.py128
1 files changed, 79 insertions, 49 deletions
diff --git a/jb/settings.py b/jb/settings.py
index d529591..1c02075 100644
--- a/jb/settings.py
+++ b/jb/settings.py
@@ -1,78 +1,108 @@
-import os
from functools import lru_cache
+from os.path import abspath
+from os.path import dirname as pdirname
+from os.path import join as pjoin
from pathlib import Path
-from typing import Optional
-from generalresearchutils.models.custom_types import InfluxDsn
-from pydantic import Field, PostgresDsn, HttpUrl, RedisDsn
-from pydantic_settings import BaseSettings, SettingsConfigDict
+from generalresearch.config import GRLBaseSettings, is_debug
+from generalresearch.models.custom_types import (
+ InfluxDsn,
+ UUIDStr,
+)
+from pydantic import Field, HttpUrl, PostgresDsn, SecretStr, model_validator
+from pydantic_settings import SettingsConfigDict
-from jb.models.custom_types import UUIDStr
-
-BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+BASE_DIR = pdirname(pdirname(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(GRLBaseSettings):
- amt_bonus_cashout_method: str = Field()
- amt_assignment_cashout_method: str = Field()
-
-
-class Settings(AmtJbBaseSettings):
model_config = SettingsConfigDict(
- env_prefix="",
+ env_file=(".env.test", ".env.testing", ".env.staging", ".env.prod"),
+ env_file_encoding="utf-8",
case_sensitive=False,
- env_file=os.path.join(BASE_DIR, ".env"),
extra="allow",
cli_parse_args=False,
)
- debug: bool = False
+
+ amt_jb_db: PostgresDsn | None = Field(default=None)
+
+ amt_endpoint: HttpUrl | None = Field(default=None)
+ amt_access_id: str | None = Field(default=None)
+ amt_secret_key: str | None = Field(default=None)
+
+ aws_owner_id: str | None = Field(default=None)
+ aws_subscription_arn: str | None = Field(default=None)
+
+ # --- Pytest ---
+
app_name: str = "AMT JB API"
+ base_url: HttpUrl = Field(default=HttpUrl("https://jamesbillings67.com/"))
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)
+ fsb_host_private_route: str | None = Field(default=None)
- product_id: UUIDStr = Field()
+ product_id: UUIDStr | None = Field(default=None)
- influx_db: Optional[InfluxDsn] = Field(default=None)
+ influx_db: InfluxDsn | None = Field(default=None)
- sns_path: str = Field()
+ sns_path: str | None = Field(default=None)
+ session_token_ttl_seconds: int = Field(default=30 * 24 * 60 * 60, gt=0) # 30 days
+ session_jwt_secret: SecretStr | None = Field(default=None, min_length=32)
-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"
+ magic_token_salt: SecretStr | None = Field(default=None, min_length=32)
+ gr_api_host: HttpUrl = Field(default=HttpUrl("https://generalresearch.com/api/v2/"))
+ gr_api_token: SecretStr | None = Field(default=None, min_length=1)
-@lru_cache
-def get_settings():
- return Settings()
+ mautic_api_key: SecretStr | None = Field(default=None, min_length=32)
+
+ @model_validator(mode="after")
+ def validate_host_and_key(self) -> "Settings":
+
+ self.debug = is_debug()
+
+ if self.debug:
+ return self
+
+ if not self.amt_jb_db:
+ raise ValueError("amt_jb_db is required")
+
+ if not self.aws_owner_id:
+ raise ValueError("aws_owner_id is required")
+
+ if not self.aws_subscription_arn:
+ raise ValueError("aws_subscription_arn is required")
+
+ if not self.product_id:
+ raise ValueError("product_id is required")
+
+ if not self.sns_path:
+ raise ValueError("sns_path is required")
+
+ if not self.session_jwt_secret:
+ raise ValueError("session_jwt_secret is required")
+
+ if not self.magic_token_salt:
+ raise ValueError("magic_token_salt is required")
+
+ if self.session_jwt_secret == self.magic_token_salt:
+ raise ValueError("JWT Secret must be different than Magic Token Salt")
+
+ if not self.gr_api_token:
+ raise ValueError("gr_api_token is required")
+
+ if not self.mautic_api_key:
+ raise ValueError("mautic_api_key is required")
+
+ return self
@lru_cache
-def get_test_settings():
- return TestSettings()
+def get_settings():
+ return Settings()