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-ruleS8WatchRuleService.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; } }