feat: add fnOS packaging, storage workflows and release pipeline

This commit is contained in:
2026-08-11 18:05:49 +08:00
parent c5922f9b08
commit 95932f0199
181 changed files with 24024 additions and 1164 deletions
@@ -0,0 +1,75 @@
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<IActionResult> Preflight(
[FromBody] OpenListDirectoryRepairPreflightRequest request,
CancellationToken cancellationToken) => ExecuteAsync(async () =>
ApiResult.Success(await _service.PreflightAsync(request, cancellationToken)));
[HttpPost]
public Task<IActionResult> Create(
[FromBody] CreateOpenListDirectoryRepairRequest request,
CancellationToken cancellationToken) => ExecuteAsync(async () =>
ApiResult.Success(await _service.CreateAsync(request, cancellationToken)));
[HttpGet("latest")]
public Task<IActionResult> Latest() => ExecuteAsync(async () =>
ApiResult.Success(await _service.GetLatestAsync()));
[HttpGet("{id}")]
public Task<IActionResult> Get(string id) => ExecuteAsync(async () =>
ApiResult.Success(await _service.GetAsync(id)));
[HttpGet("{id}/items")]
public Task<IActionResult> Items(string id, [FromQuery] OpenListDirectoryRepairItemPageRequest request) =>
ExecuteAsync(async () => ApiResult.Success(await _service.GetItemsAsync(id, request)));
[HttpPost("{id}/confirm-cleanup")]
public Task<IActionResult> Confirm(
string id,
[FromBody] ConfirmOpenListDirectoryRepairRequest request) => ExecuteAsync(async () =>
{
await _service.ConfirmCleanupAsync(id, request);
return ApiResult.Success("清理任务已提交");
});
[HttpPost("{id}/cancel")]
public Task<IActionResult> Cancel(string id) => ExecuteActionAsync(() => _service.CancelAsync(id));
[HttpPost("{id}/resume")]
public Task<IActionResult> Resume(string id) => ExecuteActionAsync(() => _service.ResumeAsync(id));
[HttpPost("{id}/retry-failed")]
public Task<IActionResult> RetryFailed(string id) => ExecuteActionAsync(() => _service.RetryFailedAsync(id));
private Task<IActionResult> ExecuteActionAsync(Func<Task> action) => ExecuteAsync(async () =>
{
await action();
return ApiResult.Success("操作已提交");
});
private static async Task<IActionResult> ExecuteAsync(Func<Task<IActionResult>> action)
{
try { return await action(); }
catch (Exception ex) when (ex is InvalidOperationException or KeyNotFoundException
or HttpRequestException or TimeoutException)
{
return ApiResult.Fail(ex.GetBaseException().Message);
}
}
}
}