Files
2026-06-03 08:48:26 +08:00

68 lines
1.4 KiB
Go

package common
import (
"context"
"github.com/qianfree/team-api/internal/dao"
)
// IsFeatureEnabled 检查功能是否启用
// 优先级:租户覆盖 > 套餐 > 默认
func IsFeatureEnabled(ctx context.Context, tenantID int64, featureKey string) bool {
// 1. 租户级覆盖
if tenantID > 0 {
var flag *struct {
Enabled bool `json:"enabled"`
}
err := dao.PlnFeatureFlags.Ctx(ctx).
Where("tenant_id", tenantID).
Where("feature_key", featureKey).
Where("source", "tenant").
Scan(&flag)
if err == nil && flag != nil && flag.Enabled {
return true
}
}
// 2. 查租户当前套餐
if tenantID > 0 {
var planRow *struct {
PlanID int64
}
err := dao.PlnTenantPlans.Ctx(ctx).
Where("tenant_id", tenantID).
Where("status", "active").
Fields("plan_id").
Limit(1).
Scan(&planRow)
if err == nil && planRow != nil && planRow.PlanID > 0 {
var flag *struct {
Enabled bool `json:"enabled"`
}
err = dao.PlnFeatureFlags.Ctx(ctx).
Where("plan_id", planRow.PlanID).
Where("feature_key", featureKey).
Scan(&flag)
if err == nil && flag != nil && flag.Enabled {
return true
}
}
}
// 3. 默认值
var flag *struct {
DefaultEnabled bool `json:"default_enabled"`
}
err := dao.PlnFeatureFlags.Ctx(ctx).
Where("feature_key", featureKey).
Where("source", "manual").
Limit(1).
Scan(&flag)
if err != nil {
return false
}
if flag == nil {
return false
}
return flag.DefaultEnabled
}