diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/ArchiveAssignmentUseCase.java b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/ArchiveAssignmentUseCase.java new file mode 100644 index 0000000..05a7f91 --- /dev/null +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/ArchiveAssignmentUseCase.java @@ -0,0 +1,32 @@ +package fr.univ_lille.gitlab.classrooms.assignments; + +import fr.univ_lille.gitlab.classrooms.gitlab.GitLabException; +import fr.univ_lille.gitlab.classrooms.gitlab.Gitlab; +import org.springframework.stereotype.Component; + +@Component +public class ArchiveAssignmentUseCase { + + private final StudentAssignmentRepository studentAssignmentRepository; + + private final Gitlab gitlab; + + ArchiveAssignmentUseCase(StudentAssignmentRepository studentAssignmentRepository, Gitlab gitlab) { + this.studentAssignmentRepository = studentAssignmentRepository; + this.gitlab = gitlab; + } + + public void archive(Assignment assignment){ + var studentAssignments = this.studentAssignmentRepository.findAllByAssignment(assignment); + studentAssignments.stream() + .map(it -> (StudentExerciseAssignment)it) + .forEach(studentExerciseAssignment -> { + try { + this.gitlab.archiveProject(studentExerciseAssignment); + } catch (GitLabException e) { + System.out.println(e.getMessage()); + } + }); + } + +} diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/ArchiveRestController.java b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/ArchiveRestController.java new file mode 100644 index 0000000..2f83d2c --- /dev/null +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/ArchiveRestController.java @@ -0,0 +1,33 @@ +package fr.univ_lille.gitlab.classrooms.assignments; + +import jakarta.annotation.security.RolesAllowed; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.server.ResponseStatusException; + +import java.util.UUID; + +@Controller +@RolesAllowed("TEACHER") +public class ArchiveRestController { + + private AssignmentService assignmentService; + + private ArchiveAssignmentUseCase archiveAssignmentUseCase; + + public ArchiveRestController(AssignmentService assignmentService, ArchiveAssignmentUseCase archiveAssignmentUseCase) { + this.assignmentService = assignmentService; + this.archiveAssignmentUseCase = archiveAssignmentUseCase; + } + + @GetMapping("/assignments/{assignmentId}/archive") + String archiveAssignment(@PathVariable UUID assignmentId, Model model) { + var assignment = this.assignmentService.getAssignment(assignmentId).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); + this.archiveAssignmentUseCase.archive(assignment); + + return "redirect:/classrooms/" + assignment.getClassroom().getId(); + } +} diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/Assignment.java b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/Assignment.java index 34d7d0a..88d3c9a 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/Assignment.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/Assignment.java @@ -4,6 +4,7 @@ import fr.univ_lille.gitlab.classrooms.classrooms.Classroom; import fr.univ_lille.gitlab.classrooms.users.ClassroomUser; import jakarta.persistence.*; +import java.time.ZonedDateTime; import java.util.HashSet; import java.util.Set; import java.util.UUID; @@ -26,6 +27,10 @@ public abstract class Assignment { @ManyToOne private Classroom classroom; + private ZonedDateTime dueDate; + + private boolean autoArchive = false; + public UUID getId() { return id; } @@ -69,4 +74,20 @@ public abstract class Assignment { public void setClassroom(Classroom classroom) { this.classroom = classroom; } + + public ZonedDateTime getDueDate() { + return dueDate; + } + + public void setDueDate(ZonedDateTime dueDate) { + this.dueDate = dueDate; + } + + public boolean isAutoArchive() { + return autoArchive; + } + + public void setAutoArchive(boolean autoArchive) { + this.autoArchive = autoArchive; + } } diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/AutoArchiveJob.java b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/AutoArchiveJob.java new file mode 100644 index 0000000..e789926 --- /dev/null +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/AutoArchiveJob.java @@ -0,0 +1,34 @@ +package fr.univ_lille.gitlab.classrooms.assignments; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.ZonedDateTime; +import java.util.concurrent.TimeUnit; + +@Component +public class AutoArchiveJob { + + private AssignmentRepository assignmentRepository; + + private ArchiveAssignmentUseCase archiveAssignmentUseCase; + + private static final Logger LOGGER = LoggerFactory.getLogger(AutoArchiveJob.class.getName()); + + public AutoArchiveJob(AssignmentRepository assignmentRepository, ArchiveAssignmentUseCase archiveAssignmentUseCase) { + this.assignmentRepository = assignmentRepository; + this.archiveAssignmentUseCase = archiveAssignmentUseCase; + } + + @Scheduled(fixedRate = 5, timeUnit = TimeUnit.MINUTES) + void autoArchiveAssignments(){ + LOGGER.info("Auto archiving assignments"); + this.assignmentRepository.findAll() + .stream() + .filter(Assignment::isAutoArchive) + .filter(it -> it.getDueDate().isBefore(ZonedDateTime.now())) + .forEach(it -> this.archiveAssignmentUseCase.archive(it)); + } +} diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/ExerciseAssignmentRestController.java b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/ExerciseAssignmentRestController.java index bfd8819..779142a 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/ExerciseAssignmentRestController.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/assignments/ExerciseAssignmentRestController.java @@ -4,13 +4,10 @@ import jakarta.annotation.security.RolesAllowed; import org.gitlab4j.api.GitLabApi; import org.gitlab4j.api.GitLabApiException; import org.gitlab4j.api.models.Project; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.server.ResponseStatusException; import java.util.UUID; import java.util.stream.Collectors; @@ -51,12 +48,4 @@ public class ExerciseAssignmentRestController { return urls.collect(Collectors.joining("\n")); } - @GetMapping("/assignments/{assignmentId}/archive") - String archiveAssignment(@PathVariable UUID assignmentId, Model model) { - var assignment = this.assignmentService.getAssignment(assignmentId).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); - this.assignmentService.archive(assignment); - - return "redirect:/classrooms/" + assignment.getClassroom().getId(); - } - } diff --git a/src/main/resources/db/migration/V24__ASSIGNMENT_AUTO_ARCHIVE.sql b/src/main/resources/db/migration/V24__ASSIGNMENT_AUTO_ARCHIVE.sql new file mode 100644 index 0000000..7feaf6e --- /dev/null +++ b/src/main/resources/db/migration/V24__ASSIGNMENT_AUTO_ARCHIVE.sql @@ -0,0 +1,5 @@ +ALTER TABLE assignment + ADD column if not exists auto_archive bool; + +ALTER TABLE assignment + ADD column if not exists due_date TIMESTAMP WITH TIME ZONE; \ No newline at end of file