feat(gateway): 多租户地基·增量1 —— 租户身份/成员/上下文(T4.A/SaaS P1)
按 SAAS_DESIGN.md P1 第一刀(真·多租户 + 桌面端为主):先立租户身份,不动查询。 - store.Tenant / TenantMember 表 + AutoMigrate - store: CreateTenant / AddMember(幂等) / DefaultTenantForUser / EnsureDefaultTenant(幂等) / BackfillDefaultTenants / GetTenant / MemberRole - 注册即建单人默认租户(owner);启动回填给存量用户补建(幂等) - middleware.TenantContext(挂 Auth 后)解析当前租户→注入 tenant_id;handler.tenantID(c) 助手 - GET /api/v1/tenants/current 验证端点(租户上下文 + 角色) - live:存量用户(回填 7 租户)/tenants/current 返回默认租户+owner;新注册自动建租户 下一步(增量2):核心表加 tenant_id + 统一 gorm scope 强制隔离 + 存量行回填 + 重写查询。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -72,3 +72,25 @@ type GuardrailEvent struct {
|
||||
}
|
||||
|
||||
func (GuardrailEvent) TableName() string { return "sundynix_guardrail_event" }
|
||||
|
||||
// Tenant 是多租户的计费/隔离单位(组织/账户)。个人用户 = 一个单人默认租户;团队/企业 = 多成员。
|
||||
type Tenant struct {
|
||||
BaseModel
|
||||
Name string `gorm:"size:128"`
|
||||
Slug string `gorm:"size:64;uniqueIndex"` // 唯一短标识(默认租户用 default-<uid>)
|
||||
Plan string `gorm:"size:32;default:free"` // free / pro / enterprise
|
||||
Status string `gorm:"size:16;default:active"` // active / suspended
|
||||
}
|
||||
|
||||
func (Tenant) TableName() string { return "sundynix_tenant" }
|
||||
|
||||
// TenantMember 是用户与租户的成员关系(带角色)。一个用户可属多个租户。
|
||||
type TenantMember struct {
|
||||
BaseModel
|
||||
TenantID string `gorm:"size:64;uniqueIndex:idx_tenant_user;index"`
|
||||
UserID string `gorm:"size:64;uniqueIndex:idx_tenant_user;index"`
|
||||
Role string `gorm:"size:16"` // owner / admin / member / viewer / billing_admin
|
||||
Status string `gorm:"size:16;default:active"` // active / invited / removed
|
||||
}
|
||||
|
||||
func (TenantMember) TableName() string { return "sundynix_tenant_member" }
|
||||
|
||||
Reference in New Issue
Block a user