"""设备注册 / 心跳 endpoint(无障碍保护存活检测)。 路由前缀 /api/v1/device,需 Bearer 鉴权(设备绑登录用户)。 POST /register 注册设备 / 更新 registration_id(App 前台、拿到 push token 时调) POST /heartbeat 上报心跳(无障碍服务存活时周期调,刷新存活) 后端 heartbeat_monitor_worker 据此发现心跳超时的设备并极光推送告警。 见 spec: spec/accessibility-liveness-push.md。 """ from __future__ import annotations import logging from fastapi import APIRouter from app.api.deps import CurrentUser, DbSession from app.repositories import device as device_repo from app.schemas.device import ( DeviceOut, DeviceRegisterRequest, HeartbeatRequest, OkResponse, ) logger = logging.getLogger("shagua.device") router = APIRouter(prefix="/api/v1/device", tags=["device"]) @router.post("/register", response_model=DeviceOut, summary="注册设备/更新推送token") def register_device( req: DeviceRegisterRequest, user: CurrentUser, db: DbSession, ) -> DeviceOut: device = device_repo.register_or_update( db, user_id=user.id, device_id=req.device_id, registration_id=req.registration_id, platform=req.platform, app_version=req.app_version, ) logger.info( "device register user_id=%d device_id=%s reg=%s", user.id, req.device_id, bool(req.registration_id), ) return DeviceOut.model_validate(device) @router.post("/heartbeat", response_model=OkResponse, summary="上报心跳") def report_heartbeat( req: HeartbeatRequest, user: CurrentUser, db: DbSession, ) -> OkResponse: device_repo.touch_heartbeat( db, user_id=user.id, device_id=req.device_id, accessibility_enabled=req.accessibility_enabled, registration_id=req.registration_id, ) return OkResponse()