kb-demo / backend /app /feature_flags.py
RayLi-Git
fix: 檔案移至根目錄 + 套用示範 README
a7cd101
Raw
History Blame Contribute Delete
2.24 kB
"""Phase5-H Feature Flags (PRD §51 Stage 1 - Rollback)。
5 個 env-driven flag,全為「預設啟用、出問題可關掉」設計。
| Flag | env 名稱 | 預設 | 作用 |
|-------------------------|------------------------|------|--------------------------------------------------|
| 2FA 強制 | FEATURE_2FA | true | false → admin/senior_manager 不再強制 2FA grace |
| senior_manager 角色 UI | FEATURE_SENIOR_MANAGER | true | false → 不可建立 senior_manager 帳號(API+UI 雙鎖)|
| 垃圾桶頁 UI | FEATURE_TRASH_UI | true | false → 前端隱藏垃圾桶頁入口(後端仍可運作) |
| 帳號管理進階篩選 UI | FEATURE_ACCOUNT_FILTER | true | false → 前端退回簡化版使用者管理頁 |
| FTS5 全文檢索 | FEATURE_FTS5 | false| true → search.py 走 FTS5;其他模組此檔僅顯示狀態 |
註:`FEATURE_FTS5` 預設為 false(與 search.py L36 一致:中文 LIKE 較可靠)。
"""
from __future__ import annotations
import os
from typing import Any
def _truthy(env_name: str, default: bool) -> bool:
raw = os.environ.get(env_name)
if raw is None:
return default
return raw.strip().lower() in ("1", "true", "yes", "on")
def feature_2fa() -> bool:
return _truthy("FEATURE_2FA", True)
def feature_senior_manager() -> bool:
return _truthy("FEATURE_SENIOR_MANAGER", True)
def feature_trash_ui() -> bool:
return _truthy("FEATURE_TRASH_UI", True)
def feature_account_filter() -> bool:
return _truthy("FEATURE_ACCOUNT_FILTER", True)
def feature_fts5() -> bool:
return _truthy("FEATURE_FTS5", False)
def feature_hsts() -> bool:
"""是否輸出 HSTS header。dev/http 預設 off;正式 HTTPS 部署設 KBV5_HSTS=1。"""
return _truthy("KBV5_HSTS", False)
def get_all() -> dict[str, Any]:
return {
"FEATURE_2FA": feature_2fa(),
"FEATURE_SENIOR_MANAGER": feature_senior_manager(),
"FEATURE_TRASH_UI": feature_trash_ui(),
"FEATURE_ACCOUNT_FILTER": feature_account_filter(),
"FEATURE_FTS5": feature_fts5(),
}