CRM App 三日大修復

過去三日,我哋解決咗 CRM app 從開 發環境搬到正式環境嘅一連串問題。以下係紀錄。

Day 1: Schema 同步地獄

由 Dev 搬到 Production,最大問題就係 Database schema 唔一致。

問題:

  • 多個 tables 喺 DEV 存在但 PROD 冇
  • audit_log table schema 唔匹配(table_name vs entity_type
  • FK constraints 缺少,導致 PostgREST 無法做 relationship joins

解決:

  • 創建完整嘅 SQL script 去創建曉所有 tables
  • 分階段執行:先創建 tables,再啟用 RLS,再添加 FK constraints
  • 使用 CREATE TABLE IF NOT EXISTS 避免重複創建錯誤
1
2
-- 关键修复:按 dependency order 排序
-- products 要喺 inventory_alerts 之前創建

Day 2: MFA Login 輪

登入流程特別曲折。

問題:

  1. F5 refresh 之後 session lost
  2. MFA verify 成功但係 redirect 回 login page
  3. JWT token 格式問題(client 存成 object,我哋要 string)

Root Cause:

  • supabase.auth.getSession() 有 race condition
  • MFA verify 之後新 token 未寫入 localStorage 就去讀
  • onAuthStateChange 唔會為 MFA verify 觸發 INITIAL_SESSION

解決:

  • 直接從 localStorage 讀 token,唔用 getSession()
  • MFA verify 之後,手動 update localStorage 再 dispatch custom event
  • 加 500ms delay 等 async reload 完成
1
2
3
4
5
// 更新 localStorage 後再 dispatch event
localStorage.setItem('sb-***-auth-token', JSON.stringify(newToken))
window.dispatchEvent(new CustomEvent('mfa-verified', { detail: { userId } }))
await new Promise(resolve => setTimeout(resolve, 500))
navigate('/')

Day 3: Vercel Routing + Debug Logs

問題:

  1. /companies 等 route F5 返 404(Vercel 唔知呢個係 SPA route)
  2. ServiceWorker register 失敗(sw.js 唔存在)
  3. Console 有一大堆 debug logs

解決:

  • vercel.json 加 SPA rewrite rule
  • 創建 minimal sw.js
  • 移除所有 console.log debug statements
1
2
3
4
5
{
  "rewrites": [
    { "source": "/(.*)", "destination": "/index.html" }
  ]
}

技術教訓

  1. Schema 管理:開 發環境同 production 一定要用同一份 SQL,最好係 IaC
  2. Supabase FK Join:PostgREST 只能 join public schema,auth.users 唔得。需要手動 fetch 再 client-side join
  3. MFA Flow:Supabase MFA + custom AuthContext 需要注意 token 時序
  4. Vercel SPA:所有 route 都要 rewrite 到 index.html

繼續優化方向

  • 統一度發流程(而家係手動喺 SQL Editor 跑 SQL)
  • 添加更多 E2E 測試
  • 優化 chart render performance

有問題?聯絡作者。