"""WeCom configuration endpoints.""" from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select from ...core.database import get_db from ...dependencies.auth import get_current_user from ...dependencies.tenant import get_tenant_id from ...models import Integration, User from ...services.auth import has_any_role from ...services.wecom import get_wecom_service from .schemas import WeComConfigRequest router = APIRouter() @router.post("/config") async def save_wecom_config( request: WeComConfigRequest, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), tenant_id: int = Depends(get_tenant_id), ): if not has_any_role(str(current_user.role or ""), ["ADMIN", "BOSS"]): raise HTTPException(status_code=403, detail="只有管理员可以配置企业微信集成") try: service = get_wecom_service(db) await service.save_config( corp_id=request.corp_id, agent_id=request.agent_id, app_secret=request.app_secret, token=request.token, encoding_aes_key=request.encoding_aes_key, tenant_id=tenant_id, ) return { "status": "success", "message": "企业微信配置已保存", "next_steps": [ "1. 在企业微信管理平台配置接收消息 URL", "2. URL: https://your-domain.com/api/wecom/webhook", "3. 点击验证按钮完成 URL 验证", ], } except Exception as exc: raise HTTPException(status_code=500, detail=f"保存配置失败: {str(exc)}") @router.get("/config") async def get_wecom_config( current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), tenant_id: int = Depends(get_tenant_id), ): """获取企业微信配置状态。管理员可获取完整配置用于回填修改表单。""" try: service = get_wecom_service(db) await service.load_config(tenant_id) can_view_secrets = has_any_role(str(current_user.role or ""), ["ADMIN", "BOSS"]) return { "is_configured": service.is_configured(), "corp_id": service.corp_id, "agent_id": service.agent_id, "app_secret": service.app_secret if can_view_secrets else None, "has_token": bool(service.token), "has_encoding_key": bool(service.encoding_aes_key), "token_preview": ( f"{service.token[:4]}...{service.token[-4:]}" if service.token and len(service.token) > 8 else (service.token or None) ), "encoding_aes_key_preview": ( f"{service.encoding_aes_key[:4]}...{service.encoding_aes_key[-4:]}" if service.encoding_aes_key and len(service.encoding_aes_key) > 8 else (service.encoding_aes_key or None) ), "token": service.token if can_view_secrets else None, "encoding_aes_key": service.encoding_aes_key if can_view_secrets else None, } except Exception as exc: raise HTTPException(status_code=500, detail=f"获取配置失败: {str(exc)}") @router.delete("/config") async def delete_wecom_config( current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), tenant_id: int = Depends(get_tenant_id), ): if not has_any_role(str(current_user.role or ""), ["ADMIN", "BOSS"]): raise HTTPException(status_code=403, detail="只有管理员可以删除配置") try: result = await db.execute( select(Integration).where( Integration.tenant_id == tenant_id, Integration.type == "wecom", ) ) integration = result.scalar_one_or_none() if integration: integration.is_active = False await db.commit() return {"status": "success", "message": "企业微信配置已删除"} except Exception as exc: raise HTTPException(status_code=500, detail=f"删除配置失败: {str(exc)}")