Skip to content
海博賽特
海博賽特
最初的旅程:一個人,也能啟動一個世界

Email 驗證、會員系統與那些「看似簡單」的更新紀錄

今天幾乎都在跟會員系統纏鬥。Ingrelens 一開始只是做「註冊、登入」這種基本功能,結果一路長出資料更新、密碼修改、guest 升級成正式會員……每加一個需求,整體邏輯就再複雜一點。 先處理 email 驗證。以前的流程只是寄信、點連結,直到要支援 guest 升級與 email 更改,原本設計就撐不住,尤其 verification metadata

今天幾乎都在跟會員系統纏鬥。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 都會問自己:「這樣會不會過度工程化?這麼複雜的歷史真的有必要嗎?」想起可能的用例後,還是寧願現在多花點力,把彈性留好。

總結:解了幾筆技術債,也再次提醒自己——很多看起來簡單的功能,背後都有不簡單的細節。