using Dpz.Core.Entity.Base.Image;
using Dpz.Core.Infrastructure.Imaging;
using Dpz.Core.MessageQueue.Abstractions;
using Dpz.Core.Public.ViewModel.Messages;
using Dpz.Core.Public.ViewModel.Request;
using Dpz.Core.Public.ViewModel.Response;

namespace Dpz.Core.WebApi.Controllers;

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

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

    /// <summary>
    /// 新建碎碎念
    /// </summary>
    /// <param name="model"></param>
    /// <param name="cancellationToken">取消令牌</param>
    /// <returns></returns>
    [HttpPost, Authorize]
    [ProducesResponseType(StatusCodes.Status204NoContent)]
    [ProducesResponseType(StatusCodes.Status401Unauthorized)]
    public async Task<IActionResult> Create(
        [FromBody] MumbleCreateDto model,
        CancellationToken cancellationToken
    )
    {
        var user = await currentUserService.GetRequiredUserInfoAsync(cancellationToken);
        var request = new CreateMumbleRequest
        {
            Author = user,
            CommentCount = 0,
            Like = 0,
            CreateTime = DateTime.Now,
            LastUpdateTime = DateTime.Now,
            Markdown = model.Markdown,
            Images = model.Images,
        };
        await mumbleService.CreateAsync(request, cancellationToken);

        return NoContent();
    }

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

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

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

    /// <summary>
    /// 上传相关的图片
    /// </summary>
    /// <returns></returns>
    [HttpPost("upload"), Authorize]
    [ProducesResponseType<List<ImageMetadata>>(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [ProducesResponseType(StatusCodes.Status401Unauthorized)]
    public async Task<ActionResult<List<ImageMetadata>>> Upload(
        CancellationToken cancellationToken = default
    )
    {
        var path = new[] {
#if DEBUG
            "Test",
#endif
            "images", "mumble", DateTime.Now.ToString("yyyy-MM-dd") };
        return await Request.Form.Files.UploadMultipleImagesAsync(
            imageFormatDetector,
            objectStorageService,
            publisher,
            path,
            cancellationToken
        );
    }

    /// <summary>
    /// 历史碎碎念
    /// 如果历史上的当前没有碎碎念,则返回随机碎碎念
    /// </summary>
    /// <returns></returns>
    [HttpGet("history")]
    public async Task<ActionResult<List<MumbleResponse>>> History(
        CancellationToken cancellationToken
    )
    {
        var list = await mumbleService.GetHistoryMumblesAsync(5, cancellationToken);
        return Ok(list);
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码解释

这是一个 ASP.NET Core Web API 控制器,用于管理"碎碎念"(Mumble)功能,类似于微博或朋友圈的短内容发布系统。

主要功能模块

1. 控制器基本信息

[ApiController, Route(("api/[controller]"))]
public class MumbleController
  • 定义了 RESTful API 路径为 /api/Mumble
  • 使用依赖注入接收 5 个服务:
    • IMumbleService: 碎碎念业务逻辑服务
    • IObjectStorageOperation: 对象存储服务(处理图片)
    • IHttpCurrentUserService: 当前用户服务
    • IImageFormatDetector: 图片格式检测器
    • IMessagePublisher: 消息发布器(用于异步删除图片)

2. 核心 API 端点

GET /api/Mumble - 分页获取碎碎念列表

  • 支持按内容搜索、分页查询
  • 返回分页元数据到响应头

GET /api/Mumble/{id} - 获取单条碎碎念

  • 根据 ID 查询特定碎碎念

POST /api/Mumble - 创建碎碎念

  • 🔒 需要授权([Authorize]
  • 接收 Markdown 内容和图片
  • 自动填充当前用户信息和时间戳

PATCH /api/Mumble - 编辑碎碎念内容

  • 🔒 需要系统管理员权限(Policy = "System"
  • 支持修改 Markdown 和图片

DELETE /api/Mumble/{id} - 删除碎碎念

  • 🔒 需要系统管理员权限

POST /api/Mumble/like/{id} - 点赞

  • 无需授权的公开接口
  • 返回更新后的碎碎念数据

POST /api/Mumble/upload - 上传图片

  • 🔒 需要授权
  • 支持多图上传
  • 按日期组织存储路径:images/mumble/yyyy-MM-dd
  • Debug 模式下会添加 "Test" 前缀路径

GET /api/Mumble/history - 获取历史碎碎念

  • 返回历史上的今天发布的碎碎念(最多 5 条)
  • 如果没有则返回随机碎碎念

设计特点

  1. 异步处理:所有方法都使用 async/awaitCancellationToken
  2. 权限控制:使用不同级别的授权策略
  3. 响应类型标注:使用 ProducesResponseType 提供 Swagger 文档支持
  4. RESTful 风格:遵循标准 HTTP 动词语义
  5. 条件编译:Debug 模式下图片路径不同

注意事项

  • 有两行被注释的代码 //await HandleImageHostAsync(x),可能是图片处理的遗留代码
  • 删除操作接收的是数组参数,虽然当前只传单个 ID
评论加载中...