Skip to content

Commit

Permalink
Merge pull request #323 from ASAP-as-soon-as-possible/feat/#322
Browse files Browse the repository at this point in the history
#322 [feat] 테이블 변경에 따른 최적의 회의 시간 로직 리팩토링
  • Loading branch information
KWY0218 authored Aug 23, 2024
2 parents 9e7fe30 + 5673bd3 commit 7ceb146
Show file tree
Hide file tree
Showing 37 changed files with 797 additions and 617 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import java.util.List;
import java.util.Optional;

public interface TimeBlockRepository extends Repository<TimeBlock, Long>, TimeBlockRepositoryCustom {
public interface TimeBlockRepository extends Repository<TimeBlock, Long> {

void save(final TimeBlock timeBlock);

Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,6 @@ public interface UserRepository extends Repository<User, Long>, UserRepositoryCu
List<User> findByMeeting(final Meeting meeting);

int countByMeeting(final Meeting meeting);

List<User> findAllByMeetingId(final long meetingId);
}
Original file line number Diff line number Diff line change
@@ -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.vo.UserVo;

import java.time.LocalDate;
import java.util.List;

public interface UserRepositoryCustom {
void updateUserIsFixedByMeeting(final Meeting meeting, final List<Long> users);

List<UserVo> findByAvailableDateAndTimeSlots(Long meetingId, LocalDate availableDate, List<TimeSlot> timeSlots);
}
Original file line number Diff line number Diff line change
@@ -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.vo.QUserVo;
import com.asap.server.service.vo.UserVo;
import com.querydsl.jpa.impl.JPAQueryFactory;
import java.time.LocalDate;
import java.util.List;
import lombok.RequiredArgsConstructor;

Expand All @@ -28,28 +21,4 @@ public void updateUserIsFixedByMeeting(Meeting meeting, List<Long> users) {
)
.execute();
}

@Override
public List<UserVo> findByAvailableDateAndTimeSlots(
Long meetingId,
LocalDate date,
List<TimeSlot> 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();
}
}
Original file line number Diff line number Diff line change
@@ -1,33 +1,18 @@
package com.asap.server.presentation.controller.dto.response;

import com.asap.server.service.vo.BestMeetingTimeWithUsersVo;
import lombok.AllArgsConstructor;
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
public class BestMeetingTimeResponseDto {
private int memberCount;
private MeetingTimeResponseDto bestDateTime;
private List<MeetingTimeResponseDto> 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<BestMeetingTimeWithUsersVo> bestMeetingTimes) {
public record BestMeetingTimeResponseDto(
int memberCount,
MeetingTimeResponseDto bestDateTime,
List<MeetingTimeResponseDto> 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()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,27 @@
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;
import lombok.Getter;
import lombok.ToString;

@Getter
@ToString
@AllArgsConstructor
@EqualsAndHashCode
public class MeetingTimeResponseDto {
private String month;
private String day;
private String dayOfWeek;
private String startTime;
private String endTime;
private List<UserVo> users;
private List<UserDto> 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()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -21,6 +22,7 @@
@RequiredArgsConstructor
public class MeetingRetrieveController implements MeetingRetrieveControllerDocs {
private final MeetingService meetingService;
private final MeetingRetrieveService meetingRetrieveService;

@GetMapping("/{meetingId}/schedule")
@Override
Expand Down Expand Up @@ -69,7 +71,7 @@ public SuccessResponse<BestMeetingTimeResponseDto> getBestMeetingTime(
) {
return SuccessResponse.success(
Success.BEST_MEETING_SUCCESS,
meetingService.getBestMeetingTime(meetingId, userId)
BestMeetingTimeResponseDto.of(meetingRetrieveService.getBestMeetingTime(meetingId, userId))
);
}
}
26 changes: 1 addition & 25 deletions src/main/java/com/asap/server/service/MeetingService.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,18 @@
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;
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.vo.BestMeetingTimeVo;
import com.asap.server.service.vo.BestMeetingTimeWithUsersVo;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
Expand All @@ -49,8 +43,6 @@ public class MeetingService {
private final UserService userService;
private final AvailableDateService availableDateService;
private final JwtService jwtService;
private final MeetingTimeRecommendService meetingTimeRecommendService;
private final TimeBlockRepository timeBlockRepository;
private final PasswordEncoder passwordEncoder;

@Transactional
Expand Down Expand Up @@ -185,20 +177,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<TimeBlockDto> timeBlocks = timeBlockRepository.findAllTimeBlockByMeeting(meetingId);

List<BestMeetingTimeVo> bestMeetingTimes = meetingTimeRecommendService.getBestMeetingTime(timeBlocks, meeting.getDuration(), userCount);
List<BestMeetingTimeWithUsersVo> bestMeetingTimeWithUsers = userService.getBestMeetingInUsers(meetingId, bestMeetingTimes);
return BestMeetingTimeResponseDto.of(userCount, bestMeetingTimeWithUsers);
}

}
38 changes: 4 additions & 34 deletions src/main/java/com/asap/server/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +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;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -113,7 +110,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<UserMeetingScheduleRegisterDto> registerDto) {
Expand Down Expand Up @@ -146,31 +143,4 @@ public void setFixedUsers(final Meeting meeting, final List<UserRequestDto> user
.collect(Collectors.toList());
userRepository.updateUserIsFixedByMeeting(meeting, userIds);
}

public int getMeetingUserCount(final Meeting meeting) {
return userRepository.countByMeeting(meeting);
}

public List<BestMeetingTimeWithUsersVo> getBestMeetingInUsers(
final Long meetingId,
final List<BestMeetingTimeVo> bestMeetingTimes
) {
return bestMeetingTimes.stream()
.map(bestMeetingTime -> getBestMeetingTimeInUsers(meetingId, bestMeetingTime))
.collect(Collectors.toList());
}

private BestMeetingTimeWithUsersVo getBestMeetingTimeInUsers(
final Long meetingId,
final BestMeetingTimeVo bestMeetingTime
) {
if (bestMeetingTime == null) {
return null;
}
List<TimeSlot> timeSlots = TimeSlot.getTimeSlots(bestMeetingTime.startTime().ordinal(),
bestMeetingTime.endTime().ordinal() - 1);
List<UserVo> users = userRepository.findByAvailableDateAndTimeSlots(meetingId, bestMeetingTime.date(),
timeSlots);
return BestMeetingTimeWithUsersVo.of(bestMeetingTime, users);
}
}
Loading

0 comments on commit 7ceb146

Please sign in to comment.