"""簡化配置 - 用於測試""" from pydantic_settings import BaseSettings import os from dotenv import load_dotenv # 載入 .env 檔案 (必須在讀取環境變數之前) load_dotenv() # 直接從環境變數讀取,不依賴 pydantic-settings 的複雜功能 class Settings: """應用配置 (簡化版)""" # 基本資訊 PROJECT_NAME: str = os.getenv("PROJECT_NAME", "HR Portal API") VERSION: str = os.getenv("VERSION", "2.0.0") ENVIRONMENT: str = os.getenv("ENVIRONMENT", "development") HOST: str = os.getenv("HOST", "0.0.0.0") PORT: int = int(os.getenv("PORT", "8000")) # 資料庫 DATABASE_URL: str = os.getenv("DATABASE_URL", "postgresql+psycopg://hr_admin:hr_dev_password_2026@localhost:5433/hr_portal") DATABASE_ECHO: bool = os.getenv("DATABASE_ECHO", "False").lower() == "true" # CORS ALLOWED_ORIGINS: str = os.getenv("ALLOWED_ORIGINS", "http://localhost:3000,http://localhost:10180,http://10.1.0.245:3000,http://10.1.0.245:10180,https://hr.ease.taipei") def get_allowed_origins(self): return [origin.strip() for origin in self.ALLOWED_ORIGINS.split(",")] # Keycloak KEYCLOAK_URL: str = os.getenv("KEYCLOAK_URL", "https://auth.ease.taipei") KEYCLOAK_REALM: str = os.getenv("KEYCLOAK_REALM", "porscheworld") KEYCLOAK_CLIENT_ID: str = os.getenv("KEYCLOAK_CLIENT_ID", "hr-backend") KEYCLOAK_CLIENT_SECRET: str = os.getenv("KEYCLOAK_CLIENT_SECRET", "") KEYCLOAK_ADMIN_USERNAME: str = os.getenv("KEYCLOAK_ADMIN_USERNAME", "") KEYCLOAK_ADMIN_PASSWORD: str = os.getenv("KEYCLOAK_ADMIN_PASSWORD", "") # JWT JWT_SECRET_KEY: str = os.getenv("JWT_SECRET_KEY", "dev-secret-key-change-in-production") JWT_ALGORITHM: str = os.getenv("JWT_ALGORITHM", "HS256") JWT_ACCESS_TOKEN_EXPIRE_MINUTES: int = int(os.getenv("JWT_ACCESS_TOKEN_EXPIRE_MINUTES", "30")) # 郵件 MAIL_SERVER: str = os.getenv("MAIL_SERVER", "10.1.0.30") MAIL_PORT: int = int(os.getenv("MAIL_PORT", "587")) MAIL_USE_TLS: bool = os.getenv("MAIL_USE_TLS", "True").lower() == "true" MAIL_ADMIN_USER: str = os.getenv("MAIL_ADMIN_USER", "admin@porscheworld.tw") MAIL_ADMIN_PASSWORD: str = os.getenv("MAIL_ADMIN_PASSWORD", "") # NAS NAS_HOST: str = os.getenv("NAS_HOST", "10.1.0.30") NAS_PORT: int = int(os.getenv("NAS_PORT", "5000")) NAS_USERNAME: str = os.getenv("NAS_USERNAME", "") NAS_PASSWORD: str = os.getenv("NAS_PASSWORD", "") NAS_WEBDAV_URL: str = os.getenv("NAS_WEBDAV_URL", "https://nas.lab.taipei/webdav") NAS_SMB_SHARE: str = os.getenv("NAS_SMB_SHARE", "Working") # 日誌 LOG_LEVEL: str = os.getenv("LOG_LEVEL", "INFO") LOG_FILE: str = os.getenv("LOG_FILE", "logs/hr_portal.log") # 分頁 DEFAULT_PAGE_SIZE: int = int(os.getenv("DEFAULT_PAGE_SIZE", "20")) MAX_PAGE_SIZE: int = int(os.getenv("MAX_PAGE_SIZE", "100")) # 郵件配額 (MB) EMAIL_QUOTA_JUNIOR: int = int(os.getenv("EMAIL_QUOTA_JUNIOR", "1000")) EMAIL_QUOTA_MID: int = int(os.getenv("EMAIL_QUOTA_MID", "2000")) EMAIL_QUOTA_SENIOR: int = int(os.getenv("EMAIL_QUOTA_SENIOR", "5000")) EMAIL_QUOTA_MANAGER: int = int(os.getenv("EMAIL_QUOTA_MANAGER", "10000")) # NAS 配額 (GB) NAS_QUOTA_JUNIOR: int = int(os.getenv("NAS_QUOTA_JUNIOR", "50")) NAS_QUOTA_MID: int = int(os.getenv("NAS_QUOTA_MID", "100")) NAS_QUOTA_SENIOR: int = int(os.getenv("NAS_QUOTA_SENIOR", "200")) NAS_QUOTA_MANAGER: int = int(os.getenv("NAS_QUOTA_MANAGER", "500")) # Drive Service (Nextcloud 微服務) DRIVE_SERVICE_URL: str = os.getenv("DRIVE_SERVICE_URL", "https://drive-api.ease.taipei") DRIVE_SERVICE_TIMEOUT: int = int(os.getenv("DRIVE_SERVICE_TIMEOUT", "10")) DRIVE_SERVICE_TENANT_ID: int = int(os.getenv("DRIVE_SERVICE_TENANT_ID", "1")) # Docker Mailserver SSH 整合 MAILSERVER_SSH_HOST: str = os.getenv("MAILSERVER_SSH_HOST", "10.1.0.254") MAILSERVER_SSH_PORT: int = int(os.getenv("MAILSERVER_SSH_PORT", "22")) MAILSERVER_SSH_USER: str = os.getenv("MAILSERVER_SSH_USER", "porsche") MAILSERVER_SSH_PASSWORD: str = os.getenv("MAILSERVER_SSH_PASSWORD", "") MAILSERVER_CONTAINER_NAME: str = os.getenv("MAILSERVER_CONTAINER_NAME", "mailserver") MAILSERVER_SSH_TIMEOUT: int = int(os.getenv("MAILSERVER_SSH_TIMEOUT", "30")) # 創建實例 settings = Settings()