Email 驗證、會員系統與那些「看似簡單」的更新紀錄
今天幾乎都在跟會員系統纏鬥。Ingrelens 一開始只是做「註冊、登入」這種基本功能,結果一路長出資料更新、密碼修改、guest 升級成正式會員……每加一個需求,整體邏輯就再複雜一點。
先處理 email 驗證。以前的流程只是寄信、點連結,直到要支援 guest 升級與 email 更改,原本設計就撐不住,尤其 verification metadata 完全不夠用。我改成以一個簡單的 JSON 欄位記錄驗證類型與必要資訊,流程比較有彈性。
接著踩到 profile_data 的坑:它不是每次都能穩定解析成字典,偶爾還會冒出 500。原因是某些地方沒做好 JSON parse 的錯誤處理。最後我強制所有 profile_data 至少回到 dict 型態;parse 失敗就回空字典,並加上足夠的 logging。下次出事,至少不會像今天一樣翻 log 還是一頭霧水。
下午切回前端。本來以為昨天的 API URL 邏輯已經收尾,今天一測又發現 ingredient fetching 還有細節沒處理好。尤其錯誤處理太粗糙,訊息不夠明確,前端只會得到一個「壞掉了」的回應。我把 API URL 的處理和錯誤回傳格式統一,讓前端能確切知道問題落點。老實說,這種錯誤處理的講究,外面不一定在意,但等自己要維運時,就會知道為什麼要花時間把它補齊。
同時更新了 API 文件與 README。寫到會員系統這種牽一髮動全身的東西,總會想:「這段需要寫進文件嗎?這樣描述夠清楚嗎?」最後把 guest upgrade 和 email change 的流程完整補齊,順便重新命名幾個 section,避免未來的我看文件看到一半滿頭問號。
也順手調整了 Jest 的設定,更新 module path,把 TypeScript 版本提示補到 README。看起來只是小事,但等環境改動時,就不用再花半小時找「到底要怎麼設這個 Jest」。
最後是 description history 功能與 migration scripts。原本以為簡單,實作時意外花了不少時間在資料庫結構與歷史紀錄的儲存方式。每次寫 migration 都會問自己:「這樣會不會過度工程化?這麼複雜的歷史真的有必要嗎?」想起可能的用例後,還是寧願現在多花點力,把彈性留好。
總結:解了幾筆技術債,也再次提醒自己——很多看起來簡單的功能,背後都有不簡單的細節。