ProblemController.java 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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.Parameter;
  5. import io.swagger.v3.oas.annotations.media.Content;
  6. import io.swagger.v3.oas.annotations.media.Schema;
  7. import io.swagger.v3.oas.annotations.responses.ApiResponse;
  8. import io.swagger.v3.oas.annotations.responses.ApiResponses;
  9. import io.swagger.v3.oas.annotations.security.SecurityRequirement;
  10. import io.swagger.v3.oas.annotations.tags.Tag;
  11. import jakarta.annotation.Resource;
  12. import jakarta.validation.Valid;
  13. import jakarta.validation.constraints.NotEmpty;
  14. import jakarta.validation.constraints.NotNull;
  15. import org.springframework.security.access.prepost.PreAuthorize;
  16. import org.springframework.web.bind.annotation.*;
  17. import space.anyi.serve.entity.PageVo;
  18. import space.anyi.serve.entity.Response;
  19. import space.anyi.serve.entity.problem.*;
  20. import space.anyi.serve.entity.user.User;
  21. import space.anyi.serve.service.ProblemService;
  22. import space.anyi.serve.util.SecurityUtils;
  23. import java.util.List;
  24. @Tag(name = "ProblemController", description = "题目相关接口")
  25. @ApiResponses(value = {
  26. @ApiResponse(responseCode = "200", description = "成功", useReturnTypeSchema = true),
  27. @ApiResponse(responseCode = "400", description = "参数校验失败,返回体 code=400",
  28. content = @Content(schema = @Schema(implementation = Response.class))),
  29. @ApiResponse(responseCode = "401", description = "未认证或认证已过期",
  30. content = @Content(schema = @Schema(implementation = Response.class))),
  31. @ApiResponse(responseCode = "403", description = "无权限访问",
  32. content = @Content(schema = @Schema(implementation = Response.class)))
  33. })
  34. @RestController
  35. @RequestMapping("problem")
  36. public class ProblemController {
  37. @Resource
  38. private ProblemService problemService;
  39. @Operation(summary = "分页查询题目列表")
  40. @GetMapping
  41. public Response<PageVo<List<ProblemVo>>> queryByPage(
  42. @Parameter(description = "题目标题,模糊查询")
  43. @RequestParam(defaultValue = "") String title,
  44. @Parameter(description = "难度:easy-简单,medium-中等,hard-困难")
  45. @RequestParam(defaultValue = "") String difficulty,
  46. @Parameter(description = "分类ID")
  47. @RequestParam(required = false) Long categoryId,
  48. @Parameter(description = "是否公开:1-公开,0-未公开")
  49. @RequestParam(required = false) Integer isPublic,
  50. @Parameter(description = "页码")
  51. @NotNull(message = "页码不能为null") @RequestParam(defaultValue = "1") Integer pageNum,
  52. @Parameter(description = "分页大小")
  53. @NotNull(message = "分页大小不能为null") @RequestParam(defaultValue = "10") Integer pageSize) {
  54. boolean onlyPublic = SecurityUtils.isAnonymous();
  55. Page<Problem> page = Page.of(pageNum, pageSize);
  56. Page<ProblemVo> result = problemService.queryByPage(title, difficulty, categoryId, isPublic, onlyPublic, page);
  57. return Response.ok(new PageVo<>(result.getTotal(), result.getRecords()));
  58. }
  59. @Operation(summary = "查询题目详情")
  60. @GetMapping("{id}")
  61. public Response<ProblemDetailVo> getDetail(@Parameter(description = "题目ID") @PathVariable Long id) {
  62. ProblemDetailVo detail = problemService.getDetail(id);
  63. String role = SecurityUtils.getCurrentRole();
  64. boolean staff = User.ROLE_COACH.equals(role) || User.ROLE_ADMIN.equals(role);
  65. if (detail.getIsPublic() != null && detail.getIsPublic() == Problem.IS_PUBLIC_NO && !staff) {
  66. return Response.error("无权限查看该题目");
  67. }
  68. return Response.ok(detail);
  69. }
  70. @Operation(summary = "新增题目", security = @SecurityRequirement(name = "openApiSecurityScheme"))
  71. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  72. @PostMapping
  73. public Response<Boolean> add(@Valid @RequestBody ProblemDto dto) {
  74. return Response.ok(problemService.insert(dto, SecurityUtils.getCurrentUserId()));
  75. }
  76. @Operation(summary = "修改题目", security = @SecurityRequirement(name = "openApiSecurityScheme"))
  77. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  78. @PutMapping
  79. public Response<Boolean> edit(@Valid @RequestBody ProblemDto dto) {
  80. return Response.ok(problemService.update(dto));
  81. }
  82. @Operation(summary = "批量删除题目", security = @SecurityRequirement(name = "openApiSecurityScheme"))
  83. @PreAuthorize("hasRole('ROLE_admin')")
  84. @DeleteMapping
  85. public Response<Boolean> deleteByIds(@Parameter(description = "题目ID列表") @NotEmpty(message = "ID列表不能为空") @RequestParam List<Long> ids) {
  86. return Response.ok(problemService.deleteByIds(ids));
  87. }
  88. @Operation(summary = "新增题目样例", security = @SecurityRequirement(name = "openApiSecurityScheme"))
  89. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  90. @PostMapping("{id}/case")
  91. public Response<Boolean> addCase(@Parameter(description = "题目ID") @PathVariable Long id, @Valid @RequestBody ProblemCaseDto dto) {
  92. dto.setProblemId(id);
  93. return Response.ok(problemService.addCase(dto));
  94. }
  95. @Operation(summary = "修改题目样例", security = @SecurityRequirement(name = "openApiSecurityScheme"))
  96. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  97. @PutMapping("case")
  98. public Response<Boolean> updateCase(@Valid @RequestBody ProblemCaseDto dto) {
  99. return Response.ok(problemService.updateCase(dto));
  100. }
  101. @Operation(summary = "删除题目样例", security = @SecurityRequirement(name = "openApiSecurityScheme"))
  102. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  103. @DeleteMapping("case")
  104. public Response<Boolean> deleteCase(@Parameter(description = "样例ID") @NotNull(message = "样例ID不能为空") @RequestParam Long id) {
  105. return Response.ok(problemService.deleteCase(id));
  106. }
  107. @Operation(summary = "新增题目评测用例", security = @SecurityRequirement(name = "openApiSecurityScheme"))
  108. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  109. @PostMapping("{id}/test")
  110. public Response<Boolean> addTest(@Parameter(description = "题目ID") @PathVariable Long id, @Valid @RequestBody ProblemTestDto dto) {
  111. dto.setProblemId(id);
  112. return Response.ok(problemService.addTest(dto));
  113. }
  114. @Operation(summary = "修改题目评测用例", security = @SecurityRequirement(name = "openApiSecurityScheme"))
  115. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  116. @PutMapping("test")
  117. public Response<Boolean> updateTest(@Valid @RequestBody ProblemTestDto dto) {
  118. return Response.ok(problemService.updateTest(dto));
  119. }
  120. @Operation(summary = "删除题目评测用例", security = @SecurityRequirement(name = "openApiSecurityScheme"))
  121. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  122. @DeleteMapping("test")
  123. public Response<Boolean> deleteTest(@Parameter(description = "评测用例ID") @NotNull(message = "评测用例ID不能为空") @RequestParam Long id) {
  124. return Response.ok(problemService.deleteTest(id));
  125. }
  126. @Operation(summary = "查询题目评测用例列表", security = @SecurityRequirement(name = "openApiSecurityScheme"))
  127. @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')")
  128. @GetMapping("{id}/test")
  129. public Response<List<ProblemTestVo>> queryTests(@Parameter(description = "题目ID") @PathVariable Long id) {
  130. return Response.ok(problemService.queryTests(id));
  131. }
  132. }