package middleware import ( "github.com/gin-gonic/gin" "github.com/sundynix/sundynix-gateway/internal/store" ) // CtxTenantID 是鉴权后写入 gin.Context 的当前租户 ID 键。 const CtxTenantID = "tenant_id" // TenantContext 解析当前用户的默认租户并注入 tenant_id(多租户作用域的事实源)。 // 须挂在 Auth 之后(依赖已注入的 uid);未登录请求跳过。存量/异常无租户者由 EnsureDefaultTenant // 幂等兜底补建,保证任何已登录请求都能拿到 tenant_id。 // // 注:当前每请求解析一次(1–2 条按索引查询)。后续可把 tenant_id 嵌入 JWT / 加缓存去掉此开销。 func TenantContext(db *store.Postgres) gin.HandlerFunc { return func(c *gin.Context) { if v, ok := c.Get(CtxUserID); ok { if uid, _ := v.(string); uid != "" { if t, err := db.EnsureDefaultTenant(c.Request.Context(), uid, ""); err == nil && t != nil { c.Set(CtxTenantID, t.ID) } } } c.Next() } }