Skip to content

Commit

Permalink
refactor(MemberController): 스케줄 생성시 약속 잠금 검증 로직 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
ikjo39 committed Jul 30, 2024
1 parent 85ceeb1 commit 41831ab
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;
import java.util.stream.Collectors;
import kr.momo.domain.attendee.Attendee;
import kr.momo.domain.availabledate.AvailableDate;
import kr.momo.domain.availabledate.AvailableDates;
Expand All @@ -15,14 +14,15 @@ public record MeetingResponse(
String meetingName,
@JsonFormat(shape = Shape.STRING, pattern = "HH:mm", timezone = "Asia/Seoul") LocalTime firstTime,
@JsonFormat(shape = Shape.STRING, pattern = "HH:mm", timezone = "Asia/Seoul") LocalTime lastTime,
boolean isLocked,
List<LocalDate> availableDates,
List<String> attendeeNames
) {

public static MeetingResponse of(Meeting meeting, AvailableDates availableDates, List<Attendee> attendees) {
List<LocalDate> dates = availableDates.getAvailableDates().stream()
.map(AvailableDate::getDate)
.collect(Collectors.toList());
.toList();

List<String> attendeeNames = attendees.stream()
.map(Attendee::name)
Expand All @@ -32,6 +32,7 @@ public static MeetingResponse of(Meeting meeting, AvailableDates availableDates,
meeting.getName(),
meeting.startTimeslotTime(),
meeting.endTimeslotTime(),
meeting.isLocked(),
dates,
attendeeNames
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ public class ScheduleService {
public void create(String uuid, long attendeeId, ScheduleCreateRequest request) {
Meeting meeting = meetingRepository.findByUuid(uuid)
.orElseThrow(() -> new MomoException(MeetingErrorCode.INVALID_UUID));
validateMeetingLocked(meeting);

Attendee attendee = attendeeRepository.findByIdAndMeeting(attendeeId, meeting)
.orElseThrow(() -> new MomoException(AttendeeErrorCode.INVALID_ATTENDEE));

Expand All @@ -47,6 +49,12 @@ public void create(String uuid, long attendeeId, ScheduleCreateRequest request)
scheduleRepository.saveAll(schedules);
}

private void validateMeetingLocked(Meeting meeting) {
if (meeting.isLocked()) {
throw new MomoException(MeetingErrorCode.ALREADY_LOCKED);
}
}

private List<Schedule> createSchedules(ScheduleCreateRequest request, Meeting meeting, Attendee attendee) {
AvailableDates availableDates = new AvailableDates(availableDateRepository.findAllByMeeting(meeting));
return request.dateTimes().stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.SoftAssertions.assertSoftly;
import static org.junit.jupiter.api.Assertions.assertAll;

import java.time.LocalDate;
import java.time.LocalTime;
Expand Down Expand Up @@ -57,13 +57,14 @@ void findByUUID() {

MeetingResponse response = meetingService.findByUUID(meeting.getUuid());

assertSoftly(softAssertions -> {
softAssertions.assertThat(response.firstTime()).isEqualTo(meeting.startTimeslotTime());
softAssertions.assertThat(response.lastTime()).isEqualTo(meeting.endTimeslotTime());
softAssertions.assertThat(response.meetingName()).isEqualTo(meeting.getName());
softAssertions.assertThat(response.availableDates().size()).isEqualTo(availableDates.size());
softAssertions.assertThat(response.attendeeNames()).isEqualTo(List.of(attendee.name()));
});
assertAll(
() -> assertThat(response.firstTime()).isEqualTo(meeting.startTimeslotTime()),
() -> assertThat(response.lastTime()).isEqualTo(meeting.endTimeslotTime()),
() -> assertThat(response.meetingName()).isEqualTo(meeting.getName()),
() -> assertThat(response.isLocked()).isFalse(),
() -> assertThat(response.availableDates()).hasSize(availableDates.size()),
() -> assertThat(response.attendeeNames()).isEqualTo(List.of(attendee.name()))
);
}

@DisplayName("생성 완료된 약속의 정보를 조회한다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,14 +76,30 @@ void setUp() {
);
}

@DisplayName("스케줄 생성 시 사용자의 기존 스케줄들을 모두 삭제하고 새로운 스케줄을 저장한다.")
@Test
void createSchedulesReplacesOldSchedules() {
ScheduleCreateRequest request = new ScheduleCreateRequest(attendee.name(), dateTimes);
scheduleRepository.saveAll(List.of(
new Schedule(attendee, today, Timeslot.TIME_0130),
new Schedule(attendee, tomorrow, Timeslot.TIME_0130)
));

scheduleService.create(meeting.getUuid(), attendee.getId(), request);
long scheduleCount = scheduleRepository.count();

assertThat(scheduleCount).isEqualTo(4);
}

@DisplayName("스케줄 생성 요청의 UUID가 존재하지 않으면 예외를 발생시킨다.")
@Test
void throwsExceptionWhenInvalidUUID() {
Meeting other = MeetingFixture.DINNER.create();
String invalidUUID = other.getUuid();
long attendeeId = attendee.getId();
ScheduleCreateRequest request = new ScheduleCreateRequest(attendee.name(), dateTimes);

assertThatThrownBy(() -> scheduleService.create(other.getUuid(), attendeeId, request))
assertThatThrownBy(() -> scheduleService.create(invalidUUID, attendeeId, request))
.isInstanceOf(MomoException.class)
.hasMessage(MeetingErrorCode.INVALID_UUID.message());
}
Expand All @@ -101,19 +117,19 @@ void throwsExceptionWhenInvalidAttendee() {
.hasMessage(AttendeeErrorCode.INVALID_ATTENDEE.message());
}

@DisplayName("스케줄 생성 시 사용자의 기존 스케줄들을 모두 삭제하고 새로운 스케줄을 저장한다.")
@DisplayName("스케줄 생성시 약속이 잠겨있다면 예외를 발생시킨다.")
@Test
void createSchedulesReplacesOldSchedules() {
void throwsExceptionWhenMeetingLocked() {
Meeting game = MeetingFixture.GAME.create();
game.lock();
Meeting lockedMeeting = meetingRepository.save(game);
ScheduleCreateRequest request = new ScheduleCreateRequest(attendee.name(), dateTimes);
scheduleRepository.saveAll(List.of(
new Schedule(attendee, today, Timeslot.TIME_0130),
new Schedule(attendee, tomorrow, Timeslot.TIME_0130)
));

scheduleService.create(meeting.getUuid(), attendee.getId(), request);
long scheduleCount = scheduleRepository.count();
String givenUUID = lockedMeeting.getUuid();
Long givenAttendeeId = attendee.getId();

assertThat(scheduleCount).isEqualTo(4);
assertThatThrownBy(() -> scheduleService.create(givenUUID, givenAttendeeId, request))
.isInstanceOf(MomoException.class)
.hasMessage(MeetingErrorCode.ALREADY_LOCKED.message());
}

/* dummy data table
Expand Down

0 comments on commit 41831ab

Please sign in to comment.