需求:管理员在 HM 控制台按订阅套餐控制谁能用蜂群。照搬现有 MaxAgents(#8)模式 (per-plan、管理员设、不硬编码 tier)。 后端: - model SubscriptionPlan 加 SwarmEnabled bool(default false;AutoMigrate 加列,跨三库)。 - model GetUserSwarmEnabled(userId):用户任一活跃套餐 SwarmEnabled=true 即放行(镜像 GetUserMaxAgents);无套餐/DB 不可用 => false(opt-in)。 - controller AgentCreateUserSwarm gate:普通用户须有开通套餐,管理员(role>=admin)绕过(测试/运维)。 - controller 套餐 admin upsert 字段映射加 swarm_enabled(create 整结构已自动带)。 前端(web/default 套餐编辑): - plan-form schema/defaults/映射 + types 加 swarm_enabled。 - 套餐编辑抽屉加「蜂群使用权」Switch(镜像 enabled)。 - zh.json 加 "Swarm Access" → 蜂群使用权(en 用 key 兜底)。 默认关闭(opt-in)、管理员逐套餐勾选;gate 在 swarm 创建入口,与 swarm 运行时是否启用无关。 测试 TestGetUserSwarmEnabled(无套餐/开通/未开通/过期/多套餐/非法 user)。build+vet+model 测试全绿。 影响面:HM 订阅模型(加字段)+ swarm 创建鉴权 + admin UI;不涉计费扣费/密钥/swarm 契约。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
48 lines
1.4 KiB
Go
48 lines
1.4 KiB
Go
package model
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/heicode/manager/common"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
// GetUserSwarmEnabled gates swarm access per subscription plan (admin-set,
|
|
// opt-in): true iff the user has any ACTIVE plan with SwarmEnabled=true.
|
|
func TestGetUserSwarmEnabled(t *testing.T) {
|
|
now := common.GetTimestamp()
|
|
future := now + 100000
|
|
|
|
onPlan := SubscriptionPlan{Title: "swarm-on", SwarmEnabled: true}
|
|
require.NoError(t, DB.Create(&onPlan).Error)
|
|
offPlan := SubscriptionPlan{Title: "swarm-off", SwarmEnabled: false}
|
|
require.NoError(t, DB.Create(&offPlan).Error)
|
|
|
|
mkSub := func(uid, planId int, end int64) {
|
|
require.NoError(t, DB.Create(&UserSubscription{UserId: uid, PlanId: planId, Status: "active", EndTime: end}).Error)
|
|
}
|
|
|
|
// 1. no subscription -> false (opt-in default)
|
|
require.False(t, GetUserSwarmEnabled(991001))
|
|
|
|
// 2. active plan with swarm on -> true
|
|
mkSub(991002, onPlan.Id, future)
|
|
require.True(t, GetUserSwarmEnabled(991002))
|
|
|
|
// 3. active plan with swarm off -> false
|
|
mkSub(991003, offPlan.Id, future)
|
|
require.False(t, GetUserSwarmEnabled(991003))
|
|
|
|
// 4. expired swarm-on plan -> false (not active)
|
|
mkSub(991004, onPlan.Id, now-100)
|
|
require.False(t, GetUserSwarmEnabled(991004))
|
|
|
|
// 5. multiple active plans, one on -> true
|
|
mkSub(991005, offPlan.Id, future)
|
|
mkSub(991005, onPlan.Id, future)
|
|
require.True(t, GetUserSwarmEnabled(991005))
|
|
|
|
// guard: invalid user -> false
|
|
require.False(t, GetUserSwarmEnabled(0))
|
|
}
|