approval/app/config/settings.py

84 lines
2.7 KiB
Python

from __future__ import annotations
import os
from typing import List
from dotenv import load_dotenv
from dataclasses import dataclass
from functools import lru_cache
@dataclass(frozen=True)
class Settings:
feishu_app_id: str
feishu_app_secret: str
feishu_verify_token: str
feishu_encrypt_key: str
feishu_ws_url: str
feishu_approval_code: str
feishu_approval_event_key: str
feishu_project_no_field_code: str
feishu_unsubscribe_codes: List[str]
feishu_unsubscribe_once: bool
huobanyun_app_id: str
huobanyun_app_secret: str
huobanyun_token: str
huobanyun_api_key: str
huobanyun_base_url: str
huobanyun_order_status_done_id: str
huobanyun_order_status_done_name: str
log_level: str
log_rotation: str
log_max_bytes: int
log_backup_count: int
log_query_token: str
request_timeout: int
retry_count: int
def _env(name: str, default: str = "") -> str:
return os.getenv(name, default).strip()
def _env_list(name: str) -> List[str]:
raw = os.getenv(name, "")
return [item.strip() for item in raw.split(",") if item.strip()]
def _env_bool(name: str, default: str = "false") -> bool:
return _env(name, default).lower() in {"1", "true", "yes", "y", "on"}
@lru_cache(maxsize=1)
def get_settings() -> Settings:
load_dotenv()
return Settings(
feishu_app_id=_env("FEISHU_APP_ID"),
feishu_app_secret=_env("FEISHU_APP_SECRET"),
feishu_verify_token=_env("FEISHU_VERIFY_TOKEN"),
feishu_encrypt_key=_env("FEISHU_ENCRYPT_KEY"),
feishu_ws_url=_env("FEISHU_WS_URL"),
feishu_approval_code=_env("FEISHU_APPROVAL_CODE"),
feishu_approval_event_key=_env("FEISHU_APPROVAL_EVENT_KEY"),
feishu_project_no_field_code=_env("FEISHU_PROJECT_NO_FIELD_CODE"),
feishu_unsubscribe_codes=_env_list("FEISHU_UNSUBSCRIBE_CODES"),
feishu_unsubscribe_once=_env_bool("FEISHU_UNSUBSCRIBE_ONCE", "false"),
huobanyun_app_id=_env("HUOBANYUN_APP_ID"),
huobanyun_app_secret=_env("HUOBANYUN_APP_SECRET"),
huobanyun_token=_env("HUOBANYUN_TOKEN"),
huobanyun_api_key=_env("HUOBANYUN_API_KEY"),
huobanyun_base_url=_env("HUOBANYUN_BASE_URL"),
huobanyun_order_status_done_id=_env("HUOBANYUN_ORDER_STATUS_DONE_ID"),
huobanyun_order_status_done_name=_env("HUOBANYUN_ORDER_STATUS_DONE_NAME", "已完成"),
log_level=_env("LOG_LEVEL", "INFO"),
log_rotation=_env("LOG_ROTATION", "size"),
log_max_bytes=int(_env("LOG_MAX_BYTES", "10485760")),
log_backup_count=int(_env("LOG_BACKUP_COUNT", "10")),
log_query_token=_env("LOG_QUERY_TOKEN"),
request_timeout=int(_env("REQUEST_TIMEOUT", "10")),
retry_count=int(_env("RETRY_COUNT", "2")),
)