using dy.net.model.dto; using dy.net.service; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace dy.net.Controllers { [Route("api/storage/openlist/directory-repairs")] [ApiController] [Authorize] public sealed class OpenListDirectoryRepairsController : ControllerBase { private readonly OpenListDirectoryRepairService _service; public OpenListDirectoryRepairsController(OpenListDirectoryRepairService service) => _service = service; [HttpPost("preflight")] public Task Preflight( [FromBody] OpenListDirectoryRepairPreflightRequest request, CancellationToken cancellationToken) => ExecuteAsync(async () => ApiResult.Success(await _service.PreflightAsync(request, cancellationToken))); [HttpPost] public Task Create( [FromBody] CreateOpenListDirectoryRepairRequest request, CancellationToken cancellationToken) => ExecuteAsync(async () => ApiResult.Success(await _service.CreateAsync(request, cancellationToken))); [HttpGet("latest")] public Task Latest() => ExecuteAsync(async () => ApiResult.Success(await _service.GetLatestAsync())); [HttpGet("{id}")] public Task Get(string id) => ExecuteAsync(async () => ApiResult.Success(await _service.GetAsync(id))); [HttpGet("{id}/items")] public Task Items(string id, [FromQuery] OpenListDirectoryRepairItemPageRequest request) => ExecuteAsync(async () => ApiResult.Success(await _service.GetItemsAsync(id, request))); [HttpPost("{id}/confirm-cleanup")] public Task Confirm( string id, [FromBody] ConfirmOpenListDirectoryRepairRequest request) => ExecuteAsync(async () => { await _service.ConfirmCleanupAsync(id, request); return ApiResult.Success("清理任务已提交"); }); [HttpPost("{id}/cancel")] public Task Cancel(string id) => ExecuteActionAsync(() => _service.CancelAsync(id)); [HttpPost("{id}/resume")] public Task Resume(string id) => ExecuteActionAsync(() => _service.ResumeAsync(id)); [HttpPost("{id}/retry-failed")] public Task RetryFailed(string id) => ExecuteActionAsync(() => _service.RetryFailedAsync(id)); private Task ExecuteActionAsync(Func action) => ExecuteAsync(async () => { await action(); return ApiResult.Success("操作已提交"); }); private static async Task ExecuteAsync(Func> action) { try { return await action(); } catch (Exception ex) when (ex is InvalidOperationException or KeyNotFoundException or HttpRequestException or TimeoutException) { return ApiResult.Fail(ex.GetBaseException().Message); } } } }