Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BE] 도메인 설계 수정 반영 #27

Merged
merged 14 commits into from
Jul 18, 2024
Merged
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.woowacourse.momo.controller.meeting;

import com.woowacourse.momo.controller.MomoApiResponse;
import com.woowacourse.momo.service.meeting.dto.MeetingResponse;
import com.woowacourse.momo.service.meeting.MeetingService;
import com.woowacourse.momo.service.meeting.dto.MeetingResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,47 @@
package com.woowacourse.momo.domain.guest;
package com.woowacourse.momo.domain.attendee;

import com.woowacourse.momo.domain.BaseEntity;
import com.woowacourse.momo.domain.meeting.Meeting;
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Table(name = "guest")
@Table(name = "attendee")
@Entity
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Guest extends BaseEntity {
public class Attendee extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "meeting_id", nullable = false)
private Meeting meeting;

@Embedded
@Column(nullable = false, length = 20)
private GuestName name;
private AttendeeName name;

@Column(nullable = false)
private String password;

@Enumerated(EnumType.STRING)
@Column(length = 10)
private Role role;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.woowacourse.momo.domain.guest;
package com.woowacourse.momo.domain.attendee;

import jakarta.persistence.Embeddable;
import lombok.AccessLevel;
Expand All @@ -8,11 +8,11 @@
@Embeddable
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class GuestName {
public class AttendeeName {

private String name;

public GuestName(String name) {
public AttendeeName(String name) {
validateNameLength(name);
this.name = name;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.woowacourse.momo.domain.attendee;

import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;

public interface AttendeeRepository extends JpaRepository<Attendee, Long> {

Optional<Attendee> findByName(AttendeeName name);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.woowacourse.momo.domain.attendee;

public enum Role {
HOST, GUEST
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
public enum Role {
HOST, GUEST
}
public enum Role {
HOST,
GUEST
}

줄바꿈 컨벤션이 빠져있는거 같아요!

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
package com.woowacourse.momo.domain.meeting;

import com.woowacourse.momo.domain.BaseEntity;
import com.woowacourse.momo.domain.guest.Guest;
import com.woowacourse.momo.domain.timeslot.Timeslot;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
Expand All @@ -38,13 +34,9 @@ public class Meeting extends BaseEntity {

@Enumerated(EnumType.STRING)
@Column(length = 10)
private Timeslot startTime;
private Timeslot firstTimeslot;

@Enumerated(EnumType.STRING)
@Column(length = 10)
private Timeslot endTime;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "host_id", nullable = false)
private Guest host;
private Timeslot lastTimeslot;
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.woowacourse.momo.domain.schedule;

import com.woowacourse.momo.domain.attendee.Attendee;
import com.woowacourse.momo.domain.availabledate.AvailableDate;
import com.woowacourse.momo.domain.guest.Guest;
import com.woowacourse.momo.domain.meeting.Meeting;
import com.woowacourse.momo.domain.timeslot.Timeslot;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
Expand Down Expand Up @@ -32,25 +31,26 @@ public class Schedule {
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "meeting_id", nullable = false)
private Meeting meeting;
@JoinColumn(name = "attendee_id", nullable = false)
private Attendee attendee;


@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "guest_id", nullable = false)
private Guest guest;
@JoinColumn(name = "available_date_id", nullable = false)
private AvailableDate availableDate;

@Enumerated(EnumType.STRING)
@Column(length = 10)
private Timeslot timeslot;
private Timeslot firstTimeslot;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "available_date_id", nullable = false)
private AvailableDate availableDate;
@Enumerated(EnumType.STRING)
@Column(length = 10)
private Timeslot lastTimeslot;

public Schedule(Meeting meeting, Guest guest, Timeslot timeslot, AvailableDate availableDate) {
this.meeting = meeting;
this.guest = guest;
this.timeslot = timeslot;
public Schedule(Attendee attendee, AvailableDate availableDate, Timeslot firstTimeslot, Timeslot lastTimeslot) {
this.attendee = attendee;
this.availableDate = availableDate;
this.firstTimeslot = firstTimeslot;
this.lastTimeslot = lastTimeslot;
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package com.woowacourse.momo.domain.schedule;

import com.woowacourse.momo.domain.guest.Guest;
import com.woowacourse.momo.domain.meeting.Meeting;
import com.woowacourse.momo.domain.attendee.Attendee;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ScheduleRepository extends JpaRepository<Schedule, Long> {

List<Schedule> findAllByMeeting(Meeting meeting);
List<Schedule> findAllByAttendee(Attendee attendee);

void deleteAllByMeetingAndGuest(Meeting meeting, Guest guest);
void deleteAllByAttendee(Attendee attendee);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dto 클래스의 위치는 다른 곳과 같이 /service 하위로 들어가야 할 것 같아요~

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

생성시간/수정시간을 기록할 때 사용하는 기능 이름이 Auditing(감사) 이라는 것을 생각해 봤을 때 우선 로그성 정보라고 생각하고 다 남겨 놓는 것이 좋을 것 같아요!

생성시간/수정시간을 로그성 정보를 저장한다는 점은 생각지 못했네요! 꼭 필요할 것 같습니다.

다만, 현재 참가자가 시간을 수정할 때
참가자와 연관된 모든 Schedule을 삭제한 뒤 다시 Schedule을 생성하는 방식으로 로직이 진행됩니다. 로그성 정보라면, 수정하기 전 삭제되는 모든 테이블의 행 또한 다 남겨야 하는 것이 아닌가..라는 의문이 듭니다. 지금은 참가자의 수정하기 전 최근 정보만 남겨 두는데에만 의미를 두면 될것 같네요!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Schedule 수정하는 로직은 다시 한 번 논의해 봐야 할 것 같네요😅

Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public static ScheduleTimeResponse from(List<Schedule> schedules) {
.orElseThrow(IllegalArgumentException::new);

List<LocalTime> localTimes = schedules.stream()
.map(Schedule::getTimeslot)
.map(Schedule::getFirstTimeslot)
.map(Timeslot::getTime)
.sorted()
.toList();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package com.woowacourse.momo.service.meeting;

import com.woowacourse.momo.domain.attendee.Attendee;
import com.woowacourse.momo.domain.availabledate.AvailableDate;
import com.woowacourse.momo.domain.availabledate.AvailableDateRepository;
import com.woowacourse.momo.domain.meeting.Meeting;
import com.woowacourse.momo.domain.meeting.MeetingRepository;
import com.woowacourse.momo.service.meeting.dto.MeetingResponse;
import com.woowacourse.momo.domain.schedule.Schedule;
import com.woowacourse.momo.domain.schedule.ScheduleRepository;
import com.woowacourse.momo.domain.schedule.dto.ScheduleTimeResponse;
import com.woowacourse.momo.service.meeting.dto.MeetingResponse;
import java.time.LocalDate;
import java.util.Comparator;
import java.util.List;
Expand Down Expand Up @@ -36,7 +37,8 @@ public MeetingResponse findByUUID(String uuid) {
.map(AvailableDate::getDate)
.toList();

List<Schedule> schedules = scheduleRepository.findAllByMeeting(meeting);
Attendee attendee = null;
List<Schedule> schedules = scheduleRepository.findAllByAttendee(attendee);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 부분은 왜 이런 구조로 변경되었는지 궁금합니다!

Copy link
Contributor Author

@ehBeak ehBeak Jul 18, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

일단 테스트를 통과시켜야 해서 변경했습니다.
이후에 재즈(@seokmyungham)가 수정할 예정입니다~!

Map<AvailableDate, List<Schedule>> collected = schedules.stream()
.collect(Collectors.groupingBy(Schedule::getAvailableDate));
List<ScheduleTimeResponse> list = collected.entrySet().stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ public static MeetingResponse from(
) {
return new MeetingResponse(
meeting.getName(),
meeting.getStartTime().getTime(),
meeting.getEndTime().getTime(),
meeting.getFirstTimeslot().getTime(),
meeting.getLastTimeslot().getTime(),
availableDates,
schedules
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.woowacourse.momo.service.schedule;

import com.woowacourse.momo.domain.attendee.Attendee;
import com.woowacourse.momo.domain.attendee.AttendeeName;
import com.woowacourse.momo.domain.attendee.AttendeeRepository;
import com.woowacourse.momo.domain.availabledate.AvailableDate;
import com.woowacourse.momo.domain.availabledate.AvailableDateRepository;
import com.woowacourse.momo.domain.guest.Guest;
import com.woowacourse.momo.domain.guest.GuestName;
import com.woowacourse.momo.domain.guest.GuestRepository;
import com.woowacourse.momo.domain.meeting.Meeting;
import com.woowacourse.momo.domain.meeting.MeetingRepository;
import com.woowacourse.momo.domain.schedule.Schedule;
Expand All @@ -23,7 +23,7 @@
public class ScheduleService {

private final MeetingRepository meetingRepository;
private final GuestRepository guestRepository;
private final AttendeeRepository attendeeRepository;
private final ScheduleRepository scheduleRepository;
private final AvailableDateRepository availableDateRepository;

Expand All @@ -32,19 +32,19 @@ public void create(ScheduleCreateRequest request) {
Meeting meeting = meetingRepository.findById(request.meetingId())
.orElseThrow(() -> new IllegalArgumentException("유효한 약속 id가 아닙니다."));

GuestName guestName = new GuestName(request.guestName());
Guest guest = guestRepository.findByName(guestName)
AttendeeName attendeeName = new AttendeeName(request.attendeeName());
Attendee attendee = attendeeRepository.findByName(attendeeName)
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 게스트입니다."));

scheduleRepository.deleteAllByMeetingAndGuest(meeting, guest);
scheduleRepository.deleteAllByAttendee(attendee);

List<Schedule> schedules = new ArrayList<>();
for (DateTimesCreateRequest dateTime : request.dateTimes()) {
AvailableDate availableDate = availableDateRepository.findByMeetingAndDate(meeting, dateTime.date())
.orElseThrow(() -> new IllegalArgumentException("해당 날짜에 시간을 선택할 수 없습니다."));

schedules.addAll(dateTime.times().stream()
.map(time -> new Schedule(meeting, guest, Timeslot.from(time), availableDate))
.map(time -> new Schedule(attendee, availableDate, Timeslot.from(time), Timeslot.from(time)))
.toList());
}
scheduleRepository.saveAll(schedules);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

public record ScheduleCreateRequest(
@NotNull Long meetingId,
@NotBlank String guestName,
@NotBlank String attendeeName,
@NotNull List<DateTimesCreateRequest> dateTimes
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.woowacourse.momo.domain.attendee;

import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

class AttendeeNameTest {

@Test
@DisplayName("참여자 이름이 20글자를 초과하면 예외를 발생시킨다.")
void throwsExceptionIfAttendeeNameIsTooLong() {
assertThatThrownBy(() -> new AttendeeName("woowacourse-momo-jjangjjanng-momo"))
.isInstanceOf(IllegalArgumentException.class);
}

@Test
@DisplayName("참여자 이름 객체가 정상 생성된다.")
void createAttendeeNameObjectSuccessfully() {
assertThatNoException()
.isThrownBy(() -> new AttendeeName("momo"));
}
}

This file was deleted.

Loading