using Admin.NET.Plugin.AiDOP.Service.S8;
using Microsoft.Extensions.Configuration;
namespace Admin.NET.Plugin.AiDOP.Controllers.S8;
///
/// G-01 最小补验内部入口(非正式调度接入点)。
/// 仅用于触发 S8 自动监控 MVP 主链一次,供端到端联调与验收取证;
/// 不对外暴露业务语义,不作为长期 API。
/// G08-06:移除匿名访问;由 appsettings 的 `WatchScheduler:DebugEndpointEnabled` 控制是否启用,
/// 未启用时所有 Action 返回 404(语义等价于"未注册")。
///
[ApiController]
[Route("api/aidop/s8/watch-debug")]
[NonUnify]
public class AdoS8WatchDebugController : ControllerBase
{
private readonly S8WatchSchedulerService _svc;
private readonly bool _debugEndpointEnabled;
public AdoS8WatchDebugController(S8WatchSchedulerService svc, IConfiguration configuration)
{
_svc = svc;
_debugEndpointEnabled = configuration.GetValue("WatchScheduler:DebugEndpointEnabled", false);
}
[HttpPost("run-once")]
public async Task RunOnceAsync(
[FromQuery] long tenantId = 1,
[FromQuery] long factoryId = 1)
{
if (!_debugEndpointEnabled) return NotFound();
var results = await _svc.CreateExceptionsAsync(tenantId, factoryId);
return Ok(new
{
count = results.Count,
results = results.Select(r => new
{
created = r.Created,
skipped = r.Skipped,
createdExceptionId = r.CreatedExceptionId,
reason = r.Reason,
errorMessage = r.ErrorMessage,
sourceRuleId = r.DedupResult.Hit.SourceRuleId,
relatedObjectCode = r.DedupResult.Hit.RelatedObjectCode,
matchedExceptionId = r.DedupResult.MatchedExceptionId
})
});
}
///
/// S2-EW:仅供 e2e fixture 使用的 TEST_G09_ 数据软删入口。
/// 安全契约:
/// - 与 run-once 共用 _debugEndpointEnabled;未启用时 404。
/// - tenantId / factoryId 必须显式传入(无默认值),缺参由 ASP.NET 返回 400。
/// - 前缀 TEST_G09_ 在 service 端硬编码,本接口不接受 prefix 入参。
/// - 仅 soft delete(SET IsDeleted=true),不触发物理 DELETE。
///
[HttpDelete("test-cleanup")]
public async Task TestCleanupAsync(
[FromQuery] long? tenantId,
[FromQuery] long? factoryId,
[FromServices] S8ExceptionService exceptionSvc)
{
if (!_debugEndpointEnabled) return NotFound();
if (tenantId is null || factoryId is null)
return BadRequest(new { message = "tenantId and factoryId are required (no defaults)." });
var deletedCount = await exceptionSvc.SoftDeleteTestPrefixAsync(tenantId.Value, factoryId.Value);
return Ok(new { deletedCount });
}
}