把 visionA-backend 6 個 in-memory store 接到資料庫持久化,範圍=完整 (PG 全接 + session 接 Redis + 交易韌性)。interface / handler 不動, 只加 DB 實作 + 換 wiring,config 未設 DB 時保留 in-memory fallback。 - 塊 0 基礎建設:pgx/v5 連線池 + DatabaseConfig/RedisConfig + golang-migrate runner(embed)+ cmd/migrate + testcontainers 測試基礎建設 - 塊 1 model → Postgres:array 映射、upsert 保留 CreatedAt、faa_object_key、 三維 filter(owner/chip/source)、soft-delete partial index - 塊 2 device → Postgres:partial unique(已刪 serial 可重註冊)、雙狀態欄位 - 塊 3 token → Postgres:pairing_tokens + session_tokens 分表、token_hash 當 PK - 塊 4 userSession → Redis:idle + absolute 雙 TTL 取代 cleanup goroutine (tunnel session 維持 in-memory,yamux handle 不可序列化) - 塊 5 交易/韌性:WithTx helper + 刪 device cascade 撤銷 token(同 tx 原子) + /healthz ping PG/Redis(fail-fast 503)+ pgx error 統一映射(不洩漏 raw error) 降級策略(fail-fast):PG 掉 → 持久資料 API 回 503;Redis 掉 → session 失敗 不自動 fallback in-memory(避免多機 session 不同步)。 DB:PostgreSQL 14.23(gen_random_uuid 內建、無 citext → email 用 lower() unique index)。每塊經 Reviewer 審查 + 真 PG/Redis testcontainers 全量 dbtest 綠燈, in-memory fallback 未受影響。 docs: 同步更新 database.md(schema/config/migration 清單)+ api-spec.md (409/503 錯誤碼、/healthz 新行為、device unpair cascade)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
17 lines
616 B
Go
17 lines
616 B
Go
// Package migrations 把 visionA-backend 的 SQL migration 檔嵌入 binary,
|
||
// 供 internal/db 的 migration runner(golang-migrate iofs source)使用。
|
||
//
|
||
// 嵌入式設計理由:
|
||
// - binary 自帶 migration,部署時不需另外複製 migrations/ 目錄、不會有「檔案找不到」風險。
|
||
// - testcontainers 整合測試與 cmd/migrate 共用同一份 FS,行為一致。
|
||
//
|
||
// 命名規範(golang-migrate 序號式):NNNN_description.up.sql / .down.sql。
|
||
package migrations
|
||
|
||
import "embed"
|
||
|
||
// FS 嵌入本目錄下所有 .sql migration 檔。
|
||
//
|
||
//go:embed *.sql
|
||
var FS embed.FS
|