diff --git a/README.md b/README.md index be7b7c7..de6def7 100644 --- a/README.md +++ b/README.md @@ -92,12 +92,15 @@ Secrets 放 `.env`(gitignore)。本機與生產共用同一份格式、只 "ttl": 281, "count_raw": 79, "count_filtered": 24, + "generated_at": "2026-04-20T11:14:32+08:00", "items": [ /* id, name, gender, iv_pct, cp, level, latitude, longitude, remaining, expire_at, fast_move, charge_move, is_perfect, ... */ ], "debug": { "notes": [...], "redis_ttl": 281 } } ``` +`generated_at` 是 fetcher 寫入 Redis 那份資料時的時間戳(ISO 8601,台北時區)。空資料分支會是 `null`。 + ### Redis schema Key `pokemon:radar:latest`,String(JSON),TTL 由 `REDIS_TTL` 控制。Value 結構: ```json diff --git a/docs/INFRA.md b/docs/INFRA.md index 695d174..8d39e1a 100644 --- a/docs/INFRA.md +++ b/docs/INFRA.md @@ -217,6 +217,32 @@ ALLOWED_HOST_LIST = external,192.168.42.0/24,loopback 舊 global secret 從 `.env` 遷到 `hooks/pokemon/secret`(沿用原值保持 Gitea 端不用改)。 +### 3.12 前端 SWR 冷啟動 UX:空資料自動重試 + +問題:Redis 快取過期時,第一次 `/scan` 回 `source: "redis (empty)"`,要等 ~30-60 秒 fetcher 完成才有資料。使用者第一次開頁就撞上,看到紅框誤以為壞了。 + +前端 `loadScan()` 改成: +- 空資料不走紅框錯誤分支,改顯示中性灰框 banner「正在更新資料,請稍候…(N/10)」 +- 每 8 秒 `setTimeout` 遞迴重試,上限 10 次(80 秒) +- 拿到資料自動清 timer + 隱藏 banner +- 超時顯示中性警告「後端仍無資料,請稍後重新整理」 +- 真正網路 / HTTP / JSON 錯誤 → 維持原本紅框 + +這次的 push 也是 **webhook pipeline 第一次真實使用**:push → Gitea 觸發 webhook → 42.104 自動 rsync → caddy 下次 request 即新版。之前都是用 Gitea API 的 test endpoint 模擬。 + +### 3.13 UI 顯示資料更新時間 + +使用者想看到「這份資料什麼時候抓的」: + +- 後端 `/scan` response 新增 `generated_at` 欄位(ISO 8601,台北時區),從 Redis 存的 fetcher payload 頂層讀出 +- `ScanResponse` model 補 `Optional[str]` 對應 +- 前端右下角 `