From: root Date: Fri, 14 Aug 2026 13:59:19 +0000 (+0800) Subject: fix: sync/push 422 — group_id 接受 int/str 并归一化 X-Git-Url: http://acesimba.cloud/gitweb/?a=commitdiff_plain;h=a77a98c93e64f90189e3f1aacd202cd45cbd3389;p=words.git fix: sync/push 422 — group_id 接受 int/str 并归一化 iPad 离线学习后恢复连线同步失败,根因为前端 IndexedDB 以 int 存储 group_id,而 Pydantic 模型声明为 str,导致 /api/sync/push 返回 422。将 ProgressUpdate/SyncEvent 的 group_id 改为 Union[str, int] 并加 field_validator 在校验前转 str,修复上传。 --- diff --git a/backend/main.py b/backend/main.py index c027419..f4b5e9c 100644 --- a/backend/main.py +++ b/backend/main.py @@ -6,8 +6,8 @@ import datetime import urllib.request import urllib.parse import urllib.error -from pydantic import BaseModel -from typing import List, Optional +from pydantic import BaseModel, field_validator +from typing import List, Optional, Union app = FastAPI() @@ -54,14 +54,24 @@ class WordData(BaseModel): from_attributes = True class ProgressUpdate(BaseModel): - group_id: str + group_id: Union[str, int] op_type: str + @field_validator('group_id', mode='before') + @classmethod + def coerce_group_id(cls, v): + return str(v) + class SyncEvent(BaseModel): - group_id: str + group_id: Union[str, int] op_type: str completed_at: str + @field_validator('group_id', mode='before') + @classmethod + def coerce_group_id(cls, v): + return str(v) + class SyncPushRequest(BaseModel): events: List[SyncEvent]