Email 驗證、會員系統與那些「看似簡單」的 API 文件更新 📚🤦‍♂️

今天一整天幾乎都跟會員系統槓上了。說真的,當初設計 Ingrelens 時,沒想到會員功能會變得這麼複雜。從一開始只是想讓使用者簡單註冊登入,到現在竟然得處理會員資料更新、密碼修改,甚至還要支援 guest 帳號升級成正式會員,整個邏輯複雜度直線飆升。

今天一整天幾乎都跟會員系統槓上了。說真的,當初設計 Ingrelens 時,沒想到會員功能會變得這麼複雜。從一開始只是想讓使用者簡單註冊登入,到現在竟然得處理會員資料更新、密碼修改,甚至還要支援 guest 帳號升級成正式會員,整個邏輯複雜度直線飆升。

上午我先處理 email 驗證流程,之前的版本只有簡單的驗證信寄送和連結點擊確認,但當我開始支援 guest 帳號升級和 email 修改的時候,發現原本的設計根本撐不住,尤其 metadata 的部分,之前完全沒考慮到。於是又重新設計了一下 verification metadata 的結構,透過一個簡單的 JSON 欄位來記錄驗證類型跟相關資訊,這樣流程才更彈性。

但很快我又撞上另一個問題:profile_data 欄位居然不是每次都能穩定解析成字典類型?!原來之前有些地方沒做好 JSON parse 錯誤處理,導致偶爾會出現神秘的 500 錯誤。

你當初寫這段的時候腦袋到底在想什麼啦?🤦‍♂️

為了徹底解決這個問題,我乾脆強制所有 profile_data 至少都是 dict 型態,如果 parse 失敗就直接 fallback 成空字典,並且加上了足夠的 logging,這樣下次再出狀況時,至少能快速知道問題在哪,而不是像今天這樣翻遍 log 還是一臉茫然。

下午切回前端,原本以為 API URL 處理邏輯昨天已經搞定,沒想到今天一測試,發現 ingredient fetching 還是有些小細節沒處理好。尤其是 error handling,原本的設計太粗糙,錯誤訊息不夠明確,導致前端完全不知道發生了什麼事。於是我重新標準化了 API URL 的處理邏輯,讓錯誤回傳格式更統一,前端就能更直覺地知道哪裡出了問題。但說真的,這種 API 錯誤處理細節,真的有人會在意嗎?還是只有我自己在那邊瞎操心?🤔

然後,今天還花了不少時間更新 API 文件跟 README。每次更新文件時,我都會陷入一種奇妙的自我質疑:「這個東西真的需要寫進文件嗎?這樣描述真的夠清楚嗎?」尤其是會員系統這種牽一髮動全身的架構文件,要寫得清楚又不囉嗦真的很難。最後我還是狠下心把 guest upgrade 跟 email change 的流程完整補齊了,並且重新命名了一些 section,確保未來不會再有人(包括未來的我自己)看文件看到一半就滿頭問號。

順便也更新了 Jest 的設定檔,調整了新的 module path,順手把 TypeScript 的版本提示加到 README 裡,雖然這看起來只是小事一樁,但至少以後開發環境再改動時,我不用再花半小時想「這個 Jest 到底要怎麼設定啦?」。

最後一件事,就是實作了 description history 功能跟 migration scripts。這個功能原本看似簡單,卻意外地花了不少時間在設計資料庫結構跟歷史紀錄的儲存方式上。

每次寫 migration scripts 時都會不禁懷疑:「Danny,你這樣設計真的不會過度工程化嗎?這麼複雜的歷史記錄真的有必要嗎?」但一想到未來可能的 use cases,還是覺得寧願現在多花點力氣,也不要以後再來頭痛資料結構不夠彈性。

今天整體而言算是解決了不少技術債務,但也再次提醒自己,很多看似簡單的功能,背後其實藏著各種意想不到的複雜性。

Subscribe to 海博賽特日誌

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
[email protected]
Subscribe