From 3feb54d16be31d77146d6ccd04b910600cebb113 Mon Sep 17 00:00:00 2001 From: KWY Date: Wed, 21 Aug 2024 23:37:58 +0900 Subject: [PATCH 01/14] =?UTF-8?q?#322=20[feat]=20time=20block=20dto?= =?UTF-8?q?=EC=97=90=EC=84=9C=20vo=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../asap/server/service/MeetingService.java | 11 ++++---- .../MeetingTimeRecommendService.java | 11 ++++---- .../ContinuousMeetingTimeStrategy.java | 4 +-- .../ContinuousMeetingTimeStrategyImpl.java | 27 +++++++++---------- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/asap/server/service/MeetingService.java b/src/main/java/com/asap/server/service/MeetingService.java index 8dcd4c90..a0be6768 100644 --- a/src/main/java/com/asap/server/service/MeetingService.java +++ b/src/main/java/com/asap/server/service/MeetingService.java @@ -13,12 +13,10 @@ import com.asap.server.persistence.domain.ConfirmedDateTime; import com.asap.server.persistence.domain.Meeting; import com.asap.server.persistence.domain.Place; +import com.asap.server.persistence.domain.enums.Role; import com.asap.server.persistence.domain.user.Name; import com.asap.server.persistence.domain.user.User; -import com.asap.server.persistence.domain.enums.Role; import com.asap.server.persistence.repository.meeting.MeetingRepository; -import com.asap.server.persistence.repository.timeblock.TimeBlockRepository; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; import com.asap.server.presentation.controller.dto.request.MeetingConfirmRequestDto; import com.asap.server.presentation.controller.dto.request.MeetingSaveRequestDto; import com.asap.server.presentation.controller.dto.response.AvailableDatesDto; @@ -29,6 +27,8 @@ import com.asap.server.presentation.controller.dto.response.MeetingTitleResponseDto; import com.asap.server.presentation.controller.dto.response.TimeTableResponseDto; import com.asap.server.service.meeting.recommend.MeetingTimeRecommendService; +import com.asap.server.service.time.UserMeetingScheduleService; +import com.asap.server.service.time.vo.TimeBlockVo; import com.asap.server.service.vo.BestMeetingTimeVo; import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; import java.time.LocalDate; @@ -50,7 +50,7 @@ public class MeetingService { private final AvailableDateService availableDateService; private final JwtService jwtService; private final MeetingTimeRecommendService meetingTimeRecommendService; - private final TimeBlockRepository timeBlockRepository; + private final UserMeetingScheduleService userMeetingScheduleService; private final PasswordEncoder passwordEncoder; @Transactional @@ -194,7 +194,8 @@ public BestMeetingTimeResponseDto getBestMeetingTime(final Long meetingId, final if (meeting.isConfirmedMeeting()) throw new ConflictException(MEETING_VALIDATION_FAILED_EXCEPTION); int userCount = userService.getMeetingUserCount(meeting); - List timeBlocks = timeBlockRepository.findAllTimeBlockByMeeting(meetingId); + + List timeBlocks = userMeetingScheduleService.getTimeBlocks(meetingId); List bestMeetingTimes = meetingTimeRecommendService.getBestMeetingTime(timeBlocks, meeting.getDuration(), userCount); List bestMeetingTimeWithUsers = userService.getBestMeetingInUsers(meetingId, bestMeetingTimes); diff --git a/src/main/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendService.java b/src/main/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendService.java index c116021e..b6335436 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendService.java +++ b/src/main/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendService.java @@ -1,15 +1,14 @@ package com.asap.server.service.meeting.recommend; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; import com.asap.server.service.meeting.recommend.strategy.BestMeetingTimeStrategy; import com.asap.server.service.meeting.recommend.strategy.ContinuousMeetingTimeStrategy; import com.asap.server.service.meeting.recommend.strategy.MeetingTimeCasesStrategy; +import com.asap.server.service.time.vo.TimeBlockVo; import com.asap.server.service.vo.BestMeetingTimeVo; import com.asap.server.service.vo.PossibleTimeCaseVo; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -22,7 +21,7 @@ public class MeetingTimeRecommendService { private final BestMeetingTimeStrategy bestMeetingTimeStrategy; public List getBestMeetingTime( - List timeBlocks, + List timeBlocks, final Duration duration, final int userCount ) { @@ -30,8 +29,8 @@ public List getBestMeetingTime( List bestMeetingTimes = new ArrayList<>(); for (PossibleTimeCaseVo timeCase : timeCases) { - List timeBlocksFilteredUserCount = timeBlocks.stream() - .filter(t -> t.userCount() == timeCase.memberCnt()) + List timeBlocksFilteredUserCount = timeBlocks.stream() + .filter(t -> t.userIds().size() == timeCase.memberCnt()) .toList(); List candidateMeetingTimes = @@ -59,7 +58,7 @@ public List getBestMeetingTime( return bestMeetingTimes; } - private boolean isRecommendedMeetingTime(TimeBlockDto timeBlock, BestMeetingTimeVo bestMeetingTime) { + private boolean isRecommendedMeetingTime(TimeBlockVo timeBlock, BestMeetingTimeVo bestMeetingTime) { return timeBlock.availableDate().isEqual(bestMeetingTime.date()) && bestMeetingTime.startTime().getIndex() <= timeBlock.timeSlot().getIndex() && bestMeetingTime.endTime().getIndex() >= timeBlock.timeSlot().getIndex(); diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/ContinuousMeetingTimeStrategy.java b/src/main/java/com/asap/server/service/meeting/recommend/strategy/ContinuousMeetingTimeStrategy.java index 8e4edb08..81a741fb 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/ContinuousMeetingTimeStrategy.java +++ b/src/main/java/com/asap/server/service/meeting/recommend/strategy/ContinuousMeetingTimeStrategy.java @@ -1,10 +1,10 @@ package com.asap.server.service.meeting.recommend.strategy; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; +import com.asap.server.service.time.vo.TimeBlockVo; import com.asap.server.service.vo.BestMeetingTimeVo; import java.util.List; public interface ContinuousMeetingTimeStrategy { - List find(List timeBlocks, Duration duration); + List find(List timeBlocks, Duration duration); } diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java b/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java index 286088c7..f20ab125 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java +++ b/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java @@ -2,18 +2,17 @@ import com.asap.server.persistence.domain.enums.Duration; import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; import com.asap.server.service.meeting.recommend.strategy.ContinuousMeetingTimeStrategy; +import com.asap.server.service.time.vo.TimeBlockVo; import com.asap.server.service.vo.BestMeetingTimeVo; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import org.springframework.stereotype.Component; @Component public class ContinuousMeetingTimeStrategyImpl implements ContinuousMeetingTimeStrategy { @Override - public List find(List timeBlocks, Duration duration) { + public List find(List timeBlocks, Duration duration) { List response = new ArrayList<>(); if (timeBlocks.isEmpty()) { return response; @@ -23,8 +22,8 @@ public List find(List timeBlocks, Duration dura int endIdx = 1; while (endIdx < timeBlocks.size()) { - TimeBlockDto endTimeBlock = timeBlocks.get(endIdx - 1); - TimeBlockDto nextTimeBlock = timeBlocks.get(endIdx); + TimeBlockVo endTimeBlock = timeBlocks.get(endIdx - 1); + TimeBlockVo nextTimeBlock = timeBlocks.get(endIdx); if (isContinuous(endTimeBlock, nextTimeBlock)) { endIdx++; @@ -57,14 +56,14 @@ public List find(List timeBlocks, Duration dura } private void validateAndAddMeetingTime( - List timeBlocks, + List timeBlocks, Duration duration, int startIdx, int endIdx, List response ) { - TimeBlockDto startTimeBlock = timeBlocks.get(startIdx); - TimeBlockDto endTimeBlock = timeBlocks.get(endIdx - 1); + TimeBlockVo startTimeBlock = timeBlocks.get(startIdx); + TimeBlockVo endTimeBlock = timeBlocks.get(endIdx - 1); if (isSatisfiedDuration(startTimeBlock, endTimeBlock, duration)) { int weight = sumTimeBlocksWeight(timeBlocks, startIdx, endIdx); TimeSlot endTimeSlot = TimeSlot.getTimeSlot(endTimeBlock.timeSlot().getIndex() + 1); @@ -80,16 +79,16 @@ private void validateAndAddMeetingTime( } private boolean isContinuous( - TimeBlockDto endTimeBlock, - TimeBlockDto nextTimeBlock + TimeBlockVo endTimeBlock, + TimeBlockVo nextTimeBlock ) { return endTimeBlock.availableDate().isEqual(nextTimeBlock.availableDate()) && endTimeBlock.timeSlot().getIndex() + 1 == nextTimeBlock.timeSlot().getIndex(); } private boolean isSatisfiedDuration( - TimeBlockDto startTimeBlock, - TimeBlockDto endTimeBlock, + TimeBlockVo startTimeBlock, + TimeBlockVo endTimeBlock, Duration duration ) { int blockCnt = endTimeBlock.timeSlot().getIndex() - startTimeBlock.timeSlot().getIndex(); @@ -97,12 +96,12 @@ private boolean isSatisfiedDuration( } private int sumTimeBlocksWeight( - final List timeBlocks, + final List timeBlocks, final int startIdx, final int endIdx ) { int totalWeight = timeBlocks.subList(startIdx, endIdx).stream() - .mapToInt(TimeBlockDto::weight) + .mapToInt(TimeBlockVo::weight) .sum(); return totalWeight / (endIdx - startIdx); } From 302572cfcc3186ebdfc6f727a2d000ea80a84ddd Mon Sep 17 00:00:00 2001 From: KWY Date: Wed, 21 Aug 2024 23:38:33 +0900 Subject: [PATCH 02/14] =?UTF-8?q?#322=20[refactor]=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20vo=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MeetingTimeRecommendServiceTest.java | 105 +++++----- ...ContinuousMeetingTimeStrategyImplTest.java | 194 ++++++++++-------- 2 files changed, 161 insertions(+), 138 deletions(-) diff --git a/src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java b/src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java index 3558b274..ea96b17b 100644 --- a/src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java +++ b/src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java @@ -5,19 +5,17 @@ import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_13_00; import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_13_30; import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_15_00; -import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_15_30; import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_16_00; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import com.asap.server.common.generator.TimeBlockDtoGenerator; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; +import com.asap.server.persistence.domain.enums.TimeSlot; import com.asap.server.service.meeting.recommend.strategy.impl.BestMeetingTimeStrategyImpl; import com.asap.server.service.meeting.recommend.strategy.impl.ContinuousMeetingTimeStrategyImpl; import com.asap.server.service.meeting.recommend.strategy.impl.MeetingTimeCasesStrategyImpl; +import com.asap.server.service.time.vo.TimeBlockVo; import com.asap.server.service.vo.BestMeetingTimeVo; import java.time.LocalDate; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.BeforeEach; @@ -41,8 +39,8 @@ public void setUp() { public void getBestMeetingTime() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); - TimeBlockDto timeBlock = new TimeBlockDto(availableDate, SLOT_12_00, 0, 1L); - List timeBlocks = List.of(timeBlock); + TimeBlockVo timeBlock = new TimeBlockVo(availableDate, SLOT_12_00, 0, List.of(1L)); + List timeBlocks = List.of(timeBlock); BestMeetingTimeVo expected = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); @@ -60,9 +58,9 @@ public void getBestMeetingTime2() { LocalDate availableDate = LocalDate.of(2023, 7, 10); LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - TimeBlockDto timeBlock = new TimeBlockDto(availableDate, SLOT_12_00, 0, 1L); - TimeBlockDto timeBlock2 = new TimeBlockDto(availableDate2, SLOT_12_30, 0, 1L); - List timeBlocks = List.of(timeBlock, timeBlock2); + TimeBlockVo timeBlock = new TimeBlockVo(availableDate, SLOT_12_00, 0, List.of(1L)); + TimeBlockVo timeBlock2 = new TimeBlockVo(availableDate2, SLOT_12_30, 0, List.of(1L)); + List timeBlocks = List.of(timeBlock, timeBlock2); BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_00, 0); @@ -83,11 +81,11 @@ public void getBestMeetingTime3() { LocalDate availableDate = LocalDate.of(2023, 7, 10); LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - TimeBlockDto timeBlock = new TimeBlockDto(availableDate, SLOT_12_00, 0, 2L); - TimeBlockDto timeBlock2 = new TimeBlockDto(availableDate, SLOT_13_00, 0, 2L); - TimeBlockDto timeBlock3 = new TimeBlockDto(availableDate2, SLOT_12_30, 0, 2L); - TimeBlockDto timeBlock4 = new TimeBlockDto(availableDate2, SLOT_13_00, 0, 2L); - List timeBlocks = List.of(timeBlock, timeBlock2, timeBlock3, timeBlock4); + TimeBlockVo timeBlock = new TimeBlockVo(availableDate, SLOT_12_00, 0, List.of(1L, 2L)); + TimeBlockVo timeBlock2 = new TimeBlockVo(availableDate, SLOT_13_00, 0, List.of(1L, 2L)); + TimeBlockVo timeBlock3 = new TimeBlockVo(availableDate2, SLOT_12_30, 0, List.of(1L, 2L)); + TimeBlockVo timeBlock4 = new TimeBlockVo(availableDate2, SLOT_13_00, 0, List.of(1L, 2L)); + List timeBlocks = List.of(timeBlock, timeBlock2, timeBlock3, timeBlock4); BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_13_00, SLOT_13_30, 0); @@ -106,17 +104,20 @@ public void getBestMeetingTime3() { @DisplayName("최적의 회의시간이 2개이고 차선의 경우가 1개 있는 경우") public void getBestMeetingTime4() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_15_30, 0, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate2, SLOT_12_30, SLOT_13_00, 0, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - }}; + LocalDate availableDate = LocalDate.of(2024, 7, 10); + LocalDate availableDate2 = LocalDate.of(2024, 7, 11); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)) + ); BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 0); BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_15_00, SLOT_16_00, 0); @@ -135,17 +136,21 @@ public void getBestMeetingTime4() { @DisplayName("최적의 회의 시간이 3개일 때 우선순위가 가장 높은 회의 시간이 첫번째에 위치한다") public void getBestMeetingTime5() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_15_30, 0, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate2, SLOT_12_30, SLOT_13_00, 6, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - }}; + LocalDate availableDate = LocalDate.of(2024, 7, 10); + LocalDate availableDate2 = LocalDate.of(2024, 7, 11); + + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_12_30, 6, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_13_00, 6, List.of(1L, 2L)) + ); BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_30, 6); BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 0); @@ -166,8 +171,8 @@ public void getBestMeetingTime6() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); - TimeBlockDto timeBlock = new TimeBlockDto(availableDate, SLOT_12_00, 0, 2L); - List timeBlocks = List.of(timeBlock); + TimeBlockVo timeBlock = new TimeBlockVo(availableDate, SLOT_12_00, 0, List.of(1L, 2L)); + List timeBlocks = List.of(timeBlock); BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); List expected = Arrays.asList(e1, null, null); @@ -187,12 +192,12 @@ public void getBestMeetingTime7() { LocalDate availableDate2 = LocalDate.of(2023, 7, 11); LocalDate availableDate3 = LocalDate.of(2023, 7, 12); - TimeBlockDto timeBlock = new TimeBlockDto(availableDate, SLOT_12_00, 3, 3L); - TimeBlockDto timeBlock2 = new TimeBlockDto(availableDate, SLOT_12_30, 3, 3L); - TimeBlockDto timeBlock3 = new TimeBlockDto(availableDate2, SLOT_12_00, 4, 3L); - TimeBlockDto timeBlock4 = new TimeBlockDto(availableDate3, SLOT_12_00, 4, 3L); + TimeBlockVo timeBlock = new TimeBlockVo(availableDate, SLOT_12_00, 3, List.of(1L, 2L, 3L)); + TimeBlockVo timeBlock2 = new TimeBlockVo(availableDate, SLOT_12_30, 3, List.of(1L, 2L, 3L)); + TimeBlockVo timeBlock3 = new TimeBlockVo(availableDate2, SLOT_12_00, 4, List.of(1L, 2L, 3L)); + TimeBlockVo timeBlock4 = new TimeBlockVo(availableDate3, SLOT_12_00, 4, List.of(1L, 2L, 3L)); - List timeBlocks = List.of(timeBlock, timeBlock2, timeBlock3, timeBlock4); + List timeBlocks = List.of(timeBlock, timeBlock2, timeBlock3, timeBlock4); BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 3); BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate2, SLOT_12_00, SLOT_12_30, 4); @@ -210,10 +215,16 @@ public void getBestMeetingTime7() { @DisplayName("이미 추천한 시간대는 이후 조합에서 추천하지 않는다.") public void getBestMeetingTime8() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - - List timeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_15_00, 0, 2L); + LocalDate availableDate = LocalDate.of(2024, 7, 10); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)) + ); BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_30, 0); List expected = Arrays.asList(e1, null, null); diff --git a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java b/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java index 2c50a6e8..c08e6865 100644 --- a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java +++ b/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java @@ -1,15 +1,27 @@ package com.asap.server.service.meeting.recommend.strategy.impl; -import static com.asap.server.persistence.domain.enums.TimeSlot.*; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_12_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_12_30; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_13_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_14_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_14_30; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_16_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_16_30; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_17_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_18_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_20_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_23_30; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_24_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_6_00; +import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_6_30; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import com.asap.server.common.generator.TimeBlockDtoGenerator; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; +import com.asap.server.persistence.domain.enums.TimeSlot; import com.asap.server.service.meeting.recommend.strategy.ContinuousMeetingTimeStrategy; +import com.asap.server.service.time.vo.TimeBlockVo; import com.asap.server.service.vo.BestMeetingTimeVo; import java.time.LocalDate; -import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -24,11 +36,17 @@ class ContinuousMeetingTimeStrategyImplTest { @Nested class ReturnOneBestMeetingTimeVoByDuration { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - List timeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_15_30, 0, 2L); - - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_16_00, 0); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)) + ); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_16_00, 0); List result = List.of(r1); @DisplayName("회의 진행 시간이 주어졌을 때, 12시부터 16시까지인 BestMeetingTimeVo를 반환한다.") @@ -48,23 +66,28 @@ void durationsTest(Duration duration) { @Nested class ReturnBestMeetingTimeVoByDuration { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_15_30, 0, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate, SLOT_18_00, SLOT_19_30, 0, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - }}; + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_18_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_18_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_19_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_19_30, 0, List.of(1L, 2L)) + ); @DisplayName("회의 진행 시간이 2시간 이하일 때, 12시부터 16시까지, 18시부터 20시 까지인 BestMeetingTimeVo를 반환한다.") @ParameterizedTest @EnumSource(value = Duration.class, names = {"HALF", "HOUR", "HOUR_HALF", "TWO_HOUR"}) void durationsTest2(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_16_00, 0); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(availableDate, SLOT_18_00, SLOT_20_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_16_00, 0); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_18_00, SLOT_20_00, 0); List result = List.of(r1, r2); // when @@ -79,7 +102,7 @@ void durationsTest2(Duration duration) { @EnumSource(value = Duration.class, names = {"TWO_HOUR_HALF", "THREE_HOUR"}) void durationsTest3(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_16_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_16_00, 0); List result = List.of(r1); // when @@ -94,14 +117,15 @@ void durationsTest3(Duration duration) { @Nested class ReturnOneBestMeetingTimeVoByDuration2 { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - List timeBlocks = TimeBlockDtoGenerator.generator(availableDate, SLOT_12_00, SLOT_12_00, 0, 2L); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)) + ); @DisplayName("회의 진행 시간이 30분일 때, 12시부터 12시 30분까지인 BestMeetingTimeVo를 반환한다.") @Test void durationHalfTest() { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_12_30, 0); List result = List.of(r1); // when @@ -126,24 +150,22 @@ void durationHourTest() { @Nested class ReturnBestMeetingTimeVoByDuration2 { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_13_30, 0, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate2, SLOT_12_00, SLOT_12_30, 0, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - }}; + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)) + ); @DisplayName("회의 진행 시간이 1시간 이하일 때, 12시부터 14시, 12시부터 13시까지인 BestMeetingTimeVo를 반환한다.") @ParameterizedTest @EnumSource(value = Duration.class, names = {"HALF", "HOUR"}) void durationsTest(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_14_00, 0); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(availableDate2, SLOT_12_00, SLOT_13_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 0); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_12_00, SLOT_13_00, 0); List result = List.of(r1, r2); // when @@ -158,7 +180,7 @@ void durationsTest(Duration duration) { @EnumSource(value = Duration.class, names = {"HOUR_HALF", "TWO_HOUR"}) void durationsTest2(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_14_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 0); List result = List.of(r1); // when @@ -184,24 +206,25 @@ void durationsTest3(Duration duration) { @Nested class ReturnBestMeetingTimeVoByDuration3 { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_13_30, 0, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate2, SLOT_14_30, SLOT_16_30, 0, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - }}; + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_16_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_16_30, 0, List.of(1L, 2L)) + ); @DisplayName("회의 진행 시간이 2시간 이하일 때, 2023-7-10일 12시부터 14시, 2023-7-11일 14시 30분부터 17시까지인 BestMeetingTimeVo를 반환한다.") @ParameterizedTest @EnumSource(value = Duration.class, names = {"HALF", "HOUR", "HOUR_HALF", "TWO_HOUR"}) void durationsTest(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_14_00, 0); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(availableDate2, SLOT_14_30, SLOT_17_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 0); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_14_30, SLOT_17_00, 0); List result = List.of(r1, r2); // when @@ -216,7 +239,7 @@ void durationsTest(Duration duration) { @EnumSource(value = Duration.class, names = {"TWO_HOUR_HALF"}) void durationTwoHourHalfTest(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate2, SLOT_14_30, SLOT_17_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_14_30, SLOT_17_00, 0); List result = List.of(r1); // when @@ -245,19 +268,16 @@ class SumWeightTest { @Test void weightTest() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_13_30, 4, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate2, SLOT_16_00, SLOT_16_00, 2, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - }}; - - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_14_00, 4); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(availableDate2, SLOT_16_00, SLOT_16_30, 2); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 4, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 4, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 4, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 4, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_16_00, 2, List.of(1L, 2L)) + ); + + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 4); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_16_00, SLOT_16_30, 2); List result = List.of(r1, r2); // when @@ -271,24 +291,18 @@ void weightTest() { @Test void weightTest2() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - LocalDate availableDate2 = LocalDate.of(2023, 7, 11); - LocalDate availableDate3 = LocalDate.of(2023, 7, 12); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_12_00, SLOT_13_30, 2, 2L); - List tempTimeBlocks2 = TimeBlockDtoGenerator - .generator(availableDate2, SLOT_16_00, SLOT_16_00, 4, 2L); - List tempTimeBlocks3 = TimeBlockDtoGenerator - .generator(availableDate3, SLOT_16_30, SLOT_16_30, 1, 2L); - List timeBlocks = new ArrayList<>() {{ - addAll(tempTimeBlocks); - addAll(tempTimeBlocks2); - addAll(tempTimeBlocks3); - }}; - - BestMeetingTimeVo r1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_14_00, 2); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(availableDate2, SLOT_16_00, SLOT_16_30, 4); - BestMeetingTimeVo r3 = new BestMeetingTimeVo(availableDate3, SLOT_16_30, SLOT_17_00, 1); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 2, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_30, 2, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 2, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_30, 2, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_16_00, 4, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 12), TimeSlot.SLOT_16_30, 1, List.of(1L, 2L)) + ); + + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 2); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_16_00, SLOT_16_30, 4); + BestMeetingTimeVo r3 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 12), SLOT_16_30, SLOT_17_00, 1); List result = List.of(r2, r1, r3); // when @@ -306,12 +320,11 @@ class TimeSlotEdgeTest { @Test void timeSlot6_00Test() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_6_00, SLOT_6_00, 0, 2L); - List timeBlocks = new ArrayList<>(tempTimeBlocks); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_6_00, 0, List.of(1L, 2L)) + ); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_6_00, SLOT_6_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_6_00, SLOT_6_30, 0); List expected = List.of(e1); // when @@ -325,12 +338,11 @@ void timeSlot6_00Test() { @Test void timeSlot24_00Test() { // given - LocalDate availableDate = LocalDate.of(2023, 7, 10); - List tempTimeBlocks = TimeBlockDtoGenerator - .generator(availableDate, SLOT_23_30, SLOT_23_30, 0, 2L); - List timeBlocks = new ArrayList<>(tempTimeBlocks); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_23_30, 0, List.of(1L, 2L)) + ); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_23_30, SLOT_24_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_23_30, SLOT_24_00, 0); List expected = List.of(e1); // when From 656994346ef56bcda27cf2eaa2f9d7fc75278efa Mon Sep 17 00:00:00 2001 From: KWY Date: Wed, 21 Aug 2024 23:38:59 +0900 Subject: [PATCH 03/14] =?UTF-8?q?#322=20[feat]=20=ED=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20dto=20=EA=B4=80=EB=A0=A8=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../timeblock/TimeBlockRepository.java | 2 +- .../timeblock/TimeBlockRepositoryCustom.java | 8 -- .../timeblock/TimeBlockRepositoryImpl.java | 33 ----- .../timeblock/dto/TimeBlockDto.java | 25 ---- .../generator/TimeBlockDtoGenerator.java | 25 ---- .../TimeBlockRepositoryImplTest.java | 121 ------------------ 6 files changed, 1 insertion(+), 213 deletions(-) delete mode 100644 src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryCustom.java delete mode 100644 src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImpl.java delete mode 100644 src/main/java/com/asap/server/persistence/repository/timeblock/dto/TimeBlockDto.java delete mode 100644 src/test/java/com/asap/server/common/generator/TimeBlockDtoGenerator.java delete mode 100644 src/test/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImplTest.java diff --git a/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepository.java b/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepository.java index 887a4673..bef67827 100644 --- a/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepository.java +++ b/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepository.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Optional; -public interface TimeBlockRepository extends Repository, TimeBlockRepositoryCustom { +public interface TimeBlockRepository extends Repository { void save(final TimeBlock timeBlock); diff --git a/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryCustom.java b/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryCustom.java deleted file mode 100644 index 1dd2afb3..00000000 --- a/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryCustom.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.asap.server.persistence.repository.timeblock; - -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; -import java.util.List; - -public interface TimeBlockRepositoryCustom { - List findAllTimeBlockByMeeting(final Long meetingId); -} diff --git a/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImpl.java b/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImpl.java deleted file mode 100644 index 30362dce..00000000 --- a/src/main/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.asap.server.persistence.repository.timeblock; - -import static com.asap.server.persistence.domain.QAvailableDate.availableDate; -import static com.asap.server.persistence.domain.QTimeBlock.timeBlock; -import static com.asap.server.persistence.domain.QTimeBlockUser.timeBlockUser; - -import com.asap.server.persistence.repository.timeblock.dto.QTimeBlockDto; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; -import com.querydsl.jpa.impl.JPAQueryFactory; -import java.util.List; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class TimeBlockRepositoryImpl implements TimeBlockRepositoryCustom { - private final JPAQueryFactory queryFactory; - - @Override - public List findAllTimeBlockByMeeting(Long meetingId) { - return queryFactory.select( - new QTimeBlockDto( - availableDate.date.as("availableDate"), - timeBlock.timeSlot.as("timeSlot"), - timeBlock.weight.min().as("weight"), - timeBlockUser.user.id.count().as("userCount") - ) - ).from(availableDate) - .innerJoin(timeBlock).on(timeBlock.availableDate.id.eq(availableDate.id)) - .innerJoin(timeBlockUser).on(timeBlockUser.timeBlock.id.eq(timeBlock.id)) - .where(availableDate.meeting.id.eq(meetingId)) - .groupBy(availableDate.date, timeBlock.timeSlot) - .fetch(); - } -} diff --git a/src/main/java/com/asap/server/persistence/repository/timeblock/dto/TimeBlockDto.java b/src/main/java/com/asap/server/persistence/repository/timeblock/dto/TimeBlockDto.java deleted file mode 100644 index 8a739332..00000000 --- a/src/main/java/com/asap/server/persistence/repository/timeblock/dto/TimeBlockDto.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.asap.server.persistence.repository.timeblock.dto; - -import com.asap.server.persistence.domain.enums.TimeSlot; -import com.querydsl.core.annotations.QueryProjection; -import org.jetbrains.annotations.NotNull; - -import java.time.LocalDate; - -public record TimeBlockDto( - LocalDate availableDate, - TimeSlot timeSlot, - int weight, - Long userCount -) implements Comparable { - @QueryProjection - public TimeBlockDto { - } - - @Override - public int compareTo(@NotNull TimeBlockDto o) { - if (this.availableDate.equals(o.availableDate)) - return Integer.compare(this.timeSlot.ordinal(), o.timeSlot.ordinal()); - return this.availableDate.compareTo(o.availableDate); - } -} diff --git a/src/test/java/com/asap/server/common/generator/TimeBlockDtoGenerator.java b/src/test/java/com/asap/server/common/generator/TimeBlockDtoGenerator.java deleted file mode 100644 index 19f1f74d..00000000 --- a/src/test/java/com/asap/server/common/generator/TimeBlockDtoGenerator.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.asap.server.common.generator; - -import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - -public class TimeBlockDtoGenerator { - private static final TimeSlot[] timeSlots = TimeSlot.values(); - - public static List generator( - LocalDate availableDate, - TimeSlot startTime, - TimeSlot endTime, - int weight, - long userCount - ) { - List timeBlocks = new ArrayList<>(); - for (int i = startTime.ordinal(); i <= endTime.ordinal(); i++) { - timeBlocks.add(new TimeBlockDto(availableDate, timeSlots[i], weight, userCount)); - } - return timeBlocks; - } -} diff --git a/src/test/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImplTest.java b/src/test/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImplTest.java deleted file mode 100644 index 602e7c82..00000000 --- a/src/test/java/com/asap/server/persistence/repository/timeblock/TimeBlockRepositoryImplTest.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.asap.server.persistence.repository.timeblock; - -import com.asap.server.persistence.config.querydsl.QueryDslConfig; -import com.asap.server.persistence.domain.AvailableDate; -import com.asap.server.persistence.domain.Meeting; -import com.asap.server.persistence.domain.Place; -import com.asap.server.persistence.domain.TimeBlock; -import com.asap.server.persistence.domain.TimeBlockUser; -import com.asap.server.persistence.domain.user.Name; -import com.asap.server.persistence.domain.user.User; -import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.persistence.domain.enums.PlaceType; -import com.asap.server.persistence.domain.enums.Role; -import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.persistence.repository.timeblock.dto.TimeBlockDto; -import jakarta.persistence.EntityManager; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.Import; - -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - -@DataJpaTest -@Import(QueryDslConfig.class) -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) -class TimeBlockRepositoryImplTest { - @Autowired - EntityManager em; - @Autowired - TimeBlockRepository timeBlockRepositoryCustom; - - @Test - @DisplayName("2명의 사용자 모두 2개의 요일에 6_00 ~ 8_00까지 시간을 입력했을 때, 총 10개의 레코드를 불러온다.") - void findAllTimeBlockByMeetingTest() { - // given - Place place = Place.builder() - .placeType(PlaceType.OFFLINE) - .build(); - Meeting meeting = Meeting.builder() - .title("회의 테스트") - .password("0000") - .additionalInfo("") - .duration(Duration.HALF) - .place(place) - .build(); - em.persist(meeting); - - final Name name = new Name("KWY"); - final Name name2 = new Name("DSY"); - User user = User.builder() - .meeting(meeting) - .name(name) - .role(Role.HOST) - .build(); - User user2 = User.builder() - .meeting(meeting) - .name(name2) - .role(Role.MEMBER) - .build(); - em.persist(user); - em.persist(user2); - - AvailableDate availableDate = AvailableDate.builder() - .date(LocalDate.of(2024, 7, 9)) - .meeting(meeting) - .build(); - AvailableDate availableDate2 = AvailableDate.builder() - .date(LocalDate.of(2024, 7, 10)) - .meeting(meeting) - .build(); - em.persist(availableDate); - em.persist(availableDate2); - - List timeBlocks = createTimeBlocks(availableDate, TimeSlot.SLOT_6_00, TimeSlot.SLOT_8_00); - List timeBlocks2 = createTimeBlocks(availableDate2, TimeSlot.SLOT_6_00, TimeSlot.SLOT_8_00); - List tbu = createTimeBlockUsers(timeBlocks, user); - List tbu2 = createTimeBlockUsers(timeBlocks2, user); - List tbu3 = createTimeBlockUsers(timeBlocks, user2); - List tbu4 = createTimeBlockUsers(timeBlocks2, user2); - - // when - List response = timeBlockRepositoryCustom.findAllTimeBlockByMeeting(meeting.getId()); - - // then - assertThat(response.size()).isEqualTo(10); - } - - private List createTimeBlocks(AvailableDate availableDate, TimeSlot startTime, TimeSlot endTime) { - List timeSlots = TimeSlot.getTimeSlots(startTime.ordinal(), endTime.ordinal()); - List timeBlocks = new ArrayList<>(); - for (TimeSlot timeSlot : timeSlots) { - final TimeBlock timeBlock = TimeBlock.builder() - .availableDate(availableDate) - .timeSlot(timeSlot) - .build(); - em.persist(timeBlock); - timeBlocks.add(timeBlock); - } - return timeBlocks; - } - - private List createTimeBlockUsers(List timeBlocks, User user) { - List timeBlockUsers = new ArrayList<>(); - for (TimeBlock timeBlock : timeBlocks) { - TimeBlockUser tbu = TimeBlockUser.builder() - .timeBlock(timeBlock) - .user(user) - .build(); - em.persist(tbu); - timeBlockUsers.add(tbu); - } - return timeBlockUsers; - } -} \ No newline at end of file From 2fae46c41b9d793455d2de64d215b85b53f3ce36 Mon Sep 17 00:00:00 2001 From: KWY Date: Thu, 22 Aug 2024 10:55:43 +0900 Subject: [PATCH 04/14] =?UTF-8?q?#322=20[fix]=20vo=20=EB=82=B4=EB=B6=80?= =?UTF-8?q?=EC=97=90=20userIds=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존에는 쿼리를 통해 user 정보를 불러왔지만, 변경되는 테이블에 해당 쿼리를 적용할 수 없게 되었습니다. 테이블에 변경됨에 따라 비즈니스 로직을 수정했습니다. --- .../impl/BestMeetingTimeStrategyImpl.java | 4 +- .../ContinuousMeetingTimeStrategyImpl.java | 15 +++- .../server/service/vo/BestMeetingTimeVo.java | 3 +- .../MeetingTimeRecommendServiceTest.java | 34 ++++----- .../impl/BestMeetingTimeStrategyImplTest.java | 70 +++++++++---------- ...ContinuousMeetingTimeStrategyImplTest.java | 36 +++++----- 6 files changed, 88 insertions(+), 74 deletions(-) diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImpl.java b/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImpl.java index 29c73c65..48358a9e 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImpl.java +++ b/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImpl.java @@ -27,12 +27,12 @@ public List find(List candidateMeetingTime private BestMeetingTimeVo createFirstMeetingTime(BestMeetingTimeVo candidate, Duration duration) { TimeSlot endTimeSlot = TimeSlot.getTimeSlot(candidate.startTime().getIndex() + duration.getNeedBlock()); - return new BestMeetingTimeVo(candidate.date(), candidate.startTime(), endTimeSlot, candidate.weight()); + return new BestMeetingTimeVo(candidate.date(), candidate.startTime(), endTimeSlot, candidate.weight(), candidate.userIds()); } private BestMeetingTimeVo createSecondMeetingTime(BestMeetingTimeVo candidate, Duration duration) { TimeSlot startTimeSlot = TimeSlot.getTimeSlot(candidate.endTime().getIndex() - duration.getNeedBlock()); - return new BestMeetingTimeVo(candidate.date(), startTimeSlot, candidate.endTime(), candidate.weight()); + return new BestMeetingTimeVo(candidate.date(), startTimeSlot, candidate.endTime(), candidate.weight(), candidate.userIds()); } private boolean isTimeBlockSufficientlyLong(BestMeetingTimeVo candidate, Duration duration) { diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java b/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java index f20ab125..e5af609f 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java +++ b/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java @@ -66,13 +66,15 @@ private void validateAndAddMeetingTime( TimeBlockVo endTimeBlock = timeBlocks.get(endIdx - 1); if (isSatisfiedDuration(startTimeBlock, endTimeBlock, duration)) { int weight = sumTimeBlocksWeight(timeBlocks, startIdx, endIdx); + List userIds = findUserIdsBetween(timeBlocks, startIdx, endIdx); TimeSlot endTimeSlot = TimeSlot.getTimeSlot(endTimeBlock.timeSlot().getIndex() + 1); response.add( new BestMeetingTimeVo( startTimeBlock.availableDate(), startTimeBlock.timeSlot(), endTimeSlot, - weight + weight, + userIds ) ); } @@ -105,4 +107,15 @@ private int sumTimeBlocksWeight( .sum(); return totalWeight / (endIdx - startIdx); } + + private List findUserIdsBetween( + final List timeBlocks, + final int startIdx, + final int endIdx + ) { + return timeBlocks.subList(startIdx, endIdx).stream() + .flatMap(timeBlock -> timeBlock.userIds().stream()) + .distinct() + .toList(); + } } diff --git a/src/main/java/com/asap/server/service/vo/BestMeetingTimeVo.java b/src/main/java/com/asap/server/service/vo/BestMeetingTimeVo.java index 18c1592e..722f3f86 100644 --- a/src/main/java/com/asap/server/service/vo/BestMeetingTimeVo.java +++ b/src/main/java/com/asap/server/service/vo/BestMeetingTimeVo.java @@ -3,6 +3,7 @@ import com.asap.server.persistence.domain.enums.TimeSlot; import java.time.LocalDate; +import java.util.List; -public record BestMeetingTimeVo(LocalDate date, TimeSlot startTime, TimeSlot endTime, int weight) { +public record BestMeetingTimeVo(LocalDate date, TimeSlot startTime, TimeSlot endTime, int weight, List userIds) { } diff --git a/src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java b/src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java index ea96b17b..cf9c4025 100644 --- a/src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java +++ b/src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java @@ -42,7 +42,7 @@ public void getBestMeetingTime() { TimeBlockVo timeBlock = new TimeBlockVo(availableDate, SLOT_12_00, 0, List.of(1L)); List timeBlocks = List.of(timeBlock); - BestMeetingTimeVo expected = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); + BestMeetingTimeVo expected = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0, List.of(1L)); // when List result = meetingTimeRecommendService.getBestMeetingTime(timeBlocks, Duration.HALF, 1); @@ -62,8 +62,8 @@ public void getBestMeetingTime2() { TimeBlockVo timeBlock2 = new TimeBlockVo(availableDate2, SLOT_12_30, 0, List.of(1L)); List timeBlocks = List.of(timeBlock, timeBlock2); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0, List.of(1L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_00, 0, List.of(1L)); List expected = Arrays.asList(e1, e2, null); // when @@ -87,9 +87,9 @@ public void getBestMeetingTime3() { TimeBlockVo timeBlock4 = new TimeBlockVo(availableDate2, SLOT_13_00, 0, List.of(1L, 2L)); List timeBlocks = List.of(timeBlock, timeBlock2, timeBlock3, timeBlock4); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_13_00, SLOT_13_30, 0); - BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_13_00, SLOT_13_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2, e3); // when @@ -119,9 +119,9 @@ public void getBestMeetingTime4() { new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)) ); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_15_00, SLOT_16_00, 0); - BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_15_00, SLOT_16_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_30, 0, List.of(1L, 2L)); List expected = List.of(e1, e2, e3); // when @@ -152,9 +152,9 @@ public void getBestMeetingTime5() { new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_13_00, 6, List.of(1L, 2L)) ); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_30, 6); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 0); - BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate, SLOT_15_00, SLOT_16_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate2, SLOT_12_30, SLOT_13_30, 6, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate, SLOT_15_00, SLOT_16_00, 0, List.of(1L, 2L)); List expected = Arrays.asList(e1, e2, e3); // when @@ -174,7 +174,7 @@ public void getBestMeetingTime6() { TimeBlockVo timeBlock = new TimeBlockVo(availableDate, SLOT_12_00, 0, List.of(1L, 2L)); List timeBlocks = List.of(timeBlock); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_12_30, 0, List.of(1L, 2L)); List expected = Arrays.asList(e1, null, null); // when @@ -199,9 +199,9 @@ public void getBestMeetingTime7() { List timeBlocks = List.of(timeBlock, timeBlock2, timeBlock3, timeBlock4); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 3); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate2, SLOT_12_00, SLOT_12_30, 4); - BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate3, SLOT_12_00, SLOT_12_30, 4); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_00, 3, List.of(1L, 2L, 3L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate2, SLOT_12_00, SLOT_12_30, 4, List.of(1L, 2L, 3L)); + BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate3, SLOT_12_00, SLOT_12_30, 4, List.of(1L, 2L, 3L)); List expected = Arrays.asList(e1, e2, e3); // when @@ -226,7 +226,7 @@ public void getBestMeetingTime8() { new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)) ); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, SLOT_12_00, SLOT_13_30, 0, List.of(1L, 2L)); List expected = Arrays.asList(e1, null, null); // when diff --git a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImplTest.java b/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImplTest.java index f5364b8c..8163f7bd 100644 --- a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImplTest.java +++ b/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImplTest.java @@ -26,10 +26,10 @@ void test() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_14_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -45,11 +45,11 @@ void test2() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_14_30, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_16_30, TimeSlot.SLOT_17_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_14_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_16_30, TimeSlot.SLOT_17_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2); // when @@ -65,14 +65,14 @@ void test3() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_6_00, TimeSlot.SLOT_6_30, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_6_00, TimeSlot.SLOT_6_30, 0, List.of(1L, 2L)); BestMeetingTimeVo bestMeetingTimeVo2 = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_21_00, TimeSlot.SLOT_24_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_21_00, TimeSlot.SLOT_24_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo, bestMeetingTimeVo2); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_6_00, TimeSlot.SLOT_6_30, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_21_00, TimeSlot.SLOT_21_30, 0); - BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_23_30, TimeSlot.SLOT_24_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_6_00, TimeSlot.SLOT_6_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_21_00, TimeSlot.SLOT_21_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e3 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_23_30, TimeSlot.SLOT_24_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2, e3); // when @@ -94,10 +94,10 @@ void test() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -113,11 +113,11 @@ void test2() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_18_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_18_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_00, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_17_00, TimeSlot.SLOT_18_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_17_00, TimeSlot.SLOT_18_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2); // when @@ -139,10 +139,10 @@ void test() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_30, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_30, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -158,11 +158,11 @@ void test2() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_19_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_19_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_30, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_17_30, TimeSlot.SLOT_19_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_17_30, TimeSlot.SLOT_19_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2); // when @@ -184,10 +184,10 @@ void test() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -204,11 +204,11 @@ void test2() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_20_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_20_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_18_00, TimeSlot.SLOT_20_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_18_00, TimeSlot.SLOT_20_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2); // when @@ -230,10 +230,10 @@ void test() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_30, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -249,11 +249,11 @@ void test2() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_21_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_21_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_30, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_18_30, TimeSlot.SLOT_21_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_16_30, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_18_30, TimeSlot.SLOT_21_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2); // when @@ -275,10 +275,10 @@ void test() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -294,11 +294,11 @@ void test2() { // given LocalDate availableDate = LocalDate.of(2023, 7, 10); BestMeetingTimeVo bestMeetingTimeVo = - new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_22_00, 0); + new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_22_00, 0, List.of(1L, 2L)); List candidateMeetingTimes = List.of(bestMeetingTimeVo); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0); - BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_19_00, TimeSlot.SLOT_22_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_14_00, TimeSlot.SLOT_17_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo e2 = new BestMeetingTimeVo(availableDate, TimeSlot.SLOT_19_00, TimeSlot.SLOT_22_00, 0, List.of(1L, 2L)); List expected = List.of(e1, e2); // when diff --git a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java b/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java index c08e6865..1bc31758 100644 --- a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java +++ b/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java @@ -46,7 +46,7 @@ class ReturnOneBestMeetingTimeVoByDuration { new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_00, 0, List.of(1L, 2L)), new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_15_30, 0, List.of(1L, 2L)) ); - BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_16_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_16_00, 0, List.of(1L, 2L)); List result = List.of(r1); @DisplayName("회의 진행 시간이 주어졌을 때, 12시부터 16시까지인 BestMeetingTimeVo를 반환한다.") @@ -86,8 +86,8 @@ class ReturnBestMeetingTimeVoByDuration { @EnumSource(value = Duration.class, names = {"HALF", "HOUR", "HOUR_HALF", "TWO_HOUR"}) void durationsTest2(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_16_00, 0); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_18_00, SLOT_20_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_16_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_18_00, SLOT_20_00, 0, List.of(1L, 2L)); List result = List.of(r1, r2); // when @@ -102,7 +102,7 @@ void durationsTest2(Duration duration) { @EnumSource(value = Duration.class, names = {"TWO_HOUR_HALF", "THREE_HOUR"}) void durationsTest3(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_16_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_16_00, 0, List.of(1L, 2L)); List result = List.of(r1); // when @@ -125,7 +125,7 @@ class ReturnOneBestMeetingTimeVoByDuration2 { @Test void durationHalfTest() { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_12_30, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_12_30, 0, List.of(1L, 2L)); List result = List.of(r1); // when @@ -164,8 +164,8 @@ class ReturnBestMeetingTimeVoByDuration2 { @EnumSource(value = Duration.class, names = {"HALF", "HOUR"}) void durationsTest(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 0); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_12_00, SLOT_13_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_12_00, SLOT_13_00, 0, List.of(1L, 2L)); List result = List.of(r1, r2); // when @@ -180,7 +180,7 @@ void durationsTest(Duration duration) { @EnumSource(value = Duration.class, names = {"HOUR_HALF", "TWO_HOUR"}) void durationsTest2(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 0, List.of(1L, 2L)); List result = List.of(r1); // when @@ -223,8 +223,8 @@ class ReturnBestMeetingTimeVoByDuration3 { @EnumSource(value = Duration.class, names = {"HALF", "HOUR", "HOUR_HALF", "TWO_HOUR"}) void durationsTest(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 0); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_14_30, SLOT_17_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 0, List.of(1L, 2L)); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_14_30, SLOT_17_00, 0, List.of(1L, 2L)); List result = List.of(r1, r2); // when @@ -239,7 +239,7 @@ void durationsTest(Duration duration) { @EnumSource(value = Duration.class, names = {"TWO_HOUR_HALF"}) void durationTwoHourHalfTest(Duration duration) { // given - BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_14_30, SLOT_17_00, 0); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_14_30, SLOT_17_00, 0, List.of(1L, 2L)); List result = List.of(r1); // when @@ -276,8 +276,8 @@ void weightTest() { new TimeBlockVo(LocalDate.of(2024, 7, 11), TimeSlot.SLOT_16_00, 2, List.of(1L, 2L)) ); - BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 4); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_16_00, SLOT_16_30, 2); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 4, List.of(1L, 2L)); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_16_00, SLOT_16_30, 2, List.of(1L, 2L)); List result = List.of(r1, r2); // when @@ -300,9 +300,9 @@ void weightTest2() { new TimeBlockVo(LocalDate.of(2024, 7, 12), TimeSlot.SLOT_16_30, 1, List.of(1L, 2L)) ); - BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 2); - BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_16_00, SLOT_16_30, 4); - BestMeetingTimeVo r3 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 12), SLOT_16_30, SLOT_17_00, 1); + BestMeetingTimeVo r1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_12_00, SLOT_14_00, 2, List.of(1L, 2L)); + BestMeetingTimeVo r2 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 11), SLOT_16_00, SLOT_16_30, 4, List.of(1L, 2L)); + BestMeetingTimeVo r3 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 12), SLOT_16_30, SLOT_17_00, 1, List.of(1L, 2L)); List result = List.of(r2, r1, r3); // when @@ -324,7 +324,7 @@ void timeSlot6_00Test() { new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_6_00, 0, List.of(1L, 2L)) ); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_6_00, SLOT_6_30, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_6_00, SLOT_6_30, 0, List.of(1L, 2L)); List expected = List.of(e1); // when @@ -342,7 +342,7 @@ void timeSlot24_00Test() { new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_23_30, 0, List.of(1L, 2L)) ); - BestMeetingTimeVo e1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_23_30, SLOT_24_00, 0); + BestMeetingTimeVo e1 = new BestMeetingTimeVo(LocalDate.of(2024, 7, 10), SLOT_23_30, SLOT_24_00, 0, List.of(1L, 2L)); List expected = List.of(e1); // when From d383cc1dfda8a2deb1f7a997d027121dcb46fabf Mon Sep 17 00:00:00 2001 From: KWY Date: Thu, 22 Aug 2024 17:24:51 +0900 Subject: [PATCH 05/14] =?UTF-8?q?#322=20[feat]=20=ED=82=A4=EA=B0=80=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20id=EC=9D=B4=EA=B3=A0,=20value=EB=8A=94=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=EC=9D=B8=20map=EC=9D=84=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=ED=95=A8=EC=88=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UserService 내에 너무 많은 관심사가 있기 때문에 조회용 서비스를 만들었습니다. 테스트 코드 작성을 위해 User 내부에 equals를 재정의 했습니다. userid를 키로 갖고, user를 value로 갖는 map을 반환하는 함수를 구현했습니다. 위 함수를 테스트하는 테스트 코드를 만들었습니다. --- .../server/persistence/domain/user/User.java | 9 +++ .../repository/user/UserRepository.java | 2 + .../service/user/UserRetrieveService.java | 20 ++++++ .../service/user/UserRetrieveServiceTest.java | 61 +++++++++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 src/main/java/com/asap/server/service/user/UserRetrieveService.java create mode 100644 src/test/java/com/asap/server/service/user/UserRetrieveServiceTest.java diff --git a/src/main/java/com/asap/server/persistence/domain/user/User.java b/src/main/java/com/asap/server/persistence/domain/user/User.java index 67d02a77..a8941d1f 100644 --- a/src/main/java/com/asap/server/persistence/domain/user/User.java +++ b/src/main/java/com/asap/server/persistence/domain/user/User.java @@ -14,6 +14,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import java.util.Objects; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -48,4 +49,12 @@ public class User extends AuditingTimeEntity { public String getName() { return this.name.getValue(); } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof User)) { + return false; + } + return Objects.equals(this.id, ((User) obj).getId()); + } } diff --git a/src/main/java/com/asap/server/persistence/repository/user/UserRepository.java b/src/main/java/com/asap/server/persistence/repository/user/UserRepository.java index c0bc359f..d0d8dba1 100644 --- a/src/main/java/com/asap/server/persistence/repository/user/UserRepository.java +++ b/src/main/java/com/asap/server/persistence/repository/user/UserRepository.java @@ -17,4 +17,6 @@ public interface UserRepository extends Repository, UserRepositoryCu List findByMeeting(final Meeting meeting); int countByMeeting(final Meeting meeting); + + List findAllByMeetingId(final long meetingId); } diff --git a/src/main/java/com/asap/server/service/user/UserRetrieveService.java b/src/main/java/com/asap/server/service/user/UserRetrieveService.java new file mode 100644 index 00000000..2be95492 --- /dev/null +++ b/src/main/java/com/asap/server/service/user/UserRetrieveService.java @@ -0,0 +1,20 @@ +package com.asap.server.service.user; + +import com.asap.server.persistence.domain.user.User; +import com.asap.server.persistence.repository.user.UserRepository; +import java.util.Map; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class UserRetrieveService { + private final UserRepository userRepository; + + public Map getUserIdToUserMap(final Long meetingId) { + return userRepository + .findAllByMeetingId(meetingId).stream() + .collect(Collectors.toMap(User::getId, user -> user)); + } +} diff --git a/src/test/java/com/asap/server/service/user/UserRetrieveServiceTest.java b/src/test/java/com/asap/server/service/user/UserRetrieveServiceTest.java new file mode 100644 index 00000000..add5be18 --- /dev/null +++ b/src/test/java/com/asap/server/service/user/UserRetrieveServiceTest.java @@ -0,0 +1,61 @@ +package com.asap.server.service.user; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.mockito.Mockito.when; + +import com.asap.server.persistence.domain.user.User; +import com.asap.server.persistence.repository.user.UserRepository; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class UserRetrieveServiceTest { + @Mock + private UserRepository userRepository; + @InjectMocks + private UserRetrieveService userRetrieveService; + + @Test + @DisplayName("사용자가 존재할 때, userId를 키로 갖는 Map을 반환한다.") + void test() { + // given + List users = List.of( + User.builder().id(1L).build(), + User.builder().id(2L).build(), + User.builder().id(3L).build() + ); + when(userRepository.findAllByMeetingId(1L)).thenReturn(users); + Map expected = Map.of( + 1L, User.builder().id(1L).build(), + 2L, User.builder().id(2L).build(), + 3L, User.builder().id(3L).build() + ); + + // when + Map result = userRetrieveService.getUserIdToUserMap(1L); + + // then + assertThat(result).isEqualTo(expected); + } + + @Test + @DisplayName("사용자가 없을 때, 빈 Map을 반환한다.") + void test2() { + // given + when(userRepository.findAllByMeetingId(1L)).thenReturn(Collections.emptyList()); + Map expected = Map.of(); + + // when + Map result = userRetrieveService.getUserIdToUserMap(1L); + + // then + assertThat(result).isEqualTo(expected); + } +} \ No newline at end of file From d38c95f903015e4c6e9157c41a06e36be815a30f Mon Sep 17 00:00:00 2001 From: KWY Date: Thu, 22 Aug 2024 20:57:47 +0900 Subject: [PATCH 06/14] =?UTF-8?q?#322=20[fix]=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EC=A0=84=EC=9A=A9=20meeting=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=ED=9A=8C=EC=9D=98=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=ED=95=A8=EC=88=98=20=EB=A1=9C=EC=A7=81=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit meeting service 내에 많은 관심사가 있어서 조회용 서비스 파일을 만들어서 최적의 회의 시간을 추천하는 함수를 옮겼습니다 --- .../meeting/MeetingRetrieveController.java | 4 +- .../asap/server/service/MeetingService.java | 19 ------- .../meeting/MeetingRetrieveService.java | 57 +++++++++++++++++++ 3 files changed, 60 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java diff --git a/src/main/java/com/asap/server/presentation/controller/meeting/MeetingRetrieveController.java b/src/main/java/com/asap/server/presentation/controller/meeting/MeetingRetrieveController.java index 8b6e2e24..17d4c240 100644 --- a/src/main/java/com/asap/server/presentation/controller/meeting/MeetingRetrieveController.java +++ b/src/main/java/com/asap/server/presentation/controller/meeting/MeetingRetrieveController.java @@ -11,6 +11,7 @@ import com.asap.server.presentation.controller.dto.response.TimeTableResponseDto; import com.asap.server.presentation.controller.meeting.docs.MeetingRetrieveControllerDocs; import com.asap.server.service.MeetingService; +import com.asap.server.service.meeting.MeetingRetrieveService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -21,6 +22,7 @@ @RequiredArgsConstructor public class MeetingRetrieveController implements MeetingRetrieveControllerDocs { private final MeetingService meetingService; + private final MeetingRetrieveService meetingRetrieveService; @GetMapping("/{meetingId}/schedule") @Override @@ -69,7 +71,7 @@ public SuccessResponse getBestMeetingTime( ) { return SuccessResponse.success( Success.BEST_MEETING_SUCCESS, - meetingService.getBestMeetingTime(meetingId, userId) + meetingRetrieveService.getBestMeetingTime(meetingId, userId) ); } } diff --git a/src/main/java/com/asap/server/service/MeetingService.java b/src/main/java/com/asap/server/service/MeetingService.java index a0be6768..71b3af79 100644 --- a/src/main/java/com/asap/server/service/MeetingService.java +++ b/src/main/java/com/asap/server/service/MeetingService.java @@ -49,8 +49,6 @@ public class MeetingService { private final UserService userService; private final AvailableDateService availableDateService; private final JwtService jwtService; - private final MeetingTimeRecommendService meetingTimeRecommendService; - private final UserMeetingScheduleService userMeetingScheduleService; private final PasswordEncoder passwordEncoder; @Transactional @@ -185,21 +183,4 @@ public MeetingTitleResponseDto getIsFixedMeeting(final Long meetingId) throws Co .title(meeting.getTitle()) .build(); } - - public BestMeetingTimeResponseDto getBestMeetingTime(final Long meetingId, final Long userId) { - Meeting meeting = meetingRepository.findById(meetingId) - .orElseThrow(() -> new NotFoundException(Error.MEETING_NOT_FOUND_EXCEPTION)); - - if (!meeting.authenticateHost(userId)) throw new UnauthorizedException(Error.INVALID_MEETING_HOST_EXCEPTION); - if (meeting.isConfirmedMeeting()) throw new ConflictException(MEETING_VALIDATION_FAILED_EXCEPTION); - - int userCount = userService.getMeetingUserCount(meeting); - - List timeBlocks = userMeetingScheduleService.getTimeBlocks(meetingId); - - List bestMeetingTimes = meetingTimeRecommendService.getBestMeetingTime(timeBlocks, meeting.getDuration(), userCount); - List bestMeetingTimeWithUsers = userService.getBestMeetingInUsers(meetingId, bestMeetingTimes); - return BestMeetingTimeResponseDto.of(userCount, bestMeetingTimeWithUsers); - } - } diff --git a/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java new file mode 100644 index 00000000..8c9a9b69 --- /dev/null +++ b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java @@ -0,0 +1,57 @@ +package com.asap.server.service.meeting; + +import static com.asap.server.common.exception.Error.MEETING_VALIDATION_FAILED_EXCEPTION; + +import com.asap.server.common.exception.Error; +import com.asap.server.common.exception.model.ConflictException; +import com.asap.server.common.exception.model.NotFoundException; +import com.asap.server.common.exception.model.UnauthorizedException; +import com.asap.server.persistence.domain.Meeting; +import com.asap.server.persistence.repository.meeting.MeetingRepository; +import com.asap.server.presentation.controller.dto.response.BestMeetingTimeResponseDto; +import com.asap.server.service.UserService; +import com.asap.server.service.meeting.recommend.MeetingTimeRecommendService; +import com.asap.server.service.time.UserMeetingScheduleService; +import com.asap.server.service.time.vo.TimeBlockVo; +import com.asap.server.service.user.UserRetrieveService; +import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MeetingRetrieveService { + private final MeetingRepository meetingRepository; + private final UserService userService; + private final MeetingTimeRecommendService meetingTimeRecommendService; + private final UserMeetingScheduleService userMeetingScheduleService; + + public BestMeetingTimeResponseDto getBestMeetingTime(final Long meetingId, final Long userId) { + Meeting meeting = meetingRepository.findById(meetingId) + .orElseThrow(() -> new NotFoundException(Error.MEETING_NOT_FOUND_EXCEPTION)); + + if (!meeting.authenticateHost(userId)) { + throw new UnauthorizedException(Error.INVALID_MEETING_HOST_EXCEPTION); + } + if (meeting.isConfirmedMeeting()) { + throw new ConflictException(MEETING_VALIDATION_FAILED_EXCEPTION); + } + + int userCount = userService.getMeetingUserCount(meeting); + + List timeBlocks = userMeetingScheduleService.getTimeBlocks(meetingId); + + List bestMeetingTimes = meetingTimeRecommendService.getBestMeetingTime( + timeBlocks, + meeting.getDuration(), + userCount + ); + List bestMeetingTimeWithUsers = userService.getBestMeetingInUsers( + meetingId, + bestMeetingTimes + ); + return BestMeetingTimeResponseDto.of(userCount, bestMeetingTimeWithUsers); + } +} From 3ce7631b494f5f55cc355659b284d9592e3e766d Mon Sep 17 00:00:00 2001 From: KWY Date: Thu, 22 Aug 2024 21:10:54 +0900 Subject: [PATCH 07/14] =?UTF-8?q?#322=20[fix]=20=EC=B4=9D=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=20=EC=88=98=EB=A5=BC=20=EA=B5=AC=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=95=A8=EC=88=98,=20=EC=9C=A0=EC=A0=80=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EC=A0=84=EC=9A=A9=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 최적의 회의 시간에서 사용하는 총 유저 수를 구하는 함수를 유저 조회 전용 클래스를 만든 김에 옮겼습니다. --- src/main/java/com/asap/server/service/UserService.java | 4 ---- .../asap/server/service/meeting/MeetingRetrieveService.java | 4 ++-- .../com/asap/server/service/user/UserRetrieveService.java | 5 +++++ 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/asap/server/service/UserService.java b/src/main/java/com/asap/server/service/UserService.java index 491c3210..c6590acb 100644 --- a/src/main/java/com/asap/server/service/UserService.java +++ b/src/main/java/com/asap/server/service/UserService.java @@ -147,10 +147,6 @@ public void setFixedUsers(final Meeting meeting, final List user userRepository.updateUserIsFixedByMeeting(meeting, userIds); } - public int getMeetingUserCount(final Meeting meeting) { - return userRepository.countByMeeting(meeting); - } - public List getBestMeetingInUsers( final Long meetingId, final List bestMeetingTimes diff --git a/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java index 8c9a9b69..6968c604 100644 --- a/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java +++ b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java @@ -24,7 +24,7 @@ @RequiredArgsConstructor public class MeetingRetrieveService { private final MeetingRepository meetingRepository; - private final UserService userService; + private final UserRetrieveService userRetrieveService; private final MeetingTimeRecommendService meetingTimeRecommendService; private final UserMeetingScheduleService userMeetingScheduleService; @@ -39,7 +39,7 @@ public BestMeetingTimeResponseDto getBestMeetingTime(final Long meetingId, final throw new ConflictException(MEETING_VALIDATION_FAILED_EXCEPTION); } - int userCount = userService.getMeetingUserCount(meeting); + int userCount = userRetrieveService.getMeetingUserCount(meeting); List timeBlocks = userMeetingScheduleService.getTimeBlocks(meetingId); diff --git a/src/main/java/com/asap/server/service/user/UserRetrieveService.java b/src/main/java/com/asap/server/service/user/UserRetrieveService.java index 2be95492..6d4afa78 100644 --- a/src/main/java/com/asap/server/service/user/UserRetrieveService.java +++ b/src/main/java/com/asap/server/service/user/UserRetrieveService.java @@ -1,5 +1,6 @@ package com.asap.server.service.user; +import com.asap.server.persistence.domain.Meeting; import com.asap.server.persistence.domain.user.User; import com.asap.server.persistence.repository.user.UserRepository; import java.util.Map; @@ -12,6 +13,10 @@ public class UserRetrieveService { private final UserRepository userRepository; + public int getMeetingUserCount(final Meeting meeting) { + return userRepository.countByMeeting(meeting); + } + public Map getUserIdToUserMap(final Long meetingId) { return userRepository .findAllByMeetingId(meetingId).stream() From 87a6eabcd079569f1604df9a777dbe9804d7ef21 Mon Sep 17 00:00:00 2001 From: KWY Date: Fri, 23 Aug 2024 10:45:54 +0900 Subject: [PATCH 08/14] =?UTF-8?q?#322=20[feat]=20=EC=B5=9C=EC=A0=81?= =?UTF-8?q?=EC=9D=98=20=ED=9A=8C=EC=9D=98=20=EC=8B=9C=EA=B0=84=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/BestMeetingTimeResponseDto.java | 2 + .../dto/response/MeetingTimeResponseDto.java | 2 + .../meeting/MeetingRetrieveService.java | 30 ++- .../meeting/MeetingRetrieveServiceTest.java | 250 ++++++++++++++++++ 4 files changed, 280 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java diff --git a/src/main/java/com/asap/server/presentation/controller/dto/response/BestMeetingTimeResponseDto.java b/src/main/java/com/asap/server/presentation/controller/dto/response/BestMeetingTimeResponseDto.java index a80e6d48..880663f7 100644 --- a/src/main/java/com/asap/server/presentation/controller/dto/response/BestMeetingTimeResponseDto.java +++ b/src/main/java/com/asap/server/presentation/controller/dto/response/BestMeetingTimeResponseDto.java @@ -2,6 +2,7 @@ import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; @@ -11,6 +12,7 @@ @Getter @ToString @AllArgsConstructor +@EqualsAndHashCode public class BestMeetingTimeResponseDto { private int memberCount; private MeetingTimeResponseDto bestDateTime; diff --git a/src/main/java/com/asap/server/presentation/controller/dto/response/MeetingTimeResponseDto.java b/src/main/java/com/asap/server/presentation/controller/dto/response/MeetingTimeResponseDto.java index d2a7fcb4..e5e79936 100644 --- a/src/main/java/com/asap/server/presentation/controller/dto/response/MeetingTimeResponseDto.java +++ b/src/main/java/com/asap/server/presentation/controller/dto/response/MeetingTimeResponseDto.java @@ -5,12 +5,14 @@ import com.asap.server.service.vo.UserVo; import java.util.List; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; @Getter @ToString @AllArgsConstructor +@EqualsAndHashCode public class MeetingTimeResponseDto { private String month; private String day; diff --git a/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java index 6968c604..f84f3c71 100644 --- a/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java +++ b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java @@ -7,6 +7,7 @@ import com.asap.server.common.exception.model.NotFoundException; import com.asap.server.common.exception.model.UnauthorizedException; import com.asap.server.persistence.domain.Meeting; +import com.asap.server.persistence.domain.user.User; import com.asap.server.persistence.repository.meeting.MeetingRepository; import com.asap.server.presentation.controller.dto.response.BestMeetingTimeResponseDto; import com.asap.server.service.UserService; @@ -16,7 +17,9 @@ import com.asap.server.service.user.UserRetrieveService; import com.asap.server.service.vo.BestMeetingTimeVo; import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; +import com.asap.server.service.vo.UserVo; import java.util.List; +import java.util.Map; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -48,10 +51,29 @@ public BestMeetingTimeResponseDto getBestMeetingTime(final Long meetingId, final meeting.getDuration(), userCount ); - List bestMeetingTimeWithUsers = userService.getBestMeetingInUsers( - meetingId, - bestMeetingTimes - ); + + Map userIdToUserMap = userRetrieveService.getUserIdToUserMap(meetingId); + List bestMeetingTimeWithUsers = bestMeetingTimes.stream() + .map(bestMeetingTime -> { + if (bestMeetingTime == null) { + return null; + } + + List userVos = bestMeetingTime.userIds().stream() + .map(userId2 -> { + User user = userIdToUserMap.get(userId2); + return new UserVo(user.getId(), user.getName()); + }) + .toList(); + + return new BestMeetingTimeWithUsersVo( + bestMeetingTime.date(), + bestMeetingTime.startTime(), + bestMeetingTime.endTime(), + bestMeetingTime.weight(), + userVos + ); + }).toList(); return BestMeetingTimeResponseDto.of(userCount, bestMeetingTimeWithUsers); } } diff --git a/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java b/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java new file mode 100644 index 00000000..d90f35b6 --- /dev/null +++ b/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java @@ -0,0 +1,250 @@ +package com.asap.server.service.meeting; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.mockito.Mockito.when; + +import com.asap.server.persistence.domain.Meeting; +import com.asap.server.persistence.domain.enums.Duration; +import com.asap.server.persistence.domain.enums.TimeSlot; +import com.asap.server.persistence.domain.user.Name; +import com.asap.server.persistence.domain.user.User; +import com.asap.server.persistence.repository.meeting.MeetingRepository; +import com.asap.server.presentation.controller.dto.response.BestMeetingTimeResponseDto; +import com.asap.server.service.meeting.recommend.MeetingTimeRecommendService; +import com.asap.server.service.time.UserMeetingScheduleService; +import com.asap.server.service.time.vo.TimeBlockVo; +import com.asap.server.service.user.UserRetrieveService; +import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; +import com.asap.server.service.vo.UserVo; +import java.time.LocalDate; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class MeetingRetrieveServiceTest { + @Mock + private MeetingRepository meetingRepository; + @Mock + private UserRetrieveService userRetrieveService; + @Mock + private MeetingTimeRecommendService meetingTimeRecommendService; + @Mock + private UserMeetingScheduleService userMeetingScheduleService; + @InjectMocks + private MeetingRetrieveService meetingRetrieveService; + + @Nested + @DisplayName("정상 응답 테스트") + class SuccessTestCase { + @DisplayName("추천된 회의 시간이 1가지 일 때, (회의 시간, null, null)을 반환한다.") + @Test + void test() { + // given + Meeting meeting = Meeting.builder() + .id(1L) + .host(User.builder().id(1L).build()) + .duration(Duration.HALF) + .build(); + User user = User.builder() + .id(1L) + .name(new Name("KWY")) + .build(); + User user2 = User.builder() + .id(2L) + .name(new Name("DSH")) + .build(); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)) + ); + when(meetingRepository.findById(1L)).thenReturn(Optional.of(meeting)); + when(userRetrieveService.getMeetingUserCount(meeting)).thenReturn(2); + when(userMeetingScheduleService.getTimeBlocks(1L)).thenReturn(timeBlocks); + when(meetingTimeRecommendService.getBestMeetingTime(timeBlocks, meeting.getDuration(), 2)).thenReturn( + Arrays.asList( + new BestMeetingTimeVo(LocalDate.of(2024, 7, 9), TimeSlot.SLOT_12_00, TimeSlot.SLOT_12_30, 0, + List.of(1L, 2L)), + null, + null + ) + ); + when(userRetrieveService.getUserIdToUserMap(1L)).thenReturn(Map.of(1L, user, 2L, user2)); + + List bestMeetingTimeWithUsers = Arrays.asList( + new BestMeetingTimeWithUsersVo( + LocalDate.of(2024, 7, 9), + TimeSlot.SLOT_12_00, + TimeSlot.SLOT_12_30, + 0, + List.of( + new UserVo(1L, "KWY"), + new UserVo(2L, "DSH") + ) + ), + null, + null + ); + BestMeetingTimeResponseDto expected = BestMeetingTimeResponseDto.of(2, bestMeetingTimeWithUsers); + + // when + BestMeetingTimeResponseDto result = meetingRetrieveService.getBestMeetingTime(1L, 1L); + + // then + assertThat(expected).isEqualTo(result); + } + + @DisplayName("추천된 회의 시간이 2가지 일 때, (회의 시간1, 회의 시간2, null)을 반환한다.") + @Test + void test2() { + // given + Meeting meeting = Meeting.builder() + .id(1L) + .host(User.builder().id(1L).build()) + .duration(Duration.HALF) + .build(); + User user = User.builder() + .id(1L) + .name(new Name("KWY")) + .build(); + User user2 = User.builder() + .id(2L) + .name(new Name("DSH")) + .build(); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)) + ); + when(meetingRepository.findById(1L)).thenReturn(Optional.of(meeting)); + when(userRetrieveService.getMeetingUserCount(meeting)).thenReturn(2); + when(userMeetingScheduleService.getTimeBlocks(1L)).thenReturn(timeBlocks); + when(meetingTimeRecommendService.getBestMeetingTime(timeBlocks, meeting.getDuration(), 2)).thenReturn( + Arrays.asList( + new BestMeetingTimeVo(LocalDate.of(2024, 7, 9), TimeSlot.SLOT_12_00, TimeSlot.SLOT_12_30, 0, + List.of(1L, 2L)), + new BestMeetingTimeVo(LocalDate.of(2024, 7, 9), TimeSlot.SLOT_13_00, TimeSlot.SLOT_13_30, 0, + List.of(1L, 2L)), + null + ) + ); + when(userRetrieveService.getUserIdToUserMap(1L)).thenReturn(Map.of(1L, user, 2L, user2)); + + List bestMeetingTimeWithUsers = Arrays.asList( + new BestMeetingTimeWithUsersVo( + LocalDate.of(2024, 7, 9), + TimeSlot.SLOT_12_00, + TimeSlot.SLOT_12_30, + 0, + List.of( + new UserVo(1L, "KWY"), + new UserVo(2L, "DSH") + ) + ), + new BestMeetingTimeWithUsersVo( + LocalDate.of(2024, 7, 9), + TimeSlot.SLOT_13_00, + TimeSlot.SLOT_13_30, + 0, + List.of( + new UserVo(1L, "KWY"), + new UserVo(2L, "DSH") + ) + ), + null + ); + BestMeetingTimeResponseDto expected = BestMeetingTimeResponseDto.of(2, bestMeetingTimeWithUsers); + + // when + BestMeetingTimeResponseDto result = meetingRetrieveService.getBestMeetingTime(1L, 1L); + + // then + assertThat(expected).isEqualTo(result); + } + + @DisplayName("추천된 회의 시간이 3가지 일 때, (회의 시간1, 회의 시간2, 회의 시간3)을 반환한다.") + @Test + void test3() { + // given + Meeting meeting = Meeting.builder() + .id(1L) + .host(User.builder().id(1L).build()) + .duration(Duration.HALF) + .build(); + User user = User.builder() + .id(1L) + .name(new Name("KWY")) + .build(); + User user2 = User.builder() + .id(2L) + .name(new Name("DSH")) + .build(); + List timeBlocks = List.of( + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_12_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_13_00, 0, List.of(1L, 2L)), + new TimeBlockVo(LocalDate.of(2024, 7, 10), TimeSlot.SLOT_14_00, 0, List.of(1L, 2L)) + ); + when(meetingRepository.findById(1L)).thenReturn(Optional.of(meeting)); + when(userRetrieveService.getMeetingUserCount(meeting)).thenReturn(2); + when(userMeetingScheduleService.getTimeBlocks(1L)).thenReturn(timeBlocks); + when(meetingTimeRecommendService.getBestMeetingTime(timeBlocks, meeting.getDuration(), 2)).thenReturn( + Arrays.asList( + new BestMeetingTimeVo(LocalDate.of(2024, 7, 9), TimeSlot.SLOT_12_00, TimeSlot.SLOT_12_30, 0, + List.of(1L, 2L)), + new BestMeetingTimeVo(LocalDate.of(2024, 7, 9), TimeSlot.SLOT_13_00, TimeSlot.SLOT_13_30, 0, + List.of(1L, 2L)), + new BestMeetingTimeVo(LocalDate.of(2024, 7, 9), TimeSlot.SLOT_14_00, TimeSlot.SLOT_14_30, 0, + List.of(1L, 2L)) + ) + ); + when(userRetrieveService.getUserIdToUserMap(1L)).thenReturn(Map.of(1L, user, 2L, user2)); + + List bestMeetingTimeWithUsers = Arrays.asList( + new BestMeetingTimeWithUsersVo( + LocalDate.of(2024, 7, 9), + TimeSlot.SLOT_12_00, + TimeSlot.SLOT_12_30, + 0, + List.of( + new UserVo(1L, "KWY"), + new UserVo(2L, "DSH") + ) + ), + new BestMeetingTimeWithUsersVo( + LocalDate.of(2024, 7, 9), + TimeSlot.SLOT_13_00, + TimeSlot.SLOT_13_30, + 0, + List.of( + new UserVo(1L, "KWY"), + new UserVo(2L, "DSH") + ) + ), + new BestMeetingTimeWithUsersVo( + LocalDate.of(2024, 7, 9), + TimeSlot.SLOT_14_00, + TimeSlot.SLOT_14_30, + 0, + List.of( + new UserVo(1L, "KWY"), + new UserVo(2L, "DSH") + ) + ) + ); + BestMeetingTimeResponseDto expected = BestMeetingTimeResponseDto.of(2, bestMeetingTimeWithUsers); + + // when + BestMeetingTimeResponseDto result = meetingRetrieveService.getBestMeetingTime(1L, 1L); + + // then + assertThat(expected).isEqualTo(result); + } + } +} \ No newline at end of file From 50e430f20788539dc778d07693d402d1ac0782ac Mon Sep 17 00:00:00 2001 From: KWY Date: Fri, 23 Aug 2024 11:21:39 +0900 Subject: [PATCH 09/14] =?UTF-8?q?#322=20[refactor]=20=EA=B4=80=EC=8B=AC?= =?UTF-8?q?=EC=82=AC=20=EB=B3=84=20=ED=95=A8=EC=88=98=EB=A5=BC=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/MeetingRetrieveService.java | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java index f84f3c71..02bc635c 100644 --- a/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java +++ b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java @@ -10,7 +10,6 @@ import com.asap.server.persistence.domain.user.User; import com.asap.server.persistence.repository.meeting.MeetingRepository; import com.asap.server.presentation.controller.dto.response.BestMeetingTimeResponseDto; -import com.asap.server.service.UserService; import com.asap.server.service.meeting.recommend.MeetingTimeRecommendService; import com.asap.server.service.time.UserMeetingScheduleService; import com.asap.server.service.time.vo.TimeBlockVo; @@ -54,26 +53,32 @@ public BestMeetingTimeResponseDto getBestMeetingTime(final Long meetingId, final Map userIdToUserMap = userRetrieveService.getUserIdToUserMap(meetingId); List bestMeetingTimeWithUsers = bestMeetingTimes.stream() - .map(bestMeetingTime -> { - if (bestMeetingTime == null) { - return null; - } + .map(bestMeetingTime -> mapToBestMeetingTimeWithUsers(bestMeetingTime, userIdToUserMap)) + .toList(); + return BestMeetingTimeResponseDto.of(userCount, bestMeetingTimeWithUsers); + } + + private BestMeetingTimeWithUsersVo mapToBestMeetingTimeWithUsers( + final BestMeetingTimeVo bestMeetingTime, + final Map userIdToUserMap + ) { + if (bestMeetingTime == null) { + return null; + } - List userVos = bestMeetingTime.userIds().stream() - .map(userId2 -> { - User user = userIdToUserMap.get(userId2); - return new UserVo(user.getId(), user.getName()); - }) - .toList(); + List userVos = bestMeetingTime.userIds().stream() + .map(userId -> { + User user = userIdToUserMap.get(userId); + return new UserVo(user.getId(), user.getName()); + }) + .toList(); - return new BestMeetingTimeWithUsersVo( - bestMeetingTime.date(), - bestMeetingTime.startTime(), - bestMeetingTime.endTime(), - bestMeetingTime.weight(), - userVos - ); - }).toList(); - return BestMeetingTimeResponseDto.of(userCount, bestMeetingTimeWithUsers); + return new BestMeetingTimeWithUsersVo( + bestMeetingTime.date(), + bestMeetingTime.startTime(), + bestMeetingTime.endTime(), + bestMeetingTime.weight(), + userVos + ); } } From 6b802230812987d4ffd6f42e9a2cc87646acf4a7 Mon Sep 17 00:00:00 2001 From: KWY Date: Fri, 23 Aug 2024 21:12:23 +0900 Subject: [PATCH 10/14] =?UTF-8?q?#322=20[chore]=20meeting=20service=20?= =?UTF-8?q?=EB=82=B4=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20import=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/asap/server/service/MeetingService.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/com/asap/server/service/MeetingService.java b/src/main/java/com/asap/server/service/MeetingService.java index 71b3af79..55e1cc00 100644 --- a/src/main/java/com/asap/server/service/MeetingService.java +++ b/src/main/java/com/asap/server/service/MeetingService.java @@ -20,17 +20,11 @@ import com.asap.server.presentation.controller.dto.request.MeetingConfirmRequestDto; import com.asap.server.presentation.controller.dto.request.MeetingSaveRequestDto; import com.asap.server.presentation.controller.dto.response.AvailableDatesDto; -import com.asap.server.presentation.controller.dto.response.BestMeetingTimeResponseDto; import com.asap.server.presentation.controller.dto.response.FixedMeetingResponseDto; import com.asap.server.presentation.controller.dto.response.MeetingSaveResponseDto; import com.asap.server.presentation.controller.dto.response.MeetingScheduleResponseDto; import com.asap.server.presentation.controller.dto.response.MeetingTitleResponseDto; import com.asap.server.presentation.controller.dto.response.TimeTableResponseDto; -import com.asap.server.service.meeting.recommend.MeetingTimeRecommendService; -import com.asap.server.service.time.UserMeetingScheduleService; -import com.asap.server.service.time.vo.TimeBlockVo; -import com.asap.server.service.vo.BestMeetingTimeVo; -import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; From adb83d50407766f6329a56a5687c7b2a1ed86894 Mon Sep 17 00:00:00 2001 From: KWY Date: Fri, 23 Aug 2024 21:29:41 +0900 Subject: [PATCH 11/14] =?UTF-8?q?#322=20[feat]=20service=20-=20controller?= =?UTF-8?q?=20=EA=B0=84=20dto=EB=A5=BC=20=ED=86=B5=ED=95=B4=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=A0=84=EB=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/BestMeetingTimeResponseDto.java | 37 +++++-------------- .../meeting/MeetingRetrieveController.java | 2 +- .../meeting/MeetingRetrieveService.java | 6 ++- .../meeting/dto/BestMeetingTimeDto.java | 30 +++++++++++++++ .../meeting/MeetingRetrieveServiceTest.java | 13 ++++--- 5 files changed, 52 insertions(+), 36 deletions(-) create mode 100644 src/main/java/com/asap/server/service/meeting/dto/BestMeetingTimeDto.java diff --git a/src/main/java/com/asap/server/presentation/controller/dto/response/BestMeetingTimeResponseDto.java b/src/main/java/com/asap/server/presentation/controller/dto/response/BestMeetingTimeResponseDto.java index 880663f7..2ff8b25b 100644 --- a/src/main/java/com/asap/server/presentation/controller/dto/response/BestMeetingTimeResponseDto.java +++ b/src/main/java/com/asap/server/presentation/controller/dto/response/BestMeetingTimeResponseDto.java @@ -1,35 +1,18 @@ package com.asap.server.presentation.controller.dto.response; -import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; - -import java.util.Arrays; +import com.asap.server.service.meeting.dto.BestMeetingTimeDto; import java.util.List; -@Getter -@ToString -@AllArgsConstructor -@EqualsAndHashCode -public class BestMeetingTimeResponseDto { - private int memberCount; - private MeetingTimeResponseDto bestDateTime; - private List otherDateTimes; - - private static final int FIRST_BEST_MEETING_INDEX = 0; - private static final int SECOND_BEST_MEETING_INDEX = 1; - private static final int THIRD_BEST_MEETING_INDEX = 2; - - public static BestMeetingTimeResponseDto of(int memberCount, List bestMeetingTimes) { +public record BestMeetingTimeResponseDto( + int memberCount, + MeetingTimeResponseDto bestDateTime, + List otherDateTimes +) { + public static BestMeetingTimeResponseDto of(final BestMeetingTimeDto bestMeetingTimeDto) { return new BestMeetingTimeResponseDto( - memberCount, - MeetingTimeResponseDto.of(bestMeetingTimes.get(FIRST_BEST_MEETING_INDEX)), - Arrays.asList( - MeetingTimeResponseDto.of(bestMeetingTimes.get(SECOND_BEST_MEETING_INDEX)), - MeetingTimeResponseDto.of(bestMeetingTimes.get(THIRD_BEST_MEETING_INDEX)) - ) + bestMeetingTimeDto.memberCount(), + bestMeetingTimeDto.bestDateTime(), + bestMeetingTimeDto.otherDateTimes() ); } } diff --git a/src/main/java/com/asap/server/presentation/controller/meeting/MeetingRetrieveController.java b/src/main/java/com/asap/server/presentation/controller/meeting/MeetingRetrieveController.java index 17d4c240..e89302af 100644 --- a/src/main/java/com/asap/server/presentation/controller/meeting/MeetingRetrieveController.java +++ b/src/main/java/com/asap/server/presentation/controller/meeting/MeetingRetrieveController.java @@ -71,7 +71,7 @@ public SuccessResponse getBestMeetingTime( ) { return SuccessResponse.success( Success.BEST_MEETING_SUCCESS, - meetingRetrieveService.getBestMeetingTime(meetingId, userId) + BestMeetingTimeResponseDto.of(meetingRetrieveService.getBestMeetingTime(meetingId, userId)) ); } } diff --git a/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java index 02bc635c..caa6c82b 100644 --- a/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java +++ b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java @@ -10,6 +10,7 @@ import com.asap.server.persistence.domain.user.User; import com.asap.server.persistence.repository.meeting.MeetingRepository; import com.asap.server.presentation.controller.dto.response.BestMeetingTimeResponseDto; +import com.asap.server.service.meeting.dto.BestMeetingTimeDto; import com.asap.server.service.meeting.recommend.MeetingTimeRecommendService; import com.asap.server.service.time.UserMeetingScheduleService; import com.asap.server.service.time.vo.TimeBlockVo; @@ -30,7 +31,7 @@ public class MeetingRetrieveService { private final MeetingTimeRecommendService meetingTimeRecommendService; private final UserMeetingScheduleService userMeetingScheduleService; - public BestMeetingTimeResponseDto getBestMeetingTime(final Long meetingId, final Long userId) { + public BestMeetingTimeDto getBestMeetingTime(final Long meetingId, final Long userId) { Meeting meeting = meetingRepository.findById(meetingId) .orElseThrow(() -> new NotFoundException(Error.MEETING_NOT_FOUND_EXCEPTION)); @@ -55,7 +56,8 @@ public BestMeetingTimeResponseDto getBestMeetingTime(final Long meetingId, final List bestMeetingTimeWithUsers = bestMeetingTimes.stream() .map(bestMeetingTime -> mapToBestMeetingTimeWithUsers(bestMeetingTime, userIdToUserMap)) .toList(); - return BestMeetingTimeResponseDto.of(userCount, bestMeetingTimeWithUsers); + + return BestMeetingTimeDto.of(userCount, bestMeetingTimeWithUsers); } private BestMeetingTimeWithUsersVo mapToBestMeetingTimeWithUsers( diff --git a/src/main/java/com/asap/server/service/meeting/dto/BestMeetingTimeDto.java b/src/main/java/com/asap/server/service/meeting/dto/BestMeetingTimeDto.java new file mode 100644 index 00000000..98765df7 --- /dev/null +++ b/src/main/java/com/asap/server/service/meeting/dto/BestMeetingTimeDto.java @@ -0,0 +1,30 @@ +package com.asap.server.service.meeting.dto; + +import com.asap.server.presentation.controller.dto.response.MeetingTimeResponseDto; +import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; +import java.util.Arrays; +import java.util.List; + +public record BestMeetingTimeDto( + int memberCount, + MeetingTimeResponseDto bestDateTime, + List otherDateTimes +) { + private static final int FIRST_BEST_MEETING_INDEX = 0; + private static final int SECOND_BEST_MEETING_INDEX = 1; + private static final int THIRD_BEST_MEETING_INDEX = 2; + + public static BestMeetingTimeDto of( + final int memberCount, + final List bestMeetingTimes + ) { + return new BestMeetingTimeDto( + memberCount, + MeetingTimeResponseDto.of(bestMeetingTimes.get(FIRST_BEST_MEETING_INDEX)), + Arrays.asList( + MeetingTimeResponseDto.of(bestMeetingTimes.get(SECOND_BEST_MEETING_INDEX)), + MeetingTimeResponseDto.of(bestMeetingTimes.get(THIRD_BEST_MEETING_INDEX)) + ) + ); + } +} diff --git a/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java b/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java index d90f35b6..019c1b2e 100644 --- a/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java +++ b/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java @@ -10,6 +10,7 @@ import com.asap.server.persistence.domain.user.User; import com.asap.server.persistence.repository.meeting.MeetingRepository; import com.asap.server.presentation.controller.dto.response.BestMeetingTimeResponseDto; +import com.asap.server.service.meeting.dto.BestMeetingTimeDto; import com.asap.server.service.meeting.recommend.MeetingTimeRecommendService; import com.asap.server.service.time.UserMeetingScheduleService; import com.asap.server.service.time.vo.TimeBlockVo; @@ -93,10 +94,10 @@ void test() { null, null ); - BestMeetingTimeResponseDto expected = BestMeetingTimeResponseDto.of(2, bestMeetingTimeWithUsers); + BestMeetingTimeDto expected = BestMeetingTimeDto.of(2, bestMeetingTimeWithUsers); // when - BestMeetingTimeResponseDto result = meetingRetrieveService.getBestMeetingTime(1L, 1L); + BestMeetingTimeDto result = meetingRetrieveService.getBestMeetingTime(1L, 1L); // then assertThat(expected).isEqualTo(result); @@ -160,10 +161,10 @@ void test2() { ), null ); - BestMeetingTimeResponseDto expected = BestMeetingTimeResponseDto.of(2, bestMeetingTimeWithUsers); + BestMeetingTimeDto expected = BestMeetingTimeDto.of(2, bestMeetingTimeWithUsers); // when - BestMeetingTimeResponseDto result = meetingRetrieveService.getBestMeetingTime(1L, 1L); + BestMeetingTimeDto result = meetingRetrieveService.getBestMeetingTime(1L, 1L); // then assertThat(expected).isEqualTo(result); @@ -238,10 +239,10 @@ void test3() { ) ) ); - BestMeetingTimeResponseDto expected = BestMeetingTimeResponseDto.of(2, bestMeetingTimeWithUsers); + BestMeetingTimeDto expected = BestMeetingTimeDto.of(2, bestMeetingTimeWithUsers); // when - BestMeetingTimeResponseDto result = meetingRetrieveService.getBestMeetingTime(1L, 1L); + BestMeetingTimeDto result = meetingRetrieveService.getBestMeetingTime(1L, 1L); // then assertThat(expected).isEqualTo(result); From c3d9ae3519709137067ae990c6e62590b6d89cfd Mon Sep 17 00:00:00 2001 From: KWY Date: Fri, 23 Aug 2024 21:45:45 +0900 Subject: [PATCH 12/14] =?UTF-8?q?#322=20[fix]=20user=20meeting=20schedule?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EC=8B=9C=20=EC=95=84=EA=B7=9C=EB=A8=BC?= =?UTF-8?q?=ED=8A=B8=20=EC=88=9C=EC=84=9C=20=EC=9E=AC=EB=B0=B0=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/asap/server/service/UserService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/asap/server/service/UserService.java b/src/main/java/com/asap/server/service/UserService.java index c6590acb..2566b85b 100644 --- a/src/main/java/com/asap/server/service/UserService.java +++ b/src/main/java/com/asap/server/service/UserService.java @@ -11,18 +11,18 @@ import com.asap.server.common.jwt.JwtService; import com.asap.server.persistence.domain.AvailableDate; import com.asap.server.persistence.domain.Meeting; -import com.asap.server.persistence.domain.user.Name; -import com.asap.server.persistence.domain.user.User; import com.asap.server.persistence.domain.enums.Role; import com.asap.server.persistence.domain.enums.TimeSlot; +import com.asap.server.persistence.domain.user.Name; +import com.asap.server.persistence.domain.user.User; import com.asap.server.persistence.repository.meeting.MeetingRepository; import com.asap.server.persistence.repository.user.UserRepository; import com.asap.server.presentation.controller.dto.request.UserRequestDto; import com.asap.server.presentation.controller.dto.response.UserMeetingTimeResponseDto; import com.asap.server.presentation.controller.dto.response.UserTimeResponseDto; +import com.asap.server.service.time.UserMeetingScheduleService; import com.asap.server.service.time.dto.UserMeetingScheduleRegisterDto; import com.asap.server.service.time.dto.UserTimeRegisterDto; -import com.asap.server.service.time.UserMeetingScheduleService; import com.asap.server.service.vo.BestMeetingTimeVo; import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; import com.asap.server.service.vo.UserVo; @@ -113,7 +113,7 @@ private void createUserTimeBlock(final Meeting meeting, .stream() .map(timeSlot -> timeBlockService.searchTimeBlock(timeSlot, availableDate, registerDto.priority())).toList() .forEach(timeBlock -> timeBlock.addTimeBlockUsers(timeBlockUserService.create(timeBlock, user))); - userMeetingScheduleService.createUserMeetingSchedule(meeting.getId(), user.getId(), registerDto); + userMeetingScheduleService.createUserMeetingSchedule(user.getId(), meeting.getId(), registerDto); } private void isDuplicatedDate(final List registerDto) { From c2a181be8972b58b7d3c430462f06c9092b1852e Mon Sep 17 00:00:00 2001 From: KWY Date: Fri, 23 Aug 2024 21:52:56 +0900 Subject: [PATCH 13/14] =?UTF-8?q?#322=20[chore]=20=ED=9A=8C=EC=9D=98=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20=EC=B6=94=EC=B2=9C=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=84=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit meeting 패키지에 있는 최적의 회의 시간 추천 service 는 회의 시간 추천이 주요 관심사이기 때문에 meeting 보다 time 패키지가 더 적합하다고 판단했습니다. --- .../repository/user/UserRepositoryCustom.java | 4 +- .../repository/user/UserRepositoryImpl.java | 4 +- .../dto/response/MeetingTimeResponseDto.java | 8 +-- .../com/asap/server/service/UserService.java | 14 ++--- .../meeting/MeetingRetrieveService.java | 21 ++++---- .../meeting/dto/BestMeetingTimeDto.java | 4 +- .../server/service/meeting/dto/UserDto.java | 7 +++ .../MeetingTimeRecommendService.java | 12 ++--- .../strategy/BestMeetingTimeStrategy.java | 4 +- .../ContinuousMeetingTimeStrategy.java | 4 +- .../strategy/MeetingTimeCasesStrategy.java | 4 +- .../impl/BestMeetingTimeStrategyImpl.java | 6 +-- .../ContinuousMeetingTimeStrategyImpl.java | 6 +-- .../impl/MeetingTimeCasesStrategyImpl.java | 6 +-- .../{ => time}/vo/BestMeetingTimeVo.java | 2 +- .../vo/BestMeetingTimeWithUsers.java} | 13 ++--- .../{ => time}/vo/PossibleTimeCaseVo.java | 2 +- .../com/asap/server/service/vo/UserVo.java | 12 ----- .../meeting/MeetingRetrieveServiceTest.java | 51 +++++++++---------- .../MeetingTimeRecommendServiceTest.java | 11 ++-- .../impl/BestMeetingTimeStrategyImplTest.java | 6 +-- ...ContinuousMeetingTimeStrategyImplTest.java | 6 +-- .../impl/MeetingTimeCasesStrategyTest.java | 6 +-- 23 files changed, 104 insertions(+), 109 deletions(-) create mode 100644 src/main/java/com/asap/server/service/meeting/dto/UserDto.java rename src/main/java/com/asap/server/service/{meeting/recommend => time}/MeetingTimeRecommendService.java (85%) rename src/main/java/com/asap/server/service/{meeting/recommend => time}/strategy/BestMeetingTimeStrategy.java (66%) rename src/main/java/com/asap/server/service/{meeting/recommend => time}/strategy/ContinuousMeetingTimeStrategy.java (70%) rename src/main/java/com/asap/server/service/{meeting/recommend => time}/strategy/MeetingTimeCasesStrategy.java (64%) rename src/main/java/com/asap/server/service/{meeting/recommend => time}/strategy/impl/BestMeetingTimeStrategyImpl.java (90%) rename src/main/java/com/asap/server/service/{meeting/recommend => time}/strategy/impl/ContinuousMeetingTimeStrategyImpl.java (95%) rename src/main/java/com/asap/server/service/{meeting/recommend => time}/strategy/impl/MeetingTimeCasesStrategyImpl.java (96%) rename src/main/java/com/asap/server/service/{ => time}/vo/BestMeetingTimeVo.java (85%) rename src/main/java/com/asap/server/service/{vo/BestMeetingTimeWithUsersVo.java => time/vo/BestMeetingTimeWithUsers.java} (63%) rename src/main/java/com/asap/server/service/{ => time}/vo/PossibleTimeCaseVo.java (76%) delete mode 100644 src/main/java/com/asap/server/service/vo/UserVo.java rename src/test/java/com/asap/server/service/{meeting/recommend => time}/MeetingTimeRecommendServiceTest.java (96%) rename src/test/java/com/asap/server/service/{meeting/recommend => time}/strategy/impl/BestMeetingTimeStrategyImplTest.java (98%) rename src/test/java/com/asap/server/service/{meeting/recommend => time}/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java (98%) rename src/test/java/com/asap/server/service/{meeting/recommend => time}/strategy/impl/MeetingTimeCasesStrategyTest.java (99%) diff --git a/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryCustom.java b/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryCustom.java index 1a1a7a66..174a0b83 100644 --- a/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryCustom.java +++ b/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryCustom.java @@ -2,7 +2,7 @@ import com.asap.server.persistence.domain.Meeting; import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.service.vo.UserVo; +import com.asap.server.service.meeting.dto.UserDto; import java.time.LocalDate; import java.util.List; @@ -10,5 +10,5 @@ public interface UserRepositoryCustom { void updateUserIsFixedByMeeting(final Meeting meeting, final List users); - List findByAvailableDateAndTimeSlots(Long meetingId, LocalDate availableDate, List timeSlots); + List findByAvailableDateAndTimeSlots(Long meetingId, LocalDate availableDate, List timeSlots); } diff --git a/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryImpl.java b/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryImpl.java index a0c5ce35..dd0fbabc 100644 --- a/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryImpl.java +++ b/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryImpl.java @@ -7,8 +7,8 @@ import com.asap.server.persistence.domain.Meeting; import com.asap.server.persistence.domain.enums.TimeSlot; +import com.asap.server.service.meeting.dto.UserDto; import com.asap.server.service.vo.QUserVo; -import com.asap.server.service.vo.UserVo; import com.querydsl.jpa.impl.JPAQueryFactory; import java.time.LocalDate; import java.util.List; @@ -30,7 +30,7 @@ public void updateUserIsFixedByMeeting(Meeting meeting, List users) { } @Override - public List findByAvailableDateAndTimeSlots( + public List findByAvailableDateAndTimeSlots( Long meetingId, LocalDate date, List timeSlots diff --git a/src/main/java/com/asap/server/presentation/controller/dto/response/MeetingTimeResponseDto.java b/src/main/java/com/asap/server/presentation/controller/dto/response/MeetingTimeResponseDto.java index e5e79936..49cfd5a1 100644 --- a/src/main/java/com/asap/server/presentation/controller/dto/response/MeetingTimeResponseDto.java +++ b/src/main/java/com/asap/server/presentation/controller/dto/response/MeetingTimeResponseDto.java @@ -1,8 +1,8 @@ package com.asap.server.presentation.controller.dto.response; import com.asap.server.common.utils.DateUtil; -import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; -import com.asap.server.service.vo.UserVo; +import com.asap.server.service.meeting.dto.UserDto; +import com.asap.server.service.time.vo.BestMeetingTimeWithUsers; import java.util.List; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; @@ -19,9 +19,9 @@ public class MeetingTimeResponseDto { private String dayOfWeek; private String startTime; private String endTime; - private List users; + private List users; - public static MeetingTimeResponseDto of(BestMeetingTimeWithUsersVo bestMeetingTime) { + public static MeetingTimeResponseDto of(BestMeetingTimeWithUsers bestMeetingTime) { if (bestMeetingTime == null) return null; return new MeetingTimeResponseDto( DateUtil.getMonth(bestMeetingTime.date()), diff --git a/src/main/java/com/asap/server/service/UserService.java b/src/main/java/com/asap/server/service/UserService.java index 2566b85b..9fd6e9d3 100644 --- a/src/main/java/com/asap/server/service/UserService.java +++ b/src/main/java/com/asap/server/service/UserService.java @@ -23,9 +23,9 @@ import com.asap.server.service.time.UserMeetingScheduleService; import com.asap.server.service.time.dto.UserMeetingScheduleRegisterDto; import com.asap.server.service.time.dto.UserTimeRegisterDto; -import com.asap.server.service.vo.BestMeetingTimeVo; -import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; -import com.asap.server.service.vo.UserVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; +import com.asap.server.service.time.vo.BestMeetingTimeWithUsers; +import com.asap.server.service.meeting.dto.UserDto; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -147,7 +147,7 @@ public void setFixedUsers(final Meeting meeting, final List user userRepository.updateUserIsFixedByMeeting(meeting, userIds); } - public List getBestMeetingInUsers( + public List getBestMeetingInUsers( final Long meetingId, final List bestMeetingTimes ) { @@ -156,7 +156,7 @@ public List getBestMeetingInUsers( .collect(Collectors.toList()); } - private BestMeetingTimeWithUsersVo getBestMeetingTimeInUsers( + private BestMeetingTimeWithUsers getBestMeetingTimeInUsers( final Long meetingId, final BestMeetingTimeVo bestMeetingTime ) { @@ -165,8 +165,8 @@ private BestMeetingTimeWithUsersVo getBestMeetingTimeInUsers( } List timeSlots = TimeSlot.getTimeSlots(bestMeetingTime.startTime().ordinal(), bestMeetingTime.endTime().ordinal() - 1); - List users = userRepository.findByAvailableDateAndTimeSlots(meetingId, bestMeetingTime.date(), + List users = userRepository.findByAvailableDateAndTimeSlots(meetingId, bestMeetingTime.date(), timeSlots); - return BestMeetingTimeWithUsersVo.of(bestMeetingTime, users); + return BestMeetingTimeWithUsers.of(bestMeetingTime, users); } } diff --git a/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java index caa6c82b..203cedef 100644 --- a/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java +++ b/src/main/java/com/asap/server/service/meeting/MeetingRetrieveService.java @@ -9,15 +9,14 @@ import com.asap.server.persistence.domain.Meeting; import com.asap.server.persistence.domain.user.User; import com.asap.server.persistence.repository.meeting.MeetingRepository; -import com.asap.server.presentation.controller.dto.response.BestMeetingTimeResponseDto; import com.asap.server.service.meeting.dto.BestMeetingTimeDto; -import com.asap.server.service.meeting.recommend.MeetingTimeRecommendService; +import com.asap.server.service.meeting.dto.UserDto; +import com.asap.server.service.time.MeetingTimeRecommendService; import com.asap.server.service.time.UserMeetingScheduleService; import com.asap.server.service.time.vo.TimeBlockVo; import com.asap.server.service.user.UserRetrieveService; -import com.asap.server.service.vo.BestMeetingTimeVo; -import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; -import com.asap.server.service.vo.UserVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; +import com.asap.server.service.time.vo.BestMeetingTimeWithUsers; import java.util.List; import java.util.Map; import lombok.RequiredArgsConstructor; @@ -53,14 +52,14 @@ public BestMeetingTimeDto getBestMeetingTime(final Long meetingId, final Long us ); Map userIdToUserMap = userRetrieveService.getUserIdToUserMap(meetingId); - List bestMeetingTimeWithUsers = bestMeetingTimes.stream() + List bestMeetingTimeWithUsers = bestMeetingTimes.stream() .map(bestMeetingTime -> mapToBestMeetingTimeWithUsers(bestMeetingTime, userIdToUserMap)) .toList(); return BestMeetingTimeDto.of(userCount, bestMeetingTimeWithUsers); } - private BestMeetingTimeWithUsersVo mapToBestMeetingTimeWithUsers( + private BestMeetingTimeWithUsers mapToBestMeetingTimeWithUsers( final BestMeetingTimeVo bestMeetingTime, final Map userIdToUserMap ) { @@ -68,19 +67,19 @@ private BestMeetingTimeWithUsersVo mapToBestMeetingTimeWithUsers( return null; } - List userVos = bestMeetingTime.userIds().stream() + List userDtos = bestMeetingTime.userIds().stream() .map(userId -> { User user = userIdToUserMap.get(userId); - return new UserVo(user.getId(), user.getName()); + return new UserDto(user.getId(), user.getName()); }) .toList(); - return new BestMeetingTimeWithUsersVo( + return new BestMeetingTimeWithUsers( bestMeetingTime.date(), bestMeetingTime.startTime(), bestMeetingTime.endTime(), bestMeetingTime.weight(), - userVos + userDtos ); } } diff --git a/src/main/java/com/asap/server/service/meeting/dto/BestMeetingTimeDto.java b/src/main/java/com/asap/server/service/meeting/dto/BestMeetingTimeDto.java index 98765df7..86a1daf9 100644 --- a/src/main/java/com/asap/server/service/meeting/dto/BestMeetingTimeDto.java +++ b/src/main/java/com/asap/server/service/meeting/dto/BestMeetingTimeDto.java @@ -1,7 +1,7 @@ package com.asap.server.service.meeting.dto; import com.asap.server.presentation.controller.dto.response.MeetingTimeResponseDto; -import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; +import com.asap.server.service.time.vo.BestMeetingTimeWithUsers; import java.util.Arrays; import java.util.List; @@ -16,7 +16,7 @@ public record BestMeetingTimeDto( public static BestMeetingTimeDto of( final int memberCount, - final List bestMeetingTimes + final List bestMeetingTimes ) { return new BestMeetingTimeDto( memberCount, diff --git a/src/main/java/com/asap/server/service/meeting/dto/UserDto.java b/src/main/java/com/asap/server/service/meeting/dto/UserDto.java new file mode 100644 index 00000000..fec865dc --- /dev/null +++ b/src/main/java/com/asap/server/service/meeting/dto/UserDto.java @@ -0,0 +1,7 @@ +package com.asap.server.service.meeting.dto; + +public record UserDto( + Long id, + String name +) { +} diff --git a/src/main/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendService.java b/src/main/java/com/asap/server/service/time/MeetingTimeRecommendService.java similarity index 85% rename from src/main/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendService.java rename to src/main/java/com/asap/server/service/time/MeetingTimeRecommendService.java index b6335436..671aa280 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendService.java +++ b/src/main/java/com/asap/server/service/time/MeetingTimeRecommendService.java @@ -1,12 +1,12 @@ -package com.asap.server.service.meeting.recommend; +package com.asap.server.service.time; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.service.meeting.recommend.strategy.BestMeetingTimeStrategy; -import com.asap.server.service.meeting.recommend.strategy.ContinuousMeetingTimeStrategy; -import com.asap.server.service.meeting.recommend.strategy.MeetingTimeCasesStrategy; +import com.asap.server.service.time.strategy.BestMeetingTimeStrategy; +import com.asap.server.service.time.strategy.ContinuousMeetingTimeStrategy; +import com.asap.server.service.time.strategy.MeetingTimeCasesStrategy; import com.asap.server.service.time.vo.TimeBlockVo; -import com.asap.server.service.vo.BestMeetingTimeVo; -import com.asap.server.service.vo.PossibleTimeCaseVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; +import com.asap.server.service.time.vo.PossibleTimeCaseVo; import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/BestMeetingTimeStrategy.java b/src/main/java/com/asap/server/service/time/strategy/BestMeetingTimeStrategy.java similarity index 66% rename from src/main/java/com/asap/server/service/meeting/recommend/strategy/BestMeetingTimeStrategy.java rename to src/main/java/com/asap/server/service/time/strategy/BestMeetingTimeStrategy.java index ba2378d2..11b28865 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/BestMeetingTimeStrategy.java +++ b/src/main/java/com/asap/server/service/time/strategy/BestMeetingTimeStrategy.java @@ -1,7 +1,7 @@ -package com.asap.server.service.meeting.recommend.strategy; +package com.asap.server.service.time.strategy; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; import java.util.List; public interface BestMeetingTimeStrategy { diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/ContinuousMeetingTimeStrategy.java b/src/main/java/com/asap/server/service/time/strategy/ContinuousMeetingTimeStrategy.java similarity index 70% rename from src/main/java/com/asap/server/service/meeting/recommend/strategy/ContinuousMeetingTimeStrategy.java rename to src/main/java/com/asap/server/service/time/strategy/ContinuousMeetingTimeStrategy.java index 81a741fb..8dad06f1 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/ContinuousMeetingTimeStrategy.java +++ b/src/main/java/com/asap/server/service/time/strategy/ContinuousMeetingTimeStrategy.java @@ -1,8 +1,8 @@ -package com.asap.server.service.meeting.recommend.strategy; +package com.asap.server.service.time.strategy; import com.asap.server.persistence.domain.enums.Duration; import com.asap.server.service.time.vo.TimeBlockVo; -import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; import java.util.List; public interface ContinuousMeetingTimeStrategy { diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/MeetingTimeCasesStrategy.java b/src/main/java/com/asap/server/service/time/strategy/MeetingTimeCasesStrategy.java similarity index 64% rename from src/main/java/com/asap/server/service/meeting/recommend/strategy/MeetingTimeCasesStrategy.java rename to src/main/java/com/asap/server/service/time/strategy/MeetingTimeCasesStrategy.java index 49a4f332..4eb22221 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/MeetingTimeCasesStrategy.java +++ b/src/main/java/com/asap/server/service/time/strategy/MeetingTimeCasesStrategy.java @@ -1,7 +1,7 @@ -package com.asap.server.service.meeting.recommend.strategy; +package com.asap.server.service.time.strategy; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.service.vo.PossibleTimeCaseVo; +import com.asap.server.service.time.vo.PossibleTimeCaseVo; import java.util.List; public interface MeetingTimeCasesStrategy { diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImpl.java b/src/main/java/com/asap/server/service/time/strategy/impl/BestMeetingTimeStrategyImpl.java similarity index 90% rename from src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImpl.java rename to src/main/java/com/asap/server/service/time/strategy/impl/BestMeetingTimeStrategyImpl.java index 48358a9e..8df6e980 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImpl.java +++ b/src/main/java/com/asap/server/service/time/strategy/impl/BestMeetingTimeStrategyImpl.java @@ -1,9 +1,9 @@ -package com.asap.server.service.meeting.recommend.strategy.impl; +package com.asap.server.service.time.strategy.impl; import com.asap.server.persistence.domain.enums.Duration; import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.service.meeting.recommend.strategy.BestMeetingTimeStrategy; -import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.service.time.strategy.BestMeetingTimeStrategy; +import com.asap.server.service.time.vo.BestMeetingTimeVo; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java b/src/main/java/com/asap/server/service/time/strategy/impl/ContinuousMeetingTimeStrategyImpl.java similarity index 95% rename from src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java rename to src/main/java/com/asap/server/service/time/strategy/impl/ContinuousMeetingTimeStrategyImpl.java index e5af609f..68e0f176 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImpl.java +++ b/src/main/java/com/asap/server/service/time/strategy/impl/ContinuousMeetingTimeStrategyImpl.java @@ -1,10 +1,10 @@ -package com.asap.server.service.meeting.recommend.strategy.impl; +package com.asap.server.service.time.strategy.impl; import com.asap.server.persistence.domain.enums.Duration; import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.service.meeting.recommend.strategy.ContinuousMeetingTimeStrategy; +import com.asap.server.service.time.strategy.ContinuousMeetingTimeStrategy; import com.asap.server.service.time.vo.TimeBlockVo; -import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/MeetingTimeCasesStrategyImpl.java b/src/main/java/com/asap/server/service/time/strategy/impl/MeetingTimeCasesStrategyImpl.java similarity index 96% rename from src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/MeetingTimeCasesStrategyImpl.java rename to src/main/java/com/asap/server/service/time/strategy/impl/MeetingTimeCasesStrategyImpl.java index 989026b0..62ef4c4a 100644 --- a/src/main/java/com/asap/server/service/meeting/recommend/strategy/impl/MeetingTimeCasesStrategyImpl.java +++ b/src/main/java/com/asap/server/service/time/strategy/impl/MeetingTimeCasesStrategyImpl.java @@ -1,8 +1,8 @@ -package com.asap.server.service.meeting.recommend.strategy.impl; +package com.asap.server.service.time.strategy.impl; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.service.meeting.recommend.strategy.MeetingTimeCasesStrategy; -import com.asap.server.service.vo.PossibleTimeCaseVo; +import com.asap.server.service.time.strategy.MeetingTimeCasesStrategy; +import com.asap.server.service.time.vo.PossibleTimeCaseVo; import org.springframework.stereotype.Component; import java.util.ArrayList; diff --git a/src/main/java/com/asap/server/service/vo/BestMeetingTimeVo.java b/src/main/java/com/asap/server/service/time/vo/BestMeetingTimeVo.java similarity index 85% rename from src/main/java/com/asap/server/service/vo/BestMeetingTimeVo.java rename to src/main/java/com/asap/server/service/time/vo/BestMeetingTimeVo.java index 722f3f86..47430dc1 100644 --- a/src/main/java/com/asap/server/service/vo/BestMeetingTimeVo.java +++ b/src/main/java/com/asap/server/service/time/vo/BestMeetingTimeVo.java @@ -1,4 +1,4 @@ -package com.asap.server.service.vo; +package com.asap.server.service.time.vo; import com.asap.server.persistence.domain.enums.TimeSlot; diff --git a/src/main/java/com/asap/server/service/vo/BestMeetingTimeWithUsersVo.java b/src/main/java/com/asap/server/service/time/vo/BestMeetingTimeWithUsers.java similarity index 63% rename from src/main/java/com/asap/server/service/vo/BestMeetingTimeWithUsersVo.java rename to src/main/java/com/asap/server/service/time/vo/BestMeetingTimeWithUsers.java index 9b46afe2..5390354a 100644 --- a/src/main/java/com/asap/server/service/vo/BestMeetingTimeWithUsersVo.java +++ b/src/main/java/com/asap/server/service/time/vo/BestMeetingTimeWithUsers.java @@ -1,22 +1,23 @@ -package com.asap.server.service.vo; +package com.asap.server.service.time.vo; import com.asap.server.persistence.domain.enums.TimeSlot; +import com.asap.server.service.meeting.dto.UserDto; import java.time.LocalDate; import java.util.List; -public record BestMeetingTimeWithUsersVo( +public record BestMeetingTimeWithUsers( LocalDate date, TimeSlot startTime, TimeSlot endTime, int weight, - List users + List users ) { - public static BestMeetingTimeWithUsersVo of( + public static BestMeetingTimeWithUsers of( final BestMeetingTimeVo bestMeetingTimeVo, - final List users + final List users ) { - return new BestMeetingTimeWithUsersVo( + return new BestMeetingTimeWithUsers( bestMeetingTimeVo.date(), bestMeetingTimeVo.startTime(), bestMeetingTimeVo.endTime(), diff --git a/src/main/java/com/asap/server/service/vo/PossibleTimeCaseVo.java b/src/main/java/com/asap/server/service/time/vo/PossibleTimeCaseVo.java similarity index 76% rename from src/main/java/com/asap/server/service/vo/PossibleTimeCaseVo.java rename to src/main/java/com/asap/server/service/time/vo/PossibleTimeCaseVo.java index 78e9c733..43916489 100644 --- a/src/main/java/com/asap/server/service/vo/PossibleTimeCaseVo.java +++ b/src/main/java/com/asap/server/service/time/vo/PossibleTimeCaseVo.java @@ -1,4 +1,4 @@ -package com.asap.server.service.vo; +package com.asap.server.service.time.vo; import com.asap.server.persistence.domain.enums.Duration; diff --git a/src/main/java/com/asap/server/service/vo/UserVo.java b/src/main/java/com/asap/server/service/vo/UserVo.java deleted file mode 100644 index f7ce13f8..00000000 --- a/src/main/java/com/asap/server/service/vo/UserVo.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.asap.server.service.vo; - -import com.querydsl.core.annotations.QueryProjection; - -public record UserVo( - Long id, - String name -) { - @QueryProjection - public UserVo { - } -} diff --git a/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java b/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java index 019c1b2e..25cc970c 100644 --- a/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java +++ b/src/test/java/com/asap/server/service/meeting/MeetingRetrieveServiceTest.java @@ -9,15 +9,14 @@ import com.asap.server.persistence.domain.user.Name; import com.asap.server.persistence.domain.user.User; import com.asap.server.persistence.repository.meeting.MeetingRepository; -import com.asap.server.presentation.controller.dto.response.BestMeetingTimeResponseDto; import com.asap.server.service.meeting.dto.BestMeetingTimeDto; -import com.asap.server.service.meeting.recommend.MeetingTimeRecommendService; +import com.asap.server.service.meeting.dto.UserDto; +import com.asap.server.service.time.MeetingTimeRecommendService; import com.asap.server.service.time.UserMeetingScheduleService; import com.asap.server.service.time.vo.TimeBlockVo; import com.asap.server.service.user.UserRetrieveService; -import com.asap.server.service.vo.BestMeetingTimeVo; -import com.asap.server.service.vo.BestMeetingTimeWithUsersVo; -import com.asap.server.service.vo.UserVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; +import com.asap.server.service.time.vo.BestMeetingTimeWithUsers; import java.time.LocalDate; import java.util.Arrays; import java.util.List; @@ -80,15 +79,15 @@ void test() { ); when(userRetrieveService.getUserIdToUserMap(1L)).thenReturn(Map.of(1L, user, 2L, user2)); - List bestMeetingTimeWithUsers = Arrays.asList( - new BestMeetingTimeWithUsersVo( + List bestMeetingTimeWithUsers = Arrays.asList( + new BestMeetingTimeWithUsers( LocalDate.of(2024, 7, 9), TimeSlot.SLOT_12_00, TimeSlot.SLOT_12_30, 0, List.of( - new UserVo(1L, "KWY"), - new UserVo(2L, "DSH") + new UserDto(1L, "KWY"), + new UserDto(2L, "DSH") ) ), null, @@ -138,25 +137,25 @@ void test2() { ); when(userRetrieveService.getUserIdToUserMap(1L)).thenReturn(Map.of(1L, user, 2L, user2)); - List bestMeetingTimeWithUsers = Arrays.asList( - new BestMeetingTimeWithUsersVo( + List bestMeetingTimeWithUsers = Arrays.asList( + new BestMeetingTimeWithUsers( LocalDate.of(2024, 7, 9), TimeSlot.SLOT_12_00, TimeSlot.SLOT_12_30, 0, List.of( - new UserVo(1L, "KWY"), - new UserVo(2L, "DSH") + new UserDto(1L, "KWY"), + new UserDto(2L, "DSH") ) ), - new BestMeetingTimeWithUsersVo( + new BestMeetingTimeWithUsers( LocalDate.of(2024, 7, 9), TimeSlot.SLOT_13_00, TimeSlot.SLOT_13_30, 0, List.of( - new UserVo(1L, "KWY"), - new UserVo(2L, "DSH") + new UserDto(1L, "KWY"), + new UserDto(2L, "DSH") ) ), null @@ -207,35 +206,35 @@ void test3() { ); when(userRetrieveService.getUserIdToUserMap(1L)).thenReturn(Map.of(1L, user, 2L, user2)); - List bestMeetingTimeWithUsers = Arrays.asList( - new BestMeetingTimeWithUsersVo( + List bestMeetingTimeWithUsers = Arrays.asList( + new BestMeetingTimeWithUsers( LocalDate.of(2024, 7, 9), TimeSlot.SLOT_12_00, TimeSlot.SLOT_12_30, 0, List.of( - new UserVo(1L, "KWY"), - new UserVo(2L, "DSH") + new UserDto(1L, "KWY"), + new UserDto(2L, "DSH") ) ), - new BestMeetingTimeWithUsersVo( + new BestMeetingTimeWithUsers( LocalDate.of(2024, 7, 9), TimeSlot.SLOT_13_00, TimeSlot.SLOT_13_30, 0, List.of( - new UserVo(1L, "KWY"), - new UserVo(2L, "DSH") + new UserDto(1L, "KWY"), + new UserDto(2L, "DSH") ) ), - new BestMeetingTimeWithUsersVo( + new BestMeetingTimeWithUsers( LocalDate.of(2024, 7, 9), TimeSlot.SLOT_14_00, TimeSlot.SLOT_14_30, 0, List.of( - new UserVo(1L, "KWY"), - new UserVo(2L, "DSH") + new UserDto(1L, "KWY"), + new UserDto(2L, "DSH") ) ) ); diff --git a/src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java b/src/test/java/com/asap/server/service/time/MeetingTimeRecommendServiceTest.java similarity index 96% rename from src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java rename to src/test/java/com/asap/server/service/time/MeetingTimeRecommendServiceTest.java index cf9c4025..dd510059 100644 --- a/src/test/java/com/asap/server/service/meeting/recommend/MeetingTimeRecommendServiceTest.java +++ b/src/test/java/com/asap/server/service/time/MeetingTimeRecommendServiceTest.java @@ -1,4 +1,4 @@ -package com.asap.server.service.meeting.recommend; +package com.asap.server.service.time; import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_12_00; import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_12_30; @@ -10,11 +10,12 @@ import com.asap.server.persistence.domain.enums.Duration; import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.service.meeting.recommend.strategy.impl.BestMeetingTimeStrategyImpl; -import com.asap.server.service.meeting.recommend.strategy.impl.ContinuousMeetingTimeStrategyImpl; -import com.asap.server.service.meeting.recommend.strategy.impl.MeetingTimeCasesStrategyImpl; +import com.asap.server.service.time.MeetingTimeRecommendService; +import com.asap.server.service.time.strategy.impl.BestMeetingTimeStrategyImpl; +import com.asap.server.service.time.strategy.impl.ContinuousMeetingTimeStrategyImpl; +import com.asap.server.service.time.strategy.impl.MeetingTimeCasesStrategyImpl; import com.asap.server.service.time.vo.TimeBlockVo; -import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; import java.time.LocalDate; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImplTest.java b/src/test/java/com/asap/server/service/time/strategy/impl/BestMeetingTimeStrategyImplTest.java similarity index 98% rename from src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImplTest.java rename to src/test/java/com/asap/server/service/time/strategy/impl/BestMeetingTimeStrategyImplTest.java index 8163f7bd..b878072d 100644 --- a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/BestMeetingTimeStrategyImplTest.java +++ b/src/test/java/com/asap/server/service/time/strategy/impl/BestMeetingTimeStrategyImplTest.java @@ -1,11 +1,11 @@ -package com.asap.server.service.meeting.recommend.strategy.impl; +package com.asap.server.service.time.strategy.impl; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import com.asap.server.persistence.domain.enums.Duration; import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.service.meeting.recommend.strategy.BestMeetingTimeStrategy; -import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.service.time.strategy.BestMeetingTimeStrategy; +import com.asap.server.service.time.vo.BestMeetingTimeVo; import java.time.LocalDate; import java.util.List; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java b/src/test/java/com/asap/server/service/time/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java similarity index 98% rename from src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java rename to src/test/java/com/asap/server/service/time/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java index 1bc31758..c6e457a8 100644 --- a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java +++ b/src/test/java/com/asap/server/service/time/strategy/impl/ContinuousMeetingTimeStrategyImplTest.java @@ -1,4 +1,4 @@ -package com.asap.server.service.meeting.recommend.strategy.impl; +package com.asap.server.service.time.strategy.impl; import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_12_00; import static com.asap.server.persistence.domain.enums.TimeSlot.SLOT_12_30; @@ -18,9 +18,9 @@ import com.asap.server.persistence.domain.enums.Duration; import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.service.meeting.recommend.strategy.ContinuousMeetingTimeStrategy; +import com.asap.server.service.time.strategy.ContinuousMeetingTimeStrategy; import com.asap.server.service.time.vo.TimeBlockVo; -import com.asap.server.service.vo.BestMeetingTimeVo; +import com.asap.server.service.time.vo.BestMeetingTimeVo; import java.time.LocalDate; import java.util.List; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/MeetingTimeCasesStrategyTest.java b/src/test/java/com/asap/server/service/time/strategy/impl/MeetingTimeCasesStrategyTest.java similarity index 99% rename from src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/MeetingTimeCasesStrategyTest.java rename to src/test/java/com/asap/server/service/time/strategy/impl/MeetingTimeCasesStrategyTest.java index fdf0e12d..99cf8896 100644 --- a/src/test/java/com/asap/server/service/meeting/recommend/strategy/impl/MeetingTimeCasesStrategyTest.java +++ b/src/test/java/com/asap/server/service/time/strategy/impl/MeetingTimeCasesStrategyTest.java @@ -1,9 +1,9 @@ -package com.asap.server.service.meeting.recommend.strategy.impl; +package com.asap.server.service.time.strategy.impl; import com.asap.server.persistence.domain.enums.Duration; -import com.asap.server.service.meeting.recommend.strategy.MeetingTimeCasesStrategy; -import com.asap.server.service.vo.PossibleTimeCaseVo; +import com.asap.server.service.time.strategy.MeetingTimeCasesStrategy; +import com.asap.server.service.time.vo.PossibleTimeCaseVo; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; From 5673bd39a9074626e3ebf436dc9ba01986529fbe Mon Sep 17 00:00:00 2001 From: KWY Date: Fri, 23 Aug 2024 21:55:01 +0900 Subject: [PATCH 14/14] =?UTF-8?q?#322=20[feat]=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=ED=95=A8=EC=88=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/user/UserRepositoryCustom.java | 6 ---- .../repository/user/UserRepositoryImpl.java | 31 ------------------- .../com/asap/server/service/UserService.java | 26 ---------------- 3 files changed, 63 deletions(-) diff --git a/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryCustom.java b/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryCustom.java index 174a0b83..99e8e230 100644 --- a/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryCustom.java +++ b/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryCustom.java @@ -1,14 +1,8 @@ package com.asap.server.persistence.repository.user; import com.asap.server.persistence.domain.Meeting; -import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.service.meeting.dto.UserDto; - -import java.time.LocalDate; import java.util.List; public interface UserRepositoryCustom { void updateUserIsFixedByMeeting(final Meeting meeting, final List users); - - List findByAvailableDateAndTimeSlots(Long meetingId, LocalDate availableDate, List timeSlots); } diff --git a/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryImpl.java b/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryImpl.java index dd0fbabc..b7795fa3 100644 --- a/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryImpl.java +++ b/src/main/java/com/asap/server/persistence/repository/user/UserRepositoryImpl.java @@ -1,16 +1,9 @@ package com.asap.server.persistence.repository.user; -import static com.asap.server.persistence.domain.QAvailableDate.availableDate; -import static com.asap.server.persistence.domain.QTimeBlock.timeBlock; -import static com.asap.server.persistence.domain.QTimeBlockUser.timeBlockUser; import static com.asap.server.persistence.domain.user.QUser.user; import com.asap.server.persistence.domain.Meeting; -import com.asap.server.persistence.domain.enums.TimeSlot; -import com.asap.server.service.meeting.dto.UserDto; -import com.asap.server.service.vo.QUserVo; import com.querydsl.jpa.impl.JPAQueryFactory; -import java.time.LocalDate; import java.util.List; import lombok.RequiredArgsConstructor; @@ -28,28 +21,4 @@ public void updateUserIsFixedByMeeting(Meeting meeting, List users) { ) .execute(); } - - @Override - public List findByAvailableDateAndTimeSlots( - Long meetingId, - LocalDate date, - List timeSlots - ) { - return queryFactory.select( - new QUserVo( - user.id, - user.name.value - ) - ).from(timeBlockUser) - .innerJoin(timeBlock).on(timeBlockUser.timeBlock.id.eq(timeBlock.id)) - .innerJoin(user).on(timeBlockUser.user.id.eq(user.id)) - .innerJoin(availableDate).on(timeBlock.availableDate.id.eq(availableDate.id)) - .where( - availableDate.date.eq(date) - .and(availableDate.meeting.id.eq(meetingId)) - .and(timeBlock.timeSlot.in(timeSlots)) - ) - .groupBy(user.id) - .fetch(); - } } diff --git a/src/main/java/com/asap/server/service/UserService.java b/src/main/java/com/asap/server/service/UserService.java index 9fd6e9d3..4e1883b2 100644 --- a/src/main/java/com/asap/server/service/UserService.java +++ b/src/main/java/com/asap/server/service/UserService.java @@ -23,9 +23,6 @@ import com.asap.server.service.time.UserMeetingScheduleService; import com.asap.server.service.time.dto.UserMeetingScheduleRegisterDto; import com.asap.server.service.time.dto.UserTimeRegisterDto; -import com.asap.server.service.time.vo.BestMeetingTimeVo; -import com.asap.server.service.time.vo.BestMeetingTimeWithUsers; -import com.asap.server.service.meeting.dto.UserDto; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -146,27 +143,4 @@ public void setFixedUsers(final Meeting meeting, final List user .collect(Collectors.toList()); userRepository.updateUserIsFixedByMeeting(meeting, userIds); } - - public List getBestMeetingInUsers( - final Long meetingId, - final List bestMeetingTimes - ) { - return bestMeetingTimes.stream() - .map(bestMeetingTime -> getBestMeetingTimeInUsers(meetingId, bestMeetingTime)) - .collect(Collectors.toList()); - } - - private BestMeetingTimeWithUsers getBestMeetingTimeInUsers( - final Long meetingId, - final BestMeetingTimeVo bestMeetingTime - ) { - if (bestMeetingTime == null) { - return null; - } - List timeSlots = TimeSlot.getTimeSlots(bestMeetingTime.startTime().ordinal(), - bestMeetingTime.endTime().ordinal() - 1); - List users = userRepository.findByAvailableDateAndTimeSlots(meetingId, bestMeetingTime.date(), - timeSlots); - return BestMeetingTimeWithUsers.of(bestMeetingTime, users); - } }