把 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>
116 lines
5.3 KiB
Modula-2
116 lines
5.3 KiB
Modula-2
module visiona-backend
|
||
|
||
go 1.26
|
||
|
||
// 依賴狀態:
|
||
// - B2 引入 testify(單元測試)
|
||
// - B3 引入 gorilla/websocket + hashicorp/yamux(relay + tunnel client + wsconn)
|
||
// - B4 引入 gin-gonic/gin + gin-contrib/cors + google/uuid(api-server router / middleware / id)
|
||
// 後續任務會加入:
|
||
// - github.com/go-playground/validator/v10 (B5 request validation)
|
||
// - github.com/aws/aws-sdk-go-v2 (可選,S3 儲存層)
|
||
|
||
require (
|
||
github.com/alicebob/miniredis/v2 v2.33.0
|
||
github.com/coreos/go-oidc/v3 v3.18.0
|
||
github.com/gin-contrib/cors v1.7.7
|
||
github.com/gin-gonic/gin v1.12.0
|
||
github.com/go-jose/go-jose/v4 v4.1.4
|
||
github.com/golang-migrate/migrate/v4 v4.19.1
|
||
github.com/google/uuid v1.6.0
|
||
github.com/gorilla/websocket v1.5.3
|
||
github.com/hashicorp/yamux v0.1.2
|
||
github.com/jackc/pgx/v5 v5.10.0
|
||
github.com/redis/go-redis/v9 v9.7.0
|
||
github.com/stretchr/testify v1.11.1
|
||
github.com/testcontainers/testcontainers-go v0.43.0
|
||
github.com/testcontainers/testcontainers-go/modules/postgres v0.43.0
|
||
golang.org/x/oauth2 v0.36.0
|
||
)
|
||
|
||
require (
|
||
dario.cat/mergo v1.0.2 // indirect
|
||
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
|
||
github.com/Microsoft/go-winio v0.6.2 // indirect
|
||
github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a // indirect
|
||
github.com/bytedance/gopkg v0.1.3 // indirect
|
||
github.com/bytedance/sonic v1.15.0 // indirect
|
||
github.com/bytedance/sonic/loader v0.5.0 // indirect
|
||
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
|
||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||
github.com/cloudwego/base64x v0.1.6 // indirect
|
||
github.com/containerd/errdefs v1.0.0 // indirect
|
||
github.com/containerd/errdefs/pkg v0.3.0 // indirect
|
||
github.com/containerd/log v0.1.0 // indirect
|
||
github.com/containerd/platforms v0.2.1 // indirect
|
||
github.com/cpuguy83/dockercfg v0.3.2 // indirect
|
||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||
github.com/distribution/reference v0.6.0 // indirect
|
||
github.com/docker/go-connections v0.6.0 // indirect
|
||
github.com/docker/go-units v0.5.0 // indirect
|
||
github.com/ebitengine/purego v0.10.0 // indirect
|
||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||
github.com/gabriel-vasile/mimetype v1.4.12 // indirect
|
||
github.com/gin-contrib/sse v1.1.0 // indirect
|
||
github.com/go-logr/logr v1.4.3 // indirect
|
||
github.com/go-logr/stdr v1.2.2 // indirect
|
||
github.com/go-ole/go-ole v1.2.6 // indirect
|
||
github.com/go-playground/locales v0.14.1 // indirect
|
||
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||
github.com/go-playground/validator/v10 v10.30.1 // indirect
|
||
github.com/goccy/go-json v0.10.5 // indirect
|
||
github.com/goccy/go-yaml v1.19.2 // indirect
|
||
github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa // indirect
|
||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
||
github.com/jackc/puddle/v2 v2.2.2 // indirect
|
||
github.com/json-iterator/go v1.1.12 // indirect
|
||
github.com/klauspost/compress v1.18.5 // indirect
|
||
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
||
github.com/leodido/go-urn v1.4.0 // indirect
|
||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
|
||
github.com/magiconair/properties v1.8.10 // indirect
|
||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||
github.com/moby/docker-image-spec v1.3.1 // indirect
|
||
github.com/moby/go-archive v0.2.0 // indirect
|
||
github.com/moby/moby/api v1.54.2 // indirect
|
||
github.com/moby/moby/client v0.4.0 // indirect
|
||
github.com/moby/patternmatcher v0.6.1 // indirect
|
||
github.com/moby/sys/sequential v0.6.0 // indirect
|
||
github.com/moby/sys/user v0.4.0 // indirect
|
||
github.com/moby/sys/userns v0.1.0 // indirect
|
||
github.com/moby/term v0.5.2 // indirect
|
||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
||
github.com/opencontainers/image-spec v1.1.1 // indirect
|
||
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
||
github.com/quic-go/qpack v0.6.0 // indirect
|
||
github.com/quic-go/quic-go v0.59.0 // indirect
|
||
github.com/shirou/gopsutil/v4 v4.26.5 // indirect
|
||
github.com/sirupsen/logrus v1.9.4 // indirect
|
||
github.com/tklauser/go-sysconf v0.3.16 // indirect
|
||
github.com/tklauser/numcpus v0.11.0 // indirect
|
||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||
github.com/ugorji/go/codec v1.3.1 // indirect
|
||
github.com/yuin/gopher-lua v1.1.1 // indirect
|
||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
||
go.mongodb.org/mongo-driver/v2 v2.5.0 // indirect
|
||
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
|
||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
|
||
go.opentelemetry.io/otel v1.41.0 // indirect
|
||
go.opentelemetry.io/otel/metric v1.41.0 // indirect
|
||
go.opentelemetry.io/otel/trace v1.41.0 // indirect
|
||
golang.org/x/arch v0.23.0 // indirect
|
||
golang.org/x/crypto v0.51.0 // indirect
|
||
golang.org/x/net v0.53.0 // indirect
|
||
golang.org/x/sync v0.20.0 // indirect
|
||
golang.org/x/sys v0.45.0 // indirect
|
||
golang.org/x/text v0.37.0 // indirect
|
||
google.golang.org/protobuf v1.36.10 // indirect
|
||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||
)
|