package com.example.onlinejudge.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.onlinejudge.common.BaseResponse; import com.example.onlinejudge.common.DeleteRequest; import com.example.onlinejudge.common.ErrorCode; import com.example.onlinejudge.common.ResultUtils; import com.example.onlinejudge.exception.BusinessException; import com.example.onlinejudge.exception.ThrowUtils; import com.example.onlinejudge.model.VO.QuestionVO; import com.example.onlinejudge.model.dto.question.*; import com.example.onlinejudge.model.entity.Question; import com.example.onlinejudge.model.entity.User; import com.example.onlinejudge.service.QuestionService; import com.example.onlinejudge.service.UserService; import com.google.gson.Gson; 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.List; @RestController @RequestMapping("/question") @Slf4j public class QuestionController { @Resource private QuestionService questionService; @Resource private UserService userService; private final static Gson GSON = new Gson(); // region 增删改查 /** * 创建 * * @param questionAddRequest * @param request * @return */ @PostMapping("/add") public BaseResponse<Long> addQuestion(@RequestBody QuestionAddRequest questionAddRequest, HttpServletRequest request) { if (questionAddRequest == null) { throw new BusinessException(ErrorCode.PARAMS_ERROR); } Question question = new Question(); BeanUtils.copyProperties(questionAddRequest, question); List<String> tags = questionAddRequest.getTags(); if (tags != null) { question.setTags(GSON.toJson(tags)); } List<JudgeCase> judgeCase = questionAddRequest.getJudgeCase(); if (judgeCase != null) { question.setJudgeCase(GSON.toJson(judgeCase)); } JudgeConfig judgeConfig = questionAddRequest.getJudgeConfig(); if (judgeConfig != null) { question.setJudgeConfig(GSON.toJson(judgeConfig)); } questionService.validQuestion(question, true); // User loginUser = userService.getLoginUser(request); // question.setUserId(loginUser.getId()); boolean result = questionService.save(question); ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR); long newQuestionId = question.getId(); return ResultUtils.success(newQuestionId); } /** * 删除 * * @param deleteRequest * @param request * @return */ @PostMapping("/delete") public BaseResponse<Boolean> deleteQuestion(@RequestBody DeleteRequest deleteRequest, HttpServletRequest request) { if (deleteRequest == null || deleteRequest.getId() <= 0) { throw new BusinessException(ErrorCode.PARAMS_ERROR); } long id = deleteRequest.getId(); // 判断是否存在 Question oldQuestion = questionService.getById(id); ThrowUtils.throwIf(oldQuestion == null, ErrorCode.NOT_FOUND_ERROR); // 仅本人或管理员可删除 if (false) { throw new BusinessException(ErrorCode.NO_AUTH_ERROR); } boolean b = questionService.removeById(id); return ResultUtils.success(b); } /** * 根据 id 获取 * * @param id * @return */ @GetMapping("/get") public BaseResponse<Question> getQuestionById(long id, HttpServletRequest request) { if (id <= 0) { throw new BusinessException(ErrorCode.PARAMS_ERROR); } Question question = questionService.getById(id); if (question == null) { throw new BusinessException(ErrorCode.NOT_FOUND_ERROR); } // User loginUser = userService.getLoginUser(request); // // 不是本人或管理员,不能直接获取所有信息 // if (!question.getUserId().equals(loginUser.getId()) && !userService.isAdmin(loginUser)) { // throw new BusinessException(ErrorCode.NO_AUTH_ERROR); // } return ResultUtils.success(question); } /** * 根据 id 获取(脱敏) * * @param id * @return */ @GetMapping("/get/vo") public BaseResponse<QuestionVO> getQuestionVOById(long id, HttpServletRequest request) { if (id <= 0) { throw new BusinessException(ErrorCode.PARAMS_ERROR); } Question question = questionService.getById(id); if (question == null) { throw new BusinessException(ErrorCode.NOT_FOUND_ERROR); } return ResultUtils.success(questionService.getQuestionVO(question, request)); } /** * 分页获取列表(封装类) * * @param questionQueryRequest * @param request * @return */ @PostMapping("/list/page/vo") public BaseResponse<Page<QuestionVO>> listQuestionVOByPage(@RequestBody QuestionQueryRequest questionQueryRequest, HttpServletRequest request) { long current = questionQueryRequest.getCurrent(); long size = questionQueryRequest.getPageSize(); // 限制爬虫 ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR); Page<Question> questionPage = questionService.page(new Page<>(current, size), questionService.getQueryWrapper(questionQueryRequest)); return ResultUtils.success(questionService.getQuestionVOPage(questionPage, request)); } /** * 分页获取当前用户创建的资源列表 * * @param questionQueryRequest * @param request * @return */ @PostMapping("/my/list/page/vo") public BaseResponse<Page<QuestionVO>> listMyQuestionVOByPage(@RequestBody QuestionQueryRequest questionQueryRequest, HttpServletRequest request) { if (questionQueryRequest == null) { throw new BusinessException(ErrorCode.PARAMS_ERROR); } // User loginUser = userService.getLoginUser(request); // questionQueryRequest.setUserId(loginUser.getId()); long current = questionQueryRequest.getCurrent(); long size = questionQueryRequest.getPageSize(); // 限制爬虫 ThrowUtils.throwIf(size > 20, ErrorCode.PARAMS_ERROR); Page<Question> questionPage = questionService.page(new Page<>(current, size), questionService.getQueryWrapper(questionQueryRequest)); return ResultUtils.success(questionService.getQuestionVOPage(questionPage, request)); } /** * 分页获取题目列表(仅管理员) * * @param questionQueryRequest * @param request * @return */ @PostMapping("/list/page") public BaseResponse<Page<Question>> listQuestionByPage(@RequestBody QuestionQueryRequest questionQueryRequest, HttpServletRequest request) { long current = questionQueryRequest.getCurrent(); long size = questionQueryRequest.getPageSize(); Page<Question> questionPage = questionService.page(new Page<>(current, size), questionService.getQueryWrapper(questionQueryRequest)); return ResultUtils.success(questionPage); } // endregion /** * 编辑(用户) * * @param questionEditRequest * @param request * @return */ // @PostMapping("/edit") // public BaseResponse<Boolean> editQuestion(@RequestBody QuestionEditRequest questionEditRequest, HttpServletRequest request) { // if (questionEditRequest == null || questionEditRequest.getId() <= 0) { // throw new BusinessException(ErrorCode.PARAMS_ERROR); // } // Question question = new Question(); // BeanUtils.copyProperties(questionEditRequest, question); // List<String> tags = questionEditRequest.getTags(); // if (tags != null) { // question.setTags(GSON.toJson(tags)); // } // List<JudgeCase> judgeCase = questionEditRequest.getJudgeCase(); // if (judgeCase != null) { // question.setJudgeCase(GSON.toJson(judgeCase)); // } // JudgeConfig judgeConfig = questionEditRequest.getJudgeConfig(); // if (judgeConfig != null) { // question.setJudgeConfig(GSON.toJson(judgeConfig)); // } // // 参数校验 // questionService.validQuestion(question, false); //// User loginUser = userService.getLoginUser(request); //// long id = questionEditRequest.getId(); // // 判断是否存在 //// Question oldQuestion = questionService.getById(id); //// ThrowUtils.throwIf(oldQuestion == null, ErrorCode.NOT_FOUND_ERROR); // // 仅本人或管理员可编辑 //// if (!oldQuestion.getUserId().equals(loginUser.getId()) && !userService.isAdmin(loginUser)) { //// throw new BusinessException(ErrorCode.NO_AUTH_ERROR); //// } // boolean result = questionService.updateById(question); // return ResultUtils.success(result); // } }