package space.anyi.serve.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import space.anyi.serve.entity.PageVo; import space.anyi.serve.entity.Response; import space.anyi.serve.entity.problem.*; import space.anyi.serve.entity.user.User; import space.anyi.serve.service.ProblemService; import space.anyi.serve.util.SecurityUtils; import java.util.List; @Tag(name = "ProblemController", description = "题目相关接口") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "成功", useReturnTypeSchema = true), @ApiResponse(responseCode = "400", description = "参数校验失败,返回体 code=400", content = @Content(schema = @Schema(implementation = Response.class))), @ApiResponse(responseCode = "401", description = "未认证或认证已过期", content = @Content(schema = @Schema(implementation = Response.class))), @ApiResponse(responseCode = "403", description = "无权限访问", content = @Content(schema = @Schema(implementation = Response.class))) }) @RestController @RequestMapping("problem") public class ProblemController { @Resource private ProblemService problemService; @Operation(summary = "分页查询题目列表") @GetMapping public Response>> queryByPage( @Parameter(description = "题目标题,模糊查询") @RequestParam(defaultValue = "") String title, @Parameter(description = "难度:easy-简单,medium-中等,hard-困难") @RequestParam(defaultValue = "") String difficulty, @Parameter(description = "分类ID") @RequestParam(required = false) Long categoryId, @Parameter(description = "是否公开:1-公开,0-未公开") @RequestParam(required = false) Integer isPublic, @Parameter(description = "页码") @NotNull(message = "页码不能为null") @RequestParam(defaultValue = "1") Integer pageNum, @Parameter(description = "分页大小") @NotNull(message = "分页大小不能为null") @RequestParam(defaultValue = "10") Integer pageSize) { boolean onlyPublic = SecurityUtils.isAnonymous(); Page page = Page.of(pageNum, pageSize); Page result = problemService.queryByPage(title, difficulty, categoryId, isPublic, onlyPublic, page); return Response.ok(new PageVo<>(result.getTotal(), result.getRecords())); } @Operation(summary = "查询题目详情") @GetMapping("{id}") public Response getDetail(@Parameter(description = "题目ID") @PathVariable Long id) { ProblemDetailVo detail = problemService.getDetail(id); String role = SecurityUtils.getCurrentRole(); boolean staff = User.ROLE_COACH.equals(role) || User.ROLE_ADMIN.equals(role); if (detail.getIsPublic() != null && detail.getIsPublic() == Problem.IS_PUBLIC_NO && !staff) { return Response.error("无权限查看该题目"); } return Response.ok(detail); } @Operation(summary = "新增题目", security = @SecurityRequirement(name = "openApiSecurityScheme")) @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')") @PostMapping public Response add(@Valid @RequestBody ProblemDto dto) { return Response.ok(problemService.insert(dto, SecurityUtils.getCurrentUserId())); } @Operation(summary = "修改题目", security = @SecurityRequirement(name = "openApiSecurityScheme")) @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')") @PutMapping public Response edit(@Valid @RequestBody ProblemDto dto) { return Response.ok(problemService.update(dto)); } @Operation(summary = "批量删除题目", security = @SecurityRequirement(name = "openApiSecurityScheme")) @PreAuthorize("hasRole('ROLE_admin')") @DeleteMapping public Response deleteByIds(@Parameter(description = "题目ID列表") @NotEmpty(message = "ID列表不能为空") @RequestParam List ids) { return Response.ok(problemService.deleteByIds(ids)); } @Operation(summary = "新增题目样例", security = @SecurityRequirement(name = "openApiSecurityScheme")) @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')") @PostMapping("{id}/case") public Response addCase(@Parameter(description = "题目ID") @PathVariable Long id, @Valid @RequestBody ProblemCaseDto dto) { dto.setProblemId(id); return Response.ok(problemService.addCase(dto)); } @Operation(summary = "修改题目样例", security = @SecurityRequirement(name = "openApiSecurityScheme")) @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')") @PutMapping("case") public Response updateCase(@Valid @RequestBody ProblemCaseDto dto) { return Response.ok(problemService.updateCase(dto)); } @Operation(summary = "删除题目样例", security = @SecurityRequirement(name = "openApiSecurityScheme")) @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')") @DeleteMapping("case") public Response deleteCase(@Parameter(description = "样例ID") @NotNull(message = "样例ID不能为空") @RequestParam Long id) { return Response.ok(problemService.deleteCase(id)); } @Operation(summary = "新增题目评测用例", security = @SecurityRequirement(name = "openApiSecurityScheme")) @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')") @PostMapping("{id}/test") public Response addTest(@Parameter(description = "题目ID") @PathVariable Long id, @Valid @RequestBody ProblemTestDto dto) { dto.setProblemId(id); return Response.ok(problemService.addTest(dto)); } @Operation(summary = "修改题目评测用例", security = @SecurityRequirement(name = "openApiSecurityScheme")) @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')") @PutMapping("test") public Response updateTest(@Valid @RequestBody ProblemTestDto dto) { return Response.ok(problemService.updateTest(dto)); } @Operation(summary = "删除题目评测用例", security = @SecurityRequirement(name = "openApiSecurityScheme")) @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')") @DeleteMapping("test") public Response deleteTest(@Parameter(description = "评测用例ID") @NotNull(message = "评测用例ID不能为空") @RequestParam Long id) { return Response.ok(problemService.deleteTest(id)); } @Operation(summary = "查询题目评测用例列表", security = @SecurityRequirement(name = "openApiSecurityScheme")) @PreAuthorize("hasAnyRole('ROLE_coach', 'ROLE_admin')") @GetMapping("{id}/test") public Response> queryTests(@Parameter(description = "题目ID") @PathVariable Long id) { return Response.ok(problemService.queryTests(id)); } }