Files
aiagent/backend/app/api/fcm.py
renjianbo beff3fac8d fix: delete agent 500 error + dynamic personality + deployment guide
- Fix delete agent 500: clean up FK records (agent_llm_logs, permissions,
  schedules, executions, team_members) and unbind goals/tasks before delete
- Remove hardcoded personality templates in Android, replace with dynamic
  system prompt generation from name + description
- Set promptSectionsEnabled=false to bypass PromptComposer for personality
- Add Tencent Cloud Linux deployment guide (Docker Compose)
- Accumulated backend service updates, frontend UI fixes, Android app changes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-06-29 01:17:21 +08:00

81 lines
2.3 KiB
Python

"""
FCM 推送 API — Android 设备 Token 管理
提供设备推送令牌的注册和注销接口。
"""
from __future__ import annotations
import logging
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel, Field
from app.api.auth import get_current_user
from app.core.database import SessionLocal
from app.models.fcm_token import FcmToken
from app.models.user import User
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/api/v1/fcm", tags=["fcm"])
class FcmRegisterRequest(BaseModel):
token: str = Field(..., min_length=32, max_length=512, description="FCM/APNs 设备令牌")
platform: str = Field(default="android", description="android / ios / web")
@router.post("/register")
async def register_fcm_token(
req: FcmRegisterRequest,
current_user: User = Depends(get_current_user),
):
"""注册设备推送 Token。同一 Token 多次注册会更新绑定用户和时间。"""
db = SessionLocal()
try:
existing = db.query(FcmToken).filter(FcmToken.token == req.token).first()
if existing:
existing.user_id = current_user.id
existing.platform = req.platform
db.commit()
logger.info("FCM Token 已更新: user=%s platform=%s", current_user.id, req.platform)
return {"status": "updated", "id": str(existing.id)}
fcm = FcmToken(
user_id=current_user.id,
token=req.token,
platform=req.platform,
)
db.add(fcm)
db.commit()
db.refresh(fcm)
logger.info("FCM Token 已注册: user=%s platform=%s", current_user.id, req.platform)
return {"status": "registered", "id": str(fcm.id)}
finally:
db.close()
@router.delete("/unregister")
async def unregister_fcm_token(
token: str,
current_user: User = Depends(get_current_user),
):
"""注销设备推送 Token。"""
db = SessionLocal()
try:
fcm = (
db.query(FcmToken)
.filter(FcmToken.token == token, FcmToken.user_id == current_user.id)
.first()
)
if fcm:
db.delete(fcm)
db.commit()
logger.info("FCM Token 已注销: user=%s", current_user.id)
return {"status": "deleted"}
return {"status": "not_found"}
finally:
db.close()