]> acesimba.cloud Git - words.git/commitdiff
fix: sync/push 422 — group_id 接受 int/str 并归一化
authorroot <root@localhost.localdomain>
Fri, 14 Aug 2026 13:59:19 +0000 (21:59 +0800)
committerroot <root@localhost.localdomain>
Fri, 14 Aug 2026 13:59:19 +0000 (21:59 +0800)
iPad 离线学习后恢复连线同步失败,根因为前端 IndexedDB 以 int
存储 group_id,而 Pydantic 模型声明为 str,导致 /api/sync/push
返回 422。将 ProgressUpdate/SyncEvent 的 group_id 改为
Union[str, int] 并加 field_validator 在校验前转 str,修复上传。

backend/main.py

index c0274190cdebf7d9d60b7aada0c4faa4be0fd51d..f4b5e9c06f99657ff834d6b4fa6b095bcbda7e79 100644 (file)
@@ -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]