191 lines
7.6 KiB
Java

package edu.whut.smilepicturebackend.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import edu.whut.smilepicturebackend.annotation.AuthCheck;
import edu.whut.smilepicturebackend.common.BaseResponse;
import edu.whut.smilepicturebackend.common.DeleteRequest;
import edu.whut.smilepicturebackend.common.ResultUtils;
import edu.whut.smilepicturebackend.constant.UserConstant;
import edu.whut.smilepicturebackend.exception.BusinessException;
import edu.whut.smilepicturebackend.exception.ErrorCode;
import edu.whut.smilepicturebackend.exception.ThrowUtils;
import edu.whut.smilepicturebackend.model.dto.space.*;
import edu.whut.smilepicturebackend.model.entity.Space;
import edu.whut.smilepicturebackend.model.entity.User;
import edu.whut.smilepicturebackend.model.enums.SpaceLevelEnum;
import edu.whut.smilepicturebackend.model.vo.SpaceVO;
import edu.whut.smilepicturebackend.service.SpaceService;
import edu.whut.smilepicturebackend.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author 程序员鱼皮 <a href="https://www.codefather.cn">编程导航原创项目</a>
*/
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/space")
public class SpaceController {
private final UserService userService;
private final SpaceService spaceService;
@PostMapping("/add")
public BaseResponse<Long> addSpace(@RequestBody SpaceAddRequest spaceAddRequest, HttpServletRequest request) {
ThrowUtils.throwIf(spaceAddRequest == null, ErrorCode.PARAMS_ERROR);
User loginUser = userService.getLoginUser(request);
long newId = spaceService.addSpace(spaceAddRequest, loginUser);
return ResultUtils.success(newId);
}
@PostMapping("/delete")
public BaseResponse<Boolean> deleteSpace(@RequestBody DeleteRequest deleteRequest
, HttpServletRequest request) {
if (deleteRequest == null || deleteRequest.getId() <= 0) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
User loginUser = userService.getLoginUser(request);
Long id = deleteRequest.getId();
// 判断是否存在
Space oldSpace = spaceService.getById(id);
ThrowUtils.throwIf(oldSpace == null, ErrorCode.NOT_FOUND_ERROR);
// 仅本人或者管理员可删除
spaceService.checkSpaceAuth(loginUser, oldSpace);
// 操作数据库
boolean result = spaceService.removeById(id);
ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
return ResultUtils.success(true);
}
/**
* 更新空间(仅管理员可用)
*
* @param spaceUpdateRequest
* @param request
* @return
*/
@PostMapping("/update")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Boolean> updateSpace(@RequestBody SpaceUpdateRequest spaceUpdateRequest,
HttpServletRequest request) {
if (spaceUpdateRequest == null || spaceUpdateRequest.getId() <= 0) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
// 将实体类和 DTO 进行转换
Space space = new Space();
BeanUtils.copyProperties(spaceUpdateRequest, space);
// 自动填充数据
spaceService.fillSpaceBySpaceLevel(space);
// 数据校验
spaceService.validSpace(space, false); //不是新增时的操作
// 判断是否存在
long id = spaceUpdateRequest.getId();
Space oldSpace = spaceService.getById(id);
ThrowUtils.throwIf(oldSpace == null, ErrorCode.NOT_FOUND_ERROR);
// 操作数据库
boolean result = spaceService.updateById(space);
ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
return ResultUtils.success(true);
}
/**
* 根据 id 获取空间(仅管理员可用)
*/
@GetMapping("/get")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Space> getSpaceById(long id, HttpServletRequest request) {
ThrowUtils.throwIf(id <= 0, ErrorCode.PARAMS_ERROR);
// 查询数据库
Space space = spaceService.getById(id);
ThrowUtils.throwIf(space == null, ErrorCode.NOT_FOUND_ERROR);
// 获取封装类
return ResultUtils.success(space);
}
/**
* 根据 id 获取空间(封装类)
*/
@GetMapping("/get/vo")
public BaseResponse<SpaceVO> getSpaceVOById(long id, HttpServletRequest request) {
ThrowUtils.throwIf(id <= 0, ErrorCode.PARAMS_ERROR);
// 查询数据库
Space space = spaceService.getById(id);
ThrowUtils.throwIf(space == null, ErrorCode.NOT_FOUND_ERROR);
return ResultUtils.success(spaceService.getSpaceVO(space,request));
}
/**
* 分页获取空间列表(仅管理员可用)
*/
@PostMapping("/list/page")
@AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
public BaseResponse<Page<Space>> listSpaceByPage(@RequestBody SpaceQueryRequest spaceQueryRequest) {
long current = spaceQueryRequest.getCurrent();
long size = spaceQueryRequest.getPageSize();
// 查询数据库
Page<Space> spacePage = spaceService.page(new Page<>(current, size),
spaceService.getQueryWrapper(spaceQueryRequest));
return ResultUtils.success(spacePage);
}
/**
* 分页获取空间列表(封装类) 用户使用
*/
@PostMapping("/list/page/vo")
public BaseResponse<Page<SpaceVO>> listSpaceVOByPage(@RequestBody SpaceQueryRequest spaceQueryRequest,
HttpServletRequest request) {
long current = spaceQueryRequest.getCurrent();
long size = spaceQueryRequest.getPageSize();
// 限制爬虫
ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR);
// 查询数据库
Page<Space> spacePage = spaceService.page(new Page<>(current, size),
spaceService.getQueryWrapper(spaceQueryRequest));
// 获取封装类
return ResultUtils.success(spaceService.getSpaceVOPage(spacePage, request));
}
/**
* 编辑空间(给用户使用)
*/
@PostMapping("/edit")
public BaseResponse<Boolean> editSpace(@RequestBody SpaceEditRequest spaceEditRequest, HttpServletRequest request) {
if (spaceEditRequest == null || spaceEditRequest.getId() <= 0) {
throw new BusinessException(ErrorCode.PARAMS_ERROR);
}
// 在此处将实体类和 DTO 进行转换
Space space = new Space();
BeanUtils.copyProperties(spaceEditRequest, space);
// 自动填充数据
spaceService.fillSpaceBySpaceLevel(space);
// 设置编辑时间
space.setEditTime(new Date());
// 数据校验
spaceService.validSpace(space, false);
User loginUser = userService.getLoginUser(request);
// 判断是否存在
long id = spaceEditRequest.getId();
Space oldSpace = spaceService.getById(id);
ThrowUtils.throwIf(oldSpace == null, ErrorCode.NOT_FOUND_ERROR);
// 仅本人或管理员可编辑
spaceService.checkSpaceAuth(loginUser, oldSpace);
// 操作数据库
boolean result = spaceService.updateById(space);
ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
return ResultUtils.success(true);
}
}