/
setwind
/
olympiad
Обзор
Документация
Войти
/
setwind
/
olympiad
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/main/java/com/cfuv/olympus/controller/UserController.java
117 строк
6 KB
InfinityExistence
unzip files
23 апр 2025, 16:35
23 апр 2025, 16:35
43f4eef
Код
Авторство
О чём код?
package com.cfuv.olympus.controller; import com.cfuv.olympus.entity.domain.contest.Contest; import com.cfuv.olympus.entity.dto.auth.UserInfoResponse; import com.cfuv.olympus.entity.dto.contest.table.JudgeTableResponse; import com.cfuv.olympus.entity.dto.contest.table.ResultTableResponse; import com.cfuv.olympus.entity.dto.task.get.GetUserTasksForProblemRequest; import com.cfuv.olympus.entity.dto.task.upload.UploadFileRequest; import com.cfuv.olympus.entity.dto.user.info.UserInfoRequest; import com.cfuv.olympus.service.*; import com.cfuv.olympus.service.contest.checker.aspect.CheckContestState; import com.cfuv.olympus.web.security.UserSession; 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.tags.Tag; import jakarta.validation.Valid; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import org.springdoc.api.ErrorMessage; import org.springframework.http.MediaType; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.List; @Tag(name = "User controller", description = "User management ") @RestController @RequestMapping("/api/v1/users") @RequiredArgsConstructor @Validated public class UserController { private final ContestService contestService; private final TaskService taskService; private final UserService userService; private final UserTaskService userTaskService; private final FileService fileService; @CheckContestState @Operation(summary = "Set user info", description = "Returns the participant with his specified first name, last name and email") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Successfully retrieved"), @ApiResponse(responseCode = "404", description = "Bad request - User does not exist", content = @Content(schema = @Schema(implementation = ErrorMessage.class))) }) @PostMapping("/welcome") public UserInfoResponse welcome(@Valid @RequestBody UserInfoRequest userInfoRequest, @AuthenticationPrincipal UserSession user) { return userService.changeUserInfo(userInfoRequest, user.getUsername()); } @CheckContestState @Operation(summary = "Get started contest", description = "Returns a started contest for participant") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Successfully retrieved"), @ApiResponse(responseCode = "504", description = "Gateway timeout - Contest not started", content = @Content(schema = @Schema(implementation = ErrorMessage.class))) }) @GetMapping("/contest") public Contest getContestByUser(@AuthenticationPrincipal UserSession user) { return contestService.getContestOptionalById(user.getContestId()); } @CheckContestState @Operation(summary = "Upload file", description = "Upload and return participant answer files") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Successfully retrieved"), @ApiResponse(responseCode = "422", description = "IOException - Failed to upload file", content = @Content(schema = @Schema(implementation = ErrorMessage.class))) }) @PostMapping(value = "/contest/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public void uploadFile(@AuthenticationPrincipal UserSession user, @Parameter(description = "Номер задания") @RequestParam("taskNumber") @Min(value = 0, message = "taskNumber must be at least 0") Long taskNumber, @Parameter(description = "Файл ответа участника") @RequestParam("file") MultipartFile file, @Parameter(description = "Имя файла ответа участника", example = "index.js") @RequestParam("fileName") @NotBlank(message = "fileName cannot be blank") String fileName ) { UploadFileRequest uploadFileRequest = new UploadFileRequest(); uploadFileRequest.setContestId(user.getContestId()); uploadFileRequest.setUserId(user.getId()); uploadFileRequest.setTaskNumber(taskNumber); uploadFileRequest.setFile(file); uploadFileRequest.setFileName(fileName); fileService.uploadUserTask(uploadFileRequest); } @CheckContestState @Operation(summary = "Get all problems by userId and taskNumber", description = "Returns all participant problems by his userId and taskNumber") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Successfully retrieved") }) @PostMapping("/contest/answers") public List<JudgeTableResponse> getAllTasks(@Valid @RequestBody GetUserTasksForProblemRequest getUserTasksForProblemRequest, @AuthenticationPrincipal UserSession user) { return userTaskService.getUserTaskInCurrentProblem(getUserTasksForProblemRequest.getTaskNumber(), user.getId()); } @Operation(summary = "Get contest user tasks table", description = "Returns a contest user tasks table for user") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Successfully retrieved") }) @PostMapping("/contest/user-problems/result") public ResultTableResponse getContestResultTableByUser(@AuthenticationPrincipal UserSession user) { return taskService.getResultTableResponseNotAdmin(user.getContestId()); } }