网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
namespace Dpz.Core.WebApi.Controllers;

/// <summary>
/// 碎碎念管理
/// </summary>
[ApiController, Route(("api/[controller]"))]
public class MumbleController(
    IMumbleService mumbleService,
    IObjectStorageOperation objectStorageService
) : ControllerBase
{
    /// <summary>
    /// 获取碎碎念
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    [ProducesResponseType<List<VmMumble>>(StatusCodes.Status200OK)]
    public async Task<IActionResult> GetMumbles([FromQuery] MumbleQueryParameterDto parameter)
    {
        var list = await mumbleService.GetPagesAsync(
            parameter.PageIndex,
            parameter.PageSize,
            parameter.Content
        );
        //list.ForEach(async x => await HandleImageHostAsync(x));
        list.AddPaginationMetadata(Response.Headers);
        return Ok(list);
    }

    /// <summary>
    /// 根据ID获取碎碎念
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    [HttpGet("{id}")]
    [ProducesResponseType<VmMumble>(StatusCodes.Status200OK)]
    public async Task<IActionResult> GetMumble(string id)
    {
        var mumble = await mumbleService.FindAsync(id);
        //await HandleImageHostAsync(mumble);
        return Ok(mumble);
    }

    /// <summary>
    /// 新建碎碎念
    /// </summary>
    /// <param name="model"></param>
    /// <returns></returns>
    [HttpPost, Authorize]
    [ProducesResponseType(StatusCodes.Status204NoContent)]
    [ProducesResponseType(StatusCodes.Status401Unauthorized)]
    public async Task<IActionResult> Create([FromBody] MumbleCreateDto model)
    {
        var viewModel = new VmMumble()
        {
            Author = User.GetIdentity(),
            CommentCount = 0,
            CreateTime = DateTime.Now,
            HtmlContent = model.HtmlContent,
            LastUpdateTime = DateTime.Now,
            Markdown = model.Markdown
        };
        await mumbleService.CreateAsync(viewModel);

        return NoContent();
    }

    /// <summary>
    /// 编辑碎碎念内容
    /// </summary>
    /// <param name="model"></param>
    /// <returns></returns>
    [HttpPatch, Authorize(Policy = "System")]
    [ProducesResponseType(StatusCodes.Status204NoContent)]
    [ProducesResponseType(StatusCodes.Status401Unauthorized)]
    public async Task<IActionResult> EditContent([FromBody] MumbleEditContentDto model)
    {
        var viewModel = new VmMumble()
        {
            Id = model.Id,
            HtmlContent = model.HtmlContent,
            Markdown = model.Markdown,
        };
        await mumbleService.EditContentAsync(viewModel);
        return NoContent();
    }

    /// <summary>
    /// 删除碎碎念
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    [HttpDelete("{id}"), Authorize(Policy = "System")]
    [ProducesResponseType(StatusCodes.Status204NoContent)]
    [ProducesResponseType(StatusCodes.Status401Unauthorized)]
    public async Task<IActionResult> Delete(string id)
    {
        await mumbleService.DeleteAsync(id);
        return NoContent();
    }

    /// <summary>
    /// 点赞
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    [HttpPost("like/{id}")]
    [ProducesResponseType(StatusCodes.Status204NoContent)]
    public async Task<IActionResult> Like(string id)
    {
        var mumble = await mumbleService.LikeAsync(id);
        return Ok(mumble);
    }

    /// <summary>
    /// 上传文章相关的图片
    /// </summary>
    /// <returns></returns>
    [HttpPost("upload"), Authorize]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status401Unauthorized)]
    public async Task<IActionResult> Upload()
    {
        var file = Request.Form.Files.FirstOrDefault();
        if (file is { Length: > 0 } && file.ContentType.Contains("image"))
        {
            var userInfo = User.GetIdentity();
            var path = new[] { "images", "mumble", DateTime.Now.ToString("yyyy-MM-dd") };
            var fileName =
                ObjectId.GenerateNewId() + file.FileName[file.FileName.LastIndexOf('.')..];
            var result = await objectStorageService.UploadAsync(
                file.OpenReadStream(),
                path,
                fileName
            );
            return Ok(
                new
                {
                    success = 1,
                    message = "",
                    url = result.AccessUrl
                }
            );
        }

        return BadRequest("Please select image to upload");
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码是一个 ASP.NET Core Web API 控制器,名为 MumbleController,用于管理“碎碎念”(Mumble)相关的操作。以下是对代码中各个部分的详细解释:

1. 控制器声明

[ApiController, Route(("api/[controller]"))]
public class MumbleController : ControllerBase
  • ApiController 特性指示该类是一个 API 控制器,提供了一些自动化的功能,如模型验证。
  • Route 特性定义了控制器的路由,api/[controller] 表示该控制器的路由前缀为 api/mumble

2. 构造函数

public MumbleController(IMumbleService mumbleService, IObjectStorageOperation objectStorageService)
  • 控制器通过依赖注入接收两个服务:IMumbleService(用于处理碎碎念的业务逻辑)和 IObjectStorageOperation(用于处理对象存储操作,如文件上传)。

3. 获取碎碎念

[HttpGet]
public async Task<IActionResult> GetMumbles([FromQuery] MumbleQueryParameterDto parameter)
  • 处理 GET 请求,获取碎碎念列表。
  • 接收查询参数 MumbleQueryParameterDto,用于分页和内容过滤。
  • 调用 mumbleService.GetPagesAsync 方法获取数据,并将分页元数据添加到响应头中。

4. 根据 ID 获取碎碎念

[HttpGet("{id}")]
public async Task<IActionResult> GetMumble(string id)
  • 处理 GET 请求,根据 ID 获取特定的碎碎念。
  • 调用 mumbleService.FindAsync 方法获取数据。

5. 新建碎碎念

[HttpPost, Authorize]
public async Task<IActionResult> Create([FromBody] MumbleCreateDto model)
  • 处理 POST 请求,创建新的碎碎念。
  • 需要用户授权(Authorize 特性)。
  • 从请求体中获取 MumbleCreateDto 模型,构建 VmMumble 视图模型并调用 mumbleService.CreateAsync 方法。

6. 编辑碎碎念内容

[HttpPatch, Authorize(Policy = "System")]
public async Task<IActionResult> EditContent([FromBody] MumbleEditContentDto model)
  • 处理 PATCH 请求,编辑现有碎碎念的内容。
  • 需要用户具有特定的授权策略(System)。
  • 从请求体中获取 MumbleEditContentDto 模型,并调用 mumbleService.EditContentAsync 方法。

7. 删除碎碎念

[HttpDelete("{id}"), Authorize(Policy = "System")]
public async Task<IActionResult> Delete(string id)
  • 处理 DELETE 请求,根据 ID 删除碎碎念。
  • 需要用户具有特定的授权策略(System)。
  • 调用 mumbleService.DeleteAsync 方法。

8. 点赞

[HttpPost("like/{id}")]
public async Task<IActionResult> Like(string id)
  • 处理 POST 请求,给特定的碎碎念点赞。
  • 调用 mumbleService.LikeAsync 方法。

9. 上传文章相关的图片

[HttpPost("upload"), Authorize]
public async Task<IActionResult> Upload()
  • 处理 POST 请求,上传与碎碎念相关的图片。
  • 需要用户授权(Authorize 特性)。
  • 从请求中获取文件,检查文件类型和大小,调用 objectStorageService.UploadAsync 方法上传文件,并返回上传结果的 URL。

总结

这个控制器提供了完整的 CRUD(创建、读取、更新、删除)操作以及点赞和文件上传功能,主要用于管理碎碎念的内容和相关的图片。通过使用依赖注入和 ASP.NET Core 的特性,代码结构清晰且易于维护。

loading