PMFlow/backend/app/api/wecom_api/config.py

115 lines
4.2 KiB
Python

"""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.integrations.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)}")