网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
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 });
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码是一个 ASP.NET Core Web API 控制器的实现,名为 SysController。这个控制器主要负责系统设置相关的操作,特别是与数据备份和还原相关的功能。以下是代码的主要功能和结构的详细解释:

1. 控制器定义

  • SysController 继承自 ControllerBase,并使用了 ApiController 特性,表示这是一个 API 控制器。
  • 控制器的路由被定义为 api/[controller],这意味着访问这个控制器的 URL 将是 api/sys

2. 构造函数

  • 控制器的构造函数接受多个服务的实例,包括:
    • IBackupRecordService:用于获取备份记录的服务。
    • IRestoreService:用于执行数据还原的服务。
    • ISafeFileService:用于安全地下载文件的服务。
    • ILogger<SysController>:用于记录日志的服务。
    • IMediator:用于处理请求的中介者。

3. 还原最新数据的 API

  • Restore 方法是一个 HTTP POST 请求的处理方法,路径为 api/sys/restore
  • 该方法接受一个 RestoreRequest 对象作为请求体,包含还原所需的信息。
  • 方法内部:
    • 首先调用 backupRecordService.GetLastNewBackupRecordAsync 获取最新的备份记录。
    • 然后设置 restoreService.DownloadBackupFileAsyncDownloadBackupFileAsync 方法,以便在还原过程中下载备份文件。
    • 调用 restoreService.RestoreAsync 方法执行还原操作。
    • 如果发生异常,记录错误并返回 400 Bad Request。
    • 如果成功,返回 204 No Content。

4. 下载备份文件的私有方法

  • DownloadBackupFileAsync 方法负责下载备份文件并将其保存到本地。
  • 方法内部:
    • 使用 safeFileService.DownloadAsync 下载备份文件。
    • 创建一个名为 restore 的目录(如果不存在)。
    • 将下载的文件保存为以当前日期命名的 ZIP 文件。
    • 返回保存的文件路径。

5. 接收预处理回调的 API

  • ReceiveUpyunNotification 方法是另一个 HTTP POST 请求的处理方法,路径为 api/sys/receive/upyun/notify
  • 该方法使用 mediator.Send 发送一个 UpyunNotificationRequest 请求,处理来自 Upyun 的通知。
  • 返回的结果取决于 mediator.Send 的实现。

总结

这个控制器的主要功能是提供数据还原的 API 接口,并处理来自 Upyun 的通知。它通过依赖注入的方式使用多个服务来实现备份记录的获取、文件的下载和数据的还原,同时也具备错误处理和日志记录的能力。

loading