package com.yupi.springbootinit.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.gson.Gson; import com.yupi.springbootinit.annotation.AuthCheck; import com.yupi.springbootinit.common.BaseResponse; import com.yupi.springbootinit.common.DeleteRequest; import com.yupi.springbootinit.common.ErrorCode; import com.yupi.springbootinit.common.ResultUtils; import com.yupi.springbootinit.constant.UserConstant; import com.yupi.springbootinit.exception.BusinessException; import com.yupi.springbootinit.exception.ThrowUtils; import com.yupi.springbootinit.model.dto.post.PostAddRequest; import com.yupi.springbootinit.model.dto.post.PostEditRequest; import com.yupi.springbootinit.model.dto.post.PostQueryRequest; import com.yupi.springbootinit.model.dto.post.PostUpdateRequest; import com.yupi.springbootinit.model.entity.Post; import com.yupi.springbootinit.model.entity.User; import com.yupi.springbootinit.model.vo.PostVO; import com.yupi.springbootinit.service.PostService; import com.yupi.springbootinit.service.UserService; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 帖子接口 * * @author 程序员鱼皮 * @from 编程导航知识星球 */ @RestController @RequestMapping("/post") @Slf4j public class PostController { @Resource private PostService postService; @Resource private UserService userService; private final static Gson GSON = new Gson(); // region 增删改查 /** * 创建 * * @param postAddRequest * @param request * @return */ @PostMapping("/add") public BaseResponse addPost(@RequestBody PostAddRequest postAddRequest, HttpServletRequest request) { if (postAddRequest == null) { throw new BusinessException(ErrorCode.PARAMS_ERROR); } Post post = new Post(); BeanUtils.copyProperties(postAddRequest, post); List tags = postAddRequest.getTags(); if (tags != null) { post.setTags(GSON.toJson(tags)); } postService.validPost(post, true); User loginUser = userService.getLoginUser(request); post.setUserId(loginUser.getId()); post.setFavourNum(0); post.setThumbNum(0); boolean result = postService.save(post); ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR); long newPostId = post.getId(); return ResultUtils.success(newPostId); } /** * 删除 * * @param deleteRequest * @param request * @return */ @PostMapping("/delete") public BaseResponse deletePost(@RequestBody DeleteRequest deleteRequest, HttpServletRequest request) { if (deleteRequest == null || deleteRequest.getId() <= 0) { throw new BusinessException(ErrorCode.PARAMS_ERROR); } User user = userService.getLoginUser(request); long id = deleteRequest.getId(); // 判断是否存在 Post oldPost = postService.getById(id); ThrowUtils.throwIf(oldPost == null, ErrorCode.NOT_FOUND_ERROR); // 仅本人或管理员可删除 if (!oldPost.getUserId().equals(user.getId()) && !userService.isAdmin(request)) { throw new BusinessException(ErrorCode.NO_AUTH_ERROR); } boolean b = postService.removeById(id); return ResultUtils.success(b); } /** * 更新(仅管理员) * * @param postUpdateRequest * @return */ @PostMapping("/update") @AuthCheck(mustRole = UserConstant.ADMIN_ROLE) public BaseResponse updatePost(@RequestBody PostUpdateRequest postUpdateRequest) { if (postUpdateRequest == null || postUpdateRequest.getId() <= 0) { throw new BusinessException(ErrorCode.PARAMS_ERROR); } Post post = new Post(); BeanUtils.copyProperties(postUpdateRequest, post); List tags = postUpdateRequest.getTags(); if (tags != null) { post.setTags(GSON.toJson(tags)); } // 参数校验 postService.validPost(post, false); long id = postUpdateRequest.getId(); // 判断是否存在 Post oldPost = postService.getById(id); ThrowUtils.throwIf(oldPost == null, ErrorCode.NOT_FOUND_ERROR); boolean result = postService.updateById(post); return ResultUtils.success(result); } /** * 根据 id 获取 * * @param id * @return */ @GetMapping("/get/vo") public BaseResponse getPostVOById(long id, HttpServletRequest request) { if (id <= 0) { throw new BusinessException(ErrorCode.PARAMS_ERROR); } Post post = postService.getById(id); if (post == null) { throw new BusinessException(ErrorCode.NOT_FOUND_ERROR); } return ResultUtils.success(postService.getPostVO(post, request)); } /** * 分页获取列表(封装类) * * @param postQueryRequest * @param request * @return */ @PostMapping("/list/page/vo") public BaseResponse> listPostVOByPage(@RequestBody PostQueryRequest postQueryRequest, HttpServletRequest request) { long current = postQueryRequest.getCurrent(); long size = postQueryRequest.getPageSize(); // 限制爬虫 ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR); Page postPage = postService.page(new Page<>(current, size), postService.getQueryWrapper(postQueryRequest)); return ResultUtils.success(postService.getPostVOPage(postPage, request)); } /** * 分页获取当前用户创建的资源列表 * * @param postQueryRequest * @param request * @return */ @PostMapping("/my/list/page/vo") public BaseResponse> listMyPostVOByPage(@RequestBody PostQueryRequest postQueryRequest, HttpServletRequest request) { if (postQueryRequest == null) { throw new BusinessException(ErrorCode.PARAMS_ERROR); } User loginUser = userService.getLoginUser(request); postQueryRequest.setUserId(loginUser.getId()); long current = postQueryRequest.getCurrent(); long size = postQueryRequest.getPageSize(); // 限制爬虫 ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR); Page postPage = postService.page(new Page<>(current, size), postService.getQueryWrapper(postQueryRequest)); return ResultUtils.success(postService.getPostVOPage(postPage, request)); } // endregion /** * 分页搜索(从 ES 查询,封装类) * * @param postQueryRequest * @param request * @return */ @PostMapping("/search/page/vo") public BaseResponse> searchPostVOByPage(@RequestBody PostQueryRequest postQueryRequest, HttpServletRequest request) { long size = postQueryRequest.getPageSize(); // 限制爬虫 ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR); Page postPage = postService.searchFromEs(postQueryRequest); return ResultUtils.success(postService.getPostVOPage(postPage, request)); } /** * 编辑(用户) * * @param postEditRequest * @param request * @return */ @PostMapping("/edit") public BaseResponse editPost(@RequestBody PostEditRequest postEditRequest, HttpServletRequest request) { if (postEditRequest == null || postEditRequest.getId() <= 0) { throw new BusinessException(ErrorCode.PARAMS_ERROR); } Post post = new Post(); BeanUtils.copyProperties(postEditRequest, post); List tags = postEditRequest.getTags(); if (tags != null) { post.setTags(GSON.toJson(tags)); } // 参数校验 postService.validPost(post, false); User loginUser = userService.getLoginUser(request); long id = postEditRequest.getId(); // 判断是否存在 Post oldPost = postService.getById(id); ThrowUtils.throwIf(oldPost == null, ErrorCode.NOT_FOUND_ERROR); // 仅本人或管理员可编辑 if (!oldPost.getUserId().equals(loginUser.getId()) && !userService.isAdmin(loginUser)) { throw new BusinessException(ErrorCode.NO_AUTH_ERROR); } boolean result = postService.updateById(post); return ResultUtils.success(result); } }