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 all 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,6 @@
package com.woowacourse.momo.domain.attendee;

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,8 @@
package com.woowacourse.momo.domain.schedule;

import com.woowacourse.momo.domain.BaseEntity;
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 All @@ -25,32 +25,33 @@
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Schedule {
public class Schedule extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
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,9 @@
package com.woowacourse.momo.domain.schedule;

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

public interface ScheduleRepository extends JpaRepository<Schedule, Long> {

List<Schedule> findAllByMeeting(Meeting meeting);

void deleteAllByMeetingAndGuest(Meeting meeting, Guest guest);
void deleteAllByAttendee(Attendee attendee);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
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 com.woowacourse.momo.service.schedule.dto.ScheduleTimeResponse;
import java.time.LocalDate;
import java.util.Comparator;
import java.util.List;
Expand Down Expand Up @@ -36,7 +36,7 @@ public MeetingResponse findByUUID(String uuid) {
.map(AvailableDate::getDate)
.toList();

List<Schedule> schedules = scheduleRepository.findAllByMeeting(meeting);
List<Schedule> schedules = scheduleRepository.findAll();
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 @@ -3,7 +3,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
import com.woowacourse.momo.domain.meeting.Meeting;
import com.woowacourse.momo.domain.schedule.dto.ScheduleTimeResponse;
import com.woowacourse.momo.service.schedule.dto.ScheduleTimeResponse;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;
Expand All @@ -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
@@ -1,4 +1,4 @@
package com.woowacourse.momo.domain.schedule.dto;
package com.woowacourse.momo.service.schedule.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonFormat.Shape;
Expand All @@ -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
@@ -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