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_codes: List[str] feishu_approval_code_public: List[str] feishu_approval_code_private: List[str] feishu_approval_event_key: str feishu_project_no_field_code: str 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()] @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_codes=_env_list("FEISHU_APPROVAL_CODES"), feishu_approval_code_public=_env_list("FEISHU_APPROVAL_CODE_PUBLIC"), feishu_approval_code_private=_env_list("FEISHU_APPROVAL_CODE_PRIVATE"), feishu_approval_event_key=_env("FEISHU_APPROVAL_EVENT_KEY"), feishu_project_no_field_code=_env("FEISHU_PROJECT_NO_FIELD_CODE"), 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")), )