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 条)
- 如果没有则返回随机碎碎念
设计特点
- 异步处理:所有方法都使用
async/await和CancellationToken - 权限控制:使用不同级别的授权策略
- 响应类型标注:使用
ProducesResponseType提供 Swagger 文档支持 - RESTful 风格:遵循标准 HTTP 动词语义
- 条件编译:Debug 模式下图片路径不同
注意事项
- 有两行被注释的代码
//await HandleImageHostAsync(x),可能是图片处理的遗留代码 - 删除操作接收的是数组参数,虽然当前只传单个 ID
AI 正在分析代码…
评论加载中...