From 6e7bf47814949e377e566b102bf6ef1e52886fa2 Mon Sep 17 00:00:00 2001 From: Anton Dzyk Date: Wed, 7 Jan 2026 16:05:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TaskController.java | 40 +++++-- .../repository/entities/Task.java | 2 + .../application/service/task/TaskService.java | 6 +- .../service/task/TaskServiceImpl.java | 39 +++++-- .../domain/model/task/RequestUpdateTask.java | 13 +++ .../oa2/lti/domain/model/task/TaskData.java | 6 +- src/main/resources/static/tool/lti/js/edit.js | 50 +++++++++ src/main/resources/templates/page-403.html | 105 ++++++++++++++++++ src/main/resources/templates/task-editor.html | 85 ++++---------- 9 files changed, 259 insertions(+), 87 deletions(-) create mode 100644 src/main/java/ru/oa2/lti/domain/model/task/RequestUpdateTask.java create mode 100644 src/main/resources/static/tool/lti/js/edit.js create mode 100644 src/main/resources/templates/page-403.html diff --git a/src/main/java/ru/oa2/lti/application/controller/TaskController.java b/src/main/java/ru/oa2/lti/application/controller/TaskController.java index 0d58e5f..1210187 100644 --- a/src/main/java/ru/oa2/lti/application/controller/TaskController.java +++ b/src/main/java/ru/oa2/lti/application/controller/TaskController.java @@ -2,16 +2,21 @@ 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.domain.model.auth.Payload; import ru.oa2.lti.application.service.task.TaskService; -import ru.oa2.lti.domain.model.auth.LtiLogin; 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; @@ -47,21 +52,36 @@ public class TaskController { return "redirect:/error"; } - model.addAttribute("description", data); + model.addAttribute("description", data.getDescription()); + + if (Objects.requireNonNull(payload).getCoach()) { + model.addAttribute("initScript", data.getInitScript()); + model.addAttribute("checkScript", data.getVerificationScript()); + + return "task-editor"; + } } - if (Objects.requireNonNull(payload).getCoach()) { - return "task-editor"; - } return "task"; } @PostMapping - public ResponseEntity updateTask() { + public ResponseEntity updateTask(@RequestBody TaskData data, + HttpServletRequest request) { - //TODO exception - taskService.saveTask("TODO", "TODO", "TODO"); - return ResponseEntity.accepted().build(); + var session = request.getSession(); + var payload = (Payload) session.getAttribute("payload"); + + if (payload != null && payload.getCoach()) { + return ResponseEntity.accepted().body( + taskService.saveTask(RequestUpdateTask.builder() + .contextId(payload.getContextId()) + .data(data) + .build()) + ); + } + return ResponseEntity.status(HttpStatusCode.valueOf(403)) + .body(new ResultResponse("forbidden")); } @PostMapping("/submit") diff --git a/src/main/java/ru/oa2/lti/application/infrastructure/repository/entities/Task.java b/src/main/java/ru/oa2/lti/application/infrastructure/repository/entities/Task.java index 6374471..377d1ce 100644 --- a/src/main/java/ru/oa2/lti/application/infrastructure/repository/entities/Task.java +++ b/src/main/java/ru/oa2/lti/application/infrastructure/repository/entities/Task.java @@ -2,12 +2,14 @@ package ru.oa2.lti.application.infrastructure.repository.entities; import jakarta.persistence.*; import lombok.Getter; +import lombok.Setter; import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; import ru.oa2.lti.domain.model.task.TaskData; import ru.oa2.lti.domain.model.task.TaskType; @Getter +@Setter @Entity @Table(name = "task") public class Task { diff --git a/src/main/java/ru/oa2/lti/application/service/task/TaskService.java b/src/main/java/ru/oa2/lti/application/service/task/TaskService.java index d4740df..3581801 100644 --- a/src/main/java/ru/oa2/lti/application/service/task/TaskService.java +++ b/src/main/java/ru/oa2/lti/application/service/task/TaskService.java @@ -2,6 +2,8 @@ package ru.oa2.lti.application.service.task; import ru.oa2.lti.domain.model.ResultRequest; 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.UUID; @@ -10,7 +12,7 @@ public interface TaskService { /* Получение задачи (контекста лабораторной работы) */ - String getTask(UUID contextId); + TaskData getTask(UUID contextId); /* Запуск проверки через скрипт @@ -20,5 +22,5 @@ public interface TaskService { /* Сохранение/обновление task-а */ - void saveTask(String initScript, String checkScript, String description); + ResultResponse saveTask(RequestUpdateTask requestDataTask); } diff --git a/src/main/java/ru/oa2/lti/application/service/task/TaskServiceImpl.java b/src/main/java/ru/oa2/lti/application/service/task/TaskServiceImpl.java index badd0a4..245cbc0 100644 --- a/src/main/java/ru/oa2/lti/application/service/task/TaskServiceImpl.java +++ b/src/main/java/ru/oa2/lti/application/service/task/TaskServiceImpl.java @@ -1,20 +1,25 @@ package ru.oa2.lti.application.service.task; +import jakarta.transaction.Transactional; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import ru.oa2.lti.application.infrastructure.lms.LMSService; -import ru.oa2.lti.application.infrastructure.runner.Runner; -import ru.oa2.lti.application.service.results.ResultService; -import ru.oa2.lti.domain.model.ResultRequest; -import ru.oa2.lti.domain.model.task.TaskData; import ru.oa2.lti.application.infrastructure.repository.LMSContentRepository; import ru.oa2.lti.application.infrastructure.repository.entities.LMSContent; import ru.oa2.lti.application.infrastructure.repository.entities.Task; +import ru.oa2.lti.application.infrastructure.runner.Runner; +import ru.oa2.lti.application.service.results.ResultService; +import ru.oa2.lti.domain.model.ResultRequest; 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.Collection; import java.util.UUID; +@Slf4j @Service +@Transactional(rollbackOn = Throwable.class) public class TaskServiceImpl implements TaskService { private final LMSContentRepository lmsContentRepository; @@ -36,7 +41,7 @@ public class TaskServiceImpl implements TaskService { } @Override - public String getTask(UUID contextId) { + public TaskData getTask(UUID contextId) { var content = lmsContentRepository.getLMSContentByContentId(contextId); if(content.isPresent()) { @@ -48,12 +53,12 @@ public class TaskServiceImpl implements TaskService { //TODO string -> exception? if (!runner.run(contextId, data.getInitScript())) { - return "Init script FAILED"; + return new TaskData("Init script FAILED", "", ""); } - return data.getDescription(); + return data; } else { - return "Not Page"; + return new TaskData("Not Page", "", ""); } } @@ -70,7 +75,21 @@ public class TaskServiceImpl implements TaskService { } @Override - public void saveTask(String initScript, String checkScript, String description) { - //TODO + public ResultResponse saveTask(RequestUpdateTask requestUpdateTask) { + + log.info("save"); + var result = lmsContentRepository.getLMSContentByContentId(requestUpdateTask.getContextId()); + + //TODO доработать версионирование task-ов + if (result.isPresent()) { + var content = result.get(); + var tasks = content.getTasks(); + var currentTask = tasks.stream().findFirst(); + currentTask.ifPresent(task -> task.setData(requestUpdateTask.getData())); + lmsContentRepository.save(content); + } + + //TODO обработка exception - failed / success + return new ResultResponse("success"); } } diff --git a/src/main/java/ru/oa2/lti/domain/model/task/RequestUpdateTask.java b/src/main/java/ru/oa2/lti/domain/model/task/RequestUpdateTask.java new file mode 100644 index 0000000..c166175 --- /dev/null +++ b/src/main/java/ru/oa2/lti/domain/model/task/RequestUpdateTask.java @@ -0,0 +1,13 @@ +package ru.oa2.lti.domain.model.task; + +import lombok.Builder; +import lombok.Data; + +import java.util.UUID; + +@Data +@Builder +public class RequestUpdateTask { + UUID contextId; + TaskData data; +} diff --git a/src/main/java/ru/oa2/lti/domain/model/task/TaskData.java b/src/main/java/ru/oa2/lti/domain/model/task/TaskData.java index fc7f59d..7135db9 100644 --- a/src/main/java/ru/oa2/lti/domain/model/task/TaskData.java +++ b/src/main/java/ru/oa2/lti/domain/model/task/TaskData.java @@ -1,10 +1,14 @@ package ru.oa2.lti.domain.model.task; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; @Data +@NoArgsConstructor +@AllArgsConstructor public class TaskData { - String initScript; String description; + String initScript; String verificationScript; } diff --git a/src/main/resources/static/tool/lti/js/edit.js b/src/main/resources/static/tool/lti/js/edit.js new file mode 100644 index 0000000..672d619 --- /dev/null +++ b/src/main/resources/static/tool/lti/js/edit.js @@ -0,0 +1,50 @@ +document.getElementById('saveBtn').addEventListener('click', async () => { + + const description = document.getElementById('description').value; + const initScript = document.getElementById('initScript').value; + const verificationScript = document.getElementById('checkScript').value; + + const payload = { + description, + initScript, + verificationScript + }; + + try { + const response = await fetch('/tool/lti/task', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(payload) + }); + + const result = await response.json(); + + const statusContainer = document.getElementById('statusContainer'); + const statusIcon = document.getElementById('icon'); + const statusLabel = document.getElementById('statusLabel'); + + if (response.ok) { + statusIcon.className = 'fa-solid fa-check-circle'; + statusIcon.classList.add('status-success'); + statusLabel.textContent = 'Задача успешно сохранена'; + statusContainer.style.display = 'flex'; + statusContainer.classList.remove('status-failed'); + statusContainer.classList.add('status-success'); + } else { + throw new Error(result.message || 'Ошибка сохранения'); + } + } catch (error) { + const statusContainer = document.getElementById('statusContainer'); + const statusIcon = document.getElementById('icon'); + const statusLabel = document.getElementById('statusLabel'); + + statusIcon.className = 'fa-solid fa-times-circle'; + statusIcon.classList.add('status-failed'); + statusLabel.textContent = 'Ошибка: ' + error.message; + statusContainer.style.display = 'flex'; + statusContainer.classList.remove('status-success'); + statusContainer.classList.add('status-failed'); + } +}); \ No newline at end of file diff --git a/src/main/resources/templates/page-403.html b/src/main/resources/templates/page-403.html new file mode 100644 index 0000000..6916e61 --- /dev/null +++ b/src/main/resources/templates/page-403.html @@ -0,0 +1,105 @@ + + + + + + Доступ запрещён — 403 + + + + + + + + +
+ +
+ +
+ + +
403
+ + +
Доступ запрещён
+ + +

+ У вас нет прав для просмотра этой страницы. + Пожалуйста, обратитесь к администратору, если считаете, что это ошибка. +

+ + + + Вернуться назад + +
+ + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/task-editor.html b/src/main/resources/templates/task-editor.html index cfd6cde..0e74d8e 100644 --- a/src/main/resources/templates/task-editor.html +++ b/src/main/resources/templates/task-editor.html @@ -3,7 +3,7 @@ - Редактор задачи LTI + Редактор задачи LTI #TODO подтягивать name? @@ -115,19 +115,28 @@
- +
- - + +
- - + +
@@ -148,69 +157,17 @@ Сохранить задачу +
+ +
- - - - - - + \ No newline at end of file