89 lines
3.9 KiB
C#
89 lines
3.9 KiB
C#
using dy.net.model.dto;
|
|
using dy.net.service;
|
|
using jzc.http.lib;
|
|
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace dy.net.Controllers
|
|
{
|
|
[Route("api/storage/migrations")]
|
|
[ApiController]
|
|
[Authorize]
|
|
public class StorageMigrationsController : ControllerBase
|
|
{
|
|
private readonly StorageMigrationService _service;
|
|
|
|
public StorageMigrationsController(StorageMigrationService service) => _service = service;
|
|
|
|
[HttpPost("preflight")]
|
|
public async Task<IActionResult> Preflight([FromBody] StorageMigrationPreflightRequest request, CancellationToken cancellationToken) =>
|
|
ApiResult.Success(await _service.PreflightAsync(request?.VerifyCapabilities ?? true, cancellationToken));
|
|
|
|
[HttpPost]
|
|
public async Task<IActionResult> Create([FromBody] CreateStorageMigrationRequest request, CancellationToken cancellationToken) =>
|
|
await ExecuteAsync(async () => ApiResult.Success(await _service.CreateAsync(request, cancellationToken)));
|
|
|
|
[HttpGet("latest")]
|
|
public async Task<IActionResult> Latest() => ApiResult.Success(await _service.GetLatestAsync());
|
|
|
|
[HttpGet("failed-records/preview")]
|
|
public async Task<IActionResult> FailedRecordsPreview() =>
|
|
ApiResult.Success(await _service.PreviewFailedRecordRemovalAsync());
|
|
|
|
[HttpPost("failed-records/remove")]
|
|
public async Task<IActionResult> RemoveFailedRecords([FromBody] RemoveFailedMigrationRecordsRequest request) =>
|
|
await ExecuteAsync(async () => ApiResult.Success(await _service.RemoveFailedRecordsAsync(request)));
|
|
|
|
[HttpPost("history/archive")]
|
|
public async Task<IActionResult> ArchiveHistory() =>
|
|
await ExecuteAsync(async () => ApiResult.Success(await _service.ArchiveAllSettledAsync()));
|
|
|
|
[HttpGet("{id}")]
|
|
public async Task<IActionResult> Get(string id) =>
|
|
await ExecuteAsync(async () => ApiResult.Success(await _service.GetAsync(id)));
|
|
|
|
[HttpGet("{id}/items")]
|
|
public async Task<IActionResult> Items(string id, [FromQuery] StorageMigrationItemPageRequest request) =>
|
|
await ExecuteAsync(async () => ApiResult.Success(await _service.GetItemsAsync(id, request)));
|
|
|
|
[HttpPost("{id}/pause")]
|
|
public Task<IActionResult> Pause(string id) => ExecuteActionAsync(() => _service.PauseAsync(id));
|
|
|
|
[HttpPost("{id}/resume")]
|
|
public Task<IActionResult> Resume(string id) => ExecuteActionAsync(() => _service.ResumeAsync(id));
|
|
|
|
[HttpPost("{id}/cancel")]
|
|
public Task<IActionResult> Cancel(string id) => ExecuteActionAsync(() => _service.CancelAsync(id));
|
|
|
|
[HttpPost("{id}/retry-failed")]
|
|
public Task<IActionResult> RetryFailed(string id) => ExecuteActionAsync(() => _service.RetryFailedAsync(id));
|
|
|
|
[HttpPost("{id}/cleanup")]
|
|
public Task<IActionResult> Cleanup(string id, CancellationToken cancellationToken) =>
|
|
ExecuteActionAsync(() => _service.CleanupAsync(id, cancellationToken));
|
|
|
|
[HttpPost("{id}/rollback")]
|
|
public Task<IActionResult> Rollback(string id, CancellationToken cancellationToken) =>
|
|
ExecuteActionAsync(() => _service.RollbackAsync(id, cancellationToken));
|
|
|
|
[HttpPost("{id}/archive")]
|
|
public Task<IActionResult> Archive(string id) => ExecuteActionAsync(() => _service.ArchiveAsync(id));
|
|
|
|
private async Task<IActionResult> ExecuteActionAsync(Func<Task> action) =>
|
|
await 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)
|
|
{
|
|
return ApiResult.Fail(ex.Message);
|
|
}
|
|
}
|
|
}
|
|
}
|