using Admin.NET.Plugin.AiDOP.Const.S8; using Admin.NET.Plugin.AiDOP.Infrastructure.S8; using Admin.NET.Plugin.AiDOP.Service.S8.Rules.DataAccess; namespace Admin.NET.Plugin.AiDOP.Controllers.S8; /// /// 治理数据集目录(只读)。 /// /// S8-STANDARD-DATASET-HARD-CUTOVER-1:取代已物理删除的「数据源」配置端点。 /// 二者的性质完全不同,不要当成改名: /// · 旧的 data-sources 是**租户可写的物理连接配置**(含连接串与凭据); /// · 本端点是**平台级只读目录**,内容来自代码内的 Catalog + Provider Registry, /// 没有任何写入口 —— 数据集的增减是数据平台侧的开发行为,不是租户配置行为。 /// /// 只返回 Catalog 已定义 且 Provider 已注册 且 定义未停用 的数据集: /// 让用户在向导里选到一个"定义了但没实现"的数据集,只会把失败推迟到启用那一刻 /// (dataset_provider_not_registered),对配置者毫无帮助。 /// [ApiController] [Route("api/aidop/s8/config/datasets")] [NonUnify] public class AdoS8ConfigDatasetsController : ControllerBase { private readonly IS8DatasetCatalog _catalog; private readonly S8MonitoringDataProviderRegistry _registry; public AdoS8ConfigDatasetsController(IS8DatasetCatalog catalog, S8MonitoringDataProviderRegistry registry) { _catalog = catalog; _registry = registry; } [HttpGet] [S8Permission(S8PermissionCatalog.ConfigRead)] public IActionResult ListAsync() { var rows = _catalog.All .Where(d => d.IsActive && _registry.IsRegistered(d.DatasetCode)) .OrderBy(d => d.DatasetCode, StringComparer.Ordinal) .Select(d => new { datasetCode = d.DatasetCode, displayName = d.DisplayName, kind = d.Kind.ToString(), // 供前端在选择规则类型时先行过滤:能力不匹配的组合在这里就该看不见, // 而不是等提交后被 Enable Gate 以 dataset_capability_mismatch 拒绝。 supportsTimeout = d.Capabilities.SupportsTimeout, supportsShortage = d.Capabilities.SupportsShortage, supportsOutOfRange = d.Capabilities.SupportsOutOfRange }) .ToList(); return Ok(rows); } }