using Flyshot.Server.Host; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; namespace Flyshot.Server.Host.Controllers; /// /// 提供浏览器调试页所需的运行时配置 API。 /// /// /// 本控制器自身不进入 Swagger 文档()。 /// 调试页静态资源位于 wwwroot,Swagger 地址由配置 API 下发。 /// [ApiController] [ApiExplorerSettings(IgnoreApi = true)] [Tags("基础与状态")] public sealed class DebugConsoleController : ControllerBase { /// /// Swagger 配置项,用于决定调试页是否对外暴露以及拼接 OpenAPI JSON 地址。 /// private readonly HostSwaggerOptions _swaggerOptions; /// /// 初始化在线调试页控制器。 /// /// 来自 Swagger 配置节的标准选项。 public DebugConsoleController(IOptions swaggerOptions) { ArgumentNullException.ThrowIfNull(swaggerOptions); _swaggerOptions = swaggerOptions.Value ?? new HostSwaggerOptions(); } /// /// 返回静态调试页启动时所需的 Swagger 文档地址。 /// /// 当 Swagger 启用时返回配置;否则返回 404,与 Swagger UI 保持一致的可见性策略。 [HttpGet("/api/debug/config")] public IActionResult GetDebugConfig() { if (!_swaggerOptions.Enabled) { return NotFound(); } return Ok(new { SwaggerJsonUrl = ResolveSwaggerJsonUrl(_swaggerOptions) }); } /// /// 根据 与 解析出 Swagger JSON 实际地址。 /// /// Swagger 配置选项。 /// 形如 /swagger/v1/swagger.json 的绝对路径。 private static string ResolveSwaggerJsonUrl(HostSwaggerOptions options) { // Swashbuckle 的 RouteTemplate 不带前导斜杠,这里统一加上保证前端 fetch 走绝对路径。 var template = options.JsonRouteTemplate ?? "swagger/{documentName}/swagger.json"; var path = template.Replace("{documentName}", options.DocumentName ?? "v1", StringComparison.Ordinal); return path.StartsWith('/') ? path : "/" + path; } }