115 lines
4.2 KiB
Python
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 ""), ["REVIEWER", "OWNER"]):
|
|
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 ""), ["REVIEWER", "OWNER"])
|
|
|
|
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 ""), ["REVIEWER", "OWNER"]):
|
|
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)}")
|