ProblemController.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package space.anyi.serve.controller;
  2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  3. import io.swagger.v3.oas.annotations.Operation;
  4. import io.swagger.v3.oas.annotations.tags.Tag;
  5. import jakarta.annotation.Resource;
  6. import jakarta.validation.Valid;
  7. import jakarta.validation.constraints.NotEmpty;
  8. import jakarta.validation.constraints.NotNull;
  9. import org.springframework.security.access.prepost.PreAuthorize;
  10. import org.springframework.web.bind.annotation.*;
  11. import space.anyi.serve.entity.PageVo;
  12. import space.anyi.serve.entity.Response;
  13. import space.anyi.serve.entity.problem.*;
  14. import space.anyi.serve.service.ProblemService;
  15. import space.anyi.serve.util.SecurityUtils;
  16. import java.util.List;
  17. @Tag(name = "ProblemController", description = "题目相关接口")
  18. @RestController
  19. @RequestMapping("problem")
  20. public class ProblemController {
  21. @Resource
  22. private ProblemService problemService;
  23. @Operation(summary = "分页查询题目列表")
  24. @GetMapping
  25. public Response<PageVo<List<ProblemVo>>> queryByPage(
  26. @RequestParam(defaultValue = "") String title,
  27. @RequestParam(defaultValue = "") String difficulty,
  28. @RequestParam(required = false) Long categoryId,
  29. @RequestParam(required = false) Integer isPublic,
  30. @NotNull(message = "页码不能为null") @RequestParam(defaultValue = "1") Integer pageNum,
  31. @NotNull(message = "分页大小不能为null") @RequestParam(defaultValue = "10") Integer pageSize) {
  32. boolean onlyPublic = SecurityUtils.isAnonymous();
  33. Page<Problem> page = Page.of(pageNum, pageSize);
  34. Page<ProblemVo> result = problemService.queryByPage(title, difficulty, categoryId, isPublic, onlyPublic, page);
  35. return Response.ok(new PageVo<>(result.getTotal(), result.getRecords()));
  36. }
  37. @Operation(summary = "查询题目详情")
  38. @GetMapping("{id}")
  39. public Response<ProblemDetailVo> getDetail(@PathVariable Long id) {
  40. ProblemDetailVo detail = problemService.getDetail(id);
  41. String role = SecurityUtils.getCurrentRole();
  42. boolean staff = "coach".equals(role) || "admin".equals(role);
  43. if (detail.getIsPublic() != null && detail.getIsPublic() == 0 && !staff) {
  44. return Response.error("无权限查看该题目");
  45. }
  46. return Response.ok(detail);
  47. }
  48. @Operation(summary = "新增题目")
  49. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  50. @PostMapping
  51. public Response<Boolean> add(@Valid @RequestBody ProblemDto dto) {
  52. return Response.ok(problemService.insert(dto, SecurityUtils.getCurrentUserId()));
  53. }
  54. @Operation(summary = "修改题目")
  55. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  56. @PutMapping
  57. public Response<Boolean> edit(@Valid @RequestBody ProblemDto dto) {
  58. return Response.ok(problemService.update(dto));
  59. }
  60. @Operation(summary = "批量删除题目")
  61. @PreAuthorize("hasRole('ROLE_admin')")
  62. @DeleteMapping
  63. public Response<Boolean> deleteByIds(@NotEmpty(message = "ID列表不能为空") @RequestParam List<Long> ids) {
  64. return Response.ok(problemService.deleteByIds(ids));
  65. }
  66. @Operation(summary = "新增题目样例")
  67. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  68. @PostMapping("{id}/case")
  69. public Response<Boolean> addCase(@PathVariable Long id, @Valid @RequestBody ProblemCaseDto dto) {
  70. dto.setProblemId(id);
  71. return Response.ok(problemService.addCase(dto));
  72. }
  73. @Operation(summary = "修改题目样例")
  74. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  75. @PutMapping("case")
  76. public Response<Boolean> updateCase(@Valid @RequestBody ProblemCaseDto dto) {
  77. return Response.ok(problemService.updateCase(dto));
  78. }
  79. @Operation(summary = "删除题目样例")
  80. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  81. @DeleteMapping("case")
  82. public Response<Boolean> deleteCase(@NotNull(message = "样例ID不能为空") @RequestParam Long id) {
  83. return Response.ok(problemService.deleteCase(id));
  84. }
  85. @Operation(summary = "新增题目评测用例")
  86. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  87. @PostMapping("{id}/test")
  88. public Response<Boolean> addTest(@PathVariable Long id, @Valid @RequestBody ProblemTestDto dto) {
  89. dto.setProblemId(id);
  90. return Response.ok(problemService.addTest(dto));
  91. }
  92. @Operation(summary = "修改题目评测用例")
  93. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  94. @PutMapping("test")
  95. public Response<Boolean> updateTest(@Valid @RequestBody ProblemTestDto dto) {
  96. return Response.ok(problemService.updateTest(dto));
  97. }
  98. @Operation(summary = "删除题目评测用例")
  99. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  100. @DeleteMapping("test")
  101. public Response<Boolean> deleteTest(@NotNull(message = "评测用例ID不能为空") @RequestParam Long id) {
  102. return Response.ok(problemService.deleteTest(id));
  103. }
  104. @Operation(summary = "查询题目评测用例列表")
  105. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  106. @GetMapping("{id}/test")
  107. public Response<List<ProblemTestVo>> queryTests(@PathVariable Long id) {
  108. return Response.ok(problemService.queryTests(id));
  109. }
  110. }