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);
}
}