网站首页 网站源码
using System.Buffers;
using System.Web;
using Dpz.Core.Backup;
using Dpz.Core.WebApi.Models.EventRequest;
using Dpz.Core.WebApi.Models.Request;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
namespace Dpz.Core.WebApi.Controllers;
/// <summary>
/// 系统设置
/// </summary>
[ApiController, Route("api/[controller]")]
public class SysController(
IBackupRecordService backupRecordService,
IRestoreService restoreService,
ISafeFileService safeFileService,
ILogger<SysController> logger,
IMediator mediator
) : ControllerBase
{
/// <summary>
/// 还原最新数据
/// </summary>
/// <returns></returns>
[HttpPost("restore"), Authorize(Policy = ApiPermission.System)]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public async Task<IActionResult> Restore([FromBody] RestoreRequest request)
{
try
{
var backupRecord = await backupRecordService.GetLastNewBackupRecordAsync(
request.Database
);
restoreService.DownloadBackupFileAsync = DownloadBackupFileAsync;
await restoreService.RestoreAsync(request.ConnectionString, backupRecord);
}
catch (Exception e)
{
logger.LogError(e, "restore fail");
return BadRequest();
}
return NoContent();
}
private async Task<string> DownloadBackupFileAsync(string backupUrl)
{
var stream = await safeFileService.DownloadAsync(backupUrl);
var restorePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "restore");
if (!Directory.Exists(restorePath))
{
Directory.CreateDirectory(restorePath);
}
var restoreFilePath = Path.Combine(restorePath, $"{DateTime.Now:yyyyMMdd}.zip");
await using var fileStream = new FileStream(
restoreFilePath,
FileMode.Create,
FileAccess.Write,
FileShare.Write,
1 << 12
);
await stream.CopyToAsync(fileStream);
await fileStream.FlushAsync();
return restoreFilePath;
}
/// <summary>
/// 接收预处理回调
/// </summary>
/// <returns></returns>
[HttpPost("receive/upyun/notify")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public async Task<IActionResult> ReceiveUpyunNotification()
{
return await mediator.Send(new UpyunNotificationRequest { Request = Request });
}
}
上述代码是一个 ASP.NET Core Web API 控制器的实现,名为 SysController
。这个控制器主要负责系统设置相关的操作,特别是与数据备份和还原相关的功能。以下是代码的主要功能和结构的详细解释:
SysController
继承自 ControllerBase
,并使用了 ApiController
特性,表示这是一个 API 控制器。api/[controller]
,这意味着访问这个控制器的 URL 将是 api/sys
。IBackupRecordService
:用于获取备份记录的服务。IRestoreService
:用于执行数据还原的服务。ISafeFileService
:用于安全地下载文件的服务。ILogger<SysController>
:用于记录日志的服务。IMediator
:用于处理请求的中介者。Restore
方法是一个 HTTP POST 请求的处理方法,路径为 api/sys/restore
。RestoreRequest
对象作为请求体,包含还原所需的信息。backupRecordService.GetLastNewBackupRecordAsync
获取最新的备份记录。restoreService.DownloadBackupFileAsync
为 DownloadBackupFileAsync
方法,以便在还原过程中下载备份文件。restoreService.RestoreAsync
方法执行还原操作。DownloadBackupFileAsync
方法负责下载备份文件并将其保存到本地。safeFileService.DownloadAsync
下载备份文件。restore
的目录(如果不存在)。ReceiveUpyunNotification
方法是另一个 HTTP POST 请求的处理方法,路径为 api/sys/receive/upyun/notify
。mediator.Send
发送一个 UpyunNotificationRequest
请求,处理来自 Upyun 的通知。mediator.Send
的实现。这个控制器的主要功能是提供数据还原的 API 接口,并处理来自 Upyun 的通知。它通过依赖注入的方式使用多个服务来实现备份记录的获取、文件的下载和数据的还原,同时也具备错误处理和日志记录的能力。