diff --git a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/application/MemberQueryUseCase.java b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/application/MemberQueryUseCase.java index e3927df1..f2c716f8 100644 --- a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/application/MemberQueryUseCase.java +++ b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/member/application/MemberQueryUseCase.java @@ -71,7 +71,7 @@ private MemberInfoRes getMemberInfo(Member member) { return MemberInfoRes.of(member, student, teacher); } - public ResponseData> getAll(){ + public ResponseData> getAll() { return ResponseData.ok("모든 멤버 정보 조회 성공", memberRepository.findByStatusOrderByStudent(ActiveStatus.ACTIVE) .parallelStream() @@ -107,12 +107,11 @@ private ResponseData checkDormitoryManageMemberByMember(Member member) return ResponseData.ok("자치위원 확인 성공", dormitoryManageMemberRepository.existsByMember(member)); } - public ResponseData getMemberByCode(String code){ - return ResponseData.ok("학생 조회 성공", this.getMemberInfo(memberService.checkCode(code) - .getMember())); + public ResponseData getMemberByCode(String code) { + return ResponseData.ok("학생 조회 성공", this.getMemberInfo(memberService.checkCode(code).getMember())); } - public ResponseData> getStudentByPatent(){ + public ResponseData> getStudentByPatent() { Member member = memberAuthenticationHolder.current(); List studentRelationRes = memberService.getStudentRelationByMember(member).stream() diff --git a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/NightStudyUseCase.java b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/NightStudyUseCase.java index e2cd7c46..1ef70cd0 100644 --- a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/NightStudyUseCase.java +++ b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/NightStudyUseCase.java @@ -1,6 +1,5 @@ package b1nd.dodam.restapi.nightstudy.application; -import b1nd.dodam.core.util.ZonedDateTimeUtil; import b1nd.dodam.domain.rds.member.entity.DormitoryManageMember; import b1nd.dodam.domain.rds.member.entity.Member; import b1nd.dodam.domain.rds.member.entity.Student; @@ -37,7 +36,6 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; -import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -59,30 +57,28 @@ public class NightStudyUseCase { public Response apply(ApplyNightStudyReq req) { Student student = studentRepository.getByMember(memberAuthenticationHolder.current()); - validateDuplicatedOrBanned(student, req); + validateBanned(student, req); nightStudyService.save(req.toEntity(student)); return Response.created("심야자습 신청 성공"); } - private void validateDuplicatedOrBanned(Student student, ApplyNightStudyReq req) { + private void validateBanned(Student student, ApplyNightStudyReq req) { nightStudyBanService.validateBan(student); nightStudyService.validateDurationDuplication(student, req.startAt(), req.endAt()); - nightStudyProjectMemberService.validateMultipleDurationDuplication(Collections.singletonList(student), req.startAt(), req.endAt(), NightStudyProjectType.NIGHT_STUDY_PROJECT_2); } public Response applyProject(ApplyNightStudyProjectReq req) { Student leader = studentRepository.getByMember(memberAuthenticationHolder.current()); List students = studentRepository.getByIds(req.students()); - checkLeaderAndStudentsDuplicatedOrBanned(leader, students, req); + checkLeaderAndStudentsBanned(leader, students, req); NightStudyProject project = nightStudyProjectService.save(req.toEntity()); nightStudyProjectMemberService.saveAll(getProjectMembers(leader, students, project)); return Response.created("프로젝트 심야자습 신청 성공"); } - private void checkLeaderAndStudentsDuplicatedOrBanned(Student leader, List students, ApplyNightStudyProjectReq req) { + private void checkLeaderAndStudentsBanned(Student leader, List students, ApplyNightStudyProjectReq req) { List participants = Stream.concat(Stream.of(leader), students.stream()).toList(); nightStudyBanService.validateMultipleBans(participants); - nightStudyProjectMemberService.validateMultipleDurationDuplication(participants, req.startAt(), req.endAt(), req.type()); if (req.type() == NightStudyProjectType.NIGHT_STUDY_PROJECT_2) nightStudyService.validateNoActiveNightStudies(participants); } @@ -208,17 +204,14 @@ public ResponseData> getAllActiveBans() { @Transactional(readOnly = true) public ResponseData> getAll() { - Student student = studentRepository.getByMember(memberAuthenticationHolder.current()); - LocalDate now = ZonedDateTimeUtil.nowToLocalDate(); - List result = NightStudyRes.of(nightStudyService.getAll(now)); + List result = NightStudyRes.of(nightStudyService.getAll()); return ResponseData.ok("모든 심야자습 조회 성공", result); } @Transactional(readOnly = true) public ResponseData> getMy() { Student student = studentRepository.getByMember(memberAuthenticationHolder.current()); - LocalDate now = ZonedDateTimeUtil.nowToLocalDate(); - List result = NightStudyRes.of(nightStudyService.getMy(student, now)); + List result = NightStudyRes.of(nightStudyService.getMy(student)); return ResponseData.ok("내 심야자습 조회 성공", result); } @@ -230,20 +223,17 @@ public ResponseData> getPending() { @Transactional(readOnly = true) public ResponseData> getValid() { - LocalDate now = ZonedDateTimeUtil.nowToLocalDate(); - List result = NightStudyRes.of(nightStudyService.getValid(now)); + List result = NightStudyRes.of(nightStudyService.getValid()); return ResponseData.ok("승인된 심야자습 조회 성공", result); } @Transactional(readOnly = true) public ResponseData> getMembers() { - LocalDate now = ZonedDateTimeUtil.nowToLocalDate(); List students = studentRepository.findAllByMember_Status(ActiveStatus.ACTIVE); - List bannedStudentIds = nightStudyBanService.findAllStudentIdByDate(now); + List bannedStudentIds = nightStudyBanService.findAllStudentIdByDate(); return ResponseData.ok("학생 및 정지 여부 조회 성공", StudentWithNightStudyBanRes.of(students, bannedStudentIds)); } - @Transactional(readOnly = true) public ResponseData getProjectDetails(Long id) { NightStudyProject project = nightStudyProjectService.getById(id); @@ -253,8 +243,7 @@ public ResponseData getProjectDetails(Long id) @Transactional(readOnly = true) public ResponseData> getValidProjects() { - LocalDate today = ZonedDateTimeUtil.nowToLocalDate(); - List result = nightStudyProjectService.getAllByDateRange(today).stream() + List result = nightStudyProjectService.getAllByDateRange().stream() .map(NightStudyProjectRes::of) .toList(); return ResponseData.ok("유효한 모든 프로젝트 조회 성공", result); @@ -262,15 +251,13 @@ public ResponseData> getValidProjects() { @Transactional(readOnly = true) public ResponseData> getPendingProjects() { - LocalDate today = ZonedDateTimeUtil.nowToLocalDate(); - List members = nightStudyProjectMemberService.getPendingProjectMembers(today); + List members = nightStudyProjectMemberService.getPendingProjectMembers(); return ResponseData.ok("대기중인 프로젝트 심야자습 조회 성공", convertToProjectWithMembersRes(members)); } @Transactional(readOnly = true) public ResponseData> getAllowedProjects() { - LocalDate today = ZonedDateTimeUtil.nowToLocalDate(); - List members = nightStudyProjectMemberService.getAllowedProjectMembers(today); + List members = nightStudyProjectMemberService.getAllowedProjectMembers(); return ResponseData.ok("승인된 프로젝트 심야자습 조회 성공", convertToProjectWithMembersRes(members)); } @@ -285,8 +272,7 @@ private List convertToProjectWithMembersRes(Lis @Transactional(readOnly = true) public ResponseData> getMyProjects() { Student student = studentRepository.getByMember(memberAuthenticationHolder.current()); - LocalDate today = ZonedDateTimeUtil.nowToLocalDate(); - List result = nightStudyProjectMemberService.findByStudent(student, today).stream() + List result = nightStudyProjectMemberService.findByStudent(student).stream() .map(NightStudyProjectRes::of) .toList(); return ResponseData.ok("내 프로젝트 심야자습 조회 성공", result); @@ -294,26 +280,31 @@ public ResponseData> getMyProjects() { @Transactional(readOnly = true) public ResponseData> getRoomsInUse() { - LocalDate today = ZonedDateTimeUtil.nowToLocalDate(); - List result = NightStudyProjectRoomRes.of(nightStudyProjectService.getAllRoomsWithProjects(today)); + List result = NightStudyProjectRoomRes.of(nightStudyProjectService.getAllRoomsWithProjects()); return ResponseData.ok("사용중인 프로젝트 실 조회 성공", result); } @Transactional(readOnly = true) public ResponseData> getStudentsWithBan() { - LocalDate today = ZonedDateTimeUtil.nowToLocalDate(); Member member = authenticationHolder.current(); List students = studentRepository.findAllByMember_StatusAndMemberNot(ActiveStatus.ACTIVE, member); - List bannedStudents = nightStudyBanService.findAllStudentIdByDate(today); + List bannedStudents = nightStudyBanService.findAllStudentIdByDate(); List result = StudentWithNightStudyBanRes.of(students, bannedStudents); return ResponseData.ok("학생 조회 성공", result); } + @Transactional(readOnly = true) + public ResponseData getCombined() { + List members = nightStudyProjectMemberService.getAllStudentByDate(); + List nightStudyRes = NightStudyRes.of(nightStudyService.getCombinedStudy()); + List projectStudents = StudentWithNightStudyProjectRes.from(members); + NightStudyAndProjectRes result = NightStudyAndProjectRes.of(nightStudyRes, projectStudents); + return ResponseData.ok("심야자습 및 프로젝트 참가자 조회 성공", result); + } + @Transactional(readOnly = true) public ResponseData> getProjectStudents() { - List members = nightStudyProjectMemberService.getAllStudentByDate(ZonedDateTimeUtil.nowToLocalDate()); - return ResponseData.ok("프로젝트 참가 학생 조회 성공", members.stream() - .map(member -> StudentWithNightStudyProjectRes.of(member.getStudent(), member.getProject())) - .toList()); + List members = nightStudyProjectMemberService.getAllStudentByDate(); + return ResponseData.ok("프로젝트 참가 학생 조회 성공", StudentWithNightStudyProjectRes.from(members)); } } diff --git a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/res/NightStudyAndProjectRes.java b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/res/NightStudyAndProjectRes.java new file mode 100644 index 00000000..15b11497 --- /dev/null +++ b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/res/NightStudyAndProjectRes.java @@ -0,0 +1,15 @@ +package b1nd.dodam.restapi.nightstudy.application.data.res; + +import java.util.List; + +public record NightStudyAndProjectRes( + List selfStudy, + List projectStudy +) { + public static NightStudyAndProjectRes of( + List selfStudy, + List projectStudy + ) { + return new NightStudyAndProjectRes(selfStudy, projectStudy); + } +} diff --git a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/res/StudentWithNightStudyProjectRes.java b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/res/StudentWithNightStudyProjectRes.java index dbfbaf1a..5bda2f88 100644 --- a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/res/StudentWithNightStudyProjectRes.java +++ b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/application/data/res/StudentWithNightStudyProjectRes.java @@ -2,9 +2,12 @@ import b1nd.dodam.domain.rds.member.entity.Student; import b1nd.dodam.domain.rds.nightstudy.entity.NightStudyProject; +import b1nd.dodam.domain.rds.nightstudy.entity.NightStudyProjectMember; import b1nd.dodam.domain.rds.nightstudy.enumeration.NightStudyProjectRoom; import b1nd.dodam.domain.rds.nightstudy.enumeration.NightStudyProjectType; +import java.util.List; + public record StudentWithNightStudyProjectRes( int id, String name, @@ -27,4 +30,10 @@ public static StudentWithNightStudyProjectRes of(Student student, NightStudyProj project.getRoom() ); } -} + + public static List from(List members) { + return members.stream() + .map(member -> StudentWithNightStudyProjectRes.of(member.getStudent(), member.getProject())) + .toList(); + } +} \ No newline at end of file diff --git a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/presentation/NightStudyController.java b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/presentation/NightStudyController.java index c303013e..ce56df5a 100644 --- a/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/presentation/NightStudyController.java +++ b/dodam-application/dodam-rest-api/src/main/java/b1nd/dodam/restapi/nightstudy/presentation/NightStudyController.java @@ -154,6 +154,11 @@ public ResponseData> getAvailableStudents() { return useCase.getStudentsWithBan(); } + @GetMapping("/combined") + public ResponseData getCombined() { + return useCase.getCombined(); + } + @GetMapping("/project/students") public ResponseData> getValidProjectStudents() { return useCase.getProjectStudents(); diff --git a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/repository/NightStudyProjectMemberRepository.java b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/repository/NightStudyProjectMemberRepository.java index 444d7b24..85d8b88b 100644 --- a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/repository/NightStudyProjectMemberRepository.java +++ b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/repository/NightStudyProjectMemberRepository.java @@ -43,9 +43,9 @@ List findValidStudyByStudentAndDate( @Query(""" select m from NightStudyProjectMember m - join m.project p + join fetch m.project p where p.status = 'ALLOWED' and - :today between p.startAt and p.endAt + :today <= p.endAt """) List findAllowedProjectMembers( @Param("today") LocalDate today diff --git a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/repository/NightStudyRepository.java b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/repository/NightStudyRepository.java index 058443a9..80833807 100644 --- a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/repository/NightStudyRepository.java +++ b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/repository/NightStudyRepository.java @@ -56,4 +56,11 @@ boolean existsActiveNightStudy(@Param("students") List students, @EntityGraph(attributePaths = {"student.member"}) List findByEndAt(LocalDate endAt); + + @Query("SELECT n FROM NightStudy n " + + "JOIN FETCH n.student s " + + "JOIN FETCH s.member " + + "WHERE n.status = 'ALLOWED' AND n.endAt >= :date AND n.startAt <= :date " + + "ORDER BY s.grade, s.room, s.number") + List findCombinedNightStudy(@Param("date") LocalDate date); } diff --git a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyBanService.java b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyBanService.java index c2ce5d85..bfabfed2 100644 --- a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyBanService.java +++ b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyBanService.java @@ -61,8 +61,8 @@ public NightStudyBan findUserBan(Student student) { .orElseThrow(NightStudyBanNotFoundException::new); } - public List findAllStudentIdByDate(LocalDate date) { - return nightStudyBanRepository.findByEndedGreaterThanEqual(date) + public List findAllStudentIdByDate() { + return nightStudyBanRepository.findByEndedGreaterThanEqual(ZonedDateTimeUtil.nowToLocalDate()) .stream() .map(NightStudyBan::getStudentId) .toList(); diff --git a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyProjectMemberService.java b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyProjectMemberService.java index b25e0fca..b9b9324d 100644 --- a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyProjectMemberService.java +++ b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyProjectMemberService.java @@ -1,10 +1,9 @@ package b1nd.dodam.domain.rds.nightstudy.service; +import b1nd.dodam.core.util.ZonedDateTimeUtil; import b1nd.dodam.domain.rds.member.entity.Student; import b1nd.dodam.domain.rds.nightstudy.entity.NightStudyProject; import b1nd.dodam.domain.rds.nightstudy.entity.NightStudyProjectMember; -import b1nd.dodam.domain.rds.nightstudy.enumeration.NightStudyProjectType; -import b1nd.dodam.domain.rds.nightstudy.exception.NightStudyDuplicateException; import b1nd.dodam.domain.rds.nightstudy.exception.NightStudyProjectMemberNotFoundException; import b1nd.dodam.domain.rds.nightstudy.repository.NightStudyProjectMemberRepository; import b1nd.dodam.domain.rds.support.enumeration.ApprovalStatus; @@ -23,12 +22,12 @@ public void saveAll(List members) { repository.saveAll(members); } - public List getAllStudentByDate(LocalDate now) { - return repository.findAllowedProjectMembers(now); + public List getAllStudentByDate() { + return repository.findAllowedProjectMembers(ZonedDateTimeUtil.nowToLocalDate()); } - public List findByStudent(Student student, LocalDate now) { - return repository.findByStudentAndProject_EndAtGreaterThanEqual(student, now).stream().map(NightStudyProjectMember::getProject).toList(); + public List findByStudent(Student student) { + return repository.findByStudentAndProject_EndAtGreaterThanEqual(student, ZonedDateTimeUtil.nowToLocalDate()).stream().map(NightStudyProjectMember::getProject).toList(); } public NightStudyProjectMember findByStudentAndProject(Student student, NightStudyProject project) { @@ -40,15 +39,11 @@ public List getByProject(NightStudyProject project) { return repository.findAllByProject(project); } - public void validateMultipleDurationDuplication(List students, LocalDate startAt, LocalDate endAt, NightStudyProjectType type) { - if (repository.existsValidByStudentAndDate(students, startAt, endAt, type)) throw new NightStudyDuplicateException(); + public List getAllowedProjectMembers() { + return repository.findMemberWithProjectByStatus(ApprovalStatus.ALLOWED, ZonedDateTimeUtil.nowToLocalDate()); } - public List getAllowedProjectMembers(LocalDate date) { - return repository.findMemberWithProjectByStatus(ApprovalStatus.ALLOWED, date); - } - - public List getPendingProjectMembers(LocalDate date) { - return repository.findMemberWithProjectByStatus(ApprovalStatus.PENDING, date); + public List getPendingProjectMembers() { + return repository.findMemberWithProjectByStatus(ApprovalStatus.PENDING, ZonedDateTimeUtil.nowToLocalDate()); } } \ No newline at end of file diff --git a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyProjectService.java b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyProjectService.java index 2b4fc544..3397fb40 100644 --- a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyProjectService.java +++ b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyProjectService.java @@ -1,5 +1,6 @@ package b1nd.dodam.domain.rds.nightstudy.service; +import b1nd.dodam.core.util.ZonedDateTimeUtil; import b1nd.dodam.domain.rds.nightstudy.entity.NightStudyProject; import b1nd.dodam.domain.rds.nightstudy.exception.NightStudyNotFoundException; import b1nd.dodam.domain.rds.nightstudy.repository.NightStudyProjectRepository; @@ -29,11 +30,13 @@ public NightStudyProject getById(Long id) { .orElseThrow(NightStudyNotFoundException::new); } - public List getAllByDateRange(LocalDate date) { - return repository.findByStartAtLessThanEqualAndEndAtGreaterThanEqual(date, date); + public List getAllByDateRange() { + LocalDate now = ZonedDateTimeUtil.nowToLocalDate(); + return repository.findByStartAtLessThanEqualAndEndAtGreaterThanEqual(now, now); } - public List getAllRoomsWithProjects(LocalDate date) { - return repository.findByStatusNotAndStartAtLessThanEqualAndEndAtGreaterThanEqualOrderByRoom(ApprovalStatus.REJECTED, date, date); + public List getAllRoomsWithProjects() { + LocalDate now = ZonedDateTimeUtil.nowToLocalDate(); + return repository.findByStatusNotAndStartAtLessThanEqualAndEndAtGreaterThanEqualOrderByRoom(ApprovalStatus.REJECTED, now, now); } } diff --git a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyService.java b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyService.java index 4f4a2595..3f26909b 100644 --- a/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyService.java +++ b/dodam-system-domain/dodam-domain-rds/src/main/java/b1nd/dodam/domain/rds/nightstudy/service/NightStudyService.java @@ -41,26 +41,30 @@ public void validateNoActiveNightStudies(List students) { if (repository.existsActiveNightStudy(students, now)) throw new NightStudyDuplicateException(); } - public List getAll(LocalDate now) { - return repository.findAllByDate(now); + public List getAll() { + return repository.findAllByDate(ZonedDateTimeUtil.nowToLocalDate()); } - public List getMy(Student student, LocalDate now) { - return repository.findByStudentAndEndAtGreaterThanEqual(student, now); + public List getMy(Student student) { + return repository.findByStudentAndEndAtGreaterThanEqual(student, ZonedDateTimeUtil.nowToLocalDate()); } public List getPending() { return repository.findByStatus(ApprovalStatus.PENDING); } - public List getValid(LocalDate now) { - return repository.findAllowedStudyByDate(now, ApprovalStatus.ALLOWED); + public List getValid() { + return repository.findAllowedStudyByDate(ZonedDateTimeUtil.nowToLocalDate(), ApprovalStatus.ALLOWED); } public List getByEndDate(LocalDate endAt){ return repository.findByEndAt(endAt); } + public List getCombinedStudy() { + return repository.findCombinedNightStudy(ZonedDateTimeUtil.nowToLocalDate()); + } + public void rejectAllByStudent(Student student) { repository.findByStudentAndEndAtGreaterThanEqual(student, LocalDate.now()) .forEach(NightStudy::reject);