diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/classrooms/Classroom.java b/src/main/java/fr/univ_lille/gitlab/classrooms/classrooms/Classroom.java index 121bd7f..70bb0e4 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/classrooms/Classroom.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/classrooms/Classroom.java @@ -19,6 +19,8 @@ public class Classroom { private Long gitlabGroupId; + private boolean archived = false; + @ManyToMany(fetch = FetchType.EAGER) private Set teachers = new HashSet<>(); @@ -96,4 +98,12 @@ public class Classroom { public void setGitlabGroupId(Long gitlabGroupId) { this.gitlabGroupId = gitlabGroupId; } + + public boolean isArchived() { + return archived; + } + + public void setArchived(boolean archived) { + this.archived = archived; + } } diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/classrooms/ClassroomService.java b/src/main/java/fr/univ_lille/gitlab/classrooms/classrooms/ClassroomService.java index ece31fd..8913858 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/classrooms/ClassroomService.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/classrooms/ClassroomService.java @@ -25,4 +25,16 @@ public interface ClassroomService { void createClassroom(String classroomName, Long parentGitlabGroupId, ClassroomUser teacher) throws GitLabApiException; void saveClassroom(Classroom classroom); + + /** + * Archives a classroom + * @param classroom the classroom to archive + */ + void archiveClassroom(Classroom classroom); + + /** + * Unarchives a classroom + * @param classroom the classroom to unarchive + */ + void unarchiveClassroom(Classroom classroom); } diff --git a/src/main/java/fr/univ_lille/gitlab/classrooms/classrooms/ClassroomServiceImpl.java b/src/main/java/fr/univ_lille/gitlab/classrooms/classrooms/ClassroomServiceImpl.java index 6d47a50..caff210 100644 --- a/src/main/java/fr/univ_lille/gitlab/classrooms/classrooms/ClassroomServiceImpl.java +++ b/src/main/java/fr/univ_lille/gitlab/classrooms/classrooms/ClassroomServiceImpl.java @@ -24,12 +24,16 @@ class ClassroomServiceImpl implements ClassroomService { @Override public List getAllClassrooms() { - return this.classroomRepository.findAll(); + return this.classroomRepository.findAll().stream() + .filter(classroom -> !classroom.isArchived()) + .toList(); } @Override public List getAllJoinedClassrooms(ClassroomUser student) { - return this.classroomRepository.findClassroomByStudentsContains(student); + return this.classroomRepository.findClassroomByStudentsContains(student).stream() + .filter(classroom -> !classroom.isArchived()) + .toList(); } @Override @@ -61,4 +65,18 @@ class ClassroomServiceImpl implements ClassroomService { public void saveClassroom(Classroom classroom) { this.classroomRepository.save(classroom); } + + @Transactional + @Override + public void archiveClassroom(Classroom classroom) { + classroom.setArchived(true); + this.classroomRepository.save(classroom); + } + + @Transactional + @Override + public void unarchiveClassroom(Classroom classroom) { + classroom.setArchived(false); + this.classroomRepository.save(classroom); + } } diff --git a/src/main/resources/db/migration/V26__CLASSROOM_ARCHIVED.sql b/src/main/resources/db/migration/V26__CLASSROOM_ARCHIVED.sql new file mode 100644 index 0000000..47960d6 --- /dev/null +++ b/src/main/resources/db/migration/V26__CLASSROOM_ARCHIVED.sql @@ -0,0 +1,2 @@ +alter table classroom + add archived boolean default false not null; \ No newline at end of file diff --git a/src/test/java/fr/univ_lille/gitlab/classrooms/classrooms/ClassroomServiceImplTest.java b/src/test/java/fr/univ_lille/gitlab/classrooms/classrooms/ClassroomServiceImplTest.java index 9f80333..5949813 100644 --- a/src/test/java/fr/univ_lille/gitlab/classrooms/classrooms/ClassroomServiceImplTest.java +++ b/src/test/java/fr/univ_lille/gitlab/classrooms/classrooms/ClassroomServiceImplTest.java @@ -28,20 +28,41 @@ class ClassroomServiceImplTest { private Gitlab gitlab; @Test - void getAllClassrooms_shouldReturnAllClassrooms() { + void getAllClassrooms_shouldReturnAllNonArchivedClassrooms() { + var activeClassroom = new Classroom(); + var archiveClassroom = new Classroom(); + archiveClassroom.setArchived(true); + var allClassrooms = java.util.List.of(activeClassroom, archiveClassroom); + + when(classroomRepository.findAll()).thenReturn(allClassrooms); + var classrooms = classroomService.getAllClassrooms(); - assertThat(classrooms).isNotNull(); + assertThat(classrooms).isNotNull() + .hasSize(1) + .contains(activeClassroom) + .doesNotContain(archiveClassroom); verify(classroomRepository).findAll(); } @Test - void getAllJoinedClassrooms_shouldReturnAllJoinedClassrooms() { + void getAllJoinedClassrooms_shouldReturnAllNonArchivedJoinedClassrooms() { var student = new ClassroomUser(); + + var activeClassroom = new Classroom(); + var archiveClassroom = new Classroom(); + archiveClassroom.setArchived(true); + var allJoinedClassrooms = java.util.List.of(activeClassroom, archiveClassroom); + + when(classroomRepository.findClassroomByStudentsContains(student)).thenReturn(allJoinedClassrooms); + var classrooms = classroomService.getAllJoinedClassrooms(student); - assertThat(classrooms).isNotNull(); + assertThat(classrooms).isNotNull() + .hasSize(1) + .contains(activeClassroom) + .doesNotContain(archiveClassroom); verify(classroomRepository).findClassroomByStudentsContains(student); } @@ -80,4 +101,27 @@ class ClassroomServiceImplTest { assertThat(it.getTeachers()).contains(teacher); }); } + + @Test + void archiveClassroom_shouldSetArchivedToTrue() { + var classroom = new Classroom(); + assertThat(classroom.isArchived()).isFalse(); + + classroomService.archiveClassroom(classroom); + + assertThat(classroom.isArchived()).isTrue(); + verify(classroomRepository).save(classroom); + } + + @Test + void unarchiveClassroom_shouldSetArchivedToFalse() { + var classroom = new Classroom(); + classroom.setArchived(true); + assertThat(classroom.isArchived()).isTrue(); + + classroomService.unarchiveClassroom(classroom); + + assertThat(classroom.isArchived()).isFalse(); + verify(classroomRepository).save(classroom); + } }