package ru.oa2.lti.application.controller; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; import org.springframework.http.HttpStatusCode; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import ru.oa2.lti.application.service.history.HistoryService; import ru.oa2.lti.application.service.task.TaskService; import ru.oa2.lti.domain.model.ResultRequest; import ru.oa2.lti.domain.model.auth.LtiLogin; import ru.oa2.lti.domain.model.auth.Payload; import ru.oa2.lti.domain.model.results.ResultResponse; import ru.oa2.lti.domain.model.task.RequestUpdateTask; import ru.oa2.lti.domain.model.task.TaskData; import java.util.Objects; /* Контроллер работы с задачами(лабораторными работами) GET - возвращает контекст лабораторной работы POST - обновление/создание лабораторной работы (только для преподавателей/администраторов) POST /submit - отправка на автоматическую проверку */ @Controller @RequestMapping("/tool/lti/task") public class TaskController { private final TaskService taskService; private final HistoryService historyService; public TaskController(TaskService taskService, HistoryService historyService) { this.taskService = taskService; this.historyService = historyService; } @GetMapping public String showDockerTas(Model model, HttpServletRequest request) { var session = request.getSession(); var payload = (Payload) session.getAttribute("payload"); if (payload != null) { var data = taskService.getTask(payload.getContextId()); if (data == null) { historyService.logAction( payload.getDeploymentId(), payload.getContextId(), "TASK_ERROR", "Task not found" ); return "redirect:/error"; } model.addAttribute("name", data.getName()); model.addAttribute("description", data.getDescription()); // Логирование просмотра задачи historyService.logAction( payload.getDeploymentId(), payload.getContextId(), "TASK_VIEW", String.format("Task viewed: %s, isCoach=%s", data.getName(), payload.getCoach()) ); if (Objects.requireNonNull(payload).getCoach()) { model.addAttribute("initScript", data.getInitScript()); model.addAttribute("checkScript", data.getVerificationScript()); model.addAttribute("deleteScript", data.getDeleteScript()); return "task-editor"; } } return "task"; } @PostMapping public ResponseEntity updateTask(@RequestBody TaskData data, HttpServletRequest request) { var session = request.getSession(); var payload = (Payload) session.getAttribute("payload"); if (payload != null && payload.getCoach()) { // Логирование обновления задачи historyService.logAction( payload.getDeploymentId(), payload.getContextId(), "TASK_UPDATE", String.format("Task updated by coach: %s", data.getName()) ); return ResponseEntity.accepted().body( taskService.saveTask(RequestUpdateTask.builder() .contextId(payload.getContextId()) .data(data) .build()) ); } // Логирование попытки несанкционированного обновления if (payload != null) { historyService.logAction( payload.getDeploymentId(), payload.getContextId(), "TASK_UPDATE_DENIED", "Unauthorized task update attempt" ); } return ResponseEntity.status(HttpStatusCode.valueOf(403)) .body(new ResultResponse("forbidden")); } @PostMapping("/submit") public ResponseEntity result(HttpServletRequest req) { HttpSession session = req.getSession(false); if (session == null) return ResponseEntity.status(401).build(); var ltiLogin = (LtiLogin) session.getAttribute("lti_login"); var idToken = (String) session.getAttribute("id_token"); var payload = (Payload) session.getAttribute("payload"); // Логирование отправки задачи на проверку if (payload != null) { historyService.logAction( payload.getDeploymentId(), payload.getContextId(), "TASK_SUBMIT", String.format("Task submitted for checking, clientId=%s", ltiLogin.getClientId()) ); } return ResponseEntity .accepted() .body(taskService.checkTask(new ResultRequest(ltiLogin.getClientId(), idToken))); } }