Skip to content

fix(admin): patchDriverStatus 正規化回傳值(型別原本在說謊) - #28

Merged
thothawei merged 1 commit into
mainfrom
claude/normalize-patch-driver-status
Jul 28, 2026
Merged

fix(admin): patchDriverStatus 正規化回傳值(型別原本在說謊)#28
thothawei merged 1 commit into
mainfrom
claude/normalize-patch-driver-status

Conversation

@thothawei

Copy link
Copy Markdown
Owner

怎麼找到的

admin REST 形狀對帳:起真後端,逐端點抓實際回應比對前端的型別與 normalizer。

結論是 admin 的契約基本乾淨(詳見下方),只揪出這一個型別謊言。

問題

PATCH /admin/drivers/:id/status 實際回:

{"driver":{"ID":1,"LineUserID":"...","Name":"...","Phone":"","Status":3,
           "vehicle_type":"sedan","plate_number":"LI-3748",
           "vehicle_review_status":"approved","vehicle_review_note":"",
           "CreatedAt":"...","UpdatedAt":"..."}}

混合大小寫IDNameStatus 走 Go 欄位名,車輛欄位走 json tag),而且不含 rating_avgrating_count

前端卻宣告它回 Driver(全 PascalCase)且不正規化——VehicleTypePlateNumberVehicleReviewStatusRatingAvgRatingCount 全是 undefined

目前 runtime 沒出事:兩個 mutation 都丟掉回傳值只做 invalidateQueries,重抓那條有 normalizeDriver。但型別在說謊——哪天有人拿它去 setQueryData 做樂觀更新,那一列的車種車牌就會憑空消失,而且不會有任何錯誤。這正是今天修的那幾個 bug 的前身形狀。

修法

改吃 Record<string, unknown> 並走 normalizeDriver,讓宣告的型別成真(reviewDriverVehicle 本來就是這樣做的,兩支現在一致)。

測試

mock 換成從真後端抓下來的混合大小寫形狀——舊 mock 只有 PascalCase,所以這個問題測不出來。斷言車輛三欄正確、RatingAvgRatingCount0 而非 undefined(表格排序吃 undefined 會壞)。

反向驗證:改回不正規化 → 該案 FAIL。

驗收:npm test 134 passednpm run lint 乾淨、tsc --noEmit 通過。

這輪 admin REST 對帳驗過乾淨的部分

檢查 結果
/admin/rides 列表 8 個鍵 vs RideRow 完全一致,OrdersPage 只渲染這些
六個篩選參數(status/limit/offset/from/to/q) 名稱一致,且實跑證明真的有篩(負向對照:status=9→0、不存在關鍵字→0、未來日期→0)
分頁 total limit=1 時仍回全量 2,antd 分頁不會壞
/admin/rides/:id 頂層 eventsridetrack_geojsonstopsrating fetchRideDetail 的解析一致;rating 造一筆評分過的訂單驗到 score/comment/created_at
日報表/月報表欄位 DailyReportRowMonthlyReportRow 完全一致
/admin/lost-items 13 個鍵 LostItem 完全一致(含 customer_name/driver_name)
會費帳單(產生→列表→標記已付) 7 個鍵與 MembershipInvoice 一致;period 鍵名正確
/admin/drivers 列表 混合大小寫 + rating_avg/rating_count,normalizeDriver 兩種都吃

🤖 Generated with Claude Code

admin REST 形狀對帳(2026-07-28,真後端逐端點抓回應)發現:
PATCH /admin/drivers/:id/status 回的是**混合大小寫**——
ID/Name/Status 走 Go 欄位名,vehicle_type/plate_number/vehicle_review_status
走 json tag,而且**不含** rating_avg/rating_count。

前端卻宣告它回 `Driver`(全 PascalCase)且不正規化:車輛三欄與評價都會是 undefined。
目前呼叫端只 invalidateQueries、不看回傳值所以 runtime 沒出事——
但型別在說謊,哪天有人拿它去 setQueryData,那一列的車種車牌就會憑空消失。
這正是今天修的那幾個 bug 的前身形狀(東西在、只是那條路徑沒人走過)。

修法:改回 Record<string, unknown> 並走 normalizeDriver,讓宣告的型別成真。

測試強化:mock 換成從真後端抓下來的混合大小寫形狀(舊 mock 只有 PascalCase,
所以測不出來),斷言車輛三欄與 RatingAvg/RatingCount 補 0 而非 undefined。
反向驗證:改回不正規化 → 該案 FAIL。

驗收:npm test 134 passed、lint 乾淨、tsc --noEmit 通過。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@thothawei
thothawei merged commit 2386075 into main Jul 28, 2026
1 check passed
@thothawei
thothawei deleted the claude/normalize-patch-driver-status branch July 28, 2026 06:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant