# ============================================================================= # 企微IT智能服务台 — 火绒集成配置管理 # ============================================================================= # 说明:从系统配置表(system_configs)读取火绒 AccessKey/Secret/BaseUrl, # 构建火绒API客户端实例 # ============================================================================= import logging from typing import Optional from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.models.system_config import SystemConfig from .client import HuorongClient from .exceptions import HuorongConfigError logger = logging.getLogger(__name__) # 火绒配置在 system_configs 表中的 key 前缀 HUORONG_CONFIG_PREFIX = "integration_huorong_" async def get_huorong_client(db: AsyncSession) -> HuorongClient: """从系统配置表构建火绒API客户端。 读取 integration_huorong_ 前缀的配置项,构建 HuorongClient 实例。 如果任何必填配置缺失,抛出 HuorongConfigError。 Args: db: 数据库会话 Returns: HuorongClient: 已配置的火绒API客户端实例 Raises: HuorongConfigError: AccessKey ID/Secret/Base URL 任一缺失 """ # 读取三个必填配置 result = await db.execute( select(SystemConfig).where( SystemConfig.config_key.startswith(HUORONG_CONFIG_PREFIX) ) ) configs = list(result.scalars().all()) # 构建 key→value 映射 config_map = {cfg.config_key: cfg.config_value for cfg in configs} access_key_id = config_map.get(f"{HUORONG_CONFIG_PREFIX}access_key_id", "") access_key_secret = config_map.get(f"{HUORONG_CONFIG_PREFIX}access_key_secret", "") base_url = config_map.get(f"{HUORONG_CONFIG_PREFIX}base_url", "") # 校验必填项 if not access_key_id or not access_key_secret or not base_url: missing = [] if not access_key_id: missing.append("AccessKey ID") if not access_key_secret: missing.append("AccessKey Secret") if not base_url: missing.append("Base URL") raise HuorongConfigError( f"火绒集成配置不完整,缺失: {', '.join(missing)},请先在管理后台完成配置" ) return HuorongClient( access_key_id=access_key_id, access_key_secret=access_key_secret, base_url=base_url, ) async def is_huorong_configured(db: AsyncSession) -> bool: """检查火绒集成是否已完整配置。 Args: db: 数据库会话 Returns: bool: 三项配置均存在且非空时返回 True """ try: client = await get_huorong_client(db) return bool(client.access_key_id and client.access_key_secret and client.base_url) except HuorongConfigError: return False