From 154f347ddbe9a225e42735a3448fb36178999fa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=96=B0=E9=9B=A8?= Date: Tue, 10 Feb 2026 16:57:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E5=86=8Ctoken=E6=8E=92=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/app/api/v1/push.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/server/app/api/v1/push.py b/server/app/api/v1/push.py index ae9b8c9..07814aa 100644 --- a/server/app/api/v1/push.py +++ b/server/app/api/v1/push.py @@ -7,7 +7,7 @@ import httpx import redis from fastapi import APIRouter, Depends, Header, HTTPException, Query from pydantic import BaseModel, Field -from sqlalchemy import select +from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession from app.api.limits import rate_limit_push_by_ip @@ -297,6 +297,7 @@ async def scheduler_health(db: AsyncSession = Depends(get_db)) -> dict[str, Any] "worker": {"ok": False, "worker_count": 0}, "beat": {"ok": False, "last_heartbeat_at": None, "age_seconds": None}, "db": {"ok": False, "push_send_log_latest_created_at": None}, + "db_push_tokens": {"ok": False, "count": None, "latest": None}, "now_utc": datetime.now(timezone.utc).isoformat(), } @@ -343,5 +344,36 @@ async def scheduler_health(db: AsyncSession = Depends(get_db)) -> dict[str, Any] except Exception as e: out["db"]["error"] = f"{type(e).__name__}: {e}" + # 4) DB:查询 push_tokens 计数与最近一条(用于确认 /v1/push/register 是否真正落库) + try: + qcount = select(func.count()).select_from(PushToken) + rcount = await db.execute(qcount) + cnt = int(rcount.scalar_one() or 0) + + qlatest = select(PushToken).order_by(PushToken.last_seen_at.desc()).limit(1) + rlatest = await db.execute(qlatest) + t = rlatest.scalar_one_or_none() + + latest_obj = None + if t is not None: + tok = str(t.push_token or "") + masked = tok[:10] + "***" + tok[-6:] if len(tok) > 20 else (tok[:6] + "***" if tok else "") + latest_obj = { + "id": int(getattr(t, "id", 0) or 0), + "client_user_id": str(t.client_user_id), + "env": str(t.env), + "app_id": str(t.app_id), + "platform": str(t.platform), + "is_active": bool(t.is_active), + "last_seen_at": t.last_seen_at.isoformat() if t.last_seen_at else None, + "push_token_masked": masked, + } + + out["db_push_tokens"]["ok"] = True + out["db_push_tokens"]["count"] = cnt + out["db_push_tokens"]["latest"] = latest_obj + except Exception as e: + out["db_push_tokens"]["error"] = f"{type(e).__name__}: {e}" + return out