using FreeSql; using LiveForum.Code.Base; using LiveForum.Code.JwtInfrastructure; using LiveForum.IService.Cdk; using LiveForum.IService.Permission; using LiveForum.IService.Posts; using LiveForum.Model; using LiveForum.Model.Dto.Posts; using LiveForum.Model.Dto.PostComments; using LiveForum.Model.Enum; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace LiveForum.WebApi.Controllers { /// /// 帖子相关接口 /// [Route("api/[controller]/[action]")] [ApiController] public class PostsController : ControllerBase { private readonly IPostsService _posts; private readonly ICdkService _cdkService; private readonly IPermissionService _permissionService; private readonly JwtUserInfoModel _userInfoModel; private readonly IBaseRepository _postsRepository; /// /// 构造函数 /// public PostsController(IPostsService posts, ICdkService cdkService, IPermissionService permissionService, JwtUserInfoModel userInfoModel, IBaseRepository postsRepository) { _posts = posts; _cdkService = cdkService; _permissionService = permissionService; _userInfoModel = userInfoModel; _postsRepository = postsRepository; } /// /// 获取帖子列表(瀑布流) /// /// 请求参数 /// [HttpGet] public Task> GetPosts([FromQuery] GetPostsReq request) => _posts.GetPosts(request); /// /// 获取帖子详情 /// /// 请求参数 /// [HttpGet] public Task> GetPostDetail([FromQuery] GetPostDetailReq request) => _posts.GetPostDetail(request); /// /// 发布帖子 /// /// 请求参数 /// [HttpPost] [Authorize] public async Task> PublishPosts([FromBody] PublishPostsReq request) { var userId = _userInfoModel.UserId; // 权限校验:发贴权限 await _permissionService.CheckPermissionAsync(userId, PermissionType.Post); // CDK激活检查 if (await _cdkService.RequiresCdkActivationAsync(userId)) { return new BaseResponse(ResponseCode.CdkNotActivated, "需要激活 CDK"); } return await _posts.PublishPosts(request); } /// /// 编辑帖子 /// /// 请求参数 /// [HttpPost] [Authorize] public Task> UpdatePosts([FromBody] UpdatePostsReq request) => _posts.UpdatePosts(request); /// /// 删除帖子 /// /// 请求参数 /// [HttpPost] [Authorize] public async Task DeletePosts([FromBody] DeletePostsReq request) { var userId = _userInfoModel.UserId; // 查询帖子作者,仅当删除者非帖子作者时校验删除其他用户帖子权限 var post = await _postsRepository.Select .Where(x => x.Id == request.PostId && !x.IsDeleted) .FirstAsync(); if (post != null && post.UserId != userId) { await _permissionService.CheckPermissionAsync(userId, PermissionType.DeleteOtherPost); } return await _posts.DeletePosts(request); } /// /// 获取我的帖子列表 /// /// 请求参数 /// [HttpGet] [Authorize] public Task> GetMyPosts([FromQuery] GetMyPostsReq request) => _posts.GetMyPosts(request); /// /// 点赞/取消点赞帖子 /// /// 请求参数 /// [HttpPost] [Authorize] public async Task> LikePost([FromBody] LikePostReq request) { var userId = _userInfoModel.UserId; // 权限校验:点赞权限 await _permissionService.CheckPermissionAsync(userId, PermissionType.Like); return await _posts.LikePost(request); } /// /// 获取我点赞的帖子列表 /// /// 请求参数 /// [HttpGet] [Authorize] public Task> GetLikedPosts([FromQuery] GetLikedPostsReq request) => _posts.GetLikedPosts(request); /// /// 修改帖子回复权限 /// /// 请求参数 /// [HttpPost] [Authorize] public Task> UpdateReplyPermission([FromBody] UpdateReplyPermissionReq request) => _posts.UpdateReplyPermission(request); } }