using Admin.NET.Plugin.AiDOP.Entity.S8;
namespace Admin.NET.Plugin.AiDOP.Service.S8.Rules.DataAccess;
///
/// 规则创建来源。用于区分"调用方自带 SQL"与"服务端按字典生成 SQL",
/// 因为两者的技术债性质与安全面完全不同。
///
public static class S8RuleCreationOrigin
{
///
/// 裸 REST 创建(POST /api/aidop/s8/config/watch-rules):调用方可自带任意 expression。
/// 这是新增 SQL 技术债的来源,也是注入面。
///
public const string ExternalApi = "EXTERNAL_API";
///
/// 配置向导生成(S8ConfigDraftService.GenerateRuleAsync):
/// SQL 由服务端按 ado_s8_monitor_object / ado_s8_monitor_metric 字典生成,
/// 标识符经 ValidateSqlIdentifier 白名单校验,调用方不提供 SQL 文本。
///
public const string WizardGenerated = "WIZARD_GENERATED";
}
///
/// S8-LEGACY-SQL-RESIDUAL-CLEANUP-3:新增 SQL 技术债的治理策略。
///
/// 为什么不是"一刀切禁止 LEGACY_SQL":取证显示配置向导
/// (wizard-drafts/{id}/generate-rule → S8WatchRuleService.CreateAsync)
/// 仍是在产的规则创建流程,且它生成的正是 LEGACY_SQL 规则。直接封死会阻断在用业务流程。
///
/// 因此按来源分治:掐断"调用方自带 SQL",保留"服务端字典生成",
/// 待向导迁移到 STANDARD_DATASET 后再收口最后一条通道。
///
/// 本策略只作用于"新建":历史规则的启停与维护不受约束,
/// 否则数据源一出问题,存量规则将再也无法被关停。
///
public static class S8RuleCreationPolicy
{
/// 拒绝新增裸 SQL 规则时使用的 reason code。
public const string LegacySqlCreationDisabledReason = "legacy_sql_creation_disabled";
///
/// 新建规则时的取数模式治理。
/// 未知来源按 处理(fail-closed):
/// 将来新增调用方若忘记声明来源,会被拦下而不是意外获得放行。
///
public static void EnsureCreationAllowed(AdoS8WatchRule rule, string? origin)
{
// STANDARD_DATASET 是鼓励方向,任何来源都放行。
if (S8DataAccessMode.IsAcceptable(rule.DataAccessMode)
&& S8DataAccessMode.Resolve(rule.DataAccessMode) == S8DataAccessMode.StandardDataset)
return;
if (string.Equals(origin, S8RuleCreationOrigin.WizardGenerated, StringComparison.Ordinal))
return;
throw new S8BizException(
$"[{LegacySqlCreationDisabledReason}] 不再接受新建自带 SQL 的监控规则。" +
$"请改用 data_access_mode={S8DataAccessMode.StandardDataset} 并引用已注册的 dataset_code;" +
"历史 LEGACY_SQL 规则仍可正常运行与维护。");
}
///
/// 存量规则维护(启用 / 停用 / 改参数)时的治理。
/// 当前对两个方向都放行——治理目标是"不再新增旧债",不是"让旧债无法维护"。
/// 保留此入口是为了让边界显式:将来若要收紧,改这里而不是散落到各 service。
///
public static void EnsureMaintenanceAllowed(AdoS8WatchRule rule, bool enabling)
{
// 刻意为空:存量 LEGACY_SQL 规则的启停不受创建治理约束。
_ = rule;
_ = enabling;
}
}