From d7526d1b6a3349f22e06cba1545d3947841268db Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sun, 19 May 2024 13:22:43 +0900 Subject: [PATCH 01/60] =?UTF-8?q?[BE]=20refactor=20:=20=EB=AF=B8=ED=8C=85?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EC=8B=9C=20=EC=A0=95=EB=B3=B4=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/meeting/MeetingService.java | 3 +- .../meeting/meeting/MeetingServiceImpl.java | 9 ++--- .../dto/meeting/MeetingCreateResponse.java | 33 +++++++++++++++++++ .../meeting/meeting/MeetingAppender.java | 4 +-- .../meeting/meeting/MeetingManager.java | 28 +++++++++++----- .../meeting/meeting/MeetingController.java | 5 +-- .../meeting/meeting/FakeMeetingService.java | 5 +-- .../meeting/meeting/MeetingAppenderTest.java | 14 ++++---- .../meeting/meeting/MeetingManagerTest.java | 15 +++++++-- .../meeting/MeetingControllerTest.java | 16 +++++++++ 10 files changed, 100 insertions(+), 32 deletions(-) create mode 100644 backend/src/main/java/moim_today/dto/meeting/MeetingCreateResponse.java diff --git a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java index 7120c3b6..6906f4ac 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java @@ -2,6 +2,7 @@ import moim_today.domain.meeting.enums.MeetingStatus; import moim_today.dto.meeting.MeetingCreateRequest; +import moim_today.dto.meeting.MeetingCreateResponse; import moim_today.dto.meeting.MeetingDetailResponse; import moim_today.dto.meeting.MeetingSimpleResponse; @@ -9,7 +10,7 @@ public interface MeetingService { - void createMeeting(final MeetingCreateRequest meetingCreateRequest); + MeetingCreateResponse createMeeting(final MeetingCreateRequest meetingCreateRequest); List findAllByMoimId(final long moimId, final long memberId, final MeetingStatus meetingStatus); diff --git a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java index 2490933b..17dbf949 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java @@ -1,10 +1,7 @@ package moim_today.application.meeting.meeting; import moim_today.domain.meeting.enums.MeetingStatus; -import moim_today.dto.meeting.MeetingCreateRequest; -import moim_today.dto.meeting.MeetingDetailResponse; -import moim_today.dto.meeting.MeetingSimpleDao; -import moim_today.dto.meeting.MeetingSimpleResponse; +import moim_today.dto.meeting.*; import moim_today.implement.meeting.meeting.MeetingFinder; import moim_today.implement.meeting.meeting.MeetingManager; import moim_today.implement.meeting.meeting.MeetingRemover; @@ -28,8 +25,8 @@ public MeetingServiceImpl(final MeetingManager meetingManager, final MeetingFind } @Override - public void createMeeting(final MeetingCreateRequest meetingCreateRequest) { - meetingManager.createMeeting(meetingCreateRequest); + public MeetingCreateResponse createMeeting(final MeetingCreateRequest meetingCreateRequest) { + return meetingManager.createMeeting(meetingCreateRequest); } @Override diff --git a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateResponse.java b/backend/src/main/java/moim_today/dto/meeting/MeetingCreateResponse.java new file mode 100644 index 00000000..e95dfef1 --- /dev/null +++ b/backend/src/main/java/moim_today/dto/meeting/MeetingCreateResponse.java @@ -0,0 +1,33 @@ +package moim_today.dto.meeting; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Builder; +import moim_today.domain.meeting.enums.MeetingCategory; + +import java.time.LocalDateTime; + +@Builder +public record MeetingCreateResponse( + long meetingId, + String agenda, + + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + LocalDateTime startDateTime, + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + LocalDateTime endDateTime, + + String place, + MeetingCategory meetingCategory +) { + + public static MeetingCreateResponse of(final long meetingId, final MeetingCreateRequest meetingCreateRequest) { + return MeetingCreateResponse.builder() + .meetingId(meetingId) + .agenda(meetingCreateRequest.agenda()) + .startDateTime(meetingCreateRequest.startDateTime()) + .endDateTime(meetingCreateRequest.endDateTime()) + .place(meetingCreateRequest.place()) + .meetingCategory(meetingCreateRequest.meetingCategory()) + .build(); + } +} diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingAppender.java b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingAppender.java index 43f17e8a..d05fedb5 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingAppender.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingAppender.java @@ -15,7 +15,7 @@ public MeetingAppender(final MeetingRepository meetingRepository) { } @Transactional - public void saveMeeting(final MeetingJpaEntity meetingJpaEntity) { - meetingRepository.save(meetingJpaEntity); + public MeetingJpaEntity saveMeeting(final MeetingJpaEntity meetingJpaEntity) { + return meetingRepository.save(meetingJpaEntity); } } diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java index d38089c7..e116740a 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java @@ -2,6 +2,7 @@ import moim_today.domain.meeting.enums.MeetingCategory; import moim_today.dto.meeting.MeetingCreateRequest; +import moim_today.dto.meeting.MeetingCreateResponse; import moim_today.dto.moim.moim.MoimDateResponse; import moim_today.global.annotation.Implement; import moim_today.implement.meeting.joined_meeting.JoinedMeetingAppender; @@ -17,6 +18,7 @@ import java.time.LocalTime; import java.util.List; +import static moim_today.global.constant.NumberConstant.SCHEDULE_MEETING_ID; import static moim_today.global.constant.TimeConstant.*; @@ -40,46 +42,54 @@ public MeetingManager(final MeetingAppender meetingAppender, final MoimFinder mo } @Transactional - public void createMeeting(final MeetingCreateRequest meetingCreateRequest) { + public MeetingCreateResponse createMeeting(final MeetingCreateRequest meetingCreateRequest) { MeetingCategory meetingCategory = meetingCreateRequest.meetingCategory(); String moimTitle = moimFinder.getTitleById(meetingCreateRequest.moimId()); if (meetingCategory.equals(MeetingCategory.SINGLE)) { - createSingleMeeting(meetingCreateRequest, moimTitle); - - } else if (meetingCategory.equals(MeetingCategory.REGULAR)) { - createRegularMeeting(meetingCreateRequest, moimTitle); + return createSingleMeeting(meetingCreateRequest, moimTitle); + } else { + return createRegularMeeting(meetingCreateRequest, moimTitle); } } - private void createSingleMeeting(final MeetingCreateRequest meetingCreateRequest, final String moimTitle) { + private MeetingCreateResponse createSingleMeeting(final MeetingCreateRequest meetingCreateRequest, final String moimTitle) { MeetingJpaEntity meetingJpaEntity = meetingCreateRequest.toEntity( meetingCreateRequest.startDateTime(), meetingCreateRequest.endDateTime() ); - meetingAppender.saveMeeting(meetingJpaEntity); + MeetingJpaEntity saveEntity = meetingAppender.saveMeeting(meetingJpaEntity); joinedMeetingAppender.saveJoinedMeeting(meetingCreateRequest.moimId(), meetingJpaEntity.getId()); createSchedules(moimTitle, meetingJpaEntity); + + return MeetingCreateResponse.of(saveEntity.getId(), meetingCreateRequest); } - private void createRegularMeeting(final MeetingCreateRequest meetingCreateRequest, final String moimTitle) { + private MeetingCreateResponse createRegularMeeting(final MeetingCreateRequest meetingCreateRequest, final String moimTitle) { MoimDateResponse moimDateResponse = moimFinder.findMoimDate(meetingCreateRequest.moimId()); LocalDate startDate = moimDateResponse.startDate(); LocalDate endDate = moimDateResponse.endDate(); LocalTime startTime = meetingCreateRequest.startDateTime().toLocalTime(); LocalTime endTime = meetingCreateRequest.endDateTime().toLocalTime(); + long firstMeetingId = SCHEDULE_MEETING_ID.value(); for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusWeeks(ONE_WEEK.time())) { LocalDateTime startDateTime = LocalDateTime.of(date, startTime); LocalDateTime endDateTime = LocalDateTime.of(date, endTime); MeetingJpaEntity meetingJpaEntity = meetingCreateRequest.toEntity(startDateTime, endDateTime); - meetingAppender.saveMeeting(meetingJpaEntity); + MeetingJpaEntity saveEntity = meetingAppender.saveMeeting(meetingJpaEntity); + if(firstMeetingId == SCHEDULE_MEETING_ID.value()) { + firstMeetingId = saveEntity.getId(); + } + joinedMeetingAppender.saveJoinedMeeting(meetingCreateRequest.moimId(), meetingJpaEntity.getId()); createSchedules(moimTitle, meetingJpaEntity); } + + return MeetingCreateResponse.of(firstMeetingId, meetingCreateRequest); } private void createSchedules(final String moimTitle, final MeetingJpaEntity meetingJpaEntity) { diff --git a/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java b/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java index 6c633287..5ab16812 100644 --- a/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java +++ b/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java @@ -4,6 +4,7 @@ import moim_today.domain.meeting.enums.MeetingStatus; import moim_today.domain.member.MemberSession; import moim_today.dto.meeting.MeetingCreateRequest; +import moim_today.dto.meeting.MeetingCreateResponse; import moim_today.dto.meeting.MeetingDetailResponse; import moim_today.dto.meeting.MeetingSimpleResponse; import moim_today.global.annotation.Login; @@ -24,8 +25,8 @@ public MeetingController(final MeetingService meetingService) { } @PostMapping - public void createMeeting(@RequestBody final MeetingCreateRequest meetingCreateRequest) { - meetingService.createMeeting(meetingCreateRequest); + public MeetingCreateResponse createMeeting(@RequestBody final MeetingCreateRequest meetingCreateRequest) { + return meetingService.createMeeting(meetingCreateRequest); } @GetMapping("/{moimId}") diff --git a/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java b/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java index 13de6c8a..52c75b7d 100644 --- a/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java +++ b/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java @@ -3,6 +3,7 @@ import moim_today.application.meeting.meeting.MeetingService; import moim_today.domain.meeting.enums.MeetingStatus; import moim_today.dto.meeting.MeetingCreateRequest; +import moim_today.dto.meeting.MeetingCreateResponse; import moim_today.dto.meeting.MeetingDetailResponse; import moim_today.dto.meeting.MeetingSimpleResponse; import moim_today.dto.member.MemberSimpleResponse; @@ -19,8 +20,8 @@ public class FakeMeetingService implements MeetingService { @Override - public void createMeeting(final MeetingCreateRequest meetingCreateRequest) { - + public MeetingCreateResponse createMeeting(final MeetingCreateRequest meetingCreateRequest) { + return MeetingCreateResponse.of(MEETING_ID.longValue(), meetingCreateRequest); } @Override diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingAppenderTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingAppenderTest.java index 3c7a7f69..16728a2a 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingAppenderTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingAppenderTest.java @@ -29,16 +29,14 @@ void saveMeeting() { .build(); // when - meetingAppender.saveMeeting(meetingJpaEntity); + MeetingJpaEntity saveEntity = meetingAppender.saveMeeting(meetingJpaEntity); // then - MeetingJpaEntity findEntity = meetingRepository.getById(meetingJpaEntity.getId()); - assertThat(meetingRepository.count()).isEqualTo(1); - assertThat(findEntity.getMoimId()).isEqualTo(Long.valueOf(MOIM_ID.value())); - assertThat(findEntity.getAgenda()).isEqualTo(MEETING_AGENDA.value()); - assertThat(findEntity.getStartDateTime()).isEqualTo(LocalDateTime.of(2024,3,4, 10, 0, 0)); - assertThat(findEntity.getEndDateTime()).isEqualTo(LocalDateTime.of(2024,6,30, 10, 0, 0)); - assertThat(findEntity.getPlace()).isEqualTo(MEETING_PLACE.value()); + assertThat(saveEntity.getMoimId()).isEqualTo(Long.valueOf(MOIM_ID.value())); + assertThat(saveEntity.getAgenda()).isEqualTo(MEETING_AGENDA.value()); + assertThat(saveEntity.getStartDateTime()).isEqualTo(LocalDateTime.of(2024,3,4, 10, 0, 0)); + assertThat(saveEntity.getEndDateTime()).isEqualTo(LocalDateTime.of(2024,6,30, 10, 0, 0)); + assertThat(saveEntity.getPlace()).isEqualTo(MEETING_PLACE.value()); } } \ No newline at end of file diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java index 00556a4a..282c4be9 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java @@ -2,6 +2,7 @@ import moim_today.domain.meeting.enums.MeetingCategory; import moim_today.dto.meeting.MeetingCreateRequest; +import moim_today.dto.meeting.MeetingCreateResponse; import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; import moim_today.persistence.entity.schedule.schedule.ScheduleJpaEntity; @@ -45,10 +46,15 @@ void createSingleMeeting() { .build(); // when - meetingManager.createMeeting(meetingCreateRequest); + MeetingCreateResponse meetingCreateResponse = meetingManager.createMeeting(meetingCreateRequest); // then assertThat(meetingRepository.count()).isEqualTo(1); + assertThat(meetingCreateResponse.agenda()).isEqualTo(MEETING_AGENDA.value()); + assertThat(meetingCreateResponse.startDateTime()).isEqualTo(LocalDateTime.of(2024, 3, 4, 10, 0, 0)); + assertThat(meetingCreateResponse.endDateTime()).isEqualTo(LocalDateTime.of(2024, 3, 4, 12, 0, 0)); + assertThat(meetingCreateResponse.place()).isEqualTo(MEETING_PLACE.value()); + assertThat(meetingCreateResponse.meetingCategory()).isEqualTo(MeetingCategory.SINGLE); } @DisplayName("정기 미팅을 생성한다.") @@ -78,11 +84,16 @@ void createRegularMeeting() { .build(); // when - meetingManager.createMeeting(meetingCreateRequest); + MeetingCreateResponse meetingCreateResponse = meetingManager.createMeeting(meetingCreateRequest); // then long between = ChronoUnit.WEEKS.between(startDate, endDate) + 1; assertThat(meetingRepository.count()).isEqualTo(between); + assertThat(meetingCreateResponse.agenda()).isEqualTo(MEETING_AGENDA.value()); + assertThat(meetingCreateResponse.startDateTime()).isEqualTo(LocalDateTime.of(2024, 3, 4, 10, 0, 0)); + assertThat(meetingCreateResponse.endDateTime()).isEqualTo(LocalDateTime.of(2024, 3, 4, 12, 0, 0)); + assertThat(meetingCreateResponse.place()).isEqualTo(MEETING_PLACE.value()); + assertThat(meetingCreateResponse.meetingCategory()).isEqualTo(MeetingCategory.REGULAR); } @DisplayName("일회 미팅 생성시 참여 정보, 스케줄 정보를 등록한다.") diff --git a/backend/src/test/java/moim_today/presentation/meeting/meeting/MeetingControllerTest.java b/backend/src/test/java/moim_today/presentation/meeting/meeting/MeetingControllerTest.java index 99a24f17..69e7c41b 100644 --- a/backend/src/test/java/moim_today/presentation/meeting/meeting/MeetingControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/meeting/meeting/MeetingControllerTest.java @@ -65,6 +65,14 @@ void createSingleMeeting() throws Exception { fieldWithPath("place").type(STRING).description("미팅 장소"), fieldWithPath("meetingCategory").type(STRING).description("미팅 카테고리") ) + .responseFields( + fieldWithPath("meetingId").type(NUMBER).description("미팅 id"), + fieldWithPath("agenda").type(STRING).description("미팅 의제"), + fieldWithPath("startDateTime").type(STRING).description("미팅 시작 시간"), + fieldWithPath("endDateTime").type(STRING).description("미팅 종료 시간"), + fieldWithPath("place").type(STRING).description("미팅 장소"), + fieldWithPath("meetingCategory").type(STRING).description("미팅 카테고리") + ) .build() ))); } @@ -101,6 +109,14 @@ void createRegularMeeting() throws Exception { fieldWithPath("place").type(STRING).description("미팅 장소"), fieldWithPath("meetingCategory").type(STRING).description("미팅 카테고리") ) + .responseFields( + fieldWithPath("meetingId").type(NUMBER).description("미팅 id"), + fieldWithPath("agenda").type(STRING).description("미팅 의제"), + fieldWithPath("startDateTime").type(STRING).description("미팅 시작 시간"), + fieldWithPath("endDateTime").type(STRING).description("미팅 종료 시간"), + fieldWithPath("place").type(STRING).description("미팅 장소"), + fieldWithPath("meetingCategory").type(STRING).description("미팅 카테고리") + ) .build() ))); } From 28f67225d8772aba6513fbc5f827eb68c5d22852 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sun, 19 May 2024 14:17:37 +0900 Subject: [PATCH 02/60] =?UTF-8?q?[BE]=20refactor=20:=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=ED=95=9C=20=ED=9A=8C=EC=9B=90=EC=9D=98=20=EB=AA=A8?= =?UTF-8?q?=EC=9E=84=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/moim/moim/MoimService.java | 4 +- .../moim/moim/MoimServiceImpl.java | 5 +++ .../dto/moim/moim/MyMoimResponse.java | 22 +++++++++ .../implement/moim/moim/MoimFinder.java | 7 +++ .../repository/moim/moim/MoimRepository.java | 3 ++ .../moim/moim/MoimRepositoryImpl.java | 18 ++++++-- .../presentation/moim/MoimController.java | 8 +++- .../fake_class/moim/FakeMoimService.java | 15 +++++++ .../implement/moim/moim/MoimFinderTest.java | 45 +++++++++++++++++++ .../presentation/moim/MoimControllerTest.java | 19 ++++++++ 10 files changed, 140 insertions(+), 6 deletions(-) create mode 100644 backend/src/main/java/moim_today/dto/moim/moim/MyMoimResponse.java diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimService.java b/backend/src/main/java/moim_today/application/moim/moim/MoimService.java index fd1f8041..1c604533 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimService.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimService.java @@ -10,8 +10,10 @@ public interface MoimService { + List findAllMyMoimResponse(final long memberId); + MoimIdResponse createMoim(final long memberId, final long universityId, - final MoimCreateRequest moimCreateRequest); + final MoimCreateRequest moimCreateRequest); MoimImageResponse uploadMoimImage(final MultipartFile file); diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java index f4c8a239..12607886 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java @@ -68,6 +68,11 @@ public MoimServiceImpl(final MoimAppender moimAppender, this.moimManager = moimManager; } + @Override + public List findAllMyMoimResponse(final long memberId) { + return moimFinder.findAllMyMoimResponse(memberId); + } + @Override public MoimIdResponse createMoim(final long memberId, final long universityId, final MoimCreateRequest moimCreateRequest) { diff --git a/backend/src/main/java/moim_today/dto/moim/moim/MyMoimResponse.java b/backend/src/main/java/moim_today/dto/moim/moim/MyMoimResponse.java new file mode 100644 index 00000000..e42080c9 --- /dev/null +++ b/backend/src/main/java/moim_today/dto/moim/moim/MyMoimResponse.java @@ -0,0 +1,22 @@ +package moim_today.dto.moim.moim; + +import com.querydsl.core.annotations.QueryProjection; +import lombok.Builder; + +@Builder +public record MyMoimResponse( + long moimId, + String title +) { + + @QueryProjection + public MyMoimResponse { + } + + public static MyMoimResponse of(final long moimId, final String title) { + return MyMoimResponse.builder() + .moimId(moimId) + .title(title) + .build(); + } +} diff --git a/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java b/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java index 8c3c7ca0..e85e625d 100644 --- a/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java +++ b/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java @@ -4,6 +4,7 @@ import moim_today.dto.moim.moim.MoimDateResponse; import moim_today.dto.moim.moim.MoimMemberResponse; import moim_today.dto.moim.moim.MoimSimpleResponse; +import moim_today.dto.moim.moim.MyMoimResponse; import moim_today.dto.moim.moim.enums.MoimCategoryDto; import moim_today.global.annotation.Implement; import moim_today.global.error.BadRequestException; @@ -34,6 +35,12 @@ public MoimFinder(final JoinedMoimFinder joinedMoimFinder, this.moimRepository = moimRepository; } + @Transactional(readOnly = true) + public List findAllMyMoimResponse(final long memberId) { + List moimIds = joinedMoimFinder.findMoimIdsByMemberId(memberId); + return moimRepository.findAllMyMoimResponse(moimIds); + } + @Transactional(readOnly = true) public List findJoinedMoims(final long moimId) { return joinedMoimFinder.findByMoimId(moimId); diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java index fed4ae91..4ef15ae7 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java @@ -3,6 +3,7 @@ import moim_today.domain.moim.MoimSortedFilter; import moim_today.dto.moim.moim.MoimDateResponse; import moim_today.dto.moim.moim.MoimSimpleResponse; +import moim_today.dto.moim.moim.MyMoimResponse; import moim_today.dto.moim.moim.enums.MoimCategoryDto; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; @@ -24,6 +25,8 @@ public interface MoimRepository { List findAllMoimResponse(final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter); + List findAllMyMoimResponse(final List moimIds); + MoimJpaEntity getByIdWithPessimisticLock(final long moimId); List searchMoimBySearchParam(final String searchParam); diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java index 36b5bd00..13dac263 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java @@ -6,13 +6,11 @@ import jakarta.persistence.LockModeType; import moim_today.domain.moim.MoimSortedFilter; import moim_today.domain.moim.enums.MoimCategory; -import moim_today.dto.moim.moim.MoimDateResponse; -import moim_today.dto.moim.moim.MoimSimpleResponse; -import moim_today.dto.moim.moim.QMoimDateResponse; -import moim_today.dto.moim.moim.QMoimSimpleResponse; +import moim_today.dto.moim.moim.*; import moim_today.dto.moim.moim.enums.MoimCategoryDto; import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; +import moim_today.persistence.entity.moim.moim.QMoimJpaEntity; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -122,6 +120,18 @@ public List findAllMoimResponse(final MoimCategoryDto moimCa .fetch(); } + @Override + public List findAllMyMoimResponse(final List moimIds) { + return queryFactory.select( + new QMyMoimResponse( + moimJpaEntity.id, + moimJpaEntity.title + )) + .from(moimJpaEntity) + .where(moimJpaEntity.id.in(moimIds)) + .fetch(); + } + private BooleanExpression applyMoimCategoryFilter(final MoimCategoryDto moimCategoryDto) { if (moimCategoryDto == MoimCategoryDto.ALL) { return null; diff --git a/backend/src/main/java/moim_today/presentation/moim/MoimController.java b/backend/src/main/java/moim_today/presentation/moim/MoimController.java index b02ea40d..168b7da0 100644 --- a/backend/src/main/java/moim_today/presentation/moim/MoimController.java +++ b/backend/src/main/java/moim_today/presentation/moim/MoimController.java @@ -31,9 +31,15 @@ public MoimController(final MoimService moimService, this.moimNoticeService = moimNoticeService; } + @GetMapping + public CollectionResponse> findAllMyMoimResponse(@Login final MemberSession memberSession) { + List myMoimResponses = moimService.findAllMyMoimResponse(memberSession.id()); + return CollectionResponse.of(myMoimResponses); + } + @PostMapping public MoimIdResponse createMoim(@Login final MemberSession memberSession, - @RequestBody final MoimCreateRequest moimCreateRequest) { + @RequestBody final MoimCreateRequest moimCreateRequest) { return moimService.createMoim(memberSession.id(), memberSession.universityId(), moimCreateRequest); } diff --git a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java index 879c3872..00988e87 100644 --- a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java +++ b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java @@ -22,6 +22,21 @@ public class FakeMoimService implements MoimService { + @Override + public List findAllMyMoimResponse(final long memberId) { + MyMoimResponse myMoimResponse1 = MyMoimResponse.builder() + .moimId(1L) + .title(MOIM_TITLE.value()) + .build(); + + MyMoimResponse myMoimResponse2 = MyMoimResponse.builder() + .moimId(2L) + .title(MOIM_TITLE.value()) + .build(); + + return List.of(myMoimResponse1, myMoimResponse2); + } + @Override public MoimIdResponse createMoim(final long memberId, final long universityId, final MoimCreateRequest moimCreateRequest) { return MoimIdResponse.from(MOIM_ID.longValue()); diff --git a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java index 6ca0b671..961fd70c 100644 --- a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java +++ b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java @@ -5,6 +5,7 @@ import moim_today.dto.moim.moim.MoimDateResponse; import moim_today.dto.moim.moim.MoimMemberResponse; import moim_today.dto.moim.moim.MoimSimpleResponse; +import moim_today.dto.moim.moim.MyMoimResponse; import moim_today.dto.moim.moim.enums.MoimCategoryDto; import moim_today.global.error.BadRequestException; import moim_today.global.error.NotFoundException; @@ -12,6 +13,8 @@ import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; import moim_today.util.ImplementTest; +import moim_today.util.TestConstant; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -35,6 +38,48 @@ class MoimFinderTest extends ImplementTest { private final int MOIM_MEMBER_SIZE = 3; + @DisplayName("회원이 참여한 모임의 정보를 가져온다.") + @Test + void findAllMyMoimResponse() { + // given 1 + MemberJpaEntity memberJpaEntity = MemberJpaEntity.builder() + .build(); + + memberRepository.save(memberJpaEntity); + + // given 2 + MoimJpaEntity moimJpaEntity1 = MoimJpaEntity.builder() + .title(MOIM_TITLE.value()) + .build(); + + MoimJpaEntity moimJpaEntity2 = MoimJpaEntity.builder() + .title(MOIM_TITLE.value()) + .build(); + + moimRepository.save(moimJpaEntity1); + moimRepository.save(moimJpaEntity2); + + // given 3 + JoinedMoimJpaEntity joinedMoimJpaEntity1 = JoinedMoimJpaEntity.builder() + .memberId(memberJpaEntity.getId()) + .moimId(moimJpaEntity1.getId()) + .build(); + + JoinedMoimJpaEntity joinedMoimJpaEntity2 = JoinedMoimJpaEntity.builder() + .memberId(memberJpaEntity.getId()) + .moimId(moimJpaEntity2.getId()) + .build(); + + joinedMoimRepository.save(joinedMoimJpaEntity1); + joinedMoimRepository.save(joinedMoimJpaEntity2); + + // when + List myMoimResponses = moimFinder.findAllMyMoimResponse(memberJpaEntity.getId()); + + // then + assertThat(myMoimResponses.size()).isEqualTo(2); + } + @DisplayName("모임을 조회하면 모임 엔티티를 반환한다.") @Test void getByIdTest() { diff --git a/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java b/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java index ba920bb3..39cb6765 100644 --- a/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java @@ -42,6 +42,25 @@ protected Object initController() { return new MoimController(fakeMoimService, fakeMoimNoticeService); } + @DisplayName("로그인한 회원이 참여한 모임리스트를 조회한다.") + @Test + void findAllMyMoimResponse() throws Exception { + mockMvc.perform( + get("/api/moims") + ) + .andExpect(status().isOk()) + .andDo(document("로그인한 회원이 참여한 모임 리스트 조회", + resource(ResourceSnippetParameters.builder() + .tag("모임") + .summary("로그인한 회원이 참여한 모임 리스트 조회") + .responseFields( + fieldWithPath("data[0].moimId").type(NUMBER).description("모임 Id"), + fieldWithPath("data[0].title").type(STRING).description("모임명") + ) + .build() + ))); + } + @DisplayName("모임을 생성한다.") @Test void createPrivateMoimApiTest() throws Exception { From a8a2dfd8831bc577e50497585294ce2f17424f6e Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Sun, 19 May 2024 14:23:27 +0900 Subject: [PATCH 03/60] =?UTF-8?q?[BE]=20feat=20:=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EC=84=B8=EC=85=98=20=EC=9D=B8=EC=A6=9D=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/auth/AuthService.java | 3 +++ .../application/auth/AuthServiceImpl.java | 9 ++++++++- .../domain/member/MemberSession.java | 10 ++++++++++ .../auth/MemberSessionValidateResponse.java | 6 ++++++ .../moim_today/global/config/WebConfig.java | 1 + .../presentation/auth/AuthController.java | 17 ++++++++-------- .../fake_class/auth/FakeAuthService.java | 6 ++++++ .../presentation/auth/AuthControllerTest.java | 20 ++++++++++++++++++- 8 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 backend/src/main/java/moim_today/dto/auth/MemberSessionValidateResponse.java diff --git a/backend/src/main/java/moim_today/application/auth/AuthService.java b/backend/src/main/java/moim_today/application/auth/AuthService.java index da8edfba..68538dda 100644 --- a/backend/src/main/java/moim_today/application/auth/AuthService.java +++ b/backend/src/main/java/moim_today/application/auth/AuthService.java @@ -3,6 +3,7 @@ import jakarta.servlet.http.HttpServletRequest; import moim_today.dto.auth.MemberLoginRequest; import moim_today.dto.auth.MemberSignUpRequest; +import moim_today.dto.auth.MemberSessionValidateResponse; public interface AuthService { @@ -11,4 +12,6 @@ public interface AuthService { void signUp(final MemberSignUpRequest memberSignUpRequest, final HttpServletRequest request); void logout(final HttpServletRequest request); + + MemberSessionValidateResponse validateMemberSession(final HttpServletRequest request); } diff --git a/backend/src/main/java/moim_today/application/auth/AuthServiceImpl.java b/backend/src/main/java/moim_today/application/auth/AuthServiceImpl.java index 14afef71..7af244c8 100644 --- a/backend/src/main/java/moim_today/application/auth/AuthServiceImpl.java +++ b/backend/src/main/java/moim_today/application/auth/AuthServiceImpl.java @@ -1,10 +1,12 @@ package moim_today.application.auth; +import jakarta.servlet.http.HttpServletRequest; +import moim_today.domain.member.MemberSession; import moim_today.dto.auth.MemberLoginRequest; import moim_today.dto.auth.MemberSignUpRequest; +import moim_today.dto.auth.MemberSessionValidateResponse; import moim_today.implement.department.DepartmentFinder; import moim_today.implement.member.AuthManager; -import jakarta.servlet.http.HttpServletRequest; import moim_today.implement.member.MemberFinder; import moim_today.implement.university.UniversityFinder; import org.springframework.stereotype.Service; @@ -46,4 +48,9 @@ public void signUp(final MemberSignUpRequest memberSignUpRequest, memberFinder.validateEmailNotExists(memberSignUpRequest.email()); authManager.signUp(memberSignUpRequest, request); } + + @Override + public MemberSessionValidateResponse validateMemberSession(final HttpServletRequest request) { + return MemberSession.validateMemberSession(request); + } } diff --git a/backend/src/main/java/moim_today/domain/member/MemberSession.java b/backend/src/main/java/moim_today/domain/member/MemberSession.java index 936236ad..977d12bf 100644 --- a/backend/src/main/java/moim_today/domain/member/MemberSession.java +++ b/backend/src/main/java/moim_today/domain/member/MemberSession.java @@ -5,6 +5,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; import lombok.Builder; +import moim_today.dto.auth.MemberSessionValidateResponse; import moim_today.global.error.InternalServerException; import moim_today.persistence.entity.member.MemberJpaEntity; @@ -50,4 +51,13 @@ public void setSession(final HttpServletRequest request, final String memberSess session.setMaxInactiveInterval(ONE_DAYS_IN_SECONDS.value()); } } + + public static MemberSessionValidateResponse validateMemberSession(final HttpServletRequest request) { + HttpSession session = request.getSession(false); + + if (session == null || session.getAttribute(MEMBER_SESSION.value()) == null) { + return new MemberSessionValidateResponse(false); + } + return new MemberSessionValidateResponse(true); + } } diff --git a/backend/src/main/java/moim_today/dto/auth/MemberSessionValidateResponse.java b/backend/src/main/java/moim_today/dto/auth/MemberSessionValidateResponse.java new file mode 100644 index 00000000..67048bca --- /dev/null +++ b/backend/src/main/java/moim_today/dto/auth/MemberSessionValidateResponse.java @@ -0,0 +1,6 @@ +package moim_today.dto.auth; + +public record MemberSessionValidateResponse( + boolean isValidateMemberSession +) { +} diff --git a/backend/src/main/java/moim_today/global/config/WebConfig.java b/backend/src/main/java/moim_today/global/config/WebConfig.java index 6171d8a9..9ed88706 100644 --- a/backend/src/main/java/moim_today/global/config/WebConfig.java +++ b/backend/src/main/java/moim_today/global/config/WebConfig.java @@ -29,6 +29,7 @@ public void addInterceptors(final InterceptorRegistry registry) { "/api/login", "/api/certification/**", "/api/sign-up", + "/api", "/api/universities", "/api/universities/departments/**", "/api/departments/university-name", diff --git a/backend/src/main/java/moim_today/presentation/auth/AuthController.java b/backend/src/main/java/moim_today/presentation/auth/AuthController.java index 657e9191..15670e0f 100644 --- a/backend/src/main/java/moim_today/presentation/auth/AuthController.java +++ b/backend/src/main/java/moim_today/presentation/auth/AuthController.java @@ -3,14 +3,10 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import moim_today.application.auth.AuthService; -import moim_today.domain.member.MemberSession; import moim_today.dto.auth.MemberLoginRequest; import moim_today.dto.auth.MemberSignUpRequest; -import moim_today.global.annotation.Login; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import moim_today.dto.auth.MemberSessionValidateResponse; +import org.springframework.web.bind.annotation.*; @RequestMapping("/api") @RestController @@ -29,13 +25,18 @@ public void login(@RequestBody final MemberLoginRequest memberLoginRequest, } @PostMapping("/logout") - public void logout(@Login final MemberSession memberSession, final HttpServletRequest request) { + public void logout(final HttpServletRequest request) { authService.logout(request); } @PostMapping("/sign-up") public void signUp(@Valid @RequestBody final MemberSignUpRequest memberSignUpRequest, - final HttpServletRequest request){ + final HttpServletRequest request) { authService.signUp(memberSignUpRequest, request); } + + @GetMapping + public MemberSessionValidateResponse validateMemberSession(final HttpServletRequest SessionValidateResponse) { + return authService.validateMemberSession(SessionValidateResponse); + } } diff --git a/backend/src/test/java/moim_today/fake_class/auth/FakeAuthService.java b/backend/src/test/java/moim_today/fake_class/auth/FakeAuthService.java index 52ee227f..da44fd80 100644 --- a/backend/src/test/java/moim_today/fake_class/auth/FakeAuthService.java +++ b/backend/src/test/java/moim_today/fake_class/auth/FakeAuthService.java @@ -3,6 +3,7 @@ import moim_today.application.auth.AuthService; import moim_today.dto.auth.MemberLoginRequest; import moim_today.dto.auth.MemberSignUpRequest; +import moim_today.dto.auth.MemberSessionValidateResponse; import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.member.MemberJpaEntity; import jakarta.servlet.http.HttpServletRequest; @@ -44,4 +45,9 @@ public void signUp(final MemberSignUpRequest memberSignUpRequest, final HttpServ public void logout(final HttpServletRequest request) { } + + @Override + public MemberSessionValidateResponse validateMemberSession(final HttpServletRequest request) { + return new MemberSessionValidateResponse(true); + } } diff --git a/backend/src/test/java/moim_today/presentation/auth/AuthControllerTest.java b/backend/src/test/java/moim_today/presentation/auth/AuthControllerTest.java index 31140e1c..06b48d7d 100644 --- a/backend/src/test/java/moim_today/presentation/auth/AuthControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/auth/AuthControllerTest.java @@ -17,6 +17,7 @@ import static com.epages.restdocs.apispec.ResourceDocumentation.resource; import static moim_today.util.TestConstant.*; import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; import static org.springframework.restdocs.payload.JsonFieldType.*; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; @@ -56,7 +57,7 @@ void loginTest() throws Exception { )); } - @DisplayName("이메일/비밀번호가 틀리면 예오가 발생한다.") + @DisplayName("이메일/비밀번호가 틀리면 예외가 발생한다.") @Test void loginTestFail() throws Exception { MemberLoginRequest memberLoginRequest = new MemberLoginRequest(WRONG_EMAIL.value(), WRONG_PASSWORD.value(), true); @@ -138,4 +139,21 @@ void registerTest() throws Exception { .build()) )); } + + @DisplayName("로그인 세션이 유효한지를 검증한다.") + @Test + void validateMemberSession() throws Exception { + mockMvc.perform(get("/api")) + .andExpect(status().isOk()) + .andDo(document("회원 세션 인증 성공", + resource(ResourceSnippetParameters.builder() + .tag("인증") + .summary("회원 세션 인증") + .responseFields( + fieldWithPath("isValidateMemberSession").type(BOOLEAN).description("세션 인증 여부") + ) + .build() + ) + )); + } } From 3c2571a3ceb5377af1c1b6ac214876123cfa9cd7 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Sun, 19 May 2024 14:23:27 +0900 Subject: [PATCH 04/60] =?UTF-8?q?[BE]=20feat=20:=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EC=84=B8=EC=85=98=20=EC=9D=B8=EC=A6=9D=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/moim_today/presentation/auth/AuthController.java | 2 +- .../java/moim_today/presentation/auth/AuthControllerTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/moim_today/presentation/auth/AuthController.java b/backend/src/main/java/moim_today/presentation/auth/AuthController.java index 15670e0f..a20e978c 100644 --- a/backend/src/main/java/moim_today/presentation/auth/AuthController.java +++ b/backend/src/main/java/moim_today/presentation/auth/AuthController.java @@ -35,7 +35,7 @@ public void signUp(@Valid @RequestBody final MemberSignUpRequest memberSignUpReq authService.signUp(memberSignUpRequest, request); } - @GetMapping + @GetMapping("/session-validation") public MemberSessionValidateResponse validateMemberSession(final HttpServletRequest SessionValidateResponse) { return authService.validateMemberSession(SessionValidateResponse); } diff --git a/backend/src/test/java/moim_today/presentation/auth/AuthControllerTest.java b/backend/src/test/java/moim_today/presentation/auth/AuthControllerTest.java index 06b48d7d..601bd889 100644 --- a/backend/src/test/java/moim_today/presentation/auth/AuthControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/auth/AuthControllerTest.java @@ -143,7 +143,7 @@ void registerTest() throws Exception { @DisplayName("로그인 세션이 유효한지를 검증한다.") @Test void validateMemberSession() throws Exception { - mockMvc.perform(get("/api")) + mockMvc.perform(get("/api/session-validation")) .andExpect(status().isOk()) .andDo(document("회원 세션 인증 성공", resource(ResourceSnippetParameters.builder() From 2e9bb3e31f0968400ffcfa9b7dcffcc2148250df Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sun, 19 May 2024 15:39:01 +0900 Subject: [PATCH 05/60] =?UTF-8?q?[BE]=20feat=20:=20=EB=AA=A8=EC=9E=84=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=20=EC=97=AC=EB=B6=80=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/member/MemberService.java | 2 ++ .../application/member/MemberServiceImpl.java | 10 +++++++--- .../moim_today/dto/member/MemberHostResponse.java | 6 ++++++ .../dto/member/MemberJoinedMoimResponse.java | 15 +++++++++++++++ .../moim/joined_moim/JoinedMoimFinder.java | 5 +++++ .../implement/moim/moim/MoimManager.java | 5 +++++ .../presentation/member/MemberController.java | 6 ++++++ .../fake_class/member/FakeMemberService.java | 5 +++++ 8 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 backend/src/main/java/moim_today/dto/member/MemberJoinedMoimResponse.java diff --git a/backend/src/main/java/moim_today/application/member/MemberService.java b/backend/src/main/java/moim_today/application/member/MemberService.java index 4d96adee..149f1ed8 100644 --- a/backend/src/main/java/moim_today/application/member/MemberService.java +++ b/backend/src/main/java/moim_today/application/member/MemberService.java @@ -18,5 +18,7 @@ public interface MemberService { MemberHostResponse isHost(final long memberId, final long moimId); + MemberJoinedMoimResponse isJoinedMoim(final long moimId, final long memberId); + MemberSimpleResponse getHostProfileByMoimId(final long moimId); } diff --git a/backend/src/main/java/moim_today/application/member/MemberServiceImpl.java b/backend/src/main/java/moim_today/application/member/MemberServiceImpl.java index 1845ec3a..f4aa8027 100644 --- a/backend/src/main/java/moim_today/application/member/MemberServiceImpl.java +++ b/backend/src/main/java/moim_today/application/member/MemberServiceImpl.java @@ -66,9 +66,13 @@ public ProfileImageResponse uploadProfileImage(final long memberId, final Multip @Override public MemberHostResponse isHost(final long memberId, final long moimId) { boolean isHost = moimManager.isHost(memberId, moimId); - return MemberHostResponse.builder() - .isHost(isHost) - .build(); + return MemberHostResponse.from(isHost); + } + + @Override + public MemberJoinedMoimResponse isJoinedMoim(final long moimId, final long memberId) { + boolean isJoinedMoim = moimManager.isJoinedMoim(moimId, memberId); + return MemberJoinedMoimResponse.from(isJoinedMoim); } @Override diff --git a/backend/src/main/java/moim_today/dto/member/MemberHostResponse.java b/backend/src/main/java/moim_today/dto/member/MemberHostResponse.java index 2c28abff..29c9a126 100644 --- a/backend/src/main/java/moim_today/dto/member/MemberHostResponse.java +++ b/backend/src/main/java/moim_today/dto/member/MemberHostResponse.java @@ -6,4 +6,10 @@ public record MemberHostResponse( boolean isHost ) { + + public static MemberHostResponse from(final boolean isHost) { + return MemberHostResponse.builder() + .isHost(isHost) + .build(); + } } diff --git a/backend/src/main/java/moim_today/dto/member/MemberJoinedMoimResponse.java b/backend/src/main/java/moim_today/dto/member/MemberJoinedMoimResponse.java new file mode 100644 index 00000000..33a4d065 --- /dev/null +++ b/backend/src/main/java/moim_today/dto/member/MemberJoinedMoimResponse.java @@ -0,0 +1,15 @@ +package moim_today.dto.member; + +import lombok.Builder; + +@Builder +public record MemberJoinedMoimResponse( + boolean isJoined +) { + + public static MemberJoinedMoimResponse from(final boolean isJoined) { + return MemberJoinedMoimResponse.builder() + .isJoined(isJoined) + .build(); + } +} diff --git a/backend/src/main/java/moim_today/implement/moim/joined_moim/JoinedMoimFinder.java b/backend/src/main/java/moim_today/implement/moim/joined_moim/JoinedMoimFinder.java index 3fb9d80e..2fce11d3 100644 --- a/backend/src/main/java/moim_today/implement/moim/joined_moim/JoinedMoimFinder.java +++ b/backend/src/main/java/moim_today/implement/moim/joined_moim/JoinedMoimFinder.java @@ -47,6 +47,11 @@ public void validateMemberNotInMoim(final long moimId, final long memberId) { } } + @Transactional(readOnly = true) + public boolean isJoining(final long moimId, final long memberId) { + return joinedMoimRepository.isJoining(moimId, memberId); + } + public List findMoimIdsByMemberId(final long memberId) { return joinedMoimRepository.findMoimIdsByMemberId(memberId); } diff --git a/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java b/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java index 0f13d388..ccc98eeb 100644 --- a/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java +++ b/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java @@ -76,6 +76,11 @@ public boolean isHost(final long memberId, final long moimId){ return moimFinder.isHost(memberId, moimId); } + @Transactional(readOnly = true) + public boolean isJoinedMoim(final long moimId, final long memberId) { + return joinedMoimFinder.isJoining(moimId, memberId); + } + @Transactional(readOnly = true) public String getTitleById(final Long moimId) { return moimFinder.getTitleById(moimId); diff --git a/backend/src/main/java/moim_today/presentation/member/MemberController.java b/backend/src/main/java/moim_today/presentation/member/MemberController.java index 2397148f..844d90a5 100644 --- a/backend/src/main/java/moim_today/presentation/member/MemberController.java +++ b/backend/src/main/java/moim_today/presentation/member/MemberController.java @@ -51,6 +51,12 @@ public MemberHostResponse isHost(@Login final MemberSession memberSession, return memberService.isHost(memberSession.id(), moimId); } + @GetMapping("/{moimId}/joining") + public MemberJoinedMoimResponse isJoinedMoim(@Login final MemberSession memberSession, + @PathVariable final long moimId) { + return memberService.isJoinedMoim(moimId, memberSession.id()); + } + @GetMapping("/host-profile/{moimId}") public MemberSimpleResponse getHostProfileByMoimId(@PathVariable final long moimId) { return memberService.getHostProfileByMoimId(moimId); diff --git a/backend/src/test/java/moim_today/fake_class/member/FakeMemberService.java b/backend/src/test/java/moim_today/fake_class/member/FakeMemberService.java index 83d77cde..ae72f146 100644 --- a/backend/src/test/java/moim_today/fake_class/member/FakeMemberService.java +++ b/backend/src/test/java/moim_today/fake_class/member/FakeMemberService.java @@ -65,6 +65,11 @@ public MemberHostResponse isHost(final long memberId, final long moimId) { .build(); } + @Override + public MemberJoinedMoimResponse isJoinedMoim(final long moimId, final long memberId) { + return null; + } + @Override public MemberSimpleResponse getHostProfileByMoimId(final long moimId) { return MemberSimpleResponse.builder() From eec00603ff4efc50ba15aea446fc78628b58c41a Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sun, 19 May 2024 15:56:43 +0900 Subject: [PATCH 06/60] =?UTF-8?q?[BE]=20test=20:=20=EB=AA=A8=EC=9E=84=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=20=EC=97=AC=EB=B6=80=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fake_class/member/FakeMemberService.java | 3 +- .../joined_moim/JoinedMoimFinderTest.java | 36 +++++++++++++++++++ .../member/MemberControllerTest.java | 27 ++++++++++++-- 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/backend/src/test/java/moim_today/fake_class/member/FakeMemberService.java b/backend/src/test/java/moim_today/fake_class/member/FakeMemberService.java index ae72f146..0053a7bd 100644 --- a/backend/src/test/java/moim_today/fake_class/member/FakeMemberService.java +++ b/backend/src/test/java/moim_today/fake_class/member/FakeMemberService.java @@ -67,7 +67,8 @@ public MemberHostResponse isHost(final long memberId, final long moimId) { @Override public MemberJoinedMoimResponse isJoinedMoim(final long moimId, final long memberId) { - return null; + boolean isJoinedMoim = true; + return MemberJoinedMoimResponse.from(isJoinedMoim); } @Override diff --git a/backend/src/test/java/moim_today/implement/moim/joined_moim/JoinedMoimFinderTest.java b/backend/src/test/java/moim_today/implement/moim/joined_moim/JoinedMoimFinderTest.java index 891e9570..bf1a857d 100644 --- a/backend/src/test/java/moim_today/implement/moim/joined_moim/JoinedMoimFinderTest.java +++ b/backend/src/test/java/moim_today/implement/moim/joined_moim/JoinedMoimFinderTest.java @@ -4,6 +4,7 @@ import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; import moim_today.util.ImplementTest; +import moim_today.util.TestConstant; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -195,4 +196,39 @@ void validateJoinedMemberForbiddenTest() { .isInstanceOf(NotFoundException.class) .hasMessage(JOINED_MOIM_MEMBER_NOT_FOUND.message()); } + + @DisplayName("모임에 참여한 회원은 true를 반환한다.") + @Test + void isJoiningTrue() { + // given + long moimId = MOIM_ID.longValue(); + long memberId = MEMBER_ID.longValue(); + + JoinedMoimJpaEntity joinedMoimJpaEntity = JoinedMoimJpaEntity.builder() + .moimId(moimId) + .memberId(memberId) + .build(); + + joinedMoimRepository.save(joinedMoimJpaEntity); + + // when + boolean isJoined = joinedMoimFinder.isJoining(moimId, memberId); + + // then + assertThat(isJoined).isTrue(); + } + + @DisplayName("모임에 참여하지 않은 회원은 false 반환한다.") + @Test + void isJoiningFalse() { + // given + long moimId = MOIM_ID.longValue(); + long memberId = MEMBER_ID.longValue(); + + // when + boolean isJoined = joinedMoimFinder.isJoining(moimId, memberId); + + // then + assertThat(isJoined).isFalse(); + } } \ No newline at end of file diff --git a/backend/src/test/java/moim_today/presentation/member/MemberControllerTest.java b/backend/src/test/java/moim_today/presentation/member/MemberControllerTest.java index fd20274a..30beab7c 100644 --- a/backend/src/test/java/moim_today/presentation/member/MemberControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/member/MemberControllerTest.java @@ -9,6 +9,7 @@ import moim_today.dto.member.ProfileUpdateRequest; import moim_today.fake_class.member.FakeMemberService; import moim_today.util.ControllerTest; +import moim_today.util.TestConstant; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.mock.web.MockMultipartFile; @@ -210,9 +211,9 @@ void updateProfileImage() throws Exception { @DisplayName("멤버가 모임의 호스트인지 검사한다") @Test - void isHostTest() throws Exception { + void isHost() throws Exception { mockMvc.perform( - get("/api/members/{moimId}/hosts", 1L) + get("/api/members/{moimId}/hosts", MOIM_ID.longValue()) .param("moimId", MOIM_ID.value()) .contentType(APPLICATION_JSON) ) @@ -231,4 +232,26 @@ void isHostTest() throws Exception { ))); } + @DisplayName("회원이 참여한 모임인지 확인한다.") + @Test + void isJoinedMoim() throws Exception { + mockMvc.perform( + get("/api/members/{moimId}/joining", MOIM_ID.longValue()) + .param("moimId", MOIM_ID.value()) + .contentType(APPLICATION_JSON) + ) + .andExpect(status().isOk()) + .andDo(document("회원이 참여한 모임인지 검사", + pathParameters( + parameterWithName("moimId").description("모임 id") + ), + resource(ResourceSnippetParameters.builder() + .tag("회원") + .summary("회원이 참여한 모임인지 검사") + .responseFields( + fieldWithPath("isJoined").type(BOOLEAN).description("모임 참여 여부") + ) + .build() + ))); + } } From 4c36e6359b6c83991e302fb1b21651ed0fa75d9c Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sun, 19 May 2024 16:23:05 +0900 Subject: [PATCH 07/60] =?UTF-8?q?[BE]=20fix=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=20=EC=88=98=EB=9D=BD=20=EC=98=A4=EB=A5=98=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 --- .../meeting/joined_meeting/JoinedMeetingController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/moim_today/presentation/meeting/joined_meeting/JoinedMeetingController.java b/backend/src/main/java/moim_today/presentation/meeting/joined_meeting/JoinedMeetingController.java index 2bf16264..456b87e3 100644 --- a/backend/src/main/java/moim_today/presentation/meeting/joined_meeting/JoinedMeetingController.java +++ b/backend/src/main/java/moim_today/presentation/meeting/joined_meeting/JoinedMeetingController.java @@ -18,7 +18,7 @@ public JoinedMeetingController(final JoinedMeetingService joinedMeetingService) @PostMapping("/members/meetings/{meetingId}/acceptance") public void acceptanceJoinMeeting(@Login final MemberSession memberSession, @PathVariable final long meetingId) { - joinedMeetingService.refuseJoinMeeting(memberSession.id(), meetingId); + joinedMeetingService.acceptanceJoinMeeting(memberSession.id(), meetingId); } @PostMapping("/members/meetings/{meetingId}/refusal") From 58d95c5146dfee74d343328d64a3c37012498775 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sun, 19 May 2024 19:55:21 +0900 Subject: [PATCH 08/60] =?UTF-8?q?[BE]=20feat=20:=20=EB=AA=A8=EC=9E=84=20?= =?UTF-8?q?=EC=B0=B8=EA=B0=80=EC=8B=9C=20=EB=AA=A8=EC=9E=84=EC=9D=98=20?= =?UTF-8?q?=EB=AF=B8=ED=8C=85=20=EC=B0=B8=EC=97=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moim_today/application/moim/moim/MoimServiceImpl.java | 1 - .../java/moim_today/implement/moim/moim/MoimManager.java | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java index 12607886..442a61b6 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java @@ -156,7 +156,6 @@ public void deleteMember(final long deleteMemberId, final MoimMemberDeleteReques @Override public void appendMemberToMoim(final long requestMemberId, final MoimJoinRequest moimJoinRequest) { long enterMoimId = moimJoinRequest.moimId(); - moimManager.appendMemberToMoim(requestMemberId, enterMoimId); } diff --git a/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java b/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java index ccc98eeb..1ec25cd1 100644 --- a/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java +++ b/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java @@ -1,6 +1,7 @@ package moim_today.implement.moim.moim; import moim_today.global.annotation.Implement; +import moim_today.implement.meeting.joined_meeting.JoinedMeetingAppender; import moim_today.implement.meeting.joined_meeting.JoinedMeetingRemover; import moim_today.implement.meeting.meeting.MeetingFinder; import moim_today.implement.meeting.meeting_comment.MeetingCommentUpdater; @@ -25,6 +26,7 @@ public class MoimManager { private final MeetingCommentUpdater meetingCommentUpdater; private final ScheduleRemover scheduleRemover; private final JoinedMoimAppender joinedMoimAppender; + private final JoinedMeetingAppender joinedMeetingAppender; private final MoimFinder moimFinder; public MoimManager(final JoinedMoimFinder joinedMoimFinder, @@ -35,6 +37,7 @@ public MoimManager(final JoinedMoimFinder joinedMoimFinder, final MeetingCommentUpdater meetingCommentUpdater, final ScheduleRemover scheduleRemover, final JoinedMoimAppender joinedMoimAppender, + final JoinedMeetingAppender joinedMeetingAppender, final MoimFinder moimFinder) { this.joinedMoimFinder = joinedMoimFinder; this.joinedMoimRemover = joinedMoimRemover; @@ -44,6 +47,7 @@ public MoimManager(final JoinedMoimFinder joinedMoimFinder, this.meetingCommentUpdater = meetingCommentUpdater; this.scheduleRemover = scheduleRemover; this.joinedMoimAppender = joinedMoimAppender; + this.joinedMeetingAppender = joinedMeetingAppender; this.moimFinder = moimFinder; } @@ -69,6 +73,8 @@ public void appendMemberToMoim(final long requestMemberId, final long moimId) { joinedMoimFinder.validateMemberNotInMoim(moimId, requestMemberId); joinedMoimAppender.createJoinedMoim(requestMemberId, moimId); + List meetingIds = meetingFinder.findMeetingIdsByMoimId(moimId); + meetingIds.forEach(meetingId -> joinedMeetingAppender.saveJoinedMeeting(moimId, meetingId)); } @Transactional(readOnly = true) From 883294ea8c9f09f51bbacf24548a570f2a688b65 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sun, 19 May 2024 20:46:15 +0900 Subject: [PATCH 09/60] =?UTF-8?q?[BE]=20fix=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=EC=BF=BC=EB=A6=AC=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/MeetingRepositoryImpl.java | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java index 11cdb430..242c5a6f 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java @@ -7,8 +7,6 @@ import moim_today.dto.meeting.QMeetingSimpleDao; import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; -import moim_today.persistence.entity.meeting.meeting.QMeetingJpaEntity; -import moim_today.persistence.entity.moim.moim.QMoimJpaEntity; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -54,8 +52,8 @@ public List findAllByMoimId(final long moimId, final long memb joinedMeetingJpaEntity.attendance )) .from(meetingJpaEntity) - .where(meetingJpaEntity.moimId.eq(moimId)) - .join(joinedMeetingJpaEntity).on(joinedMeetingJpaEntity.meetingId.eq(meetingJpaEntity.id) + .join(joinedMeetingJpaEntity).on(joinedMeetingJpaEntity.meetingId.eq(meetingJpaEntity.id)) + .where(meetingJpaEntity.moimId.eq(moimId) .and(joinedMeetingJpaEntity.memberId.eq(memberId))) .orderBy(meetingJpaEntity.startDateTime.asc()) .fetch(); @@ -64,16 +62,17 @@ public List findAllByMoimId(final long moimId, final long memb @Override public List findAllUpcomingByMoimId(final long moimId, final long memberId, final LocalDateTime currentDateTime) { - return queryFactory.select(new QMeetingSimpleDao( - meetingJpaEntity.id, - meetingJpaEntity.agenda, - meetingJpaEntity.startDateTime, - joinedMeetingJpaEntity.attendance - )) + return queryFactory.select( + new QMeetingSimpleDao( + meetingJpaEntity.id, + meetingJpaEntity.agenda, + meetingJpaEntity.startDateTime, + joinedMeetingJpaEntity.attendance + )) .from(meetingJpaEntity) + .join(joinedMeetingJpaEntity).on(joinedMeetingJpaEntity.meetingId.eq(meetingJpaEntity.id)) .where(meetingJpaEntity.moimId.eq(moimId) - .and(meetingJpaEntity.startDateTime.after(currentDateTime))) - .join(joinedMeetingJpaEntity).on(joinedMeetingJpaEntity.meetingId.eq(meetingJpaEntity.id) + .and(meetingJpaEntity.startDateTime.after(currentDateTime)) .and(joinedMeetingJpaEntity.memberId.eq(memberId))) .orderBy(meetingJpaEntity.startDateTime.asc()) .fetch(); @@ -82,17 +81,18 @@ public List findAllUpcomingByMoimId(final long moimId, final l @Override public List findAllPastByMoimId(final long moimId, final long memberId, final LocalDateTime currentDateTime) { - return queryFactory.select(new QMeetingSimpleDao( - meetingJpaEntity.id, - meetingJpaEntity.agenda, - meetingJpaEntity.startDateTime, - joinedMeetingJpaEntity.attendance - )) + return queryFactory.select( + new QMeetingSimpleDao( + meetingJpaEntity.id, + meetingJpaEntity.agenda, + meetingJpaEntity.startDateTime, + joinedMeetingJpaEntity.attendance + )) .from(meetingJpaEntity) - .join(joinedMeetingJpaEntity).on(joinedMeetingJpaEntity.meetingId.eq(meetingJpaEntity.id) - .and(joinedMeetingJpaEntity.memberId.eq(memberId))) + .join(joinedMeetingJpaEntity).on(joinedMeetingJpaEntity.meetingId.eq(meetingJpaEntity.id)) .where(meetingJpaEntity.moimId.eq(moimId) - .and(meetingJpaEntity.startDateTime.before(currentDateTime))) + .and(meetingJpaEntity.startDateTime.before(currentDateTime)) + .and(joinedMeetingJpaEntity.memberId.eq(memberId))) .orderBy(meetingJpaEntity.startDateTime.asc()) .fetch(); } From ed09221a594604ac3a2ed15167ade75808be5197 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sun, 19 May 2024 21:26:51 +0900 Subject: [PATCH 10/60] =?UTF-8?q?[BE]=20fix=20:=20=EB=AA=A8=EC=9E=84=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=EC=8B=9C=20=EB=AF=B8=ED=8C=85=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A0=80=EC=9E=A5=ED=95=98=EB=8F=84=EB=A1=9D=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 --- .../moim/moim/MoimServiceImpl.java | 1 - .../joined_meeting/JoinedMeetingAppender.java | 9 ++++-- .../implement/moim/moim/MoimManager.java | 6 ++++ .../JoinedMeetingRepository.java | 2 ++ .../JoinedMeetingRepositoryImpl.java | 9 ++++++ .../meeting/MeetingRepositoryImpl.java | 28 +++++++++++-------- 6 files changed, 40 insertions(+), 15 deletions(-) diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java index 12607886..442a61b6 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java @@ -156,7 +156,6 @@ public void deleteMember(final long deleteMemberId, final MoimMemberDeleteReques @Override public void appendMemberToMoim(final long requestMemberId, final MoimJoinRequest moimJoinRequest) { long enterMoimId = moimJoinRequest.moimId(); - moimManager.appendMemberToMoim(requestMemberId, enterMoimId); } diff --git a/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppender.java b/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppender.java index e07c7c9f..77367ffa 100644 --- a/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppender.java +++ b/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppender.java @@ -27,10 +27,13 @@ public void saveJoinedMeeting(final long moimId, final long meetingId) { List joinedMeetings = new ArrayList<>(); for (long memberId : memberIds) { - JoinedMeetingJpaEntity joinedMeeting = JoinedMeetingJpaEntity.toEntity(meetingId, memberId, true); - joinedMeetings.add(joinedMeeting); - } + boolean alreadyJoinedMeeting = joinedMeetingRepository.alreadyJoinedMeeting(memberId, meetingId); + if(!alreadyJoinedMeeting) { + JoinedMeetingJpaEntity joinedMeeting = JoinedMeetingJpaEntity.toEntity(meetingId, memberId, true); + joinedMeetings.add(joinedMeeting); + } + } joinedMeetingRepository.saveAll(joinedMeetings); } } diff --git a/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java b/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java index ccc98eeb..423678cc 100644 --- a/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java +++ b/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java @@ -1,6 +1,7 @@ package moim_today.implement.moim.moim; import moim_today.global.annotation.Implement; +import moim_today.implement.meeting.joined_meeting.JoinedMeetingAppender; import moim_today.implement.meeting.joined_meeting.JoinedMeetingRemover; import moim_today.implement.meeting.meeting.MeetingFinder; import moim_today.implement.meeting.meeting_comment.MeetingCommentUpdater; @@ -22,6 +23,7 @@ public class MoimManager { private final TodoRemover todoRemover; private final MeetingFinder meetingFinder; private final JoinedMeetingRemover joinedMeetingRemover; + private final JoinedMeetingAppender joinedMeetingAppender; private final MeetingCommentUpdater meetingCommentUpdater; private final ScheduleRemover scheduleRemover; private final JoinedMoimAppender joinedMoimAppender; @@ -32,6 +34,7 @@ public MoimManager(final JoinedMoimFinder joinedMoimFinder, final TodoRemover todoRemover, final MeetingFinder meetingFinder, final JoinedMeetingRemover joinedMeetingRemover, + final JoinedMeetingAppender joinedMeetingAppender, final MeetingCommentUpdater meetingCommentUpdater, final ScheduleRemover scheduleRemover, final JoinedMoimAppender joinedMoimAppender, @@ -41,6 +44,7 @@ public MoimManager(final JoinedMoimFinder joinedMoimFinder, this.todoRemover = todoRemover; this.meetingFinder = meetingFinder; this.joinedMeetingRemover = joinedMeetingRemover; + this.joinedMeetingAppender = joinedMeetingAppender; this.meetingCommentUpdater = meetingCommentUpdater; this.scheduleRemover = scheduleRemover; this.joinedMoimAppender = joinedMoimAppender; @@ -69,6 +73,8 @@ public void appendMemberToMoim(final long requestMemberId, final long moimId) { joinedMoimFinder.validateMemberNotInMoim(moimId, requestMemberId); joinedMoimAppender.createJoinedMoim(requestMemberId, moimId); + List meetingIds = meetingFinder.findMeetingIdsByMoimId(moimId); + meetingIds.forEach(meetingId -> joinedMeetingAppender.saveJoinedMeeting(moimId, meetingId)); } @Transactional(readOnly = true) diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepository.java b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepository.java index 18f0003c..9c5e6394 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepository.java @@ -26,4 +26,6 @@ public interface JoinedMeetingRepository { JoinedMeetingJpaEntity getById(final long joinedMeetingId); List findMembersJoinedMeeting(final long meetingId); + + boolean alreadyJoinedMeeting(final long memberId, final long meetingId); } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepositoryImpl.java index a2c83566..6b662357 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepositoryImpl.java @@ -5,6 +5,7 @@ import moim_today.dto.member.QMemberSimpleResponse; import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.meeting.joined_meeting.JoinedMeetingJpaEntity; +import moim_today.persistence.entity.meeting.joined_meeting.QJoinedMeetingJpaEntity; import org.springframework.stereotype.Repository; import java.util.List; @@ -90,4 +91,12 @@ public List findMembersJoinedMeeting(final long meetingId) .where(joinedMeetingJpaEntity.meetingId.eq(meetingId)) .fetch(); } + + @Override + public boolean alreadyJoinedMeeting(final long memberId, final long meetingId) { + return queryFactory.selectFrom(joinedMeetingJpaEntity) + .where(joinedMeetingJpaEntity.memberId.eq(memberId) + .and(joinedMeetingJpaEntity.meetingId.eq(meetingId))) + .fetchOne() != null; + } } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java index 11cdb430..9c6c9f2c 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java @@ -54,9 +54,11 @@ public List findAllByMoimId(final long moimId, final long memb joinedMeetingJpaEntity.attendance )) .from(meetingJpaEntity) - .where(meetingJpaEntity.moimId.eq(moimId)) - .join(joinedMeetingJpaEntity).on(joinedMeetingJpaEntity.meetingId.eq(meetingJpaEntity.id) - .and(joinedMeetingJpaEntity.memberId.eq(memberId))) + .join(joinedMeetingJpaEntity).on(joinedMeetingJpaEntity.meetingId.eq(meetingJpaEntity.id)) + .where( + meetingJpaEntity.moimId.eq(moimId) + .and(joinedMeetingJpaEntity.memberId.eq(memberId)) + ) .orderBy(meetingJpaEntity.startDateTime.asc()) .fetch(); } @@ -71,10 +73,12 @@ public List findAllUpcomingByMoimId(final long moimId, final l joinedMeetingJpaEntity.attendance )) .from(meetingJpaEntity) - .where(meetingJpaEntity.moimId.eq(moimId) - .and(meetingJpaEntity.startDateTime.after(currentDateTime))) - .join(joinedMeetingJpaEntity).on(joinedMeetingJpaEntity.meetingId.eq(meetingJpaEntity.id) - .and(joinedMeetingJpaEntity.memberId.eq(memberId))) + .join(joinedMeetingJpaEntity).on(joinedMeetingJpaEntity.meetingId.eq(meetingJpaEntity.id)) + .where( + meetingJpaEntity.moimId.eq(moimId) + .and(meetingJpaEntity.startDateTime.after(currentDateTime)) + .and(joinedMeetingJpaEntity.memberId.eq(memberId)) + ) .orderBy(meetingJpaEntity.startDateTime.asc()) .fetch(); } @@ -89,10 +93,12 @@ public List findAllPastByMoimId(final long moimId, final long joinedMeetingJpaEntity.attendance )) .from(meetingJpaEntity) - .join(joinedMeetingJpaEntity).on(joinedMeetingJpaEntity.meetingId.eq(meetingJpaEntity.id) - .and(joinedMeetingJpaEntity.memberId.eq(memberId))) - .where(meetingJpaEntity.moimId.eq(moimId) - .and(meetingJpaEntity.startDateTime.before(currentDateTime))) + .join(joinedMeetingJpaEntity).on(joinedMeetingJpaEntity.meetingId.eq(meetingJpaEntity.id)) + .where( + meetingJpaEntity.moimId.eq(moimId) + .and(meetingJpaEntity.startDateTime.before(currentDateTime)) + .and(joinedMeetingJpaEntity.memberId.eq(memberId)) + ) .orderBy(meetingJpaEntity.startDateTime.asc()) .fetch(); } From d32dacaf013f33789ffe6aaf84a7120ea93b6d6c Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sun, 19 May 2024 21:50:27 +0900 Subject: [PATCH 11/60] =?UTF-8?q?[BE]=20fix=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=82=A0=EC=A7=9C=20=EC=98=A4=EB=A5=98=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 --- .../implement/meeting/meeting/MeetingManager.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java index e116740a..0934802b 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java @@ -68,16 +68,16 @@ private MeetingCreateResponse createSingleMeeting(final MeetingCreateRequest mee private MeetingCreateResponse createRegularMeeting(final MeetingCreateRequest meetingCreateRequest, final String moimTitle) { MoimDateResponse moimDateResponse = moimFinder.findMoimDate(meetingCreateRequest.moimId()); - LocalDate startDate = moimDateResponse.startDate(); - LocalDate endDate = moimDateResponse.endDate(); + LocalDate moimEndDate = moimDateResponse.endDate(); - LocalTime startTime = meetingCreateRequest.startDateTime().toLocalTime(); - LocalTime endTime = meetingCreateRequest.endDateTime().toLocalTime(); + LocalTime meetingStartTime = meetingCreateRequest.startDateTime().toLocalTime(); + LocalTime meetingEndTime = meetingCreateRequest.endDateTime().toLocalTime(); + LocalDate meetingStartDate = meetingCreateRequest.startDateTime().toLocalDate(); long firstMeetingId = SCHEDULE_MEETING_ID.value(); - for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusWeeks(ONE_WEEK.time())) { - LocalDateTime startDateTime = LocalDateTime.of(date, startTime); - LocalDateTime endDateTime = LocalDateTime.of(date, endTime); + for (LocalDate date = meetingStartDate; !date.isAfter(moimEndDate); date = date.plusWeeks(ONE_WEEK.time())) { + LocalDateTime startDateTime = LocalDateTime.of(date, meetingStartTime); + LocalDateTime endDateTime = LocalDateTime.of(date, meetingEndTime); MeetingJpaEntity meetingJpaEntity = meetingCreateRequest.toEntity(startDateTime, endDateTime); MeetingJpaEntity saveEntity = meetingAppender.saveMeeting(meetingJpaEntity); From 75134bcc54b5d3f42175e03df85f25073b21b01d Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sun, 19 May 2024 22:17:23 +0900 Subject: [PATCH 12/60] =?UTF-8?q?[BE]=20refactor=20:=20=EC=A0=95=EA=B8=B0?= =?UTF-8?q?=20=EB=AF=B8=ED=8C=85=20=EC=83=9D=EC=84=B1=EC=8B=9C=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=EB=82=A0=EC=A7=9C=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/meeting/MeetingServiceImpl.java | 3 +- .../meeting/meeting/MeetingManager.java | 19 ++++-- .../meeting/meeting/MeetingManagerTest.java | 63 ++++++++++++++++--- 3 files changed, 72 insertions(+), 13 deletions(-) diff --git a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java index 17dbf949..1f713985 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java @@ -7,6 +7,7 @@ import moim_today.implement.meeting.meeting.MeetingRemover; import org.springframework.stereotype.Service; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -26,7 +27,7 @@ public MeetingServiceImpl(final MeetingManager meetingManager, final MeetingFind @Override public MeetingCreateResponse createMeeting(final MeetingCreateRequest meetingCreateRequest) { - return meetingManager.createMeeting(meetingCreateRequest); + return meetingManager.createMeeting(meetingCreateRequest, LocalDate.now()); } @Override diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java index 0934802b..78c9cd48 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java @@ -42,14 +42,15 @@ public MeetingManager(final MeetingAppender meetingAppender, final MoimFinder mo } @Transactional - public MeetingCreateResponse createMeeting(final MeetingCreateRequest meetingCreateRequest) { + public MeetingCreateResponse createMeeting(final MeetingCreateRequest meetingCreateRequest, + final LocalDate currentDate) { MeetingCategory meetingCategory = meetingCreateRequest.meetingCategory(); String moimTitle = moimFinder.getTitleById(meetingCreateRequest.moimId()); if (meetingCategory.equals(MeetingCategory.SINGLE)) { return createSingleMeeting(meetingCreateRequest, moimTitle); } else { - return createRegularMeeting(meetingCreateRequest, moimTitle); + return createRegularMeeting(meetingCreateRequest, moimTitle, currentDate); } } @@ -66,13 +67,15 @@ private MeetingCreateResponse createSingleMeeting(final MeetingCreateRequest mee return MeetingCreateResponse.of(saveEntity.getId(), meetingCreateRequest); } - private MeetingCreateResponse createRegularMeeting(final MeetingCreateRequest meetingCreateRequest, final String moimTitle) { + private MeetingCreateResponse createRegularMeeting(final MeetingCreateRequest meetingCreateRequest, + final String moimTitle, final LocalDate currentDate) { MoimDateResponse moimDateResponse = moimFinder.findMoimDate(meetingCreateRequest.moimId()); LocalDate moimEndDate = moimDateResponse.endDate(); LocalTime meetingStartTime = meetingCreateRequest.startDateTime().toLocalTime(); LocalTime meetingEndTime = meetingCreateRequest.endDateTime().toLocalTime(); - LocalDate meetingStartDate = meetingCreateRequest.startDateTime().toLocalDate(); + LocalDate meetingStartDate = getMeetingStartDate(meetingCreateRequest, currentDate); + long firstMeetingId = SCHEDULE_MEETING_ID.value(); for (LocalDate date = meetingStartDate; !date.isAfter(moimEndDate); date = date.plusWeeks(ONE_WEEK.time())) { @@ -92,6 +95,14 @@ private MeetingCreateResponse createRegularMeeting(final MeetingCreateRequest me return MeetingCreateResponse.of(firstMeetingId, meetingCreateRequest); } + private LocalDate getMeetingStartDate(final MeetingCreateRequest meetingCreateRequest, + final LocalDate currentDate) { + LocalDate meetingStartDate = meetingCreateRequest.startDateTime().toLocalDate(); + meetingStartDate = meetingStartDate.isAfter(currentDate) ? meetingStartDate : currentDate; + + return meetingStartDate; + } + private void createSchedules(final String moimTitle, final MeetingJpaEntity meetingJpaEntity) { List memberIds = joinedMeetingFinder.findAllMemberId(meetingJpaEntity.getId()); diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java index 282c4be9..4541a9b1 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java @@ -45,8 +45,11 @@ void createSingleMeeting() { .meetingCategory(MeetingCategory.SINGLE) .build(); + // given 3 + LocalDate currentDate = LocalDate.of(2024, 3, 4); + // when - MeetingCreateResponse meetingCreateResponse = meetingManager.createMeeting(meetingCreateRequest); + MeetingCreateResponse meetingCreateResponse = meetingManager.createMeeting(meetingCreateRequest, currentDate); // then assertThat(meetingRepository.count()).isEqualTo(1); @@ -57,11 +60,52 @@ void createSingleMeeting() { assertThat(meetingCreateResponse.meetingCategory()).isEqualTo(MeetingCategory.SINGLE); } - @DisplayName("정기 미팅을 생성한다.") + @DisplayName("현재 날짜부터 정기 미팅을 생성한다.") + @Test + void createRegularMeetingFromCurrentDate() { + // given 1 + long memberId = 1; + LocalDate currentDate = LocalDate.of(2024, 3, 30); + LocalDate startDate = LocalDate.of(2024, 3, 4); + LocalDate endDate = LocalDate.of(2024, 6, 30); + + MoimJpaEntity moimJpaEntity = MoimJpaEntity.builder() + .memberId(memberId) + .startDate(startDate) + .endDate(endDate) + .build(); + + moimRepository.save(moimJpaEntity); + + // given 2 + MeetingCreateRequest meetingCreateRequest = MeetingCreateRequest.builder() + .moimId(moimJpaEntity.getId()) + .agenda(MEETING_AGENDA.value()) + .startDateTime(LocalDateTime.of(2024, 3, 4, 10, 0, 0)) + .endDateTime(LocalDateTime.of(2024, 3, 4, 12, 0, 0)) + .place(MEETING_PLACE.value()) + .meetingCategory(MeetingCategory.REGULAR) + .build(); + + // when + MeetingCreateResponse meetingCreateResponse = meetingManager.createMeeting(meetingCreateRequest, currentDate); + + // then + long between = ChronoUnit.WEEKS.between(currentDate, endDate) + 1; + assertThat(meetingRepository.count()).isEqualTo(between); + assertThat(meetingCreateResponse.agenda()).isEqualTo(MEETING_AGENDA.value()); + assertThat(meetingCreateResponse.startDateTime()).isEqualTo(LocalDateTime.of(2024, 3, 4, 10, 0, 0)); + assertThat(meetingCreateResponse.endDateTime()).isEqualTo(LocalDateTime.of(2024, 3, 4, 12, 0, 0)); + assertThat(meetingCreateResponse.place()).isEqualTo(MEETING_PLACE.value()); + assertThat(meetingCreateResponse.meetingCategory()).isEqualTo(MeetingCategory.REGULAR); + } + + @DisplayName("미팅 시작 날짜부터 정기 미팅을 생성한다.") @Test - void createRegularMeeting() { + void createRegularMeetingFromStartDate() { // given 1 long memberId = 1; + LocalDate currentDate = LocalDate.of(2024, 2, 1); LocalDate startDate = LocalDate.of(2024, 3, 4); LocalDate endDate = LocalDate.of(2024, 6, 30); @@ -84,7 +128,7 @@ void createRegularMeeting() { .build(); // when - MeetingCreateResponse meetingCreateResponse = meetingManager.createMeeting(meetingCreateRequest); + MeetingCreateResponse meetingCreateResponse = meetingManager.createMeeting(meetingCreateRequest, currentDate); // then long between = ChronoUnit.WEEKS.between(startDate, endDate) + 1; @@ -101,6 +145,7 @@ void createRegularMeeting() { void createSingleMeetingWithJoinedAndSchedule() { // given 1 long memberId = 1; + LocalDate currentDate = LocalDate.of(2024, 3, 30); LocalDate startDate = LocalDate.of(2024, 3, 4); LocalDate endDate = LocalDate.of(2024, 6, 30); @@ -133,7 +178,7 @@ void createSingleMeetingWithJoinedAndSchedule() { .build(); // when - meetingManager.createMeeting(meetingCreateRequest); + meetingManager.createMeeting(meetingCreateRequest, currentDate); // then assertThat(meetingRepository.count()).isEqualTo(1); @@ -146,6 +191,7 @@ void createSingleMeetingWithJoinedAndSchedule() { void createRegularMeetingWithJoinedAndSchedule() { // given 1 long memberId = 1; + LocalDate currentDate = LocalDate.of(2024, 3, 30); LocalDate startDate = LocalDate.of(2024, 3, 4); LocalDate endDate = LocalDate.of(2024, 6, 30); @@ -178,10 +224,10 @@ void createRegularMeetingWithJoinedAndSchedule() { .build(); // when - meetingManager.createMeeting(meetingCreateRequest); + meetingManager.createMeeting(meetingCreateRequest, currentDate); // then - long between = ChronoUnit.WEEKS.between(startDate, endDate) + 1; + long between = ChronoUnit.WEEKS.between(currentDate, endDate) + 1; assertThat(meetingRepository.count()).isEqualTo(between); assertThat(joinedMeetingRepository.count()).isEqualTo(10 * between); assertThat(scheduleRepository.count()).isEqualTo(10 * between); @@ -192,6 +238,7 @@ void createRegularMeetingWithJoinedAndSchedule() { void createMeetingScheduleIfNotExist() { // given 1 long memberId = 1; + LocalDate currentDate = LocalDate.of(2024, 3, 30); LocalDate startDate = LocalDate.of(2024, 3, 4); LocalDate endDate = LocalDate.of(2024, 6, 30); @@ -231,7 +278,7 @@ void createMeetingScheduleIfNotExist() { .build(); // when - meetingManager.createMeeting(meetingCreateRequest); + meetingManager.createMeeting(meetingCreateRequest, currentDate); // then assertThat(meetingRepository.count()).isEqualTo(1); From d4715e7e0b83a3b65721fe41e0e5598eac8ef807 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Mon, 20 May 2024 12:09:54 +0900 Subject: [PATCH 13/60] =?UTF-8?q?[BE]=20chore=20:=20jacoco=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BB=A4=EB=B2=84=EB=A6=AC=EC=A7=80=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/build.gradle | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/backend/build.gradle b/backend/build.gradle index 8f6a1460..2042f2e4 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -12,6 +12,7 @@ plugins { id 'io.spring.dependency-management' version '1.1.4' id 'com.epages.restdocs-api-spec' version "${restdocsApiSpecVersion}" id 'org.hidetake.swagger.generator' version '2.18.2' + id 'jacoco' } group = 'u2dj2' @@ -118,6 +119,7 @@ dependencies { tasks.named('test') { outputs.dir snippetsDir useJUnitPlatform() + finalizedBy jacocoTestReport } tasks.withType(GenerateSwaggerUI) { @@ -144,4 +146,26 @@ bootJar { } } -jar.enabled = false \ No newline at end of file +jar.enabled = false + +jacoco { + toolVersion = "0.8.10" +} + +jacocoTestReport { + dependsOn test + reports { + xml.required = true + html.required = true + } + afterEvaluate { + classDirectories.setFrom(files(classDirectories.files.collect { + fileTree(dir: it, exclude: [ + 'moim_today/dto/**', + 'moim_today/global/**', + 'moim_today/application/**', + '**/Q*.*' + ]) + })) + } +} From acb3b7b73f6a179f0419a0da7a5fce70e48713f8 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Mon, 20 May 2024 19:00:04 +0900 Subject: [PATCH 14/60] =?UTF-8?q?[BE]=20chore=20:=20git=20ignore=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/.gitignore b/backend/.gitignore index 9f039158..c66f5806 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -9,7 +9,7 @@ build/ **/src/main/generated/ ### initDB ### -**/src/main/java/moim_today/global/init/** +**/src/main/java/moim_today/**/init/** ### Properties ### application.yml From 1b20de7e70b10cdf3b8d9523dad934bea16f5d20 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Thu, 16 May 2024 13:40:37 +0900 Subject: [PATCH 15/60] =?UTF-8?q?[BE]=20feat=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EB=8C=93=EA=B8=80=20=EB=B9=84=EC=A7=80=EB=8B=88=EC=8A=A4=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=ED=8B=80=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MeetingCommentService.java | 4 ++++ .../MeetingCommentServiceImpl.java | 23 +++++++++++++++++++ .../MeetingCommentAppender.java | 14 +++++++++++ .../meeting_comment/MeetingCommentFinder.java | 14 +++++++++++ .../MeetingCommentRemover.java | 14 +++++++++++ .../MeetingCommentJpaEntity.java | 1 - .../MeetingCommentController.java | 16 +++++++++++++ 7 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java create mode 100644 backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java create mode 100644 backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentAppender.java create mode 100644 backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java create mode 100644 backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentRemover.java create mode 100644 backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java diff --git a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java new file mode 100644 index 00000000..85277c04 --- /dev/null +++ b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java @@ -0,0 +1,4 @@ +package moim_today.application.meeting.meeting_comment; + +public interface MeetingCommentService { +} diff --git a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java new file mode 100644 index 00000000..8b882ae9 --- /dev/null +++ b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java @@ -0,0 +1,23 @@ +package moim_today.application.meeting.meeting_comment; + +import moim_today.implement.meeting.meeting_comment.MeetingCommentAppender; +import moim_today.implement.meeting.meeting_comment.MeetingCommentFinder; +import moim_today.implement.meeting.meeting_comment.MeetingCommentRemover; +import moim_today.implement.meeting.meeting_comment.MeetingCommentUpdater; +import org.springframework.stereotype.Service; + +@Service +public class MeetingCommentServiceImpl implements MeetingCommentService { + + private final MeetingCommentAppender meetingCommentAppender; + private final MeetingCommentFinder meetingCommentFinder; + private final MeetingCommentUpdater meetingCommentUpdater; + private final MeetingCommentRemover meetingCommentRemover; + + public MeetingCommentServiceImpl(final MeetingCommentAppender meetingCommentAppender, final MeetingCommentFinder meetingCommentFinder, final MeetingCommentUpdater meetingCommentUpdater, final MeetingCommentRemover meetingCommentRemover) { + this.meetingCommentAppender = meetingCommentAppender; + this.meetingCommentFinder = meetingCommentFinder; + this.meetingCommentUpdater = meetingCommentUpdater; + this.meetingCommentRemover = meetingCommentRemover; + } +} diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentAppender.java b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentAppender.java new file mode 100644 index 00000000..9ea0e64e --- /dev/null +++ b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentAppender.java @@ -0,0 +1,14 @@ +package moim_today.implement.meeting.meeting_comment; + +import moim_today.global.annotation.Implement; +import moim_today.persistence.repository.meeting.meeting_comment.MeetingCommentRepository; + +@Implement +public class MeetingCommentAppender { + + private final MeetingCommentRepository meetingCommentRepository; + + public MeetingCommentAppender(final MeetingCommentRepository meetingCommentRepository) { + this.meetingCommentRepository = meetingCommentRepository; + } +} diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java new file mode 100644 index 00000000..02b6e998 --- /dev/null +++ b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java @@ -0,0 +1,14 @@ +package moim_today.implement.meeting.meeting_comment; + +import moim_today.global.annotation.Implement; +import moim_today.persistence.repository.meeting.meeting_comment.MeetingCommentRepository; + +@Implement +public class MeetingCommentFinder { + + private final MeetingCommentRepository meetingCommentRepository; + + public MeetingCommentFinder(final MeetingCommentRepository meetingCommentRepository) { + this.meetingCommentRepository = meetingCommentRepository; + } +} diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentRemover.java b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentRemover.java new file mode 100644 index 00000000..451b08f9 --- /dev/null +++ b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentRemover.java @@ -0,0 +1,14 @@ +package moim_today.implement.meeting.meeting_comment; + +import moim_today.global.annotation.Implement; +import moim_today.persistence.repository.meeting.meeting_comment.MeetingCommentRepository; + +@Implement +public class MeetingCommentRemover { + + private final MeetingCommentRepository meetingCommentRepository; + + public MeetingCommentRemover(final MeetingCommentRepository meetingCommentRepository) { + this.meetingCommentRepository = meetingCommentRepository; + } +} diff --git a/backend/src/main/java/moim_today/persistence/entity/meeting/meeting_comment/MeetingCommentJpaEntity.java b/backend/src/main/java/moim_today/persistence/entity/meeting/meeting_comment/MeetingCommentJpaEntity.java index cb9505b5..e100c539 100644 --- a/backend/src/main/java/moim_today/persistence/entity/meeting/meeting_comment/MeetingCommentJpaEntity.java +++ b/backend/src/main/java/moim_today/persistence/entity/meeting/meeting_comment/MeetingCommentJpaEntity.java @@ -1,6 +1,5 @@ package moim_today.persistence.entity.meeting.meeting_comment; -import jakarta.annotation.Nullable; import jakarta.persistence.*; import lombok.Builder; import lombok.Getter; diff --git a/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java new file mode 100644 index 00000000..631df4df --- /dev/null +++ b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java @@ -0,0 +1,16 @@ +package moim_today.presentation.meeting.meeting_comment; + +import moim_today.application.meeting.meeting_comment.MeetingCommentService; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequestMapping("/api/meetings/comments") +@RestController +public class MeetingCommentController { + + private final MeetingCommentService meetingCommentService; + + public MeetingCommentController(final MeetingCommentService meetingCommentService) { + this.meetingCommentService = meetingCommentService; + } +} From f4718d4dc7a95fdcb91f75c289e80ffe1c596782 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Thu, 16 May 2024 14:34:24 +0900 Subject: [PATCH 16/60] =?UTF-8?q?[BE]=20feat=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EB=8C=93=EA=B8=80=20=EC=9E=91=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MeetingCommentService.java | 4 ++++ .../MeetingCommentServiceImpl.java | 21 +++++++++++++++++- .../MeetingCommentCreateRequest.java | 22 +++++++++++++++++++ .../global/constant/NumberConstant.java | 1 + .../meeting/meeting/MeetingFinder.java | 7 +++++- .../MeetingCommentAppender.java | 9 ++++++++ .../meeting/meeting/MeetingRepository.java | 2 ++ .../meeting/MeetingRepositoryImpl.java | 9 ++++++++ .../repository/moim/moim/MoimRepository.java | 2 ++ .../moim/moim/MoimRepositoryImpl.java | 5 +++++ .../MeetingCommentController.java | 11 ++++++++++ .../implement/moim/moim/MoimFinderTest.java | 5 +++++ 12 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentCreateRequest.java diff --git a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java index 85277c04..2f99e60f 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java @@ -1,4 +1,8 @@ package moim_today.application.meeting.meeting_comment; +import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; + public interface MeetingCommentService { + + void createMeetingComment(final long memberId, final MeetingCommentCreateRequest meetingCommentCreateRequest); } diff --git a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java index 8b882ae9..81828158 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java @@ -1,9 +1,12 @@ package moim_today.application.meeting.meeting_comment; +import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; +import moim_today.implement.meeting.meeting.MeetingFinder; import moim_today.implement.meeting.meeting_comment.MeetingCommentAppender; import moim_today.implement.meeting.meeting_comment.MeetingCommentFinder; import moim_today.implement.meeting.meeting_comment.MeetingCommentRemover; import moim_today.implement.meeting.meeting_comment.MeetingCommentUpdater; +import moim_today.implement.moim.joined_moim.JoinedMoimFinder; import org.springframework.stereotype.Service; @Service @@ -13,11 +16,27 @@ public class MeetingCommentServiceImpl implements MeetingCommentService { private final MeetingCommentFinder meetingCommentFinder; private final MeetingCommentUpdater meetingCommentUpdater; private final MeetingCommentRemover meetingCommentRemover; + private final MeetingFinder meetingFinder; + private final JoinedMoimFinder joinedMoimFinder; - public MeetingCommentServiceImpl(final MeetingCommentAppender meetingCommentAppender, final MeetingCommentFinder meetingCommentFinder, final MeetingCommentUpdater meetingCommentUpdater, final MeetingCommentRemover meetingCommentRemover) { + public MeetingCommentServiceImpl(final MeetingCommentAppender meetingCommentAppender, + final MeetingCommentFinder meetingCommentFinder, + final MeetingCommentUpdater meetingCommentUpdater, + final MeetingCommentRemover meetingCommentRemover, + final MeetingFinder meetingFinder, + final JoinedMoimFinder joinedMoimFinder) { this.meetingCommentAppender = meetingCommentAppender; this.meetingCommentFinder = meetingCommentFinder; this.meetingCommentUpdater = meetingCommentUpdater; this.meetingCommentRemover = meetingCommentRemover; + this.meetingFinder = meetingFinder; + this.joinedMoimFinder = joinedMoimFinder; + } + + @Override + public void createMeetingComment(final long memberId, final MeetingCommentCreateRequest meetingCommentCreateRequest) { + long moimId = meetingFinder.findMoimIdByMeetingId(meetingCommentCreateRequest.meetingId()); + joinedMoimFinder.validateMemberInMoim(memberId, moimId); + meetingCommentAppender.createMeetingComment(memberId, meetingCommentCreateRequest); } } diff --git a/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentCreateRequest.java b/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentCreateRequest.java new file mode 100644 index 00000000..627484a8 --- /dev/null +++ b/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentCreateRequest.java @@ -0,0 +1,22 @@ +package moim_today.dto.meeting.meeting_comment; + +import lombok.Builder; +import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; + +import static moim_today.global.constant.NumberConstant.DEFAULT_PARENT_COMMENT_ID; + +@Builder +public record MeetingCommentCreateRequest ( + long meetingId, + String contents +){ + + public MeetingCommentJpaEntity toEntity(final long memberId) { + return MeetingCommentJpaEntity.builder() + .meetingId(meetingId) + .parentId(DEFAULT_PARENT_COMMENT_ID.value()) + .memberId(memberId) + .contents(contents) + .build(); + } +} diff --git a/backend/src/main/java/moim_today/global/constant/NumberConstant.java b/backend/src/main/java/moim_today/global/constant/NumberConstant.java index f2ac7a90..ce0dc72f 100644 --- a/backend/src/main/java/moim_today/global/constant/NumberConstant.java +++ b/backend/src/main/java/moim_today/global/constant/NumberConstant.java @@ -19,6 +19,7 @@ public enum NumberConstant { SCHEDULE_TIME_START_IDX(0), MOIM_SCHEDULE_FIRST_IDX(0), TIME_TABLE_SCHEDULING_COUNT(10), + DEFAULT_PARENT_COMMENT_ID(0), EVERYTIME_ITEM_START_INDEX(0), EVERYTIME_NODE_START_INDEX(0), diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingFinder.java b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingFinder.java index ccbd4b64..5890da10 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingFinder.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingFinder.java @@ -37,7 +37,7 @@ public List findAllByMoimId(final long moimId, final long memb final LocalDateTime currentDateTime) { if (meetingStatus.equals(MeetingStatus.ALL)) { return meetingRepository.findAllByMoimId(moimId, memberId, currentDateTime); - } else if(meetingStatus.equals(MeetingStatus.PAST)) { + } else if (meetingStatus.equals(MeetingStatus.PAST)) { return meetingRepository.findAllPastByMoimId(moimId, memberId, currentDateTime); } @@ -55,4 +55,9 @@ public MeetingDetailResponse findDetailsById(final long meetingId) { public List findUpcomingNotices(final LocalDateTime currentDateTime) { return meetingRepository.findUpcomingNotices(currentDateTime); } + + @Transactional(readOnly = true) + public long findMoimIdByMeetingId(final long meetingId) { + return meetingRepository.findMoimIdByMeetingId(meetingId); + } } diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentAppender.java b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentAppender.java index 9ea0e64e..5e424ca2 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentAppender.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentAppender.java @@ -1,7 +1,10 @@ package moim_today.implement.meeting.meeting_comment; +import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; import moim_today.global.annotation.Implement; +import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; import moim_today.persistence.repository.meeting.meeting_comment.MeetingCommentRepository; +import org.springframework.transaction.annotation.Transactional; @Implement public class MeetingCommentAppender { @@ -11,4 +14,10 @@ public class MeetingCommentAppender { public MeetingCommentAppender(final MeetingCommentRepository meetingCommentRepository) { this.meetingCommentRepository = meetingCommentRepository; } + + @Transactional + public void createMeetingComment(final long memberId, final MeetingCommentCreateRequest meetingCommentCreateRequest) { + MeetingCommentJpaEntity meetingCommentJpaEntity = meetingCommentCreateRequest.toEntity(memberId); + meetingCommentRepository.save(meetingCommentJpaEntity); + } } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepository.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepository.java index e535fd68..5bea092b 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepository.java @@ -28,4 +28,6 @@ public interface MeetingRepository { void delete(final MeetingJpaEntity meetingJpaEntity); long count(); + + long findMoimIdByMeetingId(final long meetingId); } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java index 68750f0d..b11cac84 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java @@ -158,4 +158,13 @@ public void delete(final MeetingJpaEntity meetingJpaEntity) { public long count() { return meetingJpaRepository.count(); } + + @Override + public long findMoimIdByMeetingId(final long meetingId) { + return queryFactory.select(meetingJpaEntity.moimId) + .from(meetingJpaEntity) + .where(meetingJpaEntity.id.eq(meetingId)) + .stream().findAny() + .orElseThrow(() -> new NotFoundException(MEETING_NOT_FOUND_ERROR.message())); + } } diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java index 4ef15ae7..4035f01c 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java @@ -30,4 +30,6 @@ public interface MoimRepository { MoimJpaEntity getByIdWithPessimisticLock(final long moimId); List searchMoimBySearchParam(final String searchParam); + + void flush(); } diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java index 13dac263..01a0d975 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java @@ -102,6 +102,11 @@ public List searchMoimBySearchParam(final String searchParam .fetch(); } + @Override + public void flush() { + moimJpaRepository.flush(); + } + @Override public List findAllMoimResponse(final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter) { diff --git a/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java index 631df4df..ad442dfa 100644 --- a/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java +++ b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java @@ -1,6 +1,11 @@ package moim_today.presentation.meeting.meeting_comment; import moim_today.application.meeting.meeting_comment.MeetingCommentService; +import moim_today.domain.member.MemberSession; +import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; +import moim_today.global.annotation.Login; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -13,4 +18,10 @@ public class MeetingCommentController { public MeetingCommentController(final MeetingCommentService meetingCommentService) { this.meetingCommentService = meetingCommentService; } + + @PostMapping() + public void createMeetingComment(@Login final MemberSession memberSession, + @RequestBody final MeetingCommentCreateRequest meetingCommentCreateRequest) { + meetingCommentService.createMeetingComment(memberSession.id(), meetingCommentCreateRequest); + } } diff --git a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java index 961fd70c..fd841e85 100644 --- a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java +++ b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java @@ -20,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -256,6 +257,7 @@ void findAllMoim() throws InterruptedException { .build(); moimRepository.save(firstCreatedMoimJpaEntity); + moimRepository.flush(); Thread.sleep(10); @@ -265,6 +267,7 @@ void findAllMoim() throws InterruptedException { .build(); moimRepository.save(secondCreatedMoimJpaEntity); + moimRepository.flush(); MoimCategoryDto moimCategoryDto = MoimCategoryDto.ALL; MoimSortedFilter moimSortedFilter = null; @@ -288,6 +291,7 @@ void findAllMoimOrderByCreatedAt() throws InterruptedException { .build(); moimRepository.save(firstCreatedMoimJpaEntity); + moimRepository.flush(); Thread.sleep(10); @@ -297,6 +301,7 @@ void findAllMoimOrderByCreatedAt() throws InterruptedException { .build(); moimRepository.save(secondCreatedMoimJpaEntity); + moimRepository.flush(); MoimCategoryDto moimCategoryDto = MoimCategoryDto.ALL; MoimSortedFilter moimSortedFilter = MoimSortedFilter.CREATED_AT; From 69be5b881cb5c3fa7ead59cc72b0991a1ee21e4f Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Thu, 16 May 2024 15:17:25 +0900 Subject: [PATCH 17/60] =?UTF-8?q?[BE]=20refactor=20:=20=EB=AF=B8=ED=8C=85?= =?UTF-8?q?=20DTO=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/{ => meeting}/MeetingCreateRequest.java | 2 +- .../meeting/{ => meeting}/MeetingDetailResponse.java | 2 +- .../dto/meeting/{ => meeting}/MeetingSimpleDao.java | 2 +- .../meeting/{ => meeting}/MeetingSimpleResponse.java | 2 +- .../implement/meeting/meeting/MeetingFinder.java | 4 ++-- .../persistence/entity/moim/moim/MoimJpaEntity.java | 1 + .../repository/meeting/meeting/MeetingRepository.java | 2 +- .../meeting/meeting/MeetingRepositoryImpl.java | 10 +++++----- .../meeting/meeting/MeetingController.java | 6 +++--- .../fake_class/meeting/meeting/FakeMeetingService.java | 7 +++---- .../implement/meeting/meeting/MeetingFinderTest.java | 4 ++-- .../moim_today/implement/moim/moim/MoimFinderTest.java | 9 ++++----- .../meeting/meeting/MeetingControllerTest.java | 2 +- 13 files changed, 26 insertions(+), 27 deletions(-) rename backend/src/main/java/moim_today/dto/meeting/{ => meeting}/MeetingCreateRequest.java (97%) rename backend/src/main/java/moim_today/dto/meeting/{ => meeting}/MeetingDetailResponse.java (97%) rename backend/src/main/java/moim_today/dto/meeting/{ => meeting}/MeetingSimpleDao.java (92%) rename backend/src/main/java/moim_today/dto/meeting/{ => meeting}/MeetingSimpleResponse.java (97%) diff --git a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingCreateRequest.java similarity index 97% rename from backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java rename to backend/src/main/java/moim_today/dto/meeting/meeting/MeetingCreateRequest.java index 43e39576..637da04d 100644 --- a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java +++ b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingCreateRequest.java @@ -1,4 +1,4 @@ -package moim_today.dto.meeting; +package moim_today.dto.meeting.meeting; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Builder; diff --git a/backend/src/main/java/moim_today/dto/meeting/MeetingDetailResponse.java b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingDetailResponse.java similarity index 97% rename from backend/src/main/java/moim_today/dto/meeting/MeetingDetailResponse.java rename to backend/src/main/java/moim_today/dto/meeting/meeting/MeetingDetailResponse.java index 19a6238e..6fc9920d 100644 --- a/backend/src/main/java/moim_today/dto/meeting/MeetingDetailResponse.java +++ b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingDetailResponse.java @@ -1,4 +1,4 @@ -package moim_today.dto.meeting; +package moim_today.dto.meeting.meeting; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Builder; diff --git a/backend/src/main/java/moim_today/dto/meeting/MeetingSimpleDao.java b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingSimpleDao.java similarity index 92% rename from backend/src/main/java/moim_today/dto/meeting/MeetingSimpleDao.java rename to backend/src/main/java/moim_today/dto/meeting/meeting/MeetingSimpleDao.java index bb324381..77d69a44 100644 --- a/backend/src/main/java/moim_today/dto/meeting/MeetingSimpleDao.java +++ b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingSimpleDao.java @@ -1,4 +1,4 @@ -package moim_today.dto.meeting; +package moim_today.dto.meeting.meeting; import com.fasterxml.jackson.annotation.JsonFormat; import com.querydsl.core.annotations.QueryProjection; diff --git a/backend/src/main/java/moim_today/dto/meeting/MeetingSimpleResponse.java b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingSimpleResponse.java similarity index 97% rename from backend/src/main/java/moim_today/dto/meeting/MeetingSimpleResponse.java rename to backend/src/main/java/moim_today/dto/meeting/meeting/MeetingSimpleResponse.java index acc09c3a..de3568c3 100644 --- a/backend/src/main/java/moim_today/dto/meeting/MeetingSimpleResponse.java +++ b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingSimpleResponse.java @@ -1,4 +1,4 @@ -package moim_today.dto.meeting; +package moim_today.dto.meeting.meeting; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Builder; diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingFinder.java b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingFinder.java index 5890da10..5ae438eb 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingFinder.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingFinder.java @@ -2,8 +2,8 @@ import moim_today.domain.meeting.enums.MeetingStatus; import moim_today.dto.mail.UpcomingMeetingNoticeResponse; -import moim_today.dto.meeting.MeetingDetailResponse; -import moim_today.dto.meeting.MeetingSimpleDao; +import moim_today.dto.meeting.meeting.MeetingDetailResponse; +import moim_today.dto.meeting.meeting.MeetingSimpleDao; import moim_today.dto.member.MemberSimpleResponse; import moim_today.global.annotation.Implement; import moim_today.implement.meeting.joined_meeting.JoinedMeetingFinder; diff --git a/backend/src/main/java/moim_today/persistence/entity/moim/moim/MoimJpaEntity.java b/backend/src/main/java/moim_today/persistence/entity/moim/moim/MoimJpaEntity.java index f9a5b210..5a444dd8 100644 --- a/backend/src/main/java/moim_today/persistence/entity/moim/moim/MoimJpaEntity.java +++ b/backend/src/main/java/moim_today/persistence/entity/moim/moim/MoimJpaEntity.java @@ -11,6 +11,7 @@ import moim_today.global.error.ForbiddenException; import java.time.LocalDate; +import java.time.LocalDateTime; import static moim_today.global.constant.MoimConstant.DEFAULT_MOIM_IMAGE_URL; import static moim_today.global.constant.MoimConstant.DEFAULT_MOIM_PASSWORD; diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepository.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepository.java index 5bea092b..fe5ddd48 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepository.java @@ -1,7 +1,7 @@ package moim_today.persistence.repository.meeting.meeting; import moim_today.dto.mail.UpcomingMeetingNoticeResponse; -import moim_today.dto.meeting.MeetingSimpleDao; +import moim_today.dto.meeting.meeting.MeetingSimpleDao; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import java.time.LocalDateTime; diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java index b11cac84..62e05c59 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java @@ -3,8 +3,8 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import moim_today.dto.mail.QUpcomingMeetingNoticeResponse; import moim_today.dto.mail.UpcomingMeetingNoticeResponse; -import moim_today.dto.meeting.MeetingSimpleDao; -import moim_today.dto.meeting.QMeetingSimpleDao; +import moim_today.dto.meeting.meeting.MeetingSimpleDao; +import moim_today.dto.meeting.meeting.QMeetingSimpleDao; import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import org.springframework.stereotype.Repository; @@ -14,10 +14,10 @@ import java.util.List; import static moim_today.global.constant.exception.MeetingExceptionConstant.MEETING_NOT_FOUND_ERROR; -import static moim_today.persistence.entity.meeting.joined_meeting.QJoinedMeetingJpaEntity.*; +import static moim_today.persistence.entity.meeting.joined_meeting.QJoinedMeetingJpaEntity.joinedMeetingJpaEntity; import static moim_today.persistence.entity.meeting.meeting.QMeetingJpaEntity.meetingJpaEntity; -import static moim_today.persistence.entity.member.QMemberJpaEntity.*; -import static moim_today.persistence.entity.moim.moim.QMoimJpaEntity.*; +import static moim_today.persistence.entity.member.QMemberJpaEntity.memberJpaEntity; +import static moim_today.persistence.entity.moim.moim.QMoimJpaEntity.moimJpaEntity; @Repository public class MeetingRepositoryImpl implements MeetingRepository { diff --git a/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java b/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java index 5ab16812..e6df604c 100644 --- a/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java +++ b/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java @@ -3,10 +3,10 @@ import moim_today.application.meeting.meeting.MeetingService; import moim_today.domain.meeting.enums.MeetingStatus; import moim_today.domain.member.MemberSession; -import moim_today.dto.meeting.MeetingCreateRequest; import moim_today.dto.meeting.MeetingCreateResponse; -import moim_today.dto.meeting.MeetingDetailResponse; -import moim_today.dto.meeting.MeetingSimpleResponse; +import moim_today.dto.meeting.meeting.MeetingCreateRequest; +import moim_today.dto.meeting.meeting.MeetingDetailResponse; +import moim_today.dto.meeting.meeting.MeetingSimpleResponse; import moim_today.global.annotation.Login; import moim_today.global.response.CollectionResponse; import org.springframework.web.bind.annotation.*; diff --git a/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java b/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java index 52c75b7d..de10b8ed 100644 --- a/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java +++ b/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java @@ -2,13 +2,12 @@ import moim_today.application.meeting.meeting.MeetingService; import moim_today.domain.meeting.enums.MeetingStatus; -import moim_today.dto.meeting.MeetingCreateRequest; import moim_today.dto.meeting.MeetingCreateResponse; -import moim_today.dto.meeting.MeetingDetailResponse; -import moim_today.dto.meeting.MeetingSimpleResponse; +import moim_today.dto.meeting.meeting.MeetingCreateRequest; +import moim_today.dto.meeting.meeting.MeetingDetailResponse; +import moim_today.dto.meeting.meeting.MeetingSimpleResponse; import moim_today.dto.member.MemberSimpleResponse; import moim_today.global.error.ForbiddenException; -import moim_today.util.TestConstant; import java.time.LocalDate; import java.time.LocalDateTime; diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java index 43bf0d26..e51ad590 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java @@ -2,8 +2,8 @@ import moim_today.domain.meeting.enums.MeetingStatus; import moim_today.dto.mail.UpcomingMeetingNoticeResponse; -import moim_today.dto.meeting.MeetingDetailResponse; -import moim_today.dto.meeting.MeetingSimpleDao; +import moim_today.dto.meeting.meeting.MeetingDetailResponse; +import moim_today.dto.meeting.meeting.MeetingSimpleDao; import moim_today.persistence.entity.meeting.joined_meeting.JoinedMeetingJpaEntity; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import moim_today.persistence.entity.member.MemberJpaEntity; diff --git a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java index fd841e85..6cd4a34c 100644 --- a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java +++ b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java @@ -20,7 +20,6 @@ import org.springframework.beans.factory.annotation.Autowired; import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Random; @@ -257,7 +256,8 @@ void findAllMoim() throws InterruptedException { .build(); moimRepository.save(firstCreatedMoimJpaEntity); - moimRepository.flush(); + + Thread.sleep(10); Thread.sleep(10); @@ -267,7 +267,6 @@ void findAllMoim() throws InterruptedException { .build(); moimRepository.save(secondCreatedMoimJpaEntity); - moimRepository.flush(); MoimCategoryDto moimCategoryDto = MoimCategoryDto.ALL; MoimSortedFilter moimSortedFilter = null; @@ -291,7 +290,8 @@ void findAllMoimOrderByCreatedAt() throws InterruptedException { .build(); moimRepository.save(firstCreatedMoimJpaEntity); - moimRepository.flush(); + + Thread.sleep(10); Thread.sleep(10); @@ -301,7 +301,6 @@ void findAllMoimOrderByCreatedAt() throws InterruptedException { .build(); moimRepository.save(secondCreatedMoimJpaEntity); - moimRepository.flush(); MoimCategoryDto moimCategoryDto = MoimCategoryDto.ALL; MoimSortedFilter moimSortedFilter = MoimSortedFilter.CREATED_AT; diff --git a/backend/src/test/java/moim_today/presentation/meeting/meeting/MeetingControllerTest.java b/backend/src/test/java/moim_today/presentation/meeting/meeting/MeetingControllerTest.java index 69e7c41b..31a89f43 100644 --- a/backend/src/test/java/moim_today/presentation/meeting/meeting/MeetingControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/meeting/meeting/MeetingControllerTest.java @@ -4,7 +4,7 @@ import moim_today.application.meeting.meeting.MeetingService; import moim_today.domain.meeting.enums.MeetingCategory; import moim_today.domain.meeting.enums.MeetingStatus; -import moim_today.dto.meeting.MeetingCreateRequest; +import moim_today.dto.meeting.meeting.MeetingCreateRequest; import moim_today.fake_class.meeting.meeting.FakeMeetingService; import moim_today.util.ControllerTest; import moim_today.util.EnumDocsUtils; From b195fc0043f449711633a162f9c82f736600aa03 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Thu, 16 May 2024 15:55:13 +0900 Subject: [PATCH 18/60] =?UTF-8?q?[BE]=20test=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EB=8C=93=EA=B8=80=20=EC=9E=91=EC=84=B1=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MeetingCommentRepository.java | 3 +- .../MeetingCommentRepositoryImpl.java | 4 ++ .../MeetingCommentController.java | 2 +- .../FakeMeetingCommentService.java | 12 +++++ .../meeting/meeting/MeetingFinderTest.java | 35 +++++++++++- .../MeetingCommentAppenderTest.java | 36 +++++++++++++ .../MeetingCommentControllerTest.java | 54 +++++++++++++++++++ .../java/moim_today/util/TestConstant.java | 1 + 8 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java create mode 100644 backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentAppenderTest.java create mode 100644 backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java index ad0b5c47..be50d878 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java @@ -1,6 +1,5 @@ package moim_today.persistence.repository.meeting.meeting_comment; -import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; import java.util.List; @@ -12,4 +11,6 @@ public interface MeetingCommentRepository { void updateDeletedMembers(final long memberId, final List meetingIds); MeetingCommentJpaEntity findById(final long meetingCommentId); + + long count(); } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java index e45c6e7d..5a456197 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java @@ -43,4 +43,8 @@ public void updateDeletedMembers(final long memberId, final List meetingId .execute(); } + @Override + public long count() { + return meetingCommentJpaRepository.count(); + } } diff --git a/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java index ad442dfa..0f6166ea 100644 --- a/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java +++ b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java @@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -@RequestMapping("/api/meetings/comments") +@RequestMapping("/api/meeting-comments") @RestController public class MeetingCommentController { diff --git a/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java b/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java new file mode 100644 index 00000000..d076f445 --- /dev/null +++ b/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java @@ -0,0 +1,12 @@ +package moim_today.fake_class.meeting.meeting_comment; + +import moim_today.application.meeting.meeting_comment.MeetingCommentService; +import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; + +public class FakeMeetingCommentService implements MeetingCommentService { + + @Override + public void createMeetingComment(final long memberId, final MeetingCommentCreateRequest meetingCommentCreateRequest) { + + } +} diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java index e51ad590..c505b209 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java @@ -4,6 +4,7 @@ import moim_today.dto.mail.UpcomingMeetingNoticeResponse; import moim_today.dto.meeting.meeting.MeetingDetailResponse; import moim_today.dto.meeting.meeting.MeetingSimpleDao; +import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.meeting.joined_meeting.JoinedMeetingJpaEntity; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import moim_today.persistence.entity.member.MemberJpaEntity; @@ -15,9 +16,10 @@ import java.time.LocalDateTime; import java.util.List; +import static moim_today.global.constant.exception.MeetingExceptionConstant.MEETING_NOT_FOUND_ERROR; import static moim_today.util.TestConstant.*; -import static moim_today.util.TestConstant.MOIM_ID; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class MeetingFinderTest extends ImplementTest { @@ -636,4 +638,33 @@ void findUpcomingNoticesOnlyUpcomingNoticeSentFalse() { // then assertThat(upcomingNotices.size()).isEqualTo(1); } + + @DisplayName("미팅 Id로 모임 Id를 조회한다.") + @Test + void findMoimIdByMeetingId() { + // given + long expectedMoimId = MOIM_ID.longValue(); + + MeetingJpaEntity meetingJpaEntity = MeetingJpaEntity.builder() + .moimId(expectedMoimId) + .build(); + + meetingRepository.save(meetingJpaEntity); + long meetingId = meetingJpaEntity.getId(); + + // when + long actualMoimId = meetingFinder.findMoimIdByMeetingId(meetingId); + + // then + assertThat(expectedMoimId).isEqualTo(actualMoimId); + } + + @DisplayName("미팅 Id로 모임 Id를 조회할때, 미팅이 존재하지 않으면 예외가 발생한다.") + @Test + void findMoimIdByMeetingIdThrowsNotFoundException() { + // expected + assertThatThrownBy(() -> meetingFinder.findMoimIdByMeetingId(MEETING_ID.longValue())) + .isInstanceOf(NotFoundException.class) + .hasMessage(MEETING_NOT_FOUND_ERROR.message()); + } } diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentAppenderTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentAppenderTest.java new file mode 100644 index 00000000..ecc234a9 --- /dev/null +++ b/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentAppenderTest.java @@ -0,0 +1,36 @@ +package moim_today.implement.meeting.meeting_comment; + +import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; +import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; +import moim_today.util.ImplementTest; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static moim_today.util.TestConstant.*; +import static org.assertj.core.api.Assertions.*; + +class MeetingCommentAppenderTest extends ImplementTest { + + @Autowired + private MeetingCommentAppender meetingCommentAppender; + + @DisplayName("미팅에 댓글을 작성한다.") + @Test + void createMeetingComment(){ + //given + long memberId = MEMBER_ID.longValue(); + + MeetingCommentCreateRequest meetingCommentCreateRequest = MeetingCommentCreateRequest.builder() + .meetingId(MEETING_ID.longValue()) + .contents(MEETING_COMMENT_CONTENTS.value()) + .build(); + + //when + meetingCommentAppender.createMeetingComment(memberId, meetingCommentCreateRequest); + + //then + assertThat(meetingCommentRepository.count()).isEqualTo(1); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java b/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java new file mode 100644 index 00000000..8c38f231 --- /dev/null +++ b/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java @@ -0,0 +1,54 @@ +package moim_today.presentation.meeting.meeting_comment; + +import com.epages.restdocs.apispec.ResourceSnippetParameters; +import moim_today.application.meeting.meeting_comment.MeetingCommentService; +import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; +import moim_today.fake_class.meeting.meeting_comment.FakeMeetingCommentService; +import moim_today.util.ControllerTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.http.MediaType; + +import static com.epages.restdocs.apispec.ResourceDocumentation.resource; +import static com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatTypes.NUMBER; +import static com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatTypes.STRING; +import static moim_today.util.TestConstant.MEETING_COMMENT_CONTENTS; +import static moim_today.util.TestConstant.MEETING_ID; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +class MeetingCommentControllerTest extends ControllerTest { + + private final MeetingCommentService meetingCommentService = new FakeMeetingCommentService(); + + @Override + protected Object initController() { + return new MeetingCommentController(meetingCommentService); + } + + @DisplayName("미팅에 댓글을 작성한다.") + @Test + void createMeetingComment() throws Exception { + MeetingCommentCreateRequest meetingCommentCreateRequest = MeetingCommentCreateRequest.builder() + .meetingId(MEETING_ID.longValue()) + .contents(MEETING_COMMENT_CONTENTS.value()) + .build(); + + mockMvc.perform(post("/api/meeting-comments") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(meetingCommentCreateRequest))) + .andExpect(status().isOk()) + .andDo(document("미팅 댓글 작성 성공", + resource(ResourceSnippetParameters.builder() + .tag("미팅 댓글") + .summary("미팅 댓글 작성") + .requestFields( + fieldWithPath("meetingId").type(NUMBER).description("미팅 Id"), + fieldWithPath("contents").type(STRING).description("댓글 내용") + ) + .build() + ))); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/util/TestConstant.java b/backend/src/test/java/moim_today/util/TestConstant.java index d12fbb79..ebf2e055 100644 --- a/backend/src/test/java/moim_today/util/TestConstant.java +++ b/backend/src/test/java/moim_today/util/TestConstant.java @@ -79,6 +79,7 @@ public enum TestConstant { MEETING_ID("123"), MEETING_AGENDA("meeting agenda"), MEETING_PLACE("meeting place"), + MEETING_COMMENT_CONTENTS("meeting comment contents"), FIRST_CREATED_MEETING_AGENDA("first agenda"), SECOND_CREATED_MEETING_AGENDA("second agenda"), From d746331edb8ff3af6c54094068eb7d9208453e57 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Thu, 16 May 2024 16:54:27 +0900 Subject: [PATCH 19/60] =?UTF-8?q?[BE]=20feat=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EB=8C=93=EA=B8=80=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MeetingCommentService.java | 5 ++++ .../MeetingCommentServiceImpl.java | 12 +++++++++- .../MeetingCommentResponse.java | 22 ++++++++++++++++++ .../meeting/meeting/MeetingFinder.java | 2 +- .../meeting_comment/MeetingCommentFinder.java | 7 ++++++ .../MeetingCommentRepository.java | 3 +++ .../MeetingCommentRepositoryImpl.java | 23 ++++++++++++++++++- .../MeetingCommentController.java | 17 ++++++++++---- .../FakeMeetingCommentService.java | 8 +++++++ .../meeting/meeting/MeetingFinderTest.java | 8 +++---- 10 files changed, 95 insertions(+), 12 deletions(-) create mode 100644 backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentResponse.java diff --git a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java index 2f99e60f..bfe88c53 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java @@ -1,8 +1,13 @@ package moim_today.application.meeting.meeting_comment; import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; +import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; + +import java.util.List; public interface MeetingCommentService { void createMeetingComment(final long memberId, final MeetingCommentCreateRequest meetingCommentCreateRequest); + + List findAllByMeetingId(final long memberId, final long meetingId); } diff --git a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java index 81828158..6addd72d 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java @@ -1,6 +1,7 @@ package moim_today.application.meeting.meeting_comment; import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; +import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; import moim_today.implement.meeting.meeting.MeetingFinder; import moim_today.implement.meeting.meeting_comment.MeetingCommentAppender; import moim_today.implement.meeting.meeting_comment.MeetingCommentFinder; @@ -9,6 +10,8 @@ import moim_today.implement.moim.joined_moim.JoinedMoimFinder; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class MeetingCommentServiceImpl implements MeetingCommentService { @@ -35,8 +38,15 @@ public MeetingCommentServiceImpl(final MeetingCommentAppender meetingCommentAppe @Override public void createMeetingComment(final long memberId, final MeetingCommentCreateRequest meetingCommentCreateRequest) { - long moimId = meetingFinder.findMoimIdByMeetingId(meetingCommentCreateRequest.meetingId()); + long moimId = meetingFinder.getMoimIdByMeetingId(meetingCommentCreateRequest.meetingId()); joinedMoimFinder.validateMemberInMoim(memberId, moimId); meetingCommentAppender.createMeetingComment(memberId, meetingCommentCreateRequest); } + + @Override + public List findAllByMeetingId(final long memberId, final long meetingId) { + long moimId = meetingFinder.getMoimIdByMeetingId(meetingId); + joinedMoimFinder.validateMemberInMoim(memberId, moimId); + return meetingCommentFinder.findAllByMeetingId(meetingId); + } } diff --git a/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentResponse.java b/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentResponse.java new file mode 100644 index 00000000..8b268e12 --- /dev/null +++ b/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentResponse.java @@ -0,0 +1,22 @@ +package moim_today.dto.meeting.meeting_comment; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.querydsl.core.annotations.QueryProjection; +import lombok.Builder; + +import java.time.LocalDateTime; + +@Builder +public record MeetingCommentResponse( + long meetingCommentId, + String username, + String imageUrl, + String contents, + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "Asia/Seoul") + LocalDateTime createdAt +) { + + @QueryProjection + public MeetingCommentResponse { + } +} diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingFinder.java b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingFinder.java index 5ae438eb..9fdc01e3 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingFinder.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingFinder.java @@ -57,7 +57,7 @@ public List findUpcomingNotices(final LocalDateTi } @Transactional(readOnly = true) - public long findMoimIdByMeetingId(final long meetingId) { + public long getMoimIdByMeetingId(final long meetingId) { return meetingRepository.findMoimIdByMeetingId(meetingId); } } diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java index 02b6e998..bce1723f 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java @@ -1,8 +1,11 @@ package moim_today.implement.meeting.meeting_comment; +import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; import moim_today.global.annotation.Implement; import moim_today.persistence.repository.meeting.meeting_comment.MeetingCommentRepository; +import java.util.List; + @Implement public class MeetingCommentFinder { @@ -11,4 +14,8 @@ public class MeetingCommentFinder { public MeetingCommentFinder(final MeetingCommentRepository meetingCommentRepository) { this.meetingCommentRepository = meetingCommentRepository; } + + public List findAllByMeetingId(final long meetingId) { + return meetingCommentRepository.findAllByMeetingId(meetingId); + } } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java index be50d878..c1eeb721 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java @@ -1,5 +1,6 @@ package moim_today.persistence.repository.meeting.meeting_comment; +import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; import java.util.List; @@ -13,4 +14,6 @@ public interface MeetingCommentRepository { MeetingCommentJpaEntity findById(final long meetingCommentId); long count(); + + List findAllByMeetingId(final long meetingId); } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java index 5a456197..26943dae 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java @@ -1,7 +1,10 @@ package moim_today.persistence.repository.meeting.meeting_comment; import com.querydsl.jpa.impl.JPAQueryFactory; +import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; +import moim_today.dto.meeting.meeting_comment.QMeetingCommentResponse; import moim_today.global.error.NotFoundException; +import moim_today.implement.meeting.meeting_comment.MeetingCommentAppender; import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; import org.springframework.stereotype.Repository; @@ -10,17 +13,20 @@ import static moim_today.global.constant.MemberConstant.UNKNOWN_MEMBER; import static moim_today.global.constant.exception.MeetingCommentExceptionConstant.MEETING_COMMENT_NOT_FOUND_ERROR; import static moim_today.persistence.entity.meeting.meeting_comment.QMeetingCommentJpaEntity.meetingCommentJpaEntity; +import static moim_today.persistence.entity.member.QMemberJpaEntity.memberJpaEntity; @Repository public class MeetingCommentRepositoryImpl implements MeetingCommentRepository { private final MeetingCommentJpaRepository meetingCommentJpaRepository; private final JPAQueryFactory queryFactory; + private final MeetingCommentAppender meetingCommentAppender; public MeetingCommentRepositoryImpl(final MeetingCommentJpaRepository meetingCommentJpaRepository, - final JPAQueryFactory queryFactory) { + final JPAQueryFactory queryFactory, final MeetingCommentAppender meetingCommentAppender) { this.meetingCommentJpaRepository = meetingCommentJpaRepository; this.queryFactory = queryFactory; + this.meetingCommentAppender = meetingCommentAppender; } @Override @@ -47,4 +53,19 @@ public void updateDeletedMembers(final long memberId, final List meetingId public long count() { return meetingCommentJpaRepository.count(); } + + @Override + public List findAllByMeetingId(final long meetingId) { + return queryFactory.select(new QMeetingCommentResponse( + meetingCommentJpaEntity.id, + memberJpaEntity.username, + memberJpaEntity.memberProfileImageUrl, + meetingCommentJpaEntity.contents, + meetingCommentJpaEntity.createdAt + )) + .from(meetingCommentJpaEntity) + .join(memberJpaEntity).on(meetingCommentJpaEntity.memberId.eq(memberJpaEntity.id)) + .where(meetingCommentJpaEntity.meetingId.eq(meetingId)) + .fetch(); + } } diff --git a/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java index 0f6166ea..f29e0356 100644 --- a/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java +++ b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java @@ -3,11 +3,12 @@ import moim_today.application.meeting.meeting_comment.MeetingCommentService; import moim_today.domain.member.MemberSession; import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; +import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; import moim_today.global.annotation.Login; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import moim_today.global.response.CollectionResponse; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RequestMapping("/api/meeting-comments") @RestController @@ -19,9 +20,15 @@ public MeetingCommentController(final MeetingCommentService meetingCommentServic this.meetingCommentService = meetingCommentService; } - @PostMapping() + @PostMapping public void createMeetingComment(@Login final MemberSession memberSession, @RequestBody final MeetingCommentCreateRequest meetingCommentCreateRequest) { meetingCommentService.createMeetingComment(memberSession.id(), meetingCommentCreateRequest); } + + @GetMapping("/{meetingId}") + public CollectionResponse> findAllByMeetingId(@Login final MemberSession memberSession, + @PathVariable final long meetingId) { + return CollectionResponse.of(meetingCommentService.findAllByMeetingId(memberSession.id(), meetingId)); + } } diff --git a/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java b/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java index d076f445..646d1a62 100644 --- a/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java +++ b/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java @@ -2,6 +2,9 @@ import moim_today.application.meeting.meeting_comment.MeetingCommentService; import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; +import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; + +import java.util.List; public class FakeMeetingCommentService implements MeetingCommentService { @@ -9,4 +12,9 @@ public class FakeMeetingCommentService implements MeetingCommentService { public void createMeetingComment(final long memberId, final MeetingCommentCreateRequest meetingCommentCreateRequest) { } + + @Override + public List findAllByMeetingId(final long memberId, final long meetingId) { + return List.of(); + } } diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java index c505b209..fb36bc30 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java @@ -641,7 +641,7 @@ void findUpcomingNoticesOnlyUpcomingNoticeSentFalse() { @DisplayName("미팅 Id로 모임 Id를 조회한다.") @Test - void findMoimIdByMeetingId() { + void getMoimIdByMeetingId() { // given long expectedMoimId = MOIM_ID.longValue(); @@ -653,7 +653,7 @@ void findMoimIdByMeetingId() { long meetingId = meetingJpaEntity.getId(); // when - long actualMoimId = meetingFinder.findMoimIdByMeetingId(meetingId); + long actualMoimId = meetingFinder.getMoimIdByMeetingId(meetingId); // then assertThat(expectedMoimId).isEqualTo(actualMoimId); @@ -661,9 +661,9 @@ void findMoimIdByMeetingId() { @DisplayName("미팅 Id로 모임 Id를 조회할때, 미팅이 존재하지 않으면 예외가 발생한다.") @Test - void findMoimIdByMeetingIdThrowsNotFoundException() { + void getMoimIdByMeetingIdThrowsNotFoundException() { // expected - assertThatThrownBy(() -> meetingFinder.findMoimIdByMeetingId(MEETING_ID.longValue())) + assertThatThrownBy(() -> meetingFinder.getMoimIdByMeetingId(MEETING_ID.longValue())) .isInstanceOf(NotFoundException.class) .hasMessage(MEETING_NOT_FOUND_ERROR.message()); } From dc1ed9b820831f54220d3676367046752f558deb Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Thu, 16 May 2024 16:55:24 +0900 Subject: [PATCH 20/60] =?UTF-8?q?[BE]=20refactor=20:=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EB=B0=98=ED=99=98=20=ED=83=80=EC=9E=85=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=AA=85=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 --- .../moim_today/global/response/CollectionResponse.java | 2 +- .../presentation/department/DepartmentController.java | 4 ++-- .../presentation/meeting/meeting/MeetingController.java | 2 +- .../meeting/meeting_comment/MeetingCommentController.java | 2 +- .../java/moim_today/presentation/moim/MoimController.java | 8 ++++---- .../presentation/schedule/ScheduleController.java | 8 ++++---- .../java/moim_today/presentation/todo/TodoController.java | 2 +- .../presentation/university/UniversityController.java | 2 +- .../global/response/CollectionResponseTest.java | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) diff --git a/backend/src/main/java/moim_today/global/response/CollectionResponse.java b/backend/src/main/java/moim_today/global/response/CollectionResponse.java index db6bf3e6..18bf5e66 100644 --- a/backend/src/main/java/moim_today/global/response/CollectionResponse.java +++ b/backend/src/main/java/moim_today/global/response/CollectionResponse.java @@ -3,7 +3,7 @@ public record CollectionResponse ( T data ) { - public static CollectionResponse of(final T data) { + public static CollectionResponse from(final T data) { return new CollectionResponse<>(data); } } diff --git a/backend/src/main/java/moim_today/presentation/department/DepartmentController.java b/backend/src/main/java/moim_today/presentation/department/DepartmentController.java index 9f035900..9df5aedd 100644 --- a/backend/src/main/java/moim_today/presentation/department/DepartmentController.java +++ b/backend/src/main/java/moim_today/presentation/department/DepartmentController.java @@ -28,12 +28,12 @@ public void updateDepartmentInfo() { @GetMapping("/university-name") public CollectionResponse> getDepartmentsByUniversityName( @RequestParam(defaultValue = BLANK) final String universityName) { - return CollectionResponse.of(departmentService.getAllDepartmentByUniversityName(universityName)); + return CollectionResponse.from(departmentService.getAllDepartmentByUniversityName(universityName)); } @GetMapping("/university-id") public CollectionResponse> getDepartmentsByUniversityId( @RequestParam(defaultValue = NO_UNIVERSITY_ID) final long universityId) { - return CollectionResponse.of(departmentService.getAllDepartmentById(universityId)); + return CollectionResponse.from(departmentService.getAllDepartmentById(universityId)); } } \ No newline at end of file diff --git a/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java b/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java index e6df604c..018aa789 100644 --- a/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java +++ b/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java @@ -36,7 +36,7 @@ public CollectionResponse> findAllByMoimId( @RequestParam final MeetingStatus meetingStatus) { List meetingSimpleResponses = meetingService.findAllByMoimId(moimId, memberSession.id(), meetingStatus); - return CollectionResponse.of(meetingSimpleResponses); + return CollectionResponse.from(meetingSimpleResponses); } @GetMapping("/detail/{meetingId}") diff --git a/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java index f29e0356..33673fa9 100644 --- a/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java +++ b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java @@ -29,6 +29,6 @@ public void createMeetingComment(@Login final MemberSession memberSession, @GetMapping("/{meetingId}") public CollectionResponse> findAllByMeetingId(@Login final MemberSession memberSession, @PathVariable final long meetingId) { - return CollectionResponse.of(meetingCommentService.findAllByMeetingId(memberSession.id(), meetingId)); + return CollectionResponse.from(meetingCommentService.findAllByMeetingId(memberSession.id(), meetingId)); } } diff --git a/backend/src/main/java/moim_today/presentation/moim/MoimController.java b/backend/src/main/java/moim_today/presentation/moim/MoimController.java index 168b7da0..cc77cb5b 100644 --- a/backend/src/main/java/moim_today/presentation/moim/MoimController.java +++ b/backend/src/main/java/moim_today/presentation/moim/MoimController.java @@ -58,7 +58,7 @@ public MoimDetailResponse getMoimDetail(@PathVariable final long moimId, @GetMapping("/simple") public CollectionResponse> findAllMoimResponse(@RequestParam final MoimCategoryDto moimCategoryDto, @RequestParam final MoimSortedFilter moimSortedFilter) { - return CollectionResponse.of(moimService.findAllMoimResponse(moimCategoryDto, moimSortedFilter)); + return CollectionResponse.from(moimService.findAllMoimResponse(moimCategoryDto, moimSortedFilter)); } @PatchMapping @@ -106,7 +106,7 @@ public void joinMoim(@Login final MemberSession memberSession, @GetMapping("/notices/simple") public CollectionResponse> findAllMoimNotice(@Login final MemberSession memberSession, @RequestParam final long moimId) { - return CollectionResponse.of(moimNoticeService.findAllMoimNotice(memberSession.id(), moimId)); + return CollectionResponse.from(moimNoticeService.findAllMoimNotice(memberSession.id(), moimId)); } @GetMapping("/notices/detail") @@ -129,11 +129,11 @@ public void deleteMoimNotice(@Login final MemberSession memberSession, @GetMapping("/search") public CollectionResponse> searchMoim(@RequestParam final String searchParam) { - return CollectionResponse.of(moimService.searchMoim(searchParam)); + return CollectionResponse.from(moimService.searchMoim(searchParam)); } @GetMapping("/categories") public CollectionResponse getMoimCategories() { - return CollectionResponse.of(MoimCategory.values()); + return CollectionResponse.from(MoimCategory.values()); } } diff --git a/backend/src/main/java/moim_today/presentation/schedule/ScheduleController.java b/backend/src/main/java/moim_today/presentation/schedule/ScheduleController.java index 68cdf83a..3432e8a6 100644 --- a/backend/src/main/java/moim_today/presentation/schedule/ScheduleController.java +++ b/backend/src/main/java/moim_today/presentation/schedule/ScheduleController.java @@ -26,7 +26,7 @@ public ScheduleController(final ScheduleService scheduleService) { public CollectionResponse> findAllByWeekly(@Login final MemberSession memberSession, @RequestParam final LocalDate startDate) { List scheduleResponses = scheduleService.findAllByWeekly(memberSession.id(), startDate); - return CollectionResponse.of(scheduleResponses); + return CollectionResponse.from(scheduleResponses); } @GetMapping("/weekly/available-time/moims/{moimId}") @@ -35,7 +35,7 @@ public CollectionResponse> findAvailableTimeIn @RequestParam final LocalDate startDate) { List availableTimeInMoimResponses = scheduleService.findWeeklyAvailableTimeInMoim(moimId, startDate); - return CollectionResponse.of(availableTimeInMoimResponses); + return CollectionResponse.from(availableTimeInMoimResponses); } @GetMapping("/weekly/available-time/members/{memberId}") @@ -44,14 +44,14 @@ public CollectionResponse> findAvailableTim @RequestParam final LocalDate startDate) { List availableTimeInMoimResponses = scheduleService.findWeeklyAvailableTimeForMember(memberId, startDate); - return CollectionResponse.of(availableTimeInMoimResponses); + return CollectionResponse.from(availableTimeInMoimResponses); } @GetMapping("/monthly") public CollectionResponse> findAllByMonthly(@Login final MemberSession memberSession, @RequestParam final YearMonth yearMonth) { List scheduleResponses = scheduleService.findAllByMonthly(memberSession.id(), yearMonth); - return CollectionResponse.of(scheduleResponses); + return CollectionResponse.from(scheduleResponses); } @PostMapping("/timetable") diff --git a/backend/src/main/java/moim_today/presentation/todo/TodoController.java b/backend/src/main/java/moim_today/presentation/todo/TodoController.java index 23700159..1c314cc7 100644 --- a/backend/src/main/java/moim_today/presentation/todo/TodoController.java +++ b/backend/src/main/java/moim_today/presentation/todo/TodoController.java @@ -42,7 +42,7 @@ public CollectionResponse> findAllMembersTodosInMoim( @RequestParam final YearMonth startDate, @RequestParam final int months) { - return CollectionResponse.of(todoService.findAllMembersTodosInMoim(memberSession.id(), moimId, startDate, months)); + return CollectionResponse.from(todoService.findAllMembersTodosInMoim(memberSession.id(), moimId, startDate, months)); } @GetMapping("/{todoId}") diff --git a/backend/src/main/java/moim_today/presentation/university/UniversityController.java b/backend/src/main/java/moim_today/presentation/university/UniversityController.java index 7eba1de6..35862e40 100644 --- a/backend/src/main/java/moim_today/presentation/university/UniversityController.java +++ b/backend/src/main/java/moim_today/presentation/university/UniversityController.java @@ -27,6 +27,6 @@ public void fetchUniversityInfo(){ @GetMapping public CollectionResponse> getUniversity(){ - return CollectionResponse.of(universityService.getUniversities()); + return CollectionResponse.from(universityService.getUniversities()); } } diff --git a/backend/src/test/java/moim_today/global/response/CollectionResponseTest.java b/backend/src/test/java/moim_today/global/response/CollectionResponseTest.java index 25e1a7cb..bda0ee96 100644 --- a/backend/src/test/java/moim_today/global/response/CollectionResponseTest.java +++ b/backend/src/test/java/moim_today/global/response/CollectionResponseTest.java @@ -21,7 +21,7 @@ class CollectionResponseTest { members.add(memberB); //when - CollectionResponse> arrayListCollectionResponse = CollectionResponse.of(members); + CollectionResponse> arrayListCollectionResponse = CollectionResponse.from(members); //then assertThat(arrayListCollectionResponse.data()).contains(memberA, memberB); From 33d47b03e1f86347254709dc7e36b90c30294bda Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Thu, 16 May 2024 17:44:12 +0900 Subject: [PATCH 21/60] =?UTF-8?q?[BE]=20test=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EB=8C=93=EA=B8=80=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting_comment/MeetingCommentFinder.java | 2 + .../MeetingCommentRepositoryImpl.java | 4 +- .../FakeMeetingCommentService.java | 29 ++++++++- .../MeetingCommentFinderTest.java | 65 +++++++++++++++++++ .../MeetingCommentControllerTest.java | 23 +++++++ .../java/moim_today/util/TestConstant.java | 1 + 6 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinderTest.java diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java index bce1723f..8a879669 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java @@ -3,6 +3,7 @@ import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; import moim_today.global.annotation.Implement; import moim_today.persistence.repository.meeting.meeting_comment.MeetingCommentRepository; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -15,6 +16,7 @@ public MeetingCommentFinder(final MeetingCommentRepository meetingCommentReposit this.meetingCommentRepository = meetingCommentRepository; } + @Transactional(readOnly = true) public List findAllByMeetingId(final long meetingId) { return meetingCommentRepository.findAllByMeetingId(meetingId); } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java index 26943dae..64ae02cc 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java @@ -20,13 +20,11 @@ public class MeetingCommentRepositoryImpl implements MeetingCommentRepository { private final MeetingCommentJpaRepository meetingCommentJpaRepository; private final JPAQueryFactory queryFactory; - private final MeetingCommentAppender meetingCommentAppender; public MeetingCommentRepositoryImpl(final MeetingCommentJpaRepository meetingCommentJpaRepository, - final JPAQueryFactory queryFactory, final MeetingCommentAppender meetingCommentAppender) { + final JPAQueryFactory queryFactory) { this.meetingCommentJpaRepository = meetingCommentJpaRepository; this.queryFactory = queryFactory; - this.meetingCommentAppender = meetingCommentAppender; } @Override diff --git a/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java b/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java index 646d1a62..0380d3d2 100644 --- a/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java +++ b/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java @@ -4,8 +4,11 @@ import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; +import java.time.LocalDateTime; import java.util.List; +import static moim_today.util.TestConstant.*; + public class FakeMeetingCommentService implements MeetingCommentService { @Override @@ -15,6 +18,30 @@ public void createMeetingComment(final long memberId, final MeetingCommentCreate @Override public List findAllByMeetingId(final long memberId, final long meetingId) { - return List.of(); + MeetingCommentResponse commentResponse1 = MeetingCommentResponse.builder() + .meetingCommentId(MEETING_COMMENT_ID.longValue()) + .username(USERNAME.value()) + .imageUrl(PROFILE_IMAGE_URL.value()) + .contents(MEETING_COMMENT_CONTENTS.value()) + .createdAt(LocalDateTime.now()) + .build(); + + MeetingCommentResponse commentResponse2 = MeetingCommentResponse.builder() + .meetingCommentId(MEETING_COMMENT_ID.longValue() + 1) + .username(USERNAME.value()) + .imageUrl(PROFILE_IMAGE_URL.value()) + .contents(MEETING_COMMENT_CONTENTS.value()) + .createdAt(LocalDateTime.now()) + .build(); + + MeetingCommentResponse commentResponse3 = MeetingCommentResponse.builder() + .meetingCommentId(MEETING_COMMENT_ID.longValue() + 2) + .username(USERNAME.value()) + .imageUrl(PROFILE_IMAGE_URL.value()) + .contents(MEETING_COMMENT_CONTENTS.value()) + .createdAt(LocalDateTime.now()) + .build(); + + return List.of(commentResponse1, commentResponse2, commentResponse3); } } diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinderTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinderTest.java new file mode 100644 index 00000000..74669e59 --- /dev/null +++ b/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinderTest.java @@ -0,0 +1,65 @@ +package moim_today.implement.meeting.meeting_comment; + +import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; +import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; +import moim_today.persistence.entity.member.MemberJpaEntity; +import moim_today.util.ImplementTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +import static moim_today.util.TestConstant.*; +import static org.assertj.core.api.Assertions.assertThat; + +class MeetingCommentFinderTest extends ImplementTest { + + @Autowired + private MeetingCommentFinder meetingCommentFinder; + + @DisplayName("미팅의 댓글 목록을 조회한다.") + @Test + void findAllByMeetingIdTest(){ + // given1 + MemberJpaEntity memberJpaEntity = MemberJpaEntity.builder() + .username(USERNAME.value()) + .memberProfileImageUrl(PROFILE_IMAGE_URL.value()) + .build(); + + memberRepository.save(memberJpaEntity); + long memberId = memberJpaEntity.getId(); + + // given2 + long meetingId = MEETING_ID.longValue(); + long otherMeetingId = meetingId + 1; + + MeetingCommentJpaEntity commentJpaEntityA = MeetingCommentJpaEntity.builder() + .meetingId(meetingId) + .memberId(memberId) + .contents(MEETING_COMMENT_CONTENTS.value()) + .build(); + + MeetingCommentJpaEntity commentJpaEntityB = MeetingCommentJpaEntity.builder() + .meetingId(meetingId) + .memberId(memberId) + .contents(MEETING_COMMENT_CONTENTS.value()) + .build(); + + MeetingCommentJpaEntity commentJpaEntityC = MeetingCommentJpaEntity.builder() + .meetingId(otherMeetingId) + .memberId(memberId) + .contents(MEETING_COMMENT_CONTENTS.value()) + .build(); + + meetingCommentRepository.save(commentJpaEntityA); + meetingCommentRepository.save(commentJpaEntityB); + meetingCommentRepository.save(commentJpaEntityC); + + //when + List findMeetingComments = meetingCommentFinder.findAllByMeetingId(meetingId); + + //then + assertThat(findMeetingComments.size()).isEqualTo(2); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java b/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java index 8c38f231..0fe3a879 100644 --- a/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java @@ -15,6 +15,7 @@ import static moim_today.util.TestConstant.MEETING_COMMENT_CONTENTS; import static moim_today.util.TestConstant.MEETING_ID; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -51,4 +52,26 @@ void createMeetingComment() throws Exception { .build() ))); } + + @DisplayName("미팅의 댓글 목록을 불러온다.") + @Test + void findAllMeetingCommentsByMeetingId() throws Exception { + long meetingId = MEETING_ID.longValue(); + + mockMvc.perform(get("/api/meeting-comments/{meetingId}", meetingId)) + .andExpect(status().isOk()) + .andDo(document("미팅 댓글 목록 조회 성공", + resource(ResourceSnippetParameters.builder() + .tag("미팅 댓글") + .summary("미팅 댓글 목록 조회") + .responseFields( + fieldWithPath("data[0].meetingCommentId").type(NUMBER).description("댓글 Id"), + fieldWithPath("data[0].username").type(STRING).description("작성자"), + fieldWithPath("data[0].imageUrl").type(STRING).description("작성자 프로필 사진 Url"), + fieldWithPath("data[0].contents").type(STRING).description("댓글 내용"), + fieldWithPath("data[0].createdAt").type(STRING).description("생성 일자") + ) + .build() + ))); + } } \ No newline at end of file diff --git a/backend/src/test/java/moim_today/util/TestConstant.java b/backend/src/test/java/moim_today/util/TestConstant.java index ebf2e055..9f001410 100644 --- a/backend/src/test/java/moim_today/util/TestConstant.java +++ b/backend/src/test/java/moim_today/util/TestConstant.java @@ -79,6 +79,7 @@ public enum TestConstant { MEETING_ID("123"), MEETING_AGENDA("meeting agenda"), MEETING_PLACE("meeting place"), + MEETING_COMMENT_ID("456"), MEETING_COMMENT_CONTENTS("meeting comment contents"), FIRST_CREATED_MEETING_AGENDA("first agenda"), From 5184242d6b5218aa9accb37b57bdc22e2c877a29 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Thu, 16 May 2024 19:39:37 +0900 Subject: [PATCH 22/60] =?UTF-8?q?[BE]=20feat=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EB=8C=93=EA=B8=80=20=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting_comment/MeetingCommentService.java | 3 +++ .../meeting_comment/MeetingCommentServiceImpl.java | 11 +++++++++++ .../MeetingCommentUpdateRequest.java | 7 +++++++ .../exception/MeetingExceptionConstant.java | 2 +- .../meeting_comment/MeetingCommentFinder.java | 6 ++++++ .../meeting_comment/MeetingCommentUpdater.java | 7 +++++++ .../meeting_comment/MeetingCommentJpaEntity.java | 14 ++++++++++++++ .../meeting_comment/MeetingCommentRepository.java | 2 ++ .../MeetingCommentRepositoryImpl.java | 7 ++++++- .../meeting_comment/MeetingCommentController.java | 7 +++++++ .../meeting_comment/FakeMeetingCommentService.java | 6 ++++++ 11 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentUpdateRequest.java diff --git a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java index bfe88c53..5927900f 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java @@ -2,6 +2,7 @@ import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; +import moim_today.dto.meeting.meeting_comment.MeetingCommentUpdateRequest; import java.util.List; @@ -10,4 +11,6 @@ public interface MeetingCommentService { void createMeetingComment(final long memberId, final MeetingCommentCreateRequest meetingCommentCreateRequest); List findAllByMeetingId(final long memberId, final long meetingId); + + void updateMeetingComment(final long memberId, final MeetingCommentUpdateRequest meetingCommentUpdateRequest); } diff --git a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java index 6addd72d..9f60d0a2 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java @@ -2,13 +2,16 @@ import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; +import moim_today.dto.meeting.meeting_comment.MeetingCommentUpdateRequest; import moim_today.implement.meeting.meeting.MeetingFinder; import moim_today.implement.meeting.meeting_comment.MeetingCommentAppender; import moim_today.implement.meeting.meeting_comment.MeetingCommentFinder; import moim_today.implement.meeting.meeting_comment.MeetingCommentRemover; import moim_today.implement.meeting.meeting_comment.MeetingCommentUpdater; import moim_today.implement.moim.joined_moim.JoinedMoimFinder; +import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -49,4 +52,12 @@ public List findAllByMeetingId(final long memberId, fina joinedMoimFinder.validateMemberInMoim(memberId, moimId); return meetingCommentFinder.findAllByMeetingId(meetingId); } + + @Transactional + @Override + public void updateMeetingComment(final long memberId, final MeetingCommentUpdateRequest meetingCommentUpdateRequest) { + MeetingCommentJpaEntity meetingCommentJpaEntity = meetingCommentFinder.getById(meetingCommentUpdateRequest.meetingCommentId()); + meetingCommentJpaEntity.validateMember(memberId); + meetingCommentUpdater.updateMeetingComment(meetingCommentJpaEntity, meetingCommentUpdateRequest); + } } diff --git a/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentUpdateRequest.java b/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentUpdateRequest.java new file mode 100644 index 00000000..2c64babc --- /dev/null +++ b/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentUpdateRequest.java @@ -0,0 +1,7 @@ +package moim_today.dto.meeting.meeting_comment; + +public record MeetingCommentUpdateRequest( + long meetingCommentId, + String contents +) { +} diff --git a/backend/src/main/java/moim_today/global/constant/exception/MeetingExceptionConstant.java b/backend/src/main/java/moim_today/global/constant/exception/MeetingExceptionConstant.java index bf6e2059..a5877887 100644 --- a/backend/src/main/java/moim_today/global/constant/exception/MeetingExceptionConstant.java +++ b/backend/src/main/java/moim_today/global/constant/exception/MeetingExceptionConstant.java @@ -4,7 +4,7 @@ public enum MeetingExceptionConstant { MEETING_NOT_FOUND_ERROR("미팅이 존재하지 않습니다."), JOINED_MEETING_NOT_FOUND_ERROR("미팅 참석 정보가 존재하지 않습니다."), - + MEETING_COMMENT_FORBIDDEN_ERROR("댓글 작성자만 접근할 수 있습니다."), MEETING_FORBIDDEN_ERROR("해당 미팅에 대한 권한이 없습니다."); private final String message; diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java index 8a879669..16da7081 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinder.java @@ -2,6 +2,7 @@ import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; import moim_today.global.annotation.Implement; +import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; import moim_today.persistence.repository.meeting.meeting_comment.MeetingCommentRepository; import org.springframework.transaction.annotation.Transactional; @@ -20,4 +21,9 @@ public MeetingCommentFinder(final MeetingCommentRepository meetingCommentReposit public List findAllByMeetingId(final long meetingId) { return meetingCommentRepository.findAllByMeetingId(meetingId); } + + @Transactional(readOnly = true) + public MeetingCommentJpaEntity getById(final long meetingCommentId) { + return meetingCommentRepository.getById(meetingCommentId); + } } diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentUpdater.java b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentUpdater.java index a80d8dfe..a5d63349 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentUpdater.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentUpdater.java @@ -1,6 +1,8 @@ package moim_today.implement.meeting.meeting_comment; +import moim_today.dto.meeting.meeting_comment.MeetingCommentUpdateRequest; import moim_today.global.annotation.Implement; +import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; import moim_today.persistence.repository.meeting.meeting_comment.MeetingCommentRepository; import org.springframework.transaction.annotation.Transactional; @@ -19,4 +21,9 @@ public MeetingCommentUpdater(final MeetingCommentRepository meetingCommentReposi public void updateDeletedMembers(final long memberId, final List meetingIds) { meetingCommentRepository.updateDeletedMembers(memberId, meetingIds); } + + @Transactional + public void updateMeetingComment(final MeetingCommentJpaEntity meetingCommentJpaEntity, final MeetingCommentUpdateRequest meetingCommentUpdateRequest) { + meetingCommentJpaEntity.updateMeetingComment(meetingCommentUpdateRequest); + } } diff --git a/backend/src/main/java/moim_today/persistence/entity/meeting/meeting_comment/MeetingCommentJpaEntity.java b/backend/src/main/java/moim_today/persistence/entity/meeting/meeting_comment/MeetingCommentJpaEntity.java index e100c539..9d5d362a 100644 --- a/backend/src/main/java/moim_today/persistence/entity/meeting/meeting_comment/MeetingCommentJpaEntity.java +++ b/backend/src/main/java/moim_today/persistence/entity/meeting/meeting_comment/MeetingCommentJpaEntity.java @@ -3,8 +3,12 @@ import jakarta.persistence.*; import lombok.Builder; import lombok.Getter; +import moim_today.dto.meeting.meeting_comment.MeetingCommentUpdateRequest; import moim_today.global.annotation.Association; import moim_today.global.base_entity.BaseTimeEntity; +import moim_today.global.error.ForbiddenException; + +import static moim_today.global.constant.exception.MeetingExceptionConstant.MEETING_COMMENT_FORBIDDEN_ERROR; @Getter @Table(name = "meeting_comment") @@ -37,4 +41,14 @@ private MeetingCommentJpaEntity(final long meetingId, final long parentId, this.memberId = memberId; this.contents = contents; } + + public void validateMember(final long memberId) { + if(this.memberId != memberId){ + throw new ForbiddenException(MEETING_COMMENT_FORBIDDEN_ERROR.message()); + } + } + + public void updateMeetingComment(final MeetingCommentUpdateRequest meetingCommentUpdateRequest) { + this.contents = meetingCommentUpdateRequest.contents(); + } } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java index c1eeb721..5de8e7fc 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java @@ -16,4 +16,6 @@ public interface MeetingCommentRepository { long count(); List findAllByMeetingId(final long meetingId); + + MeetingCommentJpaEntity getById(final long meetingCommentId); } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java index 64ae02cc..99a1d4a5 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java @@ -4,7 +4,6 @@ import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; import moim_today.dto.meeting.meeting_comment.QMeetingCommentResponse; import moim_today.global.error.NotFoundException; -import moim_today.implement.meeting.meeting_comment.MeetingCommentAppender; import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; import org.springframework.stereotype.Repository; @@ -66,4 +65,10 @@ public List findAllByMeetingId(final long meetingId) { .where(meetingCommentJpaEntity.meetingId.eq(meetingId)) .fetch(); } + + @Override + public MeetingCommentJpaEntity getById(final long meetingCommentId) { + return meetingCommentJpaRepository.findById(meetingCommentId) + .orElseThrow(() -> new NotFoundException(MEETING_COMMENT_NOT_FOUND_ERROR.message())); + } } diff --git a/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java index 33673fa9..d92d76f6 100644 --- a/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java +++ b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java @@ -4,6 +4,7 @@ import moim_today.domain.member.MemberSession; import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; +import moim_today.dto.meeting.meeting_comment.MeetingCommentUpdateRequest; import moim_today.global.annotation.Login; import moim_today.global.response.CollectionResponse; import org.springframework.web.bind.annotation.*; @@ -31,4 +32,10 @@ public CollectionResponse> findAllByMeetingId(@Logi @PathVariable final long meetingId) { return CollectionResponse.from(meetingCommentService.findAllByMeetingId(memberSession.id(), meetingId)); } + + @PatchMapping + public void updateMeetingComment(@Login final MemberSession memberSession, + @RequestBody final MeetingCommentUpdateRequest meetingCommentUpdateRequest) { + meetingCommentService.updateMeetingComment(memberSession.id(), meetingCommentUpdateRequest); + } } diff --git a/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java b/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java index 0380d3d2..fb276c82 100644 --- a/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java +++ b/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java @@ -3,6 +3,7 @@ import moim_today.application.meeting.meeting_comment.MeetingCommentService; import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; +import moim_today.dto.meeting.meeting_comment.MeetingCommentUpdateRequest; import java.time.LocalDateTime; import java.util.List; @@ -44,4 +45,9 @@ public List findAllByMeetingId(final long memberId, fina return List.of(commentResponse1, commentResponse2, commentResponse3); } + + @Override + public void updateMeetingComment(final long memberId, final MeetingCommentUpdateRequest meetingCommentUpdateRequest) { + + } } From ce499040c16e1814d26fe7a744ee9c01f7152050 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Thu, 16 May 2024 20:55:32 +0900 Subject: [PATCH 23/60] =?UTF-8?q?[BE]=20test=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EB=8C=93=EA=B8=80=20=EC=88=98=EC=A0=95=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MeetingCommentServiceImpl.java | 5 ++- .../MeetingCommentUpdateRequest.java | 3 ++ .../MeetingCommentUpdater.java | 8 +++- .../MeetingCommentFinderTest.java | 30 +++++++++++++ .../MeetingCommentUpdaterTest.java | 27 +++++++++++- .../MeetingCommentJpaEntityTest.java | 44 +++++++++++++++++++ .../MeetingCommentControllerTest.java | 31 +++++++++++-- 7 files changed, 138 insertions(+), 10 deletions(-) create mode 100644 backend/src/test/java/moim_today/persistence/entity/meeting/meeting_comment/MeetingCommentJpaEntityTest.java diff --git a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java index 9f60d0a2..fa159ec5 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java @@ -56,8 +56,9 @@ public List findAllByMeetingId(final long memberId, fina @Transactional @Override public void updateMeetingComment(final long memberId, final MeetingCommentUpdateRequest meetingCommentUpdateRequest) { - MeetingCommentJpaEntity meetingCommentJpaEntity = meetingCommentFinder.getById(meetingCommentUpdateRequest.meetingCommentId()); + long meetingCommentId = meetingCommentUpdateRequest.meetingCommentId(); + MeetingCommentJpaEntity meetingCommentJpaEntity = meetingCommentFinder.getById(meetingCommentId); meetingCommentJpaEntity.validateMember(memberId); - meetingCommentUpdater.updateMeetingComment(meetingCommentJpaEntity, meetingCommentUpdateRequest); + meetingCommentUpdater.updateMeetingComment(meetingCommentId, meetingCommentUpdateRequest); } } diff --git a/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentUpdateRequest.java b/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentUpdateRequest.java index 2c64babc..3bef0420 100644 --- a/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentUpdateRequest.java +++ b/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentUpdateRequest.java @@ -1,5 +1,8 @@ package moim_today.dto.meeting.meeting_comment; +import lombok.Builder; + +@Builder public record MeetingCommentUpdateRequest( long meetingCommentId, String contents diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentUpdater.java b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentUpdater.java index a5d63349..ec15c8ab 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentUpdater.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentUpdater.java @@ -12,9 +12,12 @@ public class MeetingCommentUpdater { private final MeetingCommentRepository meetingCommentRepository; + private final MeetingCommentFinder meetingCommentFinder; - public MeetingCommentUpdater(final MeetingCommentRepository meetingCommentRepository) { + public MeetingCommentUpdater(final MeetingCommentRepository meetingCommentRepository, + final MeetingCommentFinder meetingCommentFinder) { this.meetingCommentRepository = meetingCommentRepository; + this.meetingCommentFinder = meetingCommentFinder; } @Transactional @@ -23,7 +26,8 @@ public void updateDeletedMembers(final long memberId, final List meetingId } @Transactional - public void updateMeetingComment(final MeetingCommentJpaEntity meetingCommentJpaEntity, final MeetingCommentUpdateRequest meetingCommentUpdateRequest) { + public void updateMeetingComment(final long meetingCommentId, final MeetingCommentUpdateRequest meetingCommentUpdateRequest) { + MeetingCommentJpaEntity meetingCommentJpaEntity = meetingCommentFinder.getById(meetingCommentId); meetingCommentJpaEntity.updateMeetingComment(meetingCommentUpdateRequest); } } diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinderTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinderTest.java index 74669e59..e43531af 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinderTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentFinderTest.java @@ -1,6 +1,7 @@ package moim_today.implement.meeting.meeting_comment; import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; +import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; import moim_today.persistence.entity.member.MemberJpaEntity; import moim_today.util.ImplementTest; @@ -10,8 +11,10 @@ import java.util.List; +import static moim_today.global.constant.exception.MeetingCommentExceptionConstant.MEETING_COMMENT_NOT_FOUND_ERROR; import static moim_today.util.TestConstant.*; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class MeetingCommentFinderTest extends ImplementTest { @@ -62,4 +65,31 @@ void findAllByMeetingIdTest(){ //then assertThat(findMeetingComments.size()).isEqualTo(2); } + + @DisplayName("댓글 Id로 조회한다.") + @Test + void getById(){ + // given + MeetingCommentJpaEntity commentJpaEntity = MeetingCommentJpaEntity.builder() + .contents(MEETING_COMMENT_CONTENTS.value()) + .build(); + + meetingCommentRepository.save(commentJpaEntity); + long commentId = commentJpaEntity.getId(); + + //when + MeetingCommentJpaEntity meetingCommentJpaEntity = meetingCommentFinder.getById(commentId); + + //then + assertThat(meetingCommentJpaEntity.getContents()).isEqualTo(MEETING_COMMENT_CONTENTS.value()); + } + + @DisplayName("댓글 Id로 조회할 때, 없으면 예외가 발생한다.") + @Test + void getByIdThrowNotFoundException(){ + // expected + assertThatThrownBy(() -> meetingCommentFinder.getById(MEETING_ID.longValue())) + .isInstanceOf(NotFoundException.class) + .hasMessage(MEETING_COMMENT_NOT_FOUND_ERROR.message()); + } } \ No newline at end of file diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentUpdaterTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentUpdaterTest.java index 47fc7e41..892c22e2 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentUpdaterTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentUpdaterTest.java @@ -1,5 +1,6 @@ package moim_today.implement.meeting.meeting_comment; +import moim_today.dto.meeting.meeting_comment.MeetingCommentUpdateRequest; import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; import moim_today.util.ImplementTest; import org.junit.jupiter.api.DisplayName; @@ -8,8 +9,7 @@ import java.util.List; -import static moim_today.util.TestConstant.MEETING_ID; -import static moim_today.util.TestConstant.MEMBER_ID; +import static moim_today.util.TestConstant.*; import static org.assertj.core.api.Assertions.assertThat; class MeetingCommentUpdaterTest extends ImplementTest { @@ -99,4 +99,27 @@ void updateOnlyDeletedMembers() { .getMemberId(); assertThat(findMeetingCommentId2).isEqualTo(stillInMemberId2); } + + @DisplayName("댓글을 수정한다.") + @Test + void updateMeetingComment(){ + //given + MeetingCommentJpaEntity meetingCommentJpaEntity = MeetingCommentJpaEntity.builder() + .build(); + + meetingCommentRepository.save(meetingCommentJpaEntity); + long commentId = meetingCommentJpaEntity.getId(); + String commentContents = MEETING_COMMENT_CONTENTS.value(); + + MeetingCommentUpdateRequest meetingCommentUpdateRequest = MeetingCommentUpdateRequest.builder() + .meetingCommentId(commentId) + .contents(commentContents).build(); + + //when + meetingCommentUpdater.updateMeetingComment(commentId, meetingCommentUpdateRequest); + + //then + MeetingCommentJpaEntity updatedMeetingComment = meetingCommentRepository.getById(commentId); + assertThat(updatedMeetingComment.getContents()).isEqualTo(commentContents); + } } \ No newline at end of file diff --git a/backend/src/test/java/moim_today/persistence/entity/meeting/meeting_comment/MeetingCommentJpaEntityTest.java b/backend/src/test/java/moim_today/persistence/entity/meeting/meeting_comment/MeetingCommentJpaEntityTest.java new file mode 100644 index 00000000..50461dcd --- /dev/null +++ b/backend/src/test/java/moim_today/persistence/entity/meeting/meeting_comment/MeetingCommentJpaEntityTest.java @@ -0,0 +1,44 @@ +package moim_today.persistence.entity.meeting.meeting_comment; + +import moim_today.global.error.ForbiddenException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static moim_today.global.constant.exception.MeetingExceptionConstant.MEETING_COMMENT_FORBIDDEN_ERROR; +import static moim_today.util.TestConstant.MEMBER_ID; +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class MeetingCommentJpaEntityTest { + + @DisplayName("댓글 작성자가 맞다면 검증에 성공한다.") + @Test + void validateMember() { + //given + long memberId = MEMBER_ID.longValue(); + MeetingCommentJpaEntity meetingCommentJpaEntity = MeetingCommentJpaEntity.builder() + .memberId(memberId) + .build(); + + //expected + assertThatCode(() -> meetingCommentJpaEntity.validateMember(memberId)) + .doesNotThrowAnyException(); + } + + @DisplayName("댓글 작성자가 아니라면 검증에 실패한다.") + @Test + void validateMemberFailure() { + //given + long memberId = MEMBER_ID.longValue(); + long otherMemberId = MEMBER_ID.longValue() + 1; + MeetingCommentJpaEntity meetingCommentJpaEntity = MeetingCommentJpaEntity.builder() + .memberId(memberId) + .build(); + + //expected + assertThatThrownBy(() -> meetingCommentJpaEntity.validateMember(otherMemberId)) + .isInstanceOf(ForbiddenException.class) + .hasMessage(MEETING_COMMENT_FORBIDDEN_ERROR.message()); + } + +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java b/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java index 0fe3a879..7191e369 100644 --- a/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java @@ -3,6 +3,7 @@ import com.epages.restdocs.apispec.ResourceSnippetParameters; import moim_today.application.meeting.meeting_comment.MeetingCommentService; import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; +import moim_today.dto.meeting.meeting_comment.MeetingCommentUpdateRequest; import moim_today.fake_class.meeting.meeting_comment.FakeMeetingCommentService; import moim_today.util.ControllerTest; import org.junit.jupiter.api.DisplayName; @@ -12,11 +13,9 @@ import static com.epages.restdocs.apispec.ResourceDocumentation.resource; import static com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatTypes.NUMBER; import static com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatTypes.STRING; -import static moim_today.util.TestConstant.MEETING_COMMENT_CONTENTS; -import static moim_today.util.TestConstant.MEETING_ID; +import static moim_today.util.TestConstant.*; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -74,4 +73,28 @@ void findAllMeetingCommentsByMeetingId() throws Exception { .build() ))); } + + @DisplayName("미팅의 댓글을 수정한다.") + @Test + void updateMeetingComments() throws Exception { + MeetingCommentUpdateRequest meetingCommentUpdateRequest = MeetingCommentUpdateRequest.builder() + .meetingCommentId(MEETING_COMMENT_ID.longValue()) + .contents(MEETING_COMMENT_CONTENTS.value()) + .build(); + + mockMvc.perform(patch("/api/meeting-comments/") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(meetingCommentUpdateRequest))) + .andExpect(status().isOk()) + .andDo(document("미팅 댓글 수정 성공", + resource(ResourceSnippetParameters.builder() + .tag("미팅 댓글") + .summary("미팅 댓글 수정") + .requestFields( + fieldWithPath("meetingCommentId").type(NUMBER).description("댓글 Id"), + fieldWithPath("contents").type(STRING).description("댓글 내용") + ) + .build() + ))); + } } \ No newline at end of file From f84cf6d6fb6e63bc07ea5b95cf0545e6bcff5be7 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Thu, 16 May 2024 21:01:49 +0900 Subject: [PATCH 24/60] =?UTF-8?q?[BE]=20feat=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EB=8C=93=EA=B8=80=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/meeting_comment/MeetingCommentService.java | 2 ++ .../meeting/meeting_comment/MeetingCommentServiceImpl.java | 7 +++++++ .../meeting_comment/MeetingCommentDeleteRequest.java | 6 ++++++ .../meeting/meeting_comment/MeetingCommentRemover.java | 6 ++++++ .../meeting/meeting_comment/MeetingCommentRepository.java | 2 ++ .../meeting_comment/MeetingCommentRepositoryImpl.java | 5 +++++ .../meeting/meeting_comment/MeetingCommentController.java | 7 +++++++ .../meeting/meeting_comment/FakeMeetingCommentService.java | 5 +++++ 8 files changed, 40 insertions(+) create mode 100644 backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentDeleteRequest.java diff --git a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java index 5927900f..4bed00e1 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentService.java @@ -13,4 +13,6 @@ public interface MeetingCommentService { List findAllByMeetingId(final long memberId, final long meetingId); void updateMeetingComment(final long memberId, final MeetingCommentUpdateRequest meetingCommentUpdateRequest); + + void deleteMeetingComment(final long memberId, final long meetingCommentId); } diff --git a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java index fa159ec5..f3b9189b 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting_comment/MeetingCommentServiceImpl.java @@ -61,4 +61,11 @@ public void updateMeetingComment(final long memberId, final MeetingCommentUpdate meetingCommentJpaEntity.validateMember(memberId); meetingCommentUpdater.updateMeetingComment(meetingCommentId, meetingCommentUpdateRequest); } + + @Override + public void deleteMeetingComment(final long memberId, final long meetingCommentId) { + MeetingCommentJpaEntity meetingCommentJpaEntity = meetingCommentFinder.getById(meetingCommentId); + meetingCommentJpaEntity.validateMember(memberId); + meetingCommentRemover.deleteById(meetingCommentId); + } } diff --git a/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentDeleteRequest.java b/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentDeleteRequest.java new file mode 100644 index 00000000..8146c25c --- /dev/null +++ b/backend/src/main/java/moim_today/dto/meeting/meeting_comment/MeetingCommentDeleteRequest.java @@ -0,0 +1,6 @@ +package moim_today.dto.meeting.meeting_comment; + +public record MeetingCommentDeleteRequest( + long meetingCommentId +) { +} diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentRemover.java b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentRemover.java index 451b08f9..633e5f27 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentRemover.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting_comment/MeetingCommentRemover.java @@ -2,6 +2,7 @@ import moim_today.global.annotation.Implement; import moim_today.persistence.repository.meeting.meeting_comment.MeetingCommentRepository; +import org.springframework.transaction.annotation.Transactional; @Implement public class MeetingCommentRemover { @@ -11,4 +12,9 @@ public class MeetingCommentRemover { public MeetingCommentRemover(final MeetingCommentRepository meetingCommentRepository) { this.meetingCommentRepository = meetingCommentRepository; } + + @Transactional + public void deleteById(final long meetingCommentId) { + meetingCommentRepository.deleteById(meetingCommentId); + } } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java index 5de8e7fc..6848eecd 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepository.java @@ -18,4 +18,6 @@ public interface MeetingCommentRepository { List findAllByMeetingId(final long meetingId); MeetingCommentJpaEntity getById(final long meetingCommentId); + + void deleteById(final long meetingCommentId); } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java index 99a1d4a5..f77a43f2 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting_comment/MeetingCommentRepositoryImpl.java @@ -71,4 +71,9 @@ public MeetingCommentJpaEntity getById(final long meetingCommentId) { return meetingCommentJpaRepository.findById(meetingCommentId) .orElseThrow(() -> new NotFoundException(MEETING_COMMENT_NOT_FOUND_ERROR.message())); } + + @Override + public void deleteById(final long meetingCommentId) { + meetingCommentJpaRepository.deleteById(meetingCommentId); + } } diff --git a/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java index d92d76f6..3c9c3671 100644 --- a/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java +++ b/backend/src/main/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentController.java @@ -3,6 +3,7 @@ import moim_today.application.meeting.meeting_comment.MeetingCommentService; import moim_today.domain.member.MemberSession; import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; +import moim_today.dto.meeting.meeting_comment.MeetingCommentDeleteRequest; import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; import moim_today.dto.meeting.meeting_comment.MeetingCommentUpdateRequest; import moim_today.global.annotation.Login; @@ -38,4 +39,10 @@ public void updateMeetingComment(@Login final MemberSession memberSession, @RequestBody final MeetingCommentUpdateRequest meetingCommentUpdateRequest) { meetingCommentService.updateMeetingComment(memberSession.id(), meetingCommentUpdateRequest); } + + @DeleteMapping + public void deleteMeetingComment(@Login final MemberSession memberSession, + @RequestBody final MeetingCommentDeleteRequest deleteMeetingCommentRequest) { + meetingCommentService.deleteMeetingComment(memberSession.id(), deleteMeetingCommentRequest.meetingCommentId()); + } } diff --git a/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java b/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java index fb276c82..b79a70db 100644 --- a/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java +++ b/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java @@ -50,4 +50,9 @@ public List findAllByMeetingId(final long memberId, fina public void updateMeetingComment(final long memberId, final MeetingCommentUpdateRequest meetingCommentUpdateRequest) { } + + @Override + public void deleteMeetingComment(final long memberId, final long meetingCommentId) { + + } } From cac1e5f650f7f74554a701bb541b383b5848b931 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Thu, 16 May 2024 21:11:52 +0900 Subject: [PATCH 25/60] =?UTF-8?q?[BE]=20test=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EB=8C=93=EA=B8=80=20=EC=82=AD=EC=A0=9C=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MeetingCommentRemoverTest.java | 32 +++++++++++++++++++ .../MeetingCommentControllerTest.java | 25 +++++++++++++-- 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentRemoverTest.java diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentRemoverTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentRemoverTest.java new file mode 100644 index 00000000..e4682eb8 --- /dev/null +++ b/backend/src/test/java/moim_today/implement/meeting/meeting_comment/MeetingCommentRemoverTest.java @@ -0,0 +1,32 @@ +package moim_today.implement.meeting.meeting_comment; + +import moim_today.persistence.entity.meeting.meeting_comment.MeetingCommentJpaEntity; +import moim_today.util.ImplementTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.assertj.core.api.Assertions.assertThat; + +class MeetingCommentRemoverTest extends ImplementTest { + + @Autowired + private MeetingCommentRemover meetingCommentRemover; + + @DisplayName("댓글을 삭제한다.") + @Test + void deleteMeetingComment(){ + //given + MeetingCommentJpaEntity meetingCommentJpaEntity = MeetingCommentJpaEntity.builder() + .build(); + + meetingCommentRepository.save(meetingCommentJpaEntity); + long commentId = meetingCommentJpaEntity.getId(); + + //when + meetingCommentRemover.deleteById(commentId); + + //then + assertThat(meetingCommentRepository.count()).isEqualTo(0); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java b/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java index 7191e369..5fc16f31 100644 --- a/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java @@ -3,6 +3,7 @@ import com.epages.restdocs.apispec.ResourceSnippetParameters; import moim_today.application.meeting.meeting_comment.MeetingCommentService; import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; +import moim_today.dto.meeting.meeting_comment.MeetingCommentDeleteRequest; import moim_today.dto.meeting.meeting_comment.MeetingCommentUpdateRequest; import moim_today.fake_class.meeting.meeting_comment.FakeMeetingCommentService; import moim_today.util.ControllerTest; @@ -91,8 +92,28 @@ void updateMeetingComments() throws Exception { .tag("미팅 댓글") .summary("미팅 댓글 수정") .requestFields( - fieldWithPath("meetingCommentId").type(NUMBER).description("댓글 Id"), - fieldWithPath("contents").type(STRING).description("댓글 내용") + fieldWithPath("meetingCommentId").type(NUMBER).description("수정할 댓글 Id"), + fieldWithPath("contents").type(STRING).description("수정할 댓글 내용") + ) + .build() + ))); + } + + @DisplayName("미팅의 댓글을 삭제한다.") + @Test + void deleteMeetingComment() throws Exception { + MeetingCommentDeleteRequest meetingCommentDeleteRequest = new MeetingCommentDeleteRequest(MEETING_COMMENT_ID.longValue()); + + mockMvc.perform(delete("/api/meeting-comments/") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(meetingCommentDeleteRequest))) + .andExpect(status().isOk()) + .andDo(document("미팅 댓글 삭제 성공", + resource(ResourceSnippetParameters.builder() + .tag("미팅 댓글") + .summary("미팅 댓글 삭제") + .requestFields( + fieldWithPath("meetingCommentId").type(NUMBER).description("삭제할 댓글 Id") ) .build() ))); From 63fefb44c46181fb76845c4c0ecb662e746110a3 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Fri, 17 May 2024 14:53:07 +0900 Subject: [PATCH 26/60] =?UTF-8?q?[BE]=20test=20:=20=EB=8C=93=EA=B8=80=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FakeMeetingCommentService.java | 6 +- .../MeetingCommentControllerTest.java | 62 +++++++++++++++++++ .../java/moim_today/util/TestConstant.java | 1 + 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java b/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java index b79a70db..6f86d411 100644 --- a/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java +++ b/backend/src/test/java/moim_today/fake_class/meeting/meeting_comment/FakeMeetingCommentService.java @@ -4,17 +4,21 @@ import moim_today.dto.meeting.meeting_comment.MeetingCommentCreateRequest; import moim_today.dto.meeting.meeting_comment.MeetingCommentResponse; import moim_today.dto.meeting.meeting_comment.MeetingCommentUpdateRequest; +import moim_today.global.error.NotFoundException; import java.time.LocalDateTime; import java.util.List; +import static moim_today.global.constant.exception.MeetingExceptionConstant.MEETING_NOT_FOUND_ERROR; import static moim_today.util.TestConstant.*; public class FakeMeetingCommentService implements MeetingCommentService { @Override public void createMeetingComment(final long memberId, final MeetingCommentCreateRequest meetingCommentCreateRequest) { - + if (meetingCommentCreateRequest.meetingId() == NOT_FOUND_MEETING_ID.longValue()) { + throw new NotFoundException(MEETING_NOT_FOUND_ERROR.message()); + } } @Override diff --git a/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java b/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java index 5fc16f31..9d1593a3 100644 --- a/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java @@ -10,6 +10,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; +import org.springframework.restdocs.payload.JsonFieldType; import static com.epages.restdocs.apispec.ResourceDocumentation.resource; import static com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatTypes.NUMBER; @@ -53,6 +54,65 @@ void createMeetingComment() throws Exception { ))); } + @DisplayName("미팅이 존재하지 않으면 댓글 작성에 실패한다.") + @Test + void createMeetingCommentNotExistMeeting() throws Exception { + MeetingCommentCreateRequest meetingCommentCreateRequest = MeetingCommentCreateRequest.builder() + .meetingId(NOT_FOUND_MEETING_ID.longValue()) + .contents(MEETING_COMMENT_CONTENTS.value()) + .build(); + + mockMvc.perform(post("/api/meeting-comments") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(meetingCommentCreateRequest))) + .andExpect(status().isNotFound()) + .andDo(document("미팅 댓글 작성 실패 - 존재하지 않는 미팅", + resource(ResourceSnippetParameters.builder() + .tag("미팅 댓글") + .summary("미팅 댓글 작성") + .requestFields( + fieldWithPath("meetingId").type(NUMBER).description("존재하지 않는 미팅 Id"), + fieldWithPath("contents").type(STRING).description("댓글 내용") + ) + .responseFields( + fieldWithPath("statusCode").type(JsonFieldType.STRING).description("상태 코드"), + fieldWithPath("message").type(JsonFieldType.STRING).description("오류 메세지") + ) + .build() + ))); + + } + + @DisplayName("모임의 참여자가 아니면 댓글 작성에 실패한다.") + @Test + void createMeetingCommentThrowsForbidden() throws Exception { + MeetingCommentCreateRequest meetingCommentCreateRequest = MeetingCommentCreateRequest.builder() + .meetingId(NOT_FOUND_MEETING_ID.longValue()) + .contents(MEETING_COMMENT_CONTENTS.value()) + .build(); + + mockMvc.perform(post("/api/meeting-comments") + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(meetingCommentCreateRequest))) + .andExpect(status().isForbidden()) + .andDo(document("미팅 댓글 작성 실패 - 모임의 참여자가 아닐 경우", + resource(ResourceSnippetParameters.builder() + .tag("미팅 댓글") + .summary("미팅 댓글 작성") + .requestFields( + fieldWithPath("meetingId").type(NUMBER).description("미팅 Id"), + fieldWithPath("contents").type(STRING).description("댓글 내용") + ) + .responseFields( + fieldWithPath("statusCode").type(JsonFieldType.STRING).description("상태 코드"), + fieldWithPath("message").type(JsonFieldType.STRING).description("오류 메세지") + ) + .build() + ))); + + } + + @DisplayName("미팅의 댓글 목록을 불러온다.") @Test void findAllMeetingCommentsByMeetingId() throws Exception { @@ -75,6 +135,8 @@ void findAllMeetingCommentsByMeetingId() throws Exception { ))); } + + @DisplayName("미팅의 댓글을 수정한다.") @Test void updateMeetingComments() throws Exception { diff --git a/backend/src/test/java/moim_today/util/TestConstant.java b/backend/src/test/java/moim_today/util/TestConstant.java index 9f001410..9a2105d3 100644 --- a/backend/src/test/java/moim_today/util/TestConstant.java +++ b/backend/src/test/java/moim_today/util/TestConstant.java @@ -77,6 +77,7 @@ public enum TestConstant { //미팅 MEETING_ID("123"), + NOT_FOUND_MEETING_ID("0"), MEETING_AGENDA("meeting agenda"), MEETING_PLACE("meeting place"), MEETING_COMMENT_ID("456"), From de44f2c6a7345b2b5a171f849ef34468948be1d4 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Fri, 17 May 2024 14:58:56 +0900 Subject: [PATCH 27/60] =?UTF-8?q?[BE]=20fix=20:=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/todo/TodoController.java | 2 +- .../MeetingCommentControllerTest.java | 32 ------------------- 2 files changed, 1 insertion(+), 33 deletions(-) diff --git a/backend/src/main/java/moim_today/presentation/todo/TodoController.java b/backend/src/main/java/moim_today/presentation/todo/TodoController.java index 1c314cc7..3bf24f9d 100644 --- a/backend/src/main/java/moim_today/presentation/todo/TodoController.java +++ b/backend/src/main/java/moim_today/presentation/todo/TodoController.java @@ -32,7 +32,7 @@ public CollectionResponse> findAllTodoByMemberId( @Login final MemberSession memberSession, @RequestParam final YearMonth startDate, @RequestParam final int months){ - return CollectionResponse.of(todoService.findAllMembersTodos(memberSession.id(), startDate, months)); + return CollectionResponse.from(todoService.findAllMembersTodos(memberSession.id(), startDate, months)); } @GetMapping("moim/{moimId}") diff --git a/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java b/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java index 9d1593a3..a674944c 100644 --- a/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/meeting/meeting_comment/MeetingCommentControllerTest.java @@ -83,36 +83,6 @@ void createMeetingCommentNotExistMeeting() throws Exception { } - @DisplayName("모임의 참여자가 아니면 댓글 작성에 실패한다.") - @Test - void createMeetingCommentThrowsForbidden() throws Exception { - MeetingCommentCreateRequest meetingCommentCreateRequest = MeetingCommentCreateRequest.builder() - .meetingId(NOT_FOUND_MEETING_ID.longValue()) - .contents(MEETING_COMMENT_CONTENTS.value()) - .build(); - - mockMvc.perform(post("/api/meeting-comments") - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(meetingCommentCreateRequest))) - .andExpect(status().isForbidden()) - .andDo(document("미팅 댓글 작성 실패 - 모임의 참여자가 아닐 경우", - resource(ResourceSnippetParameters.builder() - .tag("미팅 댓글") - .summary("미팅 댓글 작성") - .requestFields( - fieldWithPath("meetingId").type(NUMBER).description("미팅 Id"), - fieldWithPath("contents").type(STRING).description("댓글 내용") - ) - .responseFields( - fieldWithPath("statusCode").type(JsonFieldType.STRING).description("상태 코드"), - fieldWithPath("message").type(JsonFieldType.STRING).description("오류 메세지") - ) - .build() - ))); - - } - - @DisplayName("미팅의 댓글 목록을 불러온다.") @Test void findAllMeetingCommentsByMeetingId() throws Exception { @@ -135,8 +105,6 @@ void findAllMeetingCommentsByMeetingId() throws Exception { ))); } - - @DisplayName("미팅의 댓글을 수정한다.") @Test void updateMeetingComments() throws Exception { From 7fd498472b097a4e7257472a34bd3edc95658208 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Mon, 20 May 2024 19:22:12 +0900 Subject: [PATCH 28/60] =?UTF-8?q?[BE]=20rebase=20:=20conflict=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/meeting/meeting/MeetingService.java | 6 +++--- .../application/meeting/meeting/MeetingServiceImpl.java | 4 ++++ .../java/moim_today/dto/meeting/MeetingCreateResponse.java | 1 + .../implement/meeting/meeting/MeetingManager.java | 4 ++-- .../java/moim_today/presentation/moim/MoimController.java | 2 +- .../implement/meeting/meeting/MeetingManagerTest.java | 6 ++---- 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java index 6906f4ac..158d06d6 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java @@ -1,10 +1,10 @@ package moim_today.application.meeting.meeting; import moim_today.domain.meeting.enums.MeetingStatus; -import moim_today.dto.meeting.MeetingCreateRequest; import moim_today.dto.meeting.MeetingCreateResponse; -import moim_today.dto.meeting.MeetingDetailResponse; -import moim_today.dto.meeting.MeetingSimpleResponse; +import moim_today.dto.meeting.meeting.MeetingCreateRequest; +import moim_today.dto.meeting.meeting.MeetingDetailResponse; +import moim_today.dto.meeting.meeting.MeetingSimpleResponse; import java.util.List; diff --git a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java index 1f713985..558b1646 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java @@ -2,6 +2,10 @@ import moim_today.domain.meeting.enums.MeetingStatus; import moim_today.dto.meeting.*; +import moim_today.dto.meeting.meeting.MeetingCreateRequest; +import moim_today.dto.meeting.meeting.MeetingDetailResponse; +import moim_today.dto.meeting.meeting.MeetingSimpleDao; +import moim_today.dto.meeting.meeting.MeetingSimpleResponse; import moim_today.implement.meeting.meeting.MeetingFinder; import moim_today.implement.meeting.meeting.MeetingManager; import moim_today.implement.meeting.meeting.MeetingRemover; diff --git a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateResponse.java b/backend/src/main/java/moim_today/dto/meeting/MeetingCreateResponse.java index e95dfef1..5ed83b49 100644 --- a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateResponse.java +++ b/backend/src/main/java/moim_today/dto/meeting/MeetingCreateResponse.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Builder; import moim_today.domain.meeting.enums.MeetingCategory; +import moim_today.dto.meeting.meeting.MeetingCreateRequest; import java.time.LocalDateTime; diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java index 78c9cd48..0ca4d5be 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java @@ -1,8 +1,8 @@ package moim_today.implement.meeting.meeting; import moim_today.domain.meeting.enums.MeetingCategory; -import moim_today.dto.meeting.MeetingCreateRequest; import moim_today.dto.meeting.MeetingCreateResponse; +import moim_today.dto.meeting.meeting.MeetingCreateRequest; import moim_today.dto.moim.moim.MoimDateResponse; import moim_today.global.annotation.Implement; import moim_today.implement.meeting.joined_meeting.JoinedMeetingAppender; @@ -19,7 +19,7 @@ import java.util.List; import static moim_today.global.constant.NumberConstant.SCHEDULE_MEETING_ID; -import static moim_today.global.constant.TimeConstant.*; +import static moim_today.global.constant.TimeConstant.ONE_WEEK; @Implement diff --git a/backend/src/main/java/moim_today/presentation/moim/MoimController.java b/backend/src/main/java/moim_today/presentation/moim/MoimController.java index cc77cb5b..ceab48ac 100644 --- a/backend/src/main/java/moim_today/presentation/moim/MoimController.java +++ b/backend/src/main/java/moim_today/presentation/moim/MoimController.java @@ -34,7 +34,7 @@ public MoimController(final MoimService moimService, @GetMapping public CollectionResponse> findAllMyMoimResponse(@Login final MemberSession memberSession) { List myMoimResponses = moimService.findAllMyMoimResponse(memberSession.id()); - return CollectionResponse.of(myMoimResponses); + return CollectionResponse.from(myMoimResponses); } @PostMapping diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java index 4541a9b1..dc39c2b6 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java @@ -1,8 +1,8 @@ package moim_today.implement.meeting.meeting; import moim_today.domain.meeting.enums.MeetingCategory; -import moim_today.dto.meeting.MeetingCreateRequest; import moim_today.dto.meeting.MeetingCreateResponse; +import moim_today.dto.meeting.meeting.MeetingCreateRequest; import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; import moim_today.persistence.entity.schedule.schedule.ScheduleJpaEntity; @@ -16,9 +16,7 @@ import java.time.temporal.ChronoUnit; import static moim_today.util.TestConstant.*; -import static moim_today.util.TestConstant.MEETING_AGENDA; -import static moim_today.util.TestConstant.MEETING_PLACE; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; class MeetingManagerTest extends ImplementTest { From 66bd5ef52316944970b2524a37954411dcd29f86 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Mon, 20 May 2024 19:32:01 +0900 Subject: [PATCH 29/60] =?UTF-8?q?[BE]=20refactor=20:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20flush=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/repository/moim/moim/MoimRepository.java | 2 -- .../persistence/repository/moim/moim/MoimRepositoryImpl.java | 5 ----- 2 files changed, 7 deletions(-) diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java index 4035f01c..4ef15ae7 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java @@ -30,6 +30,4 @@ public interface MoimRepository { MoimJpaEntity getByIdWithPessimisticLock(final long moimId); List searchMoimBySearchParam(final String searchParam); - - void flush(); } diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java index 01a0d975..13dac263 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java @@ -102,11 +102,6 @@ public List searchMoimBySearchParam(final String searchParam .fetch(); } - @Override - public void flush() { - moimJpaRepository.flush(); - } - @Override public List findAllMoimResponse(final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter) { From 79fae7b2bdc6ff5480d4957d73abdf9a5d361977 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Mon, 20 May 2024 19:38:54 +0900 Subject: [PATCH 30/60] =?UTF-8?q?[BE]=20test=20:=20=EB=AA=A8=EC=9E=84=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=EC=8B=9C=20=EB=AA=A8=EC=9E=84=EC=9D=B4=20?= =?UTF-8?q?=EC=97=86=EC=9D=84=20=EA=B2=BD=EC=9A=B0=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EA=B0=80=20=EB=B0=9C=EC=83=9D=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=EC=A7=80=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../implement/moim/moim/MoimRemoverTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/backend/src/test/java/moim_today/implement/moim/moim/MoimRemoverTest.java b/backend/src/test/java/moim_today/implement/moim/moim/MoimRemoverTest.java index b8b6419d..812ac01b 100644 --- a/backend/src/test/java/moim_today/implement/moim/moim/MoimRemoverTest.java +++ b/backend/src/test/java/moim_today/implement/moim/moim/MoimRemoverTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import static moim_today.util.TestConstant.MOIM_ID; import static org.assertj.core.api.Assertions.assertThat; class MoimRemoverTest extends ImplementTest { @@ -29,4 +30,17 @@ void deleteMoimTest(){ //then assertThat(moimRepository.count()).isEqualTo(0); } + + @DisplayName("모임이 존재하지 않아도 삭제시 예외가 발생하지 않는다.") + @Test + void deleteMoimWithNotExist(){ + //given + long moimId = MOIM_ID.longValue(); + + //when + moimRemover.deleteById(moimId); + + //then + assertThat(moimRepository.count()).isEqualTo(0); + } } From b1fd7fb9bd930105343374950c08ff42be3c5463 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Sun, 19 May 2024 13:21:23 +0900 Subject: [PATCH 31/60] =?UTF-8?q?[BE]=20refactor=20:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/moim_today/implement/moim/moim/MoimAppender.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/backend/src/main/java/moim_today/implement/moim/moim/MoimAppender.java b/backend/src/main/java/moim_today/implement/moim/moim/MoimAppender.java index 75ecfc71..1f5a21d5 100644 --- a/backend/src/main/java/moim_today/implement/moim/moim/MoimAppender.java +++ b/backend/src/main/java/moim_today/implement/moim/moim/MoimAppender.java @@ -2,7 +2,6 @@ import moim_today.dto.moim.moim.MoimCreateRequest; import moim_today.global.annotation.Implement; -import moim_today.implement.moim.joined_moim.JoinedMoimAppender; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; import moim_today.persistence.repository.moim.moim.MoimRepository; import org.springframework.transaction.annotation.Transactional; @@ -12,12 +11,9 @@ public class MoimAppender { private final MoimRepository moimRepository; - private final JoinedMoimAppender joinedMoimAppender; - public MoimAppender(final MoimRepository moimRepository, - final JoinedMoimAppender joinedMoimAppender) { + public MoimAppender(final MoimRepository moimRepository) { this.moimRepository = moimRepository; - this.joinedMoimAppender = joinedMoimAppender; } @Transactional From 3b455076b2789f3f985b9f768302fd1f74d0cc7f Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Sun, 19 May 2024 15:38:25 +0900 Subject: [PATCH 32/60] =?UTF-8?q?[BE]=20feat=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=8B=9C=20=EB=AA=A8=EC=9E=84=EC=9E=A5?= =?UTF-8?q?=EC=9D=B8=EC=A7=80=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/meeting/MeetingService.java | 2 +- .../meeting/meeting/MeetingServiceImpl.java | 4 +- .../meeting/meeting/MeetingManager.java | 12 +++++- .../meeting/meeting/MeetingController.java | 6 ++- .../meeting/meeting/FakeMeetingService.java | 2 +- .../meeting/meeting/MeetingManagerTest.java | 43 +++++++++++++++---- 6 files changed, 53 insertions(+), 16 deletions(-) diff --git a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java index 158d06d6..11279964 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java @@ -10,7 +10,7 @@ public interface MeetingService { - MeetingCreateResponse createMeeting(final MeetingCreateRequest meetingCreateRequest); + MeetingCreateResponse createMeeting(final long memberId, final MeetingCreateRequest meetingCreateRequest); List findAllByMoimId(final long moimId, final long memberId, final MeetingStatus meetingStatus); diff --git a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java index 558b1646..0d772e1a 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java @@ -30,8 +30,8 @@ public MeetingServiceImpl(final MeetingManager meetingManager, final MeetingFind } @Override - public MeetingCreateResponse createMeeting(final MeetingCreateRequest meetingCreateRequest) { - return meetingManager.createMeeting(meetingCreateRequest, LocalDate.now()); + public MeetingCreateResponse createMeeting(final long memberId, final MeetingCreateRequest meetingCreateRequest) { + return meetingManager.createMeeting(memberId, meetingCreateRequest, LocalDate.now()); } @Override diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java index 0ca4d5be..7c3fa7a7 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java @@ -5,6 +5,7 @@ import moim_today.dto.meeting.meeting.MeetingCreateRequest; import moim_today.dto.moim.moim.MoimDateResponse; import moim_today.global.annotation.Implement; +import moim_today.global.error.ForbiddenException; import moim_today.implement.meeting.joined_meeting.JoinedMeetingAppender; import moim_today.implement.meeting.joined_meeting.JoinedMeetingFinder; import moim_today.implement.moim.moim.MoimFinder; @@ -20,6 +21,7 @@ import static moim_today.global.constant.NumberConstant.SCHEDULE_MEETING_ID; import static moim_today.global.constant.TimeConstant.ONE_WEEK; +import static moim_today.global.constant.exception.MoimExceptionConstant.ORGANIZER_FORBIDDEN_ERROR; @Implement @@ -42,8 +44,10 @@ public MeetingManager(final MeetingAppender meetingAppender, final MoimFinder mo } @Transactional - public MeetingCreateResponse createMeeting(final MeetingCreateRequest meetingCreateRequest, + public MeetingCreateResponse createMeeting(final long memberId, + final MeetingCreateRequest meetingCreateRequest, final LocalDate currentDate) { + validateMemberIsHost(memberId, meetingCreateRequest); MeetingCategory meetingCategory = meetingCreateRequest.meetingCategory(); String moimTitle = moimFinder.getTitleById(meetingCreateRequest.moimId()); @@ -54,6 +58,12 @@ public MeetingCreateResponse createMeeting(final MeetingCreateRequest meetingCre } } + private void validateMemberIsHost(final long memberId, final MeetingCreateRequest meetingCreateRequest) { + if (!moimFinder.isHost(memberId, meetingCreateRequest.moimId())) { + throw new ForbiddenException(ORGANIZER_FORBIDDEN_ERROR.message()); + } + } + private MeetingCreateResponse createSingleMeeting(final MeetingCreateRequest meetingCreateRequest, final String moimTitle) { MeetingJpaEntity meetingJpaEntity = meetingCreateRequest.toEntity( meetingCreateRequest.startDateTime(), diff --git a/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java b/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java index 018aa789..89415f52 100644 --- a/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java +++ b/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java @@ -25,8 +25,10 @@ public MeetingController(final MeetingService meetingService) { } @PostMapping - public MeetingCreateResponse createMeeting(@RequestBody final MeetingCreateRequest meetingCreateRequest) { - return meetingService.createMeeting(meetingCreateRequest); + public MeetingCreateResponse createMeeting( + @Login final MemberSession memberSession, + @RequestBody final MeetingCreateRequest meetingCreateRequest) { + return meetingService.createMeeting(memberSession.id(), meetingCreateRequest); } @GetMapping("/{moimId}") diff --git a/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java b/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java index de10b8ed..291b5d3d 100644 --- a/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java +++ b/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java @@ -19,7 +19,7 @@ public class FakeMeetingService implements MeetingService { @Override - public MeetingCreateResponse createMeeting(final MeetingCreateRequest meetingCreateRequest) { + public MeetingCreateResponse createMeeting(final long memberId, final MeetingCreateRequest meetingCreateRequest) { return MeetingCreateResponse.of(MEETING_ID.longValue(), meetingCreateRequest); } diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java index dc39c2b6..19c14dd0 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java @@ -3,6 +3,7 @@ import moim_today.domain.meeting.enums.MeetingCategory; import moim_today.dto.meeting.MeetingCreateResponse; import moim_today.dto.meeting.meeting.MeetingCreateRequest; +import moim_today.persistence.entity.member.MemberJpaEntity; import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; import moim_today.persistence.entity.schedule.schedule.ScheduleJpaEntity; @@ -27,8 +28,16 @@ class MeetingManagerTest extends ImplementTest { @Test void createSingleMeeting() { // given 1 + MemberJpaEntity memberJpaEntity = MemberJpaEntity.builder() + .build(); + + memberRepository.save(memberJpaEntity); + long memberId = memberJpaEntity.getId(); + + // given 2 MoimJpaEntity moimJpaEntity = MoimJpaEntity.builder() .title(MOIM_TITLE.value()) + .memberId(memberId) .build(); moimRepository.save(moimJpaEntity); @@ -47,7 +56,7 @@ void createSingleMeeting() { LocalDate currentDate = LocalDate.of(2024, 3, 4); // when - MeetingCreateResponse meetingCreateResponse = meetingManager.createMeeting(meetingCreateRequest, currentDate); + MeetingCreateResponse meetingCreateResponse = meetingManager.createMeeting(memberId, meetingCreateRequest, currentDate); // then assertThat(meetingRepository.count()).isEqualTo(1); @@ -102,7 +111,11 @@ void createRegularMeetingFromCurrentDate() { @Test void createRegularMeetingFromStartDate() { // given 1 - long memberId = 1; + MemberJpaEntity memberJpaEntity = MemberJpaEntity.builder() + .build(); + + memberRepository.save(memberJpaEntity); + long memberId = memberJpaEntity.getId(); LocalDate currentDate = LocalDate.of(2024, 2, 1); LocalDate startDate = LocalDate.of(2024, 3, 4); LocalDate endDate = LocalDate.of(2024, 6, 30); @@ -126,7 +139,7 @@ void createRegularMeetingFromStartDate() { .build(); // when - MeetingCreateResponse meetingCreateResponse = meetingManager.createMeeting(meetingCreateRequest, currentDate); + MeetingCreateResponse meetingCreateResponse = meetingManager.createMeeting(memberId, meetingCreateRequest, currentDate); // then long between = ChronoUnit.WEEKS.between(startDate, endDate) + 1; @@ -142,7 +155,11 @@ void createRegularMeetingFromStartDate() { @Test void createSingleMeetingWithJoinedAndSchedule() { // given 1 - long memberId = 1; + MemberJpaEntity memberJpaEntity = MemberJpaEntity.builder() + .build(); + + memberRepository.save(memberJpaEntity); + long memberId = memberJpaEntity.getId(); LocalDate currentDate = LocalDate.of(2024, 3, 30); LocalDate startDate = LocalDate.of(2024, 3, 4); LocalDate endDate = LocalDate.of(2024, 6, 30); @@ -176,7 +193,7 @@ void createSingleMeetingWithJoinedAndSchedule() { .build(); // when - meetingManager.createMeeting(meetingCreateRequest, currentDate); + meetingManager.createMeeting(memberId, meetingCreateRequest, currentDate); // then assertThat(meetingRepository.count()).isEqualTo(1); @@ -188,7 +205,11 @@ void createSingleMeetingWithJoinedAndSchedule() { @Test void createRegularMeetingWithJoinedAndSchedule() { // given 1 - long memberId = 1; + MemberJpaEntity memberJpaEntity = MemberJpaEntity.builder() + .build(); + + memberRepository.save(memberJpaEntity); + long memberId = memberJpaEntity.getId(); LocalDate currentDate = LocalDate.of(2024, 3, 30); LocalDate startDate = LocalDate.of(2024, 3, 4); LocalDate endDate = LocalDate.of(2024, 6, 30); @@ -222,7 +243,7 @@ void createRegularMeetingWithJoinedAndSchedule() { .build(); // when - meetingManager.createMeeting(meetingCreateRequest, currentDate); + meetingManager.createMeeting(memberId, meetingCreateRequest, currentDate); // then long between = ChronoUnit.WEEKS.between(currentDate, endDate) + 1; @@ -235,7 +256,11 @@ void createRegularMeetingWithJoinedAndSchedule() { @Test void createMeetingScheduleIfNotExist() { // given 1 - long memberId = 1; + MemberJpaEntity memberJpaEntity = MemberJpaEntity.builder() + .build(); + + memberRepository.save(memberJpaEntity); + long memberId = memberJpaEntity.getId(); LocalDate currentDate = LocalDate.of(2024, 3, 30); LocalDate startDate = LocalDate.of(2024, 3, 4); LocalDate endDate = LocalDate.of(2024, 6, 30); @@ -276,7 +301,7 @@ void createMeetingScheduleIfNotExist() { .build(); // when - meetingManager.createMeeting(meetingCreateRequest, currentDate); + meetingManager.createMeeting(memberId, meetingCreateRequest, currentDate); // then assertThat(meetingRepository.count()).isEqualTo(1); From b07a0a0d0f09c847bc54c0a3f5748cd249039d4f Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Sun, 19 May 2024 16:17:22 +0900 Subject: [PATCH 33/60] =?UTF-8?q?[BE]=20feat=20:=20=EC=86=8D=ED=95=9C=20?= =?UTF-8?q?=EB=8C=80=ED=95=99=EC=9D=98=20=EB=AA=A8=EC=9E=84=EB=A7=8C=20?= =?UTF-8?q?=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/moim/moim/MoimService.java | 2 +- .../moim/moim/MoimServiceImpl.java | 8 ++- .../implement/moim/moim/MoimFinder.java | 4 +- .../repository/moim/moim/MoimRepository.java | 2 +- .../moim/moim/MoimRepositoryImpl.java | 6 +- .../presentation/moim/MoimController.java | 8 ++- .../fake_class/moim/FakeMoimService.java | 4 +- .../implement/moim/moim/MoimFinderTest.java | 60 +++++++++++++++++-- 8 files changed, 76 insertions(+), 18 deletions(-) diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimService.java b/backend/src/main/java/moim_today/application/moim/moim/MoimService.java index 1c604533..7dad706d 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimService.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimService.java @@ -31,7 +31,7 @@ MoimIdResponse createMoim(final long memberId, final long universityId, void appendMemberToMoim(final long requestMemberId, final MoimJoinRequest moimJoinRequest); - List findAllMoimResponse(final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter); + List findAllMoimResponse(final long universityId, final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter); List searchMoim(final String searchParam); } diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java index 442a61b6..fa9a4f2a 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java @@ -160,8 +160,12 @@ public void appendMemberToMoim(final long requestMemberId, final MoimJoinRequest } @Override - public List findAllMoimResponse(final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter) { - return moimFinder.findAllMoimResponse(moimCategoryDto, moimSortedFilter); + public List findAllMoimResponse( + final long universityId, + final MoimCategoryDto moimCategoryDto, + final MoimSortedFilter moimSortedFilter) { + + return moimFinder.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); } @Override diff --git a/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java b/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java index e85e625d..293aadb2 100644 --- a/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java +++ b/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java @@ -73,8 +73,8 @@ public MoimDateResponse findMoimDate(final long moimId) { } @Transactional(readOnly = true) - public List findAllMoimResponse(final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter) { - return moimRepository.findAllMoimResponse(moimCategoryDto, moimSortedFilter); + public List findAllMoimResponseByUniversityId(final long universityId, final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter) { + return moimRepository.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); } @Transactional(readOnly = true) diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java index 4ef15ae7..9e1ec25a 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java @@ -23,7 +23,7 @@ public interface MoimRepository { void deleteById(final long moimId); - List findAllMoimResponse(final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter); + List findAllMoimResponseByUniversityId(final long universityId, final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter); List findAllMyMoimResponse(final List moimIds); diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java index 13dac263..b3bd4957 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java @@ -103,7 +103,9 @@ public List searchMoimBySearchParam(final String searchParam } @Override - public List findAllMoimResponse(final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter) { + public List findAllMoimResponseByUniversityId(final long universityId, + final MoimCategoryDto moimCategoryDto, + final MoimSortedFilter moimSortedFilter) { return queryFactory.select(new QMoimSimpleResponse( moimJpaEntity.id, @@ -115,7 +117,7 @@ public List findAllMoimResponse(final MoimCategoryDto moimCa moimJpaEntity.displayStatus )) .from(moimJpaEntity) - .where(applyMoimCategoryFilter(moimCategoryDto)) + .where(moimJpaEntity.universityId.eq(universityId).and(applyMoimCategoryFilter(moimCategoryDto))) .orderBy(createOrderBySpecifier(moimSortedFilter)) .fetch(); } diff --git a/backend/src/main/java/moim_today/presentation/moim/MoimController.java b/backend/src/main/java/moim_today/presentation/moim/MoimController.java index ceab48ac..a4fed5cd 100644 --- a/backend/src/main/java/moim_today/presentation/moim/MoimController.java +++ b/backend/src/main/java/moim_today/presentation/moim/MoimController.java @@ -56,9 +56,11 @@ public MoimDetailResponse getMoimDetail(@PathVariable final long moimId, } @GetMapping("/simple") - public CollectionResponse> findAllMoimResponse(@RequestParam final MoimCategoryDto moimCategoryDto, - @RequestParam final MoimSortedFilter moimSortedFilter) { - return CollectionResponse.from(moimService.findAllMoimResponse(moimCategoryDto, moimSortedFilter)); + public CollectionResponse> findAllMoimResponse( + @Login final MemberSession memberSession, + @RequestParam final MoimCategoryDto moimCategoryDto, + @RequestParam final MoimSortedFilter moimSortedFilter) { + return CollectionResponse.from(moimService.findAllMoimResponse(memberSession.universityId(), moimCategoryDto, moimSortedFilter)); } @PatchMapping diff --git a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java index 00988e87..41465821 100644 --- a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java +++ b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java @@ -146,7 +146,9 @@ else if(moimJoinRequest.moimId() == MOIM_ID.longValue() + 3L){ } @Override - public List findAllMoimResponse(final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter) { + public List findAllMoimResponse(final long universityId, + final MoimCategoryDto moimCategoryDto, + final MoimSortedFilter moimSortedFilter) { MoimSimpleResponse moimSimpleResponse1 = MoimSimpleResponse.builder() .moimId(1L) .title(MOIM_TITLE.value()) diff --git a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java index 6cd4a34c..651b6e97 100644 --- a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java +++ b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java @@ -13,8 +13,6 @@ import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; import moim_today.util.ImplementTest; -import moim_today.util.TestConstant; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -250,7 +248,10 @@ void findMoimDate() { @Test void findAllMoim() throws InterruptedException { // given + long universityId = UNIV_ID.longValue(); + MoimJpaEntity firstCreatedMoimJpaEntity = MoimJpaEntity.builder() + .universityId(universityId) .title(FIRST_CREATED_MOIM_TITLE.value()) .moimCategory(MoimCategory.TEAM_PROJECT) .build(); @@ -262,6 +263,7 @@ void findAllMoim() throws InterruptedException { Thread.sleep(10); MoimJpaEntity secondCreatedMoimJpaEntity = MoimJpaEntity.builder() + .universityId(universityId) .title(SECOND_CREATED_MOIM_TITLE.value()) .moimCategory(MoimCategory.STUDY) .build(); @@ -272,7 +274,7 @@ void findAllMoim() throws InterruptedException { MoimSortedFilter moimSortedFilter = null; // when - List moimSimpleResponses = moimFinder.findAllMoimResponse(moimCategoryDto, moimSortedFilter); + List moimSimpleResponses = moimFinder.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); // then assertThat(moimSimpleResponses.size()).isEqualTo(2); @@ -284,7 +286,10 @@ void findAllMoim() throws InterruptedException { @Test void findAllMoimOrderByCreatedAt() throws InterruptedException { // given + long universityId = UNIV_ID.longValue(); + MoimJpaEntity firstCreatedMoimJpaEntity = MoimJpaEntity.builder() + .universityId(universityId) .title(FIRST_CREATED_MOIM_TITLE.value()) .moimCategory(MoimCategory.TEAM_PROJECT) .build(); @@ -296,6 +301,7 @@ void findAllMoimOrderByCreatedAt() throws InterruptedException { Thread.sleep(10); MoimJpaEntity secondCreatedMoimJpaEntity = MoimJpaEntity.builder() + .universityId(universityId) .title(SECOND_CREATED_MOIM_TITLE.value()) .moimCategory(MoimCategory.STUDY) .build(); @@ -306,7 +312,7 @@ void findAllMoimOrderByCreatedAt() throws InterruptedException { MoimSortedFilter moimSortedFilter = MoimSortedFilter.CREATED_AT; // when - List moimSimpleResponses = moimFinder.findAllMoimResponse(moimCategoryDto, moimSortedFilter); + List moimSimpleResponses = moimFinder.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); // then assertThat(moimSimpleResponses.size()).isEqualTo(2); @@ -318,7 +324,10 @@ void findAllMoimOrderByCreatedAt() throws InterruptedException { @Test void findAllMoimOrderByViews() { // given + long universityId = UNIV_ID.longValue(); + MoimJpaEntity firstCreatedMoimJpaEntity = MoimJpaEntity.builder() + .universityId(universityId) .title(FIRST_CREATED_MOIM_TITLE.value()) .views(10) .build(); @@ -326,6 +335,7 @@ void findAllMoimOrderByViews() { moimRepository.save(firstCreatedMoimJpaEntity); MoimJpaEntity secondCreatedMoimJpaEntity = MoimJpaEntity.builder() + .universityId(universityId) .title(SECOND_CREATED_MOIM_TITLE.value()) .views(20) .build(); @@ -336,7 +346,7 @@ void findAllMoimOrderByViews() { MoimSortedFilter moimSortedFilter = MoimSortedFilter.VIEWS; // when - List moimSimpleResponses = moimFinder.findAllMoimResponse(moimCategoryDto, moimSortedFilter); + List moimSimpleResponses = moimFinder.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); // then assertThat(moimSimpleResponses.size()).isEqualTo(2); @@ -348,7 +358,10 @@ void findAllMoimOrderByViews() { @Test void findAllMoimByCategory() { // given + long universityId = UNIV_ID.longValue(); + MoimJpaEntity firstCreatedMoimJpaEntity = MoimJpaEntity.builder() + .universityId(universityId) .title(FIRST_CREATED_MOIM_TITLE.value()) .moimCategory(MoimCategory.TEAM_PROJECT) .build(); @@ -356,6 +369,7 @@ void findAllMoimByCategory() { moimRepository.save(firstCreatedMoimJpaEntity); MoimJpaEntity secondCreatedMoimJpaEntity = MoimJpaEntity.builder() + .universityId(universityId) .title(SECOND_CREATED_MOIM_TITLE.value()) .moimCategory(MoimCategory.STUDY) .build(); @@ -366,7 +380,41 @@ void findAllMoimByCategory() { MoimSortedFilter moimSortedFilter = null; // when - List moimSimpleResponses = moimFinder.findAllMoimResponse(moimCategoryDto, moimSortedFilter); + List moimSimpleResponses = moimFinder.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); + + // then + assertThat(moimSimpleResponses.size()).isEqualTo(1); + assertThat(moimSimpleResponses.get(0).title()).isEqualTo(FIRST_CREATED_MOIM_TITLE.value()); + } + + @DisplayName("자신이 속한 대학교의 모임리스트만 가져온다.") + @Test + void findAllMoimByCategoryByUniversityId() { + // given + long universityId = UNIV_ID.longValue(); + long otherUniversityId = UNIV_ID.longValue() + 1; + + MoimJpaEntity firstCreatedMoimJpaEntity = MoimJpaEntity.builder() + .universityId(universityId) + .title(FIRST_CREATED_MOIM_TITLE.value()) + .moimCategory(MoimCategory.TEAM_PROJECT) + .build(); + + moimRepository.save(firstCreatedMoimJpaEntity); + + MoimJpaEntity secondCreatedMoimJpaEntity = MoimJpaEntity.builder() + .universityId(otherUniversityId) + .title(SECOND_CREATED_MOIM_TITLE.value()) + .moimCategory(MoimCategory.STUDY) + .build(); + + moimRepository.save(secondCreatedMoimJpaEntity); + + MoimCategoryDto moimCategoryDto = MoimCategoryDto.ALL; + MoimSortedFilter moimSortedFilter = null; + + // when + List moimSimpleResponses = moimFinder.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); // then assertThat(moimSimpleResponses.size()).isEqualTo(1); From 96691fb7989f1788e25687eeb6869507ee8139e1 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Sun, 19 May 2024 16:51:57 +0900 Subject: [PATCH 34/60] =?UTF-8?q?[BE]=20feat=20:=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=EC=8B=9C=20=EC=86=8D=ED=95=9C=20=EB=8C=80=ED=95=99=20=EB=AA=A8?= =?UTF-8?q?=EC=9E=84=EB=A7=8C=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/moim/moim/MoimService.java | 4 +- .../moim/moim/MoimServiceImpl.java | 8 +-- .../implement/moim/moim/MoimFinder.java | 15 ++-- .../repository/moim/moim/MoimRepository.java | 4 +- .../moim/moim/MoimRepositoryImpl.java | 20 +++--- .../presentation/moim/MoimController.java | 8 ++- .../fake_class/moim/FakeMoimService.java | 8 +-- .../implement/moim/moim/MoimFinderTest.java | 68 ++++++++++++++++--- 8 files changed, 90 insertions(+), 45 deletions(-) diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimService.java b/backend/src/main/java/moim_today/application/moim/moim/MoimService.java index 7dad706d..20e6742a 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimService.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimService.java @@ -31,7 +31,7 @@ MoimIdResponse createMoim(final long memberId, final long universityId, void appendMemberToMoim(final long requestMemberId, final MoimJoinRequest moimJoinRequest); - List findAllMoimResponse(final long universityId, final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter); + List findAllMoimResponses(final long universityId, final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter); - List searchMoim(final String searchParam); + List searchMoim(final long universityId, final String searchParam); } diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java index fa9a4f2a..49a6bc22 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java @@ -160,16 +160,16 @@ public void appendMemberToMoim(final long requestMemberId, final MoimJoinRequest } @Override - public List findAllMoimResponse( + public List findAllMoimResponses( final long universityId, final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter) { - return moimFinder.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); + return moimFinder.findAllMoimResponses(universityId, moimCategoryDto, moimSortedFilter); } @Override - public List searchMoim(final String searchParam) { - return moimFinder.searchMoim(searchParam); + public List searchMoim(final long universityId, final String searchParam) { + return moimFinder.searchMoim(universityId, searchParam); } } diff --git a/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java b/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java index 293aadb2..eb696d4c 100644 --- a/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java +++ b/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java @@ -15,7 +15,6 @@ import moim_today.persistence.repository.moim.moim.MoimRepository; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; import java.util.List; import static moim_today.global.constant.exception.MoimExceptionConstant.MOIM_CAPACITY_ERROR; @@ -73,8 +72,8 @@ public MoimDateResponse findMoimDate(final long moimId) { } @Transactional(readOnly = true) - public List findAllMoimResponseByUniversityId(final long universityId, final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter) { - return moimRepository.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); + public List findAllMoimResponses(final long universityId, final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter) { + return moimRepository.findAllMoimResponses(universityId, moimCategoryDto, moimSortedFilter); } @Transactional(readOnly = true) @@ -94,13 +93,7 @@ public void validateCapacity(final MoimJpaEntity moimJpaEntity) { } @Transactional(readOnly = true) - public List searchMoim(final String searchParam) { - return moimRepository.searchMoimBySearchParam(searchParam); - } - - private List extractMemberIds(final List joinedMoimJpaEntities) { - List memberIds = new ArrayList<>(); - joinedMoimJpaEntities.forEach(e -> memberIds.add(e.getMemberId())); - return memberIds; + public List searchMoim(final long universityId, final String searchParam) { + return moimRepository.searchMoimBySearchParam(universityId, searchParam); } } diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java index 9e1ec25a..465c384d 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java @@ -23,11 +23,11 @@ public interface MoimRepository { void deleteById(final long moimId); - List findAllMoimResponseByUniversityId(final long universityId, final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter); + List findAllMoimResponses(final long universityId, final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter); List findAllMyMoimResponse(final List moimIds); MoimJpaEntity getByIdWithPessimisticLock(final long moimId); - List searchMoimBySearchParam(final String searchParam); + List searchMoimBySearchParam(final long universityId, final String searchParam); } diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java index b3bd4957..3e83c2ee 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java @@ -10,13 +10,11 @@ import moim_today.dto.moim.moim.enums.MoimCategoryDto; import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; -import moim_today.persistence.entity.moim.moim.QMoimJpaEntity; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; -import java.util.Optional; - import java.util.List; +import java.util.Optional; import static moim_today.global.constant.SymbolConstant.PERCENT; import static moim_today.global.constant.exception.MoimExceptionConstant.MOIM_NOT_FOUND_ERROR; @@ -87,7 +85,7 @@ public MoimJpaEntity getByIdWithPessimisticLock(final long moimId) { } @Override - public List searchMoimBySearchParam(final String searchParam) { + public List searchMoimBySearchParam(final long universityId, final String searchParam) { return queryFactory.select(new QMoimSimpleResponse( moimJpaEntity.id, moimJpaEntity.title, @@ -98,14 +96,16 @@ public List searchMoimBySearchParam(final String searchParam moimJpaEntity.displayStatus )) .from(moimJpaEntity) - .where(moimJpaEntity.title.likeIgnoreCase(PERCENT.value() + searchParam.trim() + PERCENT.value())) + .where(moimJpaEntity.universityId.eq(universityId) + .and(moimJpaEntity.title.likeIgnoreCase(PERCENT.value() + searchParam.trim() + PERCENT.value())) + ) .fetch(); } @Override - public List findAllMoimResponseByUniversityId(final long universityId, - final MoimCategoryDto moimCategoryDto, - final MoimSortedFilter moimSortedFilter) { + public List findAllMoimResponses(final long universityId, + final MoimCategoryDto moimCategoryDto, + final MoimSortedFilter moimSortedFilter) { return queryFactory.select(new QMoimSimpleResponse( moimJpaEntity.id, @@ -117,7 +117,9 @@ public List findAllMoimResponseByUniversityId(final long uni moimJpaEntity.displayStatus )) .from(moimJpaEntity) - .where(moimJpaEntity.universityId.eq(universityId).and(applyMoimCategoryFilter(moimCategoryDto))) + .where(moimJpaEntity.universityId.eq(universityId) + .and(applyMoimCategoryFilter(moimCategoryDto)) + ) .orderBy(createOrderBySpecifier(moimSortedFilter)) .fetch(); } diff --git a/backend/src/main/java/moim_today/presentation/moim/MoimController.java b/backend/src/main/java/moim_today/presentation/moim/MoimController.java index a4fed5cd..b00f62ff 100644 --- a/backend/src/main/java/moim_today/presentation/moim/MoimController.java +++ b/backend/src/main/java/moim_today/presentation/moim/MoimController.java @@ -56,7 +56,7 @@ public MoimDetailResponse getMoimDetail(@PathVariable final long moimId, } @GetMapping("/simple") - public CollectionResponse> findAllMoimResponse( + public CollectionResponse> findAllMoimResponses( @Login final MemberSession memberSession, @RequestParam final MoimCategoryDto moimCategoryDto, @RequestParam final MoimSortedFilter moimSortedFilter) { @@ -130,8 +130,10 @@ public void deleteMoimNotice(@Login final MemberSession memberSession, } @GetMapping("/search") - public CollectionResponse> searchMoim(@RequestParam final String searchParam) { - return CollectionResponse.from(moimService.searchMoim(searchParam)); + public CollectionResponse> searchMoim( + @Login final MemberSession memberSession, + @RequestParam final String searchParam) { + return CollectionResponse.from(moimService.searchMoim(memberSession.universityId(), searchParam)); } @GetMapping("/categories") diff --git a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java index 41465821..835b099f 100644 --- a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java +++ b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java @@ -146,9 +146,9 @@ else if(moimJoinRequest.moimId() == MOIM_ID.longValue() + 3L){ } @Override - public List findAllMoimResponse(final long universityId, - final MoimCategoryDto moimCategoryDto, - final MoimSortedFilter moimSortedFilter) { + public List findAllMoimResponses(final long universityId, + final MoimCategoryDto moimCategoryDto, + final MoimSortedFilter moimSortedFilter) { MoimSimpleResponse moimSimpleResponse1 = MoimSimpleResponse.builder() .moimId(1L) .title(MOIM_TITLE.value()) @@ -173,7 +173,7 @@ public List findAllMoimResponse(final long universityId, } @Override - public List searchMoim(final String searchParam) { + public List searchMoim(final long universityId, final String searchParam) { MoimSimpleResponse moimSimpleResponse1 = MoimSimpleResponse.builder() .moimId(1L) .title(MOIM_TITLE.value()) diff --git a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java index 651b6e97..a7652bc8 100644 --- a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java +++ b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java @@ -274,7 +274,7 @@ void findAllMoim() throws InterruptedException { MoimSortedFilter moimSortedFilter = null; // when - List moimSimpleResponses = moimFinder.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); + List moimSimpleResponses = moimFinder.findAllMoimResponses(universityId, moimCategoryDto, moimSortedFilter); // then assertThat(moimSimpleResponses.size()).isEqualTo(2); @@ -312,7 +312,7 @@ void findAllMoimOrderByCreatedAt() throws InterruptedException { MoimSortedFilter moimSortedFilter = MoimSortedFilter.CREATED_AT; // when - List moimSimpleResponses = moimFinder.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); + List moimSimpleResponses = moimFinder.findAllMoimResponses(universityId, moimCategoryDto, moimSortedFilter); // then assertThat(moimSimpleResponses.size()).isEqualTo(2); @@ -346,7 +346,7 @@ void findAllMoimOrderByViews() { MoimSortedFilter moimSortedFilter = MoimSortedFilter.VIEWS; // when - List moimSimpleResponses = moimFinder.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); + List moimSimpleResponses = moimFinder.findAllMoimResponses(universityId, moimCategoryDto, moimSortedFilter); // then assertThat(moimSimpleResponses.size()).isEqualTo(2); @@ -380,7 +380,7 @@ void findAllMoimByCategory() { MoimSortedFilter moimSortedFilter = null; // when - List moimSimpleResponses = moimFinder.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); + List moimSimpleResponses = moimFinder.findAllMoimResponses(universityId, moimCategoryDto, moimSortedFilter); // then assertThat(moimSimpleResponses.size()).isEqualTo(1); @@ -414,7 +414,7 @@ void findAllMoimByCategoryByUniversityId() { MoimSortedFilter moimSortedFilter = null; // when - List moimSimpleResponses = moimFinder.findAllMoimResponseByUniversityId(universityId, moimCategoryDto, moimSortedFilter); + List moimSimpleResponses = moimFinder.findAllMoimResponses(universityId, moimCategoryDto, moimSortedFilter); // then assertThat(moimSimpleResponses.size()).isEqualTo(1); @@ -525,17 +525,22 @@ void validateCapacityDoesNotThrowError() { @Test void searchMoimBySearchParam() { // given1 + long universityId = UNIV_ID.longValue(); + MoimJpaEntity moimA = MoimJpaEntity.builder() + .universityId(universityId) .title("appleMango") .build(); // given2 MoimJpaEntity moimB = MoimJpaEntity.builder() + .universityId(universityId) .title(" " + "apple" + " " + "mango" + " ") .build(); // given3 MoimJpaEntity moimC = MoimJpaEntity.builder() + .universityId(universityId) .title("apple" + " " + "mango") .build(); @@ -544,11 +549,11 @@ void searchMoimBySearchParam() { moimRepository.save(moimC); //when - List appleResponses = moimFinder.searchMoim("apple"); - List mangoResponses = moimFinder.searchMoim("mango"); - List blankResponses = moimFinder.searchMoim(" "); - List noneResponses = moimFinder.searchMoim("none"); - List applemangoResponses = moimFinder.searchMoim("apple mango"); + List appleResponses = moimFinder.searchMoim(universityId, "apple"); + List mangoResponses = moimFinder.searchMoim(universityId, "mango"); + List blankResponses = moimFinder.searchMoim(universityId, " "); + List noneResponses = moimFinder.searchMoim(universityId, "none"); + List applemangoResponses = moimFinder.searchMoim(universityId, "apple mango"); //then assertThat(appleResponses.size()).isEqualTo(3); @@ -558,6 +563,49 @@ void searchMoimBySearchParam() { assertThat(applemangoResponses.size()).isEqualTo(2); } + @DisplayName("다른 대학 모임은 검색되지 않는다.") + @Test + void searchMoimBySearchParamAndUniversityId() { + // given1 + long universityId = UNIV_ID.longValue(); + long otherUniversityId = UNIV_ID.longValue() + 1 ; + + MoimJpaEntity moimA = MoimJpaEntity.builder() + .universityId(universityId) + .title("appleMango") + .build(); + + // given2 + MoimJpaEntity moimB = MoimJpaEntity.builder() + .universityId(universityId) + .title(" " + "apple" + " " + "mango" + " ") + .build(); + + // given3 + MoimJpaEntity moimC = MoimJpaEntity.builder() + .universityId(otherUniversityId) + .title("apple" + " " + "mango") + .build(); + + moimRepository.save(moimA); + moimRepository.save(moimB); + moimRepository.save(moimC); + + //when + List appleResponses = moimFinder.searchMoim(universityId, "apple"); + List mangoResponses = moimFinder.searchMoim(universityId, "mango"); + List blankResponses = moimFinder.searchMoim(universityId, " "); + List noneResponses = moimFinder.searchMoim(universityId, "none"); + List applemangoResponses = moimFinder.searchMoim(otherUniversityId, "apple mango"); + + //then + assertThat(appleResponses.size()).isEqualTo(2); + assertThat(mangoResponses.size()).isEqualTo(2); + assertThat(blankResponses.size()).isEqualTo(2); + assertThat(noneResponses.size()).isEqualTo(0); + assertThat(applemangoResponses.size()).isEqualTo(1); + } + private MemberJpaEntity saveRandomMember() { MemberJpaEntity memberJpaEntity = MemberJpaEntity.builder() .username(USERNAME + String.valueOf(random.nextInt(10))) From 0f7b8b6ad3c7be8618f745315061d054c1b83757 Mon Sep 17 00:00:00 2001 From: Yang JiWoong Date: Mon, 20 May 2024 19:55:12 +0900 Subject: [PATCH 35/60] =?UTF-8?q?[BE]=20rebase=20:=20conflict=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/moim_today/presentation/moim/MoimController.java | 2 +- .../implement/meeting/meeting/MeetingManagerTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/moim_today/presentation/moim/MoimController.java b/backend/src/main/java/moim_today/presentation/moim/MoimController.java index b00f62ff..918fff65 100644 --- a/backend/src/main/java/moim_today/presentation/moim/MoimController.java +++ b/backend/src/main/java/moim_today/presentation/moim/MoimController.java @@ -60,7 +60,7 @@ public CollectionResponse> findAllMoimResponses( @Login final MemberSession memberSession, @RequestParam final MoimCategoryDto moimCategoryDto, @RequestParam final MoimSortedFilter moimSortedFilter) { - return CollectionResponse.from(moimService.findAllMoimResponse(memberSession.universityId(), moimCategoryDto, moimSortedFilter)); + return CollectionResponse.from(moimService.findAllMoimResponses(memberSession.universityId(), moimCategoryDto, moimSortedFilter)); } @PatchMapping diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java index 19c14dd0..458bf0c9 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java @@ -95,7 +95,7 @@ void createRegularMeetingFromCurrentDate() { .build(); // when - MeetingCreateResponse meetingCreateResponse = meetingManager.createMeeting(meetingCreateRequest, currentDate); + MeetingCreateResponse meetingCreateResponse = meetingManager.createMeeting(memberId, meetingCreateRequest, currentDate); // then long between = ChronoUnit.WEEKS.between(currentDate, endDate) + 1; From d1af5e1fce9df675ffd5ef21f94cf9002cdbd396 Mon Sep 17 00:00:00 2001 From: Donghyun Kim Date: Tue, 21 May 2024 15:51:10 +0900 Subject: [PATCH 36/60] =?UTF-8?q?[BE]=20feat=20:=20=EC=9E=90=EC=8B=A0?= =?UTF-8?q?=EC=9D=B4=20=EC=B0=B8=EC=97=AC=ED=95=9C=20=EB=AA=A8=EC=9E=84=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EB=B0=98?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/moim/moim/MoimService.java | 4 +- .../moim/moim/MoimServiceImpl.java | 8 +- .../moim_notice/MoimNoticeCreateRequest.java | 2 + .../implement/moim/moim/MoimFinder.java | 10 ++ .../implement/moim/moim/MoimManager.java | 16 +++ .../repository/moim/moim/MoimRepository.java | 5 + .../moim/moim/MoimRepositoryImpl.java | 41 +++++- .../presentation/moim/MoimController.java | 15 +- .../fake_class/moim/FakeMoimService.java | 27 +++- .../implement/moim/moim/MoimFinderTest.java | 76 +++++++++- .../implement/moim/moim/MoimManagerTest.java | 134 ++++++++++++++++++ .../presentation/moim/MoimControllerTest.java | 29 ++++ 12 files changed, 357 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimService.java b/backend/src/main/java/moim_today/application/moim/moim/MoimService.java index 20e6742a..50751dbe 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimService.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimService.java @@ -10,7 +10,7 @@ public interface MoimService { - List findAllMyMoimResponse(final long memberId); + List findAllMyJoinedMoimResponse(final long memberId); MoimIdResponse createMoim(final long memberId, final long universityId, final MoimCreateRequest moimCreateRequest); @@ -34,4 +34,6 @@ MoimIdResponse createMoim(final long memberId, final long universityId, List findAllMoimResponses(final long universityId, final MoimCategoryDto moimCategoryDto, final MoimSortedFilter moimSortedFilter); List searchMoim(final long universityId, final String searchParam); + + List findAllMyJoinedMoimSimpleResponse(final long memberId, final boolean ended); } diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java index 49a6bc22..3141bacc 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java @@ -19,6 +19,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import java.time.LocalDate; import java.util.List; import static moim_today.global.constant.FileTypeConstant.MOIM_IMAGE; @@ -69,7 +70,7 @@ public MoimServiceImpl(final MoimAppender moimAppender, } @Override - public List findAllMyMoimResponse(final long memberId) { + public List findAllMyJoinedMoimResponse(final long memberId) { return moimFinder.findAllMyMoimResponse(memberId); } @@ -172,4 +173,9 @@ public List findAllMoimResponses( public List searchMoim(final long universityId, final String searchParam) { return moimFinder.searchMoim(universityId, searchParam); } + + @Override + public List findAllMyJoinedMoimSimpleResponse(final long memberId, final boolean ended) { + return moimManager.findAllJoinedMoimSimpleResponseByEndStatus(memberId, LocalDate.now(), ended); + } } diff --git a/backend/src/main/java/moim_today/dto/moim/moim_notice/MoimNoticeCreateRequest.java b/backend/src/main/java/moim_today/dto/moim/moim_notice/MoimNoticeCreateRequest.java index 4be6e318..4bf6439e 100644 --- a/backend/src/main/java/moim_today/dto/moim/moim_notice/MoimNoticeCreateRequest.java +++ b/backend/src/main/java/moim_today/dto/moim/moim_notice/MoimNoticeCreateRequest.java @@ -1,7 +1,9 @@ package moim_today.dto.moim.moim_notice; +import lombok.Builder; import moim_today.persistence.entity.moim.moim_notice.MoimNoticeJpaEntity; +@Builder public record MoimNoticeCreateRequest( long moimId, String title, diff --git a/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java b/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java index eb696d4c..fbe9b02d 100644 --- a/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java +++ b/backend/src/main/java/moim_today/implement/moim/moim/MoimFinder.java @@ -15,6 +15,7 @@ import moim_today.persistence.repository.moim.moim.MoimRepository; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; import java.util.List; import static moim_today.global.constant.exception.MoimExceptionConstant.MOIM_CAPACITY_ERROR; @@ -96,4 +97,13 @@ public void validateCapacity(final MoimJpaEntity moimJpaEntity) { public List searchMoim(final long universityId, final String searchParam) { return moimRepository.searchMoimBySearchParam(universityId, searchParam); } + + @Transactional(readOnly = true) + public List findEndedMoimSimpleResponsesByMoimIds(final List moimIds, final LocalDate now) { + return moimRepository.findEndedMoimSimpleResponsesByMoimIds(moimIds, now); + } + + public List findInProgressMoimSimpleResponsesByMoimIds(final List moimIds, final LocalDate now) { + return moimRepository.findInProgressMoimSimpleResponsesByMoimIds(moimIds, now); + } } diff --git a/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java b/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java index 423678cc..03c6ff7e 100644 --- a/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java +++ b/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java @@ -1,5 +1,6 @@ package moim_today.implement.moim.moim; +import moim_today.dto.moim.moim.MoimSimpleResponse; import moim_today.global.annotation.Implement; import moim_today.implement.meeting.joined_meeting.JoinedMeetingAppender; import moim_today.implement.meeting.joined_meeting.JoinedMeetingRemover; @@ -13,6 +14,7 @@ import moim_today.persistence.entity.moim.moim.MoimJpaEntity; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; import java.util.List; @Implement @@ -91,4 +93,18 @@ public boolean isJoinedMoim(final long moimId, final long memberId) { public String getTitleById(final Long moimId) { return moimFinder.getTitleById(moimId); } + + @Transactional(readOnly = true) + public List findAllJoinedMoimSimpleResponseByEndStatus(final long memberId, final LocalDate now, final boolean ended) { + List joinedMoims = joinedMoimFinder.findMoimIdsByMemberId(memberId); + return getMoimSimpleResponses(ended, joinedMoims, now); + } + + @Transactional(readOnly = true) + public List getMoimSimpleResponses(final boolean ended, final List joinedMoims, final LocalDate now) { + if(ended){ + return moimFinder.findEndedMoimSimpleResponsesByMoimIds(joinedMoims, now); + } + return moimFinder.findInProgressMoimSimpleResponsesByMoimIds(joinedMoims, now); + } } diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java index 465c384d..08131c64 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepository.java @@ -7,6 +7,7 @@ import moim_today.dto.moim.moim.enums.MoimCategoryDto; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; +import java.time.LocalDate; import java.util.List; public interface MoimRepository { @@ -30,4 +31,8 @@ public interface MoimRepository { MoimJpaEntity getByIdWithPessimisticLock(final long moimId); List searchMoimBySearchParam(final long universityId, final String searchParam); + + List findEndedMoimSimpleResponsesByMoimIds(final List moimIds, final LocalDate now); + + List findInProgressMoimSimpleResponsesByMoimIds(final List moimIds, final LocalDate now); } diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java index 3e83c2ee..a664b591 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/moim/MoimRepositoryImpl.java @@ -13,6 +13,7 @@ import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; import java.util.List; import java.util.Optional; @@ -77,10 +78,10 @@ public void deleteById(final long moimId) { @Override public MoimJpaEntity getByIdWithPessimisticLock(final long moimId) { return Optional.ofNullable(queryFactory - .selectFrom(moimJpaEntity) - .where(moimJpaEntity.id.eq(moimId)) - .setLockMode(LockModeType.PESSIMISTIC_WRITE) - .fetchFirst()) + .selectFrom(moimJpaEntity) + .where(moimJpaEntity.id.eq(moimId)) + .setLockMode(LockModeType.PESSIMISTIC_WRITE) + .fetchFirst()) .orElseThrow(() -> new NotFoundException(MOIM_NOT_FOUND_ERROR.message())); } @@ -102,6 +103,38 @@ public List searchMoimBySearchParam(final long universityId, .fetch(); } + @Override + public List findEndedMoimSimpleResponsesByMoimIds(final List moimIds, final LocalDate now) { + return queryFactory.select(new QMoimSimpleResponse( + moimJpaEntity.id, + moimJpaEntity.title, + moimJpaEntity.capacity, + moimJpaEntity.currentCount, + moimJpaEntity.imageUrl, + moimJpaEntity.moimCategory, + moimJpaEntity.displayStatus + )) + .from(moimJpaEntity) + .where(moimJpaEntity.id.in(moimIds).and(moimJpaEntity.endDate.before(now))) + .fetch(); + } + + @Override + public List findInProgressMoimSimpleResponsesByMoimIds(final List moimIds, final LocalDate now) { + return queryFactory.select(new QMoimSimpleResponse( + moimJpaEntity.id, + moimJpaEntity.title, + moimJpaEntity.capacity, + moimJpaEntity.currentCount, + moimJpaEntity.imageUrl, + moimJpaEntity.moimCategory, + moimJpaEntity.displayStatus + )) + .from(moimJpaEntity) + .where(moimJpaEntity.id.in(moimIds).and(moimJpaEntity.endDate.goe(now))) + .fetch(); + } + @Override public List findAllMoimResponses(final long universityId, final MoimCategoryDto moimCategoryDto, diff --git a/backend/src/main/java/moim_today/presentation/moim/MoimController.java b/backend/src/main/java/moim_today/presentation/moim/MoimController.java index 918fff65..5fbbb52d 100644 --- a/backend/src/main/java/moim_today/presentation/moim/MoimController.java +++ b/backend/src/main/java/moim_today/presentation/moim/MoimController.java @@ -32,11 +32,22 @@ public MoimController(final MoimService moimService, } @GetMapping - public CollectionResponse> findAllMyMoimResponse(@Login final MemberSession memberSession) { - List myMoimResponses = moimService.findAllMyMoimResponse(memberSession.id()); + public CollectionResponse> findAllMyJoinedMoimResponse(@Login final MemberSession memberSession) { + List myMoimResponses = moimService.findAllMyJoinedMoimResponse(memberSession.id()); return CollectionResponse.from(myMoimResponses); } + @GetMapping("/joined/detail") + public CollectionResponse> findAllMyJoinedMoimSimpleResponse( + @Login final MemberSession memberSession, + @RequestParam final boolean ended){ + List myMoimSimpleResponses = moimService.findAllMyJoinedMoimSimpleResponse( + memberSession.id(), ended + ); + return CollectionResponse.from(myMoimSimpleResponses); + } + + @PostMapping public MoimIdResponse createMoim(@Login final MemberSession memberSession, @RequestBody final MoimCreateRequest moimCreateRequest) { diff --git a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java index 835b099f..6219f523 100644 --- a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java +++ b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java @@ -23,7 +23,7 @@ public class FakeMoimService implements MoimService { @Override - public List findAllMyMoimResponse(final long memberId) { + public List findAllMyJoinedMoimResponse(final long memberId) { MyMoimResponse myMoimResponse1 = MyMoimResponse.builder() .moimId(1L) .title(MOIM_TITLE.value()) @@ -196,4 +196,29 @@ public List searchMoim(final long universityId, final String return List.of(moimSimpleResponse1, moimSimpleResponse2); } + + @Override + public List findAllMyJoinedMoimSimpleResponse(final long memberId, final boolean ended) { + MoimSimpleResponse moimSimpleResponse1 = MoimSimpleResponse.builder() + .moimId(1L) + .title(MOIM_TITLE.value()) + .capacity(CAPACITY.intValue()) + .currentCount(CURRENT_COUNT.intValue()) + .imageUrl(MOIM_IMAGE_URL.value()) + .moimCategory(MoimCategory.STUDY) + .displayStatus(DisplayStatus.PUBLIC) + .build(); + + MoimSimpleResponse moimSimpleResponse2 = MoimSimpleResponse.builder() + .moimId(2L) + .title(MOIM_TITLE.value()) + .capacity(CAPACITY.intValue()) + .currentCount(CURRENT_COUNT.intValue()) + .imageUrl(MOIM_IMAGE_URL.value()) + .moimCategory(MoimCategory.STUDY) + .displayStatus(DisplayStatus.PUBLIC) + .build(); + + return List.of(moimSimpleResponse1, moimSimpleResponse2); + } } diff --git a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java index a7652bc8..d310d6eb 100644 --- a/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java +++ b/backend/src/test/java/moim_today/implement/moim/moim/MoimFinderTest.java @@ -568,7 +568,7 @@ void searchMoimBySearchParam() { void searchMoimBySearchParamAndUniversityId() { // given1 long universityId = UNIV_ID.longValue(); - long otherUniversityId = UNIV_ID.longValue() + 1 ; + long otherUniversityId = UNIV_ID.longValue() + 1; MoimJpaEntity moimA = MoimJpaEntity.builder() .universityId(universityId) @@ -606,6 +606,80 @@ void searchMoimBySearchParamAndUniversityId() { assertThat(applemangoResponses.size()).isEqualTo(1); } + @DisplayName("모임들 중 완료된 모임을 반환한다.") + @Test + void findEndedMoimSimpleResponsesByMoimIds() { + MemberJpaEntity saveMember = saveRandomMember(); + + LocalDate localDate1 = LocalDate.of(2023, 5, 12); + LocalDate localDate2 = LocalDate.of(2024, 5, 16); + LocalDate localDate3 = LocalDate.of(2025, 6, 5); + + MoimJpaEntity moimJpaEntity1 = MoimJpaEntity.builder() + .memberId(saveMember.getId()) + .endDate(localDate1) + .build(); + MoimJpaEntity moimJpaEntity2 = MoimJpaEntity.builder() + .memberId(saveMember.getId()) + .endDate(localDate2) + .build(); + MoimJpaEntity moimJpaEntity3 = MoimJpaEntity.builder() + .memberId(saveMember.getId()) + .endDate(localDate3) + .build(); + + moimRepository.save(moimJpaEntity1); + moimRepository.save(moimJpaEntity2); + moimRepository.save(moimJpaEntity3); + + List moimIds = List.of(moimJpaEntity1.getId(), moimJpaEntity2.getId(), moimJpaEntity3.getId()); + + List endedMoims1 = moimFinder.findEndedMoimSimpleResponsesByMoimIds( + moimIds, LocalDate.of(2024, 5, 16)); + List endedMoims2 = moimFinder.findEndedMoimSimpleResponsesByMoimIds( + moimIds, LocalDate.of(2025, 6, 4)); + + assertThat(endedMoims1.size()).isEqualTo(1); + assertThat(endedMoims2.size()).isEqualTo(2); + } + + @DisplayName("모임들 중 진행중인 모임을 반환한다.") + @Test + void findInProgressMoimSimpleResponsesByMoimIds() { + MemberJpaEntity saveMember = saveRandomMember(); + + LocalDate localDate1 = LocalDate.of(2023, 5, 12); + LocalDate localDate2 = LocalDate.of(2024, 5, 16); + LocalDate localDate3 = LocalDate.of(2025, 6, 5); + + MoimJpaEntity moimJpaEntity1 = MoimJpaEntity.builder() + .memberId(saveMember.getId()) + .endDate(localDate1) + .build(); + MoimJpaEntity moimJpaEntity2 = MoimJpaEntity.builder() + .memberId(saveMember.getId()) + .endDate(localDate2) + .build(); + MoimJpaEntity moimJpaEntity3 = MoimJpaEntity.builder() + .memberId(saveMember.getId()) + .endDate(localDate3) + .build(); + + moimRepository.save(moimJpaEntity1); + moimRepository.save(moimJpaEntity2); + moimRepository.save(moimJpaEntity3); + + List moimIds = List.of(moimJpaEntity1.getId(), moimJpaEntity2.getId(), moimJpaEntity3.getId()); + + List inProgressMoims1 = moimFinder.findInProgressMoimSimpleResponsesByMoimIds( + moimIds, LocalDate.of(2024, 5, 16)); + List inProgressMoims2 = moimFinder.findInProgressMoimSimpleResponsesByMoimIds( + moimIds, LocalDate.of(2025, 6, 4)); + + assertThat(inProgressMoims1.size()).isEqualTo(2); + assertThat(inProgressMoims2.size()).isEqualTo(1); + } + private MemberJpaEntity saveRandomMember() { MemberJpaEntity memberJpaEntity = MemberJpaEntity.builder() .username(USERNAME + String.valueOf(random.nextInt(10))) diff --git a/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java b/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java index b7b25121..01602fbb 100644 --- a/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java +++ b/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java @@ -1,16 +1,22 @@ package moim_today.implement.moim.moim; +import moim_today.dto.moim.moim.MoimSimpleResponse; +import moim_today.persistence.entity.member.MemberJpaEntity; +import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; import moim_today.util.ImplementTest; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import java.time.LocalDate; +import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import static moim_today.util.TestConstant.MEMBER_ID; +import static moim_today.util.TestConstant.USERNAME; import static org.assertj.core.api.Assertions.assertThat; class MoimManagerTest extends ImplementTest { @@ -54,4 +60,132 @@ void validateConcurrencyTest() throws Exception{ long joinedMembersCount = joinedMoimRepository.findAllJoinedMemberId(savedMoimId).size(); assertThat(joinedMembersCount).isEqualTo(MOIM_MAXIMUM_PEOPLE); } + + @DisplayName("자신이 참여한 모임들 중 완료 여부에 따라 반환한다.") + @Test + void findAllJoinedMoimSimpleResponseByEndStatus() { + // given1 + MemberJpaEntity member1 = MemberJpaEntity.builder() + .username(USERNAME.value()) + .build(); + + memberRepository.save(member1); + + LocalDate localDate1 = LocalDate.of(2023, 5, 12); + LocalDate localDate2 = LocalDate.of(2024, 5, 16); + LocalDate localDate3 = LocalDate.of(2025, 6, 5); + + MoimJpaEntity moimJpaEntity1 = MoimJpaEntity.builder() + .memberId(member1.getId()) + .endDate(localDate1) + .build(); + MoimJpaEntity moimJpaEntity2 = MoimJpaEntity.builder() + .memberId(member1.getId()) + .endDate(localDate2) + .build(); + MoimJpaEntity moimJpaEntity3 = MoimJpaEntity.builder() + .memberId(member1.getId()) + .endDate(localDate3) + .build(); + + moimRepository.save(moimJpaEntity1); + moimRepository.save(moimJpaEntity2); + moimRepository.save(moimJpaEntity3); + + JoinedMoimJpaEntity j1 = JoinedMoimJpaEntity.builder() + .memberId(member1.getId()) + .moimId(moimJpaEntity1.getId()) + .build(); + JoinedMoimJpaEntity j2 = JoinedMoimJpaEntity.builder() + .memberId(member1.getId()) + .moimId(moimJpaEntity2.getId()) + .build(); + JoinedMoimJpaEntity j3 = JoinedMoimJpaEntity.builder() + .memberId(member1.getId()) + .moimId(moimJpaEntity3.getId()) + .build(); + + joinedMoimRepository.save(j1); + joinedMoimRepository.save(j2); + joinedMoimRepository.save(j3); + + List endedMoims = moimManager.findAllJoinedMoimSimpleResponseByEndStatus( + member1.getId(), LocalDate.of(2024, 5, 16), true); + List inProgressMoims = moimManager.findAllJoinedMoimSimpleResponseByEndStatus( + member1.getId(), LocalDate.of(2024, 5, 16), false); + + assertThat(endedMoims.size()).isEqualTo(1); + assertThat(inProgressMoims.size()).isEqualTo(2); + } + @DisplayName("다른 멤버의 모임들을 제외한 자신이 참여한 모임들 중 완료 여부에 따라 반환한다.") + @Test + void findAllJoinedMoimSimpleResponseExceptOtherMembers() { + // given + MemberJpaEntity me = MemberJpaEntity.builder() + .username(USERNAME.value()) + .build(); + MemberJpaEntity other = MemberJpaEntity.builder() + .username(USERNAME.value()+"1") + .build(); + + memberRepository.save(me); + memberRepository.save(other); + + LocalDate localDate1 = LocalDate.of(2023, 5, 12); + LocalDate localDate2 = LocalDate.of(2024, 5, 16); + + MoimJpaEntity myMoim1 = MoimJpaEntity.builder() + .memberId(me.getId()) + .endDate(localDate1) + .build(); + MoimJpaEntity myMoim2 = MoimJpaEntity.builder() + .memberId(me.getId()) + .endDate(localDate2) + .build(); + MoimJpaEntity otherMoim1 = MoimJpaEntity.builder() + .memberId(other.getId()) + .endDate(localDate1) + .build(); + MoimJpaEntity otherMoim2 = MoimJpaEntity.builder() + .memberId(other.getId()) + .endDate(localDate2) + .build(); + + moimRepository.save(myMoim1); + moimRepository.save(myMoim2); + moimRepository.save(otherMoim1); + moimRepository.save(otherMoim2); + + JoinedMoimJpaEntity j1 = JoinedMoimJpaEntity.builder() + .memberId(me.getId()) + .moimId(myMoim1.getId()) + .build(); + JoinedMoimJpaEntity j2 = JoinedMoimJpaEntity.builder() + .memberId(me.getId()) + .moimId(myMoim2.getId()) + .build(); + JoinedMoimJpaEntity j3 = JoinedMoimJpaEntity.builder() + .memberId(other.getId()) + .moimId(otherMoim1.getId()) + .build(); + JoinedMoimJpaEntity j4 = JoinedMoimJpaEntity.builder() + .memberId(other.getId()) + .moimId(otherMoim2.getId()) + .build(); + + joinedMoimRepository.save(j1); + joinedMoimRepository.save(j2); + joinedMoimRepository.save(j3); + joinedMoimRepository.save(j4); + + // when + List myEndedMoims = moimManager.findAllJoinedMoimSimpleResponseByEndStatus( + me.getId(), LocalDate.of(2023,5,12), true); + List myInProgressMoims = moimManager.findAllJoinedMoimSimpleResponseByEndStatus( + me.getId(), LocalDate.of(2023, 5, 12), false); + + // then + assertThat(myEndedMoims.size()).isEqualTo(0); + assertThat(myInProgressMoims.size()).isEqualTo(2); + } } \ No newline at end of file diff --git a/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java b/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java index 39cb6765..02c95977 100644 --- a/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java @@ -808,4 +808,33 @@ void returnCategoriesTest() throws Exception { .build() ))); } + + @DisplayName("자신이 참여한 모임의 모임들을 완료 여부에 따라 카드 정보로 반환한다") + @Test + void findAllMyJoinedMoimSimpleResponse() throws Exception { + + mockMvc.perform(get("/api/moims/joined/detail") + .queryParam("ended", "false")) + .andExpect(status().isOk()) + .andDo(document("자신이 참여한 모임 리스트를 완료 여부로 조회 성공", + resource(ResourceSnippetParameters.builder() + .tag("모임") + .summary("자신이 참여한 모임 리스트 정보 조회") + .queryParameters( + parameterWithName("ended").description("완료된 모임을 찾을 지 여부") + ) + .responseFields( + fieldWithPath("data[0].moimId").type(NUMBER).description("모임 Id"), + fieldWithPath("data[0].title").type(STRING).description("모임명"), + fieldWithPath("data[0].capacity").type(NUMBER).description("모집 인원"), + fieldWithPath("data[0].currentCount").type(NUMBER).description("현재 인원"), + fieldWithPath("data[0].imageUrl").type(STRING).description("모임 사진 URL"), + fieldWithPath("data[0].moimCategory").type(VARIES).description(String.format("카테고리 - %s", + EnumDocsUtils.getEnumNames(MoimCategory.class))), + fieldWithPath("data[0].displayStatus").type(VARIES).description(String.format("공개 여부 - %s", + EnumDocsUtils.getEnumNames(DisplayStatus.class))) + ) + .build()) + )); + } } From 21f33ce484d2cf3f585ff7139297c011badcb223 Mon Sep 17 00:00:00 2001 From: Donghyun Kim Date: Tue, 21 May 2024 16:03:20 +0900 Subject: [PATCH 37/60] =?UTF-8?q?[BE]=20fix=20:=20=ED=94=84=EB=A1=A0?= =?UTF-8?q?=ED=8A=B8=EC=97=94=EB=93=9C=EC=97=90=EC=84=9C=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=EA=B0=92=EC=9D=84=20booelan=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B0=9B=EA=B8=B0=20=EC=9C=84=ED=95=B4=20Boolean=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/moim_today/presentation/moim/MoimController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/moim_today/presentation/moim/MoimController.java b/backend/src/main/java/moim_today/presentation/moim/MoimController.java index 5fbbb52d..9c7a7965 100644 --- a/backend/src/main/java/moim_today/presentation/moim/MoimController.java +++ b/backend/src/main/java/moim_today/presentation/moim/MoimController.java @@ -40,7 +40,7 @@ public CollectionResponse> findAllMyJoinedMoimResponse(@Log @GetMapping("/joined/detail") public CollectionResponse> findAllMyJoinedMoimSimpleResponse( @Login final MemberSession memberSession, - @RequestParam final boolean ended){ + @RequestParam final Boolean ended){ List myMoimSimpleResponses = moimService.findAllMyJoinedMoimSimpleResponse( memberSession.id(), ended ); From b289363a0150f9c01101ef71c76258c3faeea78f Mon Sep 17 00:00:00 2001 From: Donghyun Kim Date: Tue, 21 May 2024 18:54:16 +0900 Subject: [PATCH 38/60] =?UTF-8?q?[BE]=20docs=20:=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=ED=99=94=EB=A5=BC=20=EB=8D=94=20=EC=A7=81=EA=B4=80=EC=A0=81?= =?UTF-8?q?=EC=9D=B4=EB=8F=84=EB=A1=9D=20=EA=B8=B0=EC=A1=B4=20api=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=B0=B8=EA=B3=A0=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moim_today/presentation/moim/MoimControllerTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java b/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java index 02c95977..3034b8a4 100644 --- a/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java @@ -52,7 +52,7 @@ void findAllMyMoimResponse() throws Exception { .andDo(document("로그인한 회원이 참여한 모임 리스트 조회", resource(ResourceSnippetParameters.builder() .tag("모임") - .summary("로그인한 회원이 참여한 모임 리스트 조회") + .summary("로그인한 회원이 참여한 모임 리스트 간단한 정보 조회") .responseFields( fieldWithPath("data[0].moimId").type(NUMBER).description("모임 Id"), fieldWithPath("data[0].title").type(STRING).description("모임명") @@ -809,7 +809,7 @@ void returnCategoriesTest() throws Exception { ))); } - @DisplayName("자신이 참여한 모임의 모임들을 완료 여부에 따라 카드 정보로 반환한다") + @DisplayName("로그인한 회원이 참여한 모임들을 완료 여부에 따라 카드 정보로 반환한다") @Test void findAllMyJoinedMoimSimpleResponse() throws Exception { @@ -819,9 +819,9 @@ void findAllMyJoinedMoimSimpleResponse() throws Exception { .andDo(document("자신이 참여한 모임 리스트를 완료 여부로 조회 성공", resource(ResourceSnippetParameters.builder() .tag("모임") - .summary("자신이 참여한 모임 리스트 정보 조회") + .summary("로그인한 회원이 참여한 모임 리스트 자세한 정보 조회") .queryParameters( - parameterWithName("ended").description("완료된 모임을 찾을 지 여부") + parameterWithName("ended").description("완료된 모임을 찾을 지 여부 - [true, false]") ) .responseFields( fieldWithPath("data[0].moimId").type(NUMBER).description("모임 Id"), From 6b5f9739ed78d3a05133ba95f348445899451b3e Mon Sep 17 00:00:00 2001 From: Donghyun Kim Date: Tue, 21 May 2024 21:09:48 +0900 Subject: [PATCH 39/60] =?UTF-8?q?[BE]=20fix=20:=20session=20validation=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=EC=9D=B4=20=EC=84=B8=EC=85=98=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20=EC=9D=B8=ED=84=B0=EC=85=89=ED=84=B0=EB=A5=BC=20?= =?UTF-8?q?=EC=95=88=20=EA=B1=B0=EC=B9=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/java/moim_today/global/config/WebConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/main/java/moim_today/global/config/WebConfig.java b/backend/src/main/java/moim_today/global/config/WebConfig.java index 9ed88706..915c2aa4 100644 --- a/backend/src/main/java/moim_today/global/config/WebConfig.java +++ b/backend/src/main/java/moim_today/global/config/WebConfig.java @@ -29,6 +29,7 @@ public void addInterceptors(final InterceptorRegistry registry) { "/api/login", "/api/certification/**", "/api/sign-up", + "/api/session-validation", "/api", "/api/universities", "/api/universities/departments/**", From 4c202d4eaed276066767532a76138f6919a8d270 Mon Sep 17 00:00:00 2001 From: Donghyun Kim Date: Tue, 21 May 2024 21:17:44 +0900 Subject: [PATCH 40/60] =?UTF-8?q?[BE]=20fix=20:=20=ED=97=B7=EA=B0=88?= =?UTF-8?q?=EB=A6=AC=EB=8A=94=20api=20=EC=9A=94=EC=B2=AD=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/moim_today/presentation/moim/MoimController.java | 2 +- .../java/moim_today/presentation/moim/MoimControllerTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/moim_today/presentation/moim/MoimController.java b/backend/src/main/java/moim_today/presentation/moim/MoimController.java index 9c7a7965..c384c4c2 100644 --- a/backend/src/main/java/moim_today/presentation/moim/MoimController.java +++ b/backend/src/main/java/moim_today/presentation/moim/MoimController.java @@ -37,7 +37,7 @@ public CollectionResponse> findAllMyJoinedMoimResponse(@Log return CollectionResponse.from(myMoimResponses); } - @GetMapping("/joined/detail") + @GetMapping("/joined/simple") public CollectionResponse> findAllMyJoinedMoimSimpleResponse( @Login final MemberSession memberSession, @RequestParam final Boolean ended){ diff --git a/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java b/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java index 3034b8a4..19fc3447 100644 --- a/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java @@ -813,7 +813,7 @@ void returnCategoriesTest() throws Exception { @Test void findAllMyJoinedMoimSimpleResponse() throws Exception { - mockMvc.perform(get("/api/moims/joined/detail") + mockMvc.perform(get("/api/moims/joined/simple") .queryParam("ended", "false")) .andExpect(status().isOk()) .andDo(document("자신이 참여한 모임 리스트를 완료 여부로 조회 성공", From 508297d2bdddee4bdd2979de5db08f40a4a7b3ed Mon Sep 17 00:00:00 2001 From: Donghyun Kim Date: Wed, 22 May 2024 01:54:05 +0900 Subject: [PATCH 41/60] =?UTF-8?q?[BE]=20feat=20:=20=EC=9E=90=EC=8B=A0?= =?UTF-8?q?=EC=9D=B4=20=ED=98=B8=EC=8A=A4=ED=8A=B8=EC=9D=B8=20=EB=AA=A8?= =?UTF-8?q?=EC=9E=84=EB=A7=8C=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/moim/moim/MoimService.java | 2 +- .../moim/moim/MoimServiceImpl.java | 7 +- .../implement/moim/moim/MoimManager.java | 21 +++-- .../joined_moim/JoinedMoimJpaRepository.java | 2 + .../presentation/moim/MoimController.java | 5 +- .../fake_class/moim/FakeMoimService.java | 2 +- .../implement/moim/moim/MoimManagerTest.java | 82 +++++++++++++++++++ 7 files changed, 110 insertions(+), 11 deletions(-) diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimService.java b/backend/src/main/java/moim_today/application/moim/moim/MoimService.java index 50751dbe..75e4c4e7 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimService.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimService.java @@ -35,5 +35,5 @@ MoimIdResponse createMoim(final long memberId, final long universityId, List searchMoim(final long universityId, final String searchParam); - List findAllMyJoinedMoimSimpleResponse(final long memberId, final boolean ended); + List findAllMyJoinedMoimSimpleResponse(final long memberId, final boolean ended, final boolean onlyHost); } diff --git a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java index 3141bacc..a316270d 100644 --- a/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java +++ b/backend/src/main/java/moim_today/application/moim/moim/MoimServiceImpl.java @@ -175,7 +175,12 @@ public List searchMoim(final long universityId, final String } @Override - public List findAllMyJoinedMoimSimpleResponse(final long memberId, final boolean ended) { + public List findAllMyJoinedMoimSimpleResponse(final long memberId, + final boolean ended, + final boolean onlyHost) { + if(onlyHost){ + return moimManager.findAllHostMoimSimpleResponsesByEndStatus(memberId, LocalDate.now(), ended); + } return moimManager.findAllJoinedMoimSimpleResponseByEndStatus(memberId, LocalDate.now(), ended); } } diff --git a/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java b/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java index 03c6ff7e..d9948f10 100644 --- a/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java +++ b/backend/src/main/java/moim_today/implement/moim/moim/MoimManager.java @@ -23,7 +23,7 @@ public class MoimManager { private final JoinedMoimFinder joinedMoimFinder; private final JoinedMoimRemover joinedMoimRemover; private final TodoRemover todoRemover; - private final MeetingFinder meetingFinder; + private final MeetingFinder meetingFinder; private final JoinedMeetingRemover joinedMeetingRemover; private final JoinedMeetingAppender joinedMeetingAppender; private final MeetingCommentUpdater meetingCommentUpdater; @@ -80,7 +80,7 @@ public void appendMemberToMoim(final long requestMemberId, final long moimId) { } @Transactional(readOnly = true) - public boolean isHost(final long memberId, final long moimId){ + public boolean isHost(final long memberId, final long moimId) { return moimFinder.isHost(memberId, moimId); } @@ -97,13 +97,22 @@ public String getTitleById(final Long moimId) { @Transactional(readOnly = true) public List findAllJoinedMoimSimpleResponseByEndStatus(final long memberId, final LocalDate now, final boolean ended) { List joinedMoims = joinedMoimFinder.findMoimIdsByMemberId(memberId); - return getMoimSimpleResponses(ended, joinedMoims, now); + return getMoimSimpleResponses(joinedMoims, now, ended); } @Transactional(readOnly = true) - public List getMoimSimpleResponses(final boolean ended, final List joinedMoims, final LocalDate now) { - if(ended){ - return moimFinder.findEndedMoimSimpleResponsesByMoimIds(joinedMoims, now); + public List findAllHostMoimSimpleResponsesByEndStatus(final long hostMemberId, final LocalDate now, final boolean ended) { + List joinedMoims = joinedMoimFinder.findMoimIdsByMemberId(hostMemberId); + List hostMoims = joinedMoims.stream() + .filter(moimId -> moimFinder.isHost(hostMemberId, moimId)) + .toList(); + return getMoimSimpleResponses(hostMoims, now, ended); + } + + @Transactional(readOnly = true) + public List getMoimSimpleResponses(final List joinedMoims, final LocalDate now, final boolean ended) { + if (ended) { + return moimFinder.findEndedMoimSimpleResponsesByMoimIds(joinedMoims, now); } return moimFinder.findInProgressMoimSimpleResponsesByMoimIds(joinedMoims, now); } diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimJpaRepository.java b/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimJpaRepository.java index f5d9e02d..d27de7a7 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimJpaRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimJpaRepository.java @@ -14,4 +14,6 @@ public interface JoinedMoimJpaRepository extends JpaRepository findAllByMemberId(final long memberId); } diff --git a/backend/src/main/java/moim_today/presentation/moim/MoimController.java b/backend/src/main/java/moim_today/presentation/moim/MoimController.java index c384c4c2..7006cb12 100644 --- a/backend/src/main/java/moim_today/presentation/moim/MoimController.java +++ b/backend/src/main/java/moim_today/presentation/moim/MoimController.java @@ -40,9 +40,10 @@ public CollectionResponse> findAllMyJoinedMoimResponse(@Log @GetMapping("/joined/simple") public CollectionResponse> findAllMyJoinedMoimSimpleResponse( @Login final MemberSession memberSession, - @RequestParam final Boolean ended){ + @RequestParam final Boolean ended, + @RequestParam(required = false, defaultValue = "false") final Boolean onlyHost){ List myMoimSimpleResponses = moimService.findAllMyJoinedMoimSimpleResponse( - memberSession.id(), ended + memberSession.id(), ended, onlyHost ); return CollectionResponse.from(myMoimSimpleResponses); } diff --git a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java index 6219f523..a00b59c8 100644 --- a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java +++ b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java @@ -198,7 +198,7 @@ public List searchMoim(final long universityId, final String } @Override - public List findAllMyJoinedMoimSimpleResponse(final long memberId, final boolean ended) { + public List findAllMyJoinedMoimSimpleResponse(final long memberId, final boolean ended, final boolean host) { MoimSimpleResponse moimSimpleResponse1 = MoimSimpleResponse.builder() .moimId(1L) .title(MOIM_TITLE.value()) diff --git a/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java b/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java index 01602fbb..b3be3421 100644 --- a/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java +++ b/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java @@ -188,4 +188,86 @@ void findAllJoinedMoimSimpleResponseExceptOtherMembers() { assertThat(myEndedMoims.size()).isEqualTo(0); assertThat(myInProgressMoims.size()).isEqualTo(2); } + + @DisplayName("자신이 호스트인 모임들의 정보만 완료 여부에 따라 가져온다") + @Test + void findAllHostMoimSimpleResponsesByEndStatus() { + // given + MemberJpaEntity me = MemberJpaEntity.builder() + .username(USERNAME.value()) + .build(); + MemberJpaEntity other = MemberJpaEntity.builder() + .username(USERNAME.value()+"1") + .build(); + + memberRepository.save(me); + memberRepository.save(other); + + LocalDate localDate1 = LocalDate.of(2023, 5, 12); + LocalDate localDate2 = LocalDate.of(2024, 5, 16); + + MoimJpaEntity myMoim1 = MoimJpaEntity.builder() + .memberId(me.getId()) + .endDate(localDate1) + .build(); + MoimJpaEntity myMoim2 = MoimJpaEntity.builder() + .memberId(me.getId()) + .endDate(localDate2) + .build(); + MoimJpaEntity otherMoim1 = MoimJpaEntity.builder() + .memberId(other.getId()) + .endDate(localDate1) + .build(); + MoimJpaEntity otherMoim2 = MoimJpaEntity.builder() + .memberId(other.getId()) + .endDate(localDate2) + .build(); + + moimRepository.save(myMoim1); + moimRepository.save(myMoim2); + moimRepository.save(otherMoim1); + moimRepository.save(otherMoim2); + + JoinedMoimJpaEntity j1 = JoinedMoimJpaEntity.builder() + .memberId(me.getId()) + .moimId(myMoim1.getId()) + .build(); + JoinedMoimJpaEntity j2 = JoinedMoimJpaEntity.builder() + .memberId(me.getId()) + .moimId(myMoim2.getId()) + .build(); + JoinedMoimJpaEntity j3 = JoinedMoimJpaEntity.builder() + .memberId(other.getId()) + .moimId(otherMoim1.getId()) + .build(); + JoinedMoimJpaEntity j4 = JoinedMoimJpaEntity.builder() + .memberId(other.getId()) + .moimId(otherMoim2.getId()) + .build(); + JoinedMoimJpaEntity j5 = JoinedMoimJpaEntity.builder() + .memberId(me.getId()) + .moimId(otherMoim1.getId()) + .build(); + JoinedMoimJpaEntity j6 = JoinedMoimJpaEntity.builder() + .memberId(me.getId()) + .moimId(otherMoim2.getId()) + .build(); + + joinedMoimRepository.save(j1); + joinedMoimRepository.save(j2); + joinedMoimRepository.save(j3); + joinedMoimRepository.save(j4); + joinedMoimRepository.save(j5); + joinedMoimRepository.save(j6); + + // when + List myEndedMoims = moimManager.findAllHostMoimSimpleResponsesByEndStatus( + me.getId(), LocalDate.of(2023,5,12), true); + List myInProgressMoims = moimManager.findAllHostMoimSimpleResponsesByEndStatus( + me.getId(), LocalDate.of(2023, 5, 12), false); + + // then + assertThat(myEndedMoims.size()).isEqualTo(0); + assertThat(myInProgressMoims.size()).isEqualTo(2); + } } \ No newline at end of file From cd432b92b9724a37df4ff95025951a1a095b4698 Mon Sep 17 00:00:00 2001 From: Donghyun Kim Date: Wed, 22 May 2024 01:59:23 +0900 Subject: [PATCH 42/60] =?UTF-8?q?[BE]=20docs=20:=20=EC=9E=90=EC=8B=A0?= =?UTF-8?q?=EC=9D=B4=20=ED=98=B8=EC=8A=A4=ED=8A=B8=EC=9D=B8=20=EB=AA=A8?= =?UTF-8?q?=EC=9E=84=20=EC=A1=B0=ED=9A=8C=20=EB=AC=B8=EC=84=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fake_class/moim/FakeMoimService.java | 4 ++- .../presentation/moim/MoimControllerTest.java | 31 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java index a00b59c8..c3e31dc5 100644 --- a/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java +++ b/backend/src/test/java/moim_today/fake_class/moim/FakeMoimService.java @@ -198,7 +198,9 @@ public List searchMoim(final long universityId, final String } @Override - public List findAllMyJoinedMoimSimpleResponse(final long memberId, final boolean ended, final boolean host) { + public List findAllMyJoinedMoimSimpleResponse(final long memberId, + final boolean ended, + final boolean onlyHost) { MoimSimpleResponse moimSimpleResponse1 = MoimSimpleResponse.builder() .moimId(1L) .title(MOIM_TITLE.value()) diff --git a/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java b/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java index 19fc3447..ead3ce25 100644 --- a/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/moim/MoimControllerTest.java @@ -837,4 +837,35 @@ void findAllMyJoinedMoimSimpleResponse() throws Exception { .build()) )); } + + @DisplayName("로그인한 회원이 호스트인 모임들을 완료 여부에 따라 카드 정보로 반환한다") + @Test + void findAllHostMoimSimpleResponse() throws Exception { + + mockMvc.perform(get("/api/moims/joined/simple") + .queryParam("ended", "false") + .queryParam("onlyHost","true")) + .andExpect(status().isOk()) + .andDo(document("자신이 호스트인 모임 리스트를 완료 여부로 조회 성공", + resource(ResourceSnippetParameters.builder() + .tag("모임") + .summary("로그인한 회원이 호스트인 모임 리스트 자세한 정보 조회") + .queryParameters( + parameterWithName("ended").description("완료된 모임을 찾을 지 여부 - [true, false]"), + parameterWithName("onlyHost").optional().description("자신이 호스트인 모임만 찾을 지 여부 - [true, false] , default : false") + ) + .responseFields( + fieldWithPath("data[0].moimId").type(NUMBER).description("모임 Id"), + fieldWithPath("data[0].title").type(STRING).description("모임명"), + fieldWithPath("data[0].capacity").type(NUMBER).description("모집 인원"), + fieldWithPath("data[0].currentCount").type(NUMBER).description("현재 인원"), + fieldWithPath("data[0].imageUrl").type(STRING).description("모임 사진 URL"), + fieldWithPath("data[0].moimCategory").type(VARIES).description(String.format("카테고리 - %s", + EnumDocsUtils.getEnumNames(MoimCategory.class))), + fieldWithPath("data[0].displayStatus").type(VARIES).description(String.format("공개 여부 - %s", + EnumDocsUtils.getEnumNames(DisplayStatus.class))) + ) + .build()) + )); + } } From 74638d2d86b9ac536b1cd2f7a8c3bc478d403eb2 Mon Sep 17 00:00:00 2001 From: Donghyun Kim Date: Wed, 22 May 2024 13:49:25 +0900 Subject: [PATCH 43/60] =?UTF-8?q?[BE]=20chore=20:=20test=20given=20?= =?UTF-8?q?=EC=A0=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/moim_today/implement/moim/moim/MoimManagerTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java b/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java index b3be3421..dd2a02ff 100644 --- a/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java +++ b/backend/src/test/java/moim_today/implement/moim/moim/MoimManagerTest.java @@ -75,6 +75,7 @@ void findAllJoinedMoimSimpleResponseByEndStatus() { LocalDate localDate2 = LocalDate.of(2024, 5, 16); LocalDate localDate3 = LocalDate.of(2025, 6, 5); + // given2 MoimJpaEntity moimJpaEntity1 = MoimJpaEntity.builder() .memberId(member1.getId()) .endDate(localDate1) @@ -92,6 +93,7 @@ void findAllJoinedMoimSimpleResponseByEndStatus() { moimRepository.save(moimJpaEntity2); moimRepository.save(moimJpaEntity3); + // given3 JoinedMoimJpaEntity j1 = JoinedMoimJpaEntity.builder() .memberId(member1.getId()) .moimId(moimJpaEntity1.getId()) @@ -109,11 +111,13 @@ void findAllJoinedMoimSimpleResponseByEndStatus() { joinedMoimRepository.save(j2); joinedMoimRepository.save(j3); + // when List endedMoims = moimManager.findAllJoinedMoimSimpleResponseByEndStatus( member1.getId(), LocalDate.of(2024, 5, 16), true); List inProgressMoims = moimManager.findAllJoinedMoimSimpleResponseByEndStatus( member1.getId(), LocalDate.of(2024, 5, 16), false); + // then assertThat(endedMoims.size()).isEqualTo(1); assertThat(inProgressMoims.size()).isEqualTo(2); } From 3e40c869178c1399749e946b4a246f59fc632fa2 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Mon, 20 May 2024 19:44:42 +0900 Subject: [PATCH 44/60] =?UTF-8?q?[BE]=20refactor=20:=20=EB=AF=B8=ED=8C=85?= =?UTF-8?q?=20=EC=B0=B8=EC=97=AC=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/joined_meeting/JoinedMeetingUpdater.java | 2 +- .../meeting/joined_meeting/JoinedMeetingJpaRepository.java | 3 ++- .../meeting/joined_meeting/JoinedMeetingRepository.java | 2 +- .../meeting/joined_meeting/JoinedMeetingRepositoryImpl.java | 6 ++++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingUpdater.java b/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingUpdater.java index 219e66b3..e17065e3 100644 --- a/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingUpdater.java +++ b/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingUpdater.java @@ -17,7 +17,7 @@ public JoinedMeetingUpdater(final JoinedMeetingRepository joinedMeetingRepositor @Transactional public void updateAttendance(final long memberId, final long meetingId, final boolean attendance) { JoinedMeetingJpaEntity joinedMeetingJpaEntity = - joinedMeetingRepository.findByMemberIdAndMeetingId(memberId, meetingId); + joinedMeetingRepository.getByMemberIdAndMeetingId(memberId, meetingId); joinedMeetingJpaEntity.updateAttendance(attendance); } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingJpaRepository.java b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingJpaRepository.java index eae51039..72eed007 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingJpaRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingJpaRepository.java @@ -4,10 +4,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface JoinedMeetingJpaRepository extends JpaRepository { void deleteAllByMeetingIdIn(final List meetingIds); - JoinedMeetingJpaEntity findByMemberIdAndMeetingId(final long memberId, final long meetingId); + Optional findByMemberIdAndMeetingId(final long memberId, final long meetingId); } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepository.java b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepository.java index 9c5e6394..9ef3cdaa 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepository.java @@ -15,7 +15,7 @@ public interface JoinedMeetingRepository { List findAllMemberIdByMeetingId(final long meetingId); - JoinedMeetingJpaEntity findByMemberIdAndMeetingId(final long memberId, final long meetingId); + JoinedMeetingJpaEntity getByMemberIdAndMeetingId(final long memberId, final long meetingId); List findAll(); diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepositoryImpl.java index 6b662357..b536d8a1 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepositoryImpl.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; import static moim_today.global.constant.exception.MeetingExceptionConstant.JOINED_MEETING_NOT_FOUND_ERROR; import static moim_today.persistence.entity.meeting.joined_meeting.QJoinedMeetingJpaEntity.joinedMeetingJpaEntity; @@ -50,8 +51,9 @@ public List findAllMemberIdByMeetingId(final long meetingId) { } @Override - public JoinedMeetingJpaEntity findByMemberIdAndMeetingId(final long memberId, final long meetingId) { - return joinedMeetingJpaRepository.findByMemberIdAndMeetingId(memberId, meetingId); + public JoinedMeetingJpaEntity getByMemberIdAndMeetingId(final long memberId, final long meetingId) { + return joinedMeetingJpaRepository.findByMemberIdAndMeetingId(memberId, meetingId) + .orElseThrow(() -> new NotFoundException(JOINED_MEETING_NOT_FOUND_ERROR.message())); } @Override From a2bf9621b6a8482c5396a572d98af1584b22cb93 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Mon, 20 May 2024 19:50:21 +0900 Subject: [PATCH 45/60] =?UTF-8?q?[BE]=20feat=20:=20=EC=9D=B4=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=EC=88=98=EC=8B=A0=20=EC=97=AC=EB=B6=80=20=EC=B0=A8?= =?UTF-8?q?=EB=8B=A8=20Entity/Repository=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EmailSubscribeJpaEntity.java | 26 +++++++++++++++++++ .../EmailSubscribeJpaRepository.java | 7 +++++ .../EmailSubscribeRepository.java | 4 +++ .../EmailSubscribeRepositoryImpl.java | 13 ++++++++++ 4 files changed, 50 insertions(+) create mode 100644 backend/src/main/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntity.java create mode 100644 backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeJpaRepository.java create mode 100644 backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java create mode 100644 backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java diff --git a/backend/src/main/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntity.java b/backend/src/main/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntity.java new file mode 100644 index 00000000..9b62b772 --- /dev/null +++ b/backend/src/main/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntity.java @@ -0,0 +1,26 @@ +package moim_today.persistence.entity.email_subscribe; + +import jakarta.persistence.*; +import lombok.Builder; +import lombok.Getter; +import moim_today.global.base_entity.BaseTimeEntity; + +@Getter +@Table(name = "email_subscribe") +@Entity +public class EmailSubscribeJpaEntity extends BaseTimeEntity { + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "email_subscribe_id") + private long id; + + private boolean subscribeStatus; + + protected EmailSubscribeJpaEntity() { + } + + @Builder + private EmailSubscribeJpaEntity(final boolean subscribeStatus) { + this.subscribeStatus = subscribeStatus; + } +} diff --git a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeJpaRepository.java b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeJpaRepository.java new file mode 100644 index 00000000..1cf8df70 --- /dev/null +++ b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeJpaRepository.java @@ -0,0 +1,7 @@ +package moim_today.persistence.repository.email_subscribe; + +import moim_today.persistence.entity.email_subscribe.EmailSubscribeJpaEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface EmailSubscribeJpaRepository extends JpaRepository { +} diff --git a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java new file mode 100644 index 00000000..eff4fedb --- /dev/null +++ b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java @@ -0,0 +1,4 @@ +package moim_today.persistence.repository.email_subscribe; + +public interface EmailSubscribeRepository { +} diff --git a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java new file mode 100644 index 00000000..717ca520 --- /dev/null +++ b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java @@ -0,0 +1,13 @@ +package moim_today.persistence.repository.email_subscribe; + +import org.springframework.stereotype.Repository; + +@Repository +public class EmailSubscribeRepositoryImpl implements EmailSubscribeRepository { + + private final EmailSubscribeJpaRepository emailSubscribeJpaRepository; + + public EmailSubscribeRepositoryImpl(final EmailSubscribeJpaRepository emailSubscribeJpaRepository) { + this.emailSubscribeJpaRepository = emailSubscribeJpaRepository; + } +} From 4e47811241f6bf4933a4d7ec944db9c42a408fdd Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Mon, 20 May 2024 20:16:55 +0900 Subject: [PATCH 46/60] =?UTF-8?q?[BE]=20feat=20:=20=EC=9D=B4=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=EC=88=98=EC=8B=A0=20=EC=B0=A8=EB=8B=A8=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EmailSubscribeService.java | 6 +++++ .../EmailSubscribeServiceImpl.java | 19 +++++++++++++ .../dto/mail/EmailSubscribeRequest.java | 6 +++++ .../exception/MailExceptionConstant.java | 4 ++- .../EmailSubscribeUpdater.java | 22 +++++++++++++++ .../EmailSubscribeJpaEntity.java | 11 +++++++- .../EmailSubscribeJpaRepository.java | 4 +++ .../EmailSubscribeRepository.java | 5 ++++ .../EmailSubscribeRepositoryImpl.java | 10 +++++++ .../EmailSubscribeController.java | 27 +++++++++++++++++++ 10 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeService.java create mode 100644 backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeServiceImpl.java create mode 100644 backend/src/main/java/moim_today/dto/mail/EmailSubscribeRequest.java create mode 100644 backend/src/main/java/moim_today/implement/email_subscribe/EmailSubscribeUpdater.java create mode 100644 backend/src/main/java/moim_today/presentation/email_subscribe/EmailSubscribeController.java diff --git a/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeService.java b/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeService.java new file mode 100644 index 00000000..e4dfc28b --- /dev/null +++ b/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeService.java @@ -0,0 +1,6 @@ +package moim_today.application.email_subscribe; + +public interface EmailSubscribeService { + + void updateSubscribeStatus(final long memberId, final boolean subscribedStatus); +} diff --git a/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeServiceImpl.java b/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeServiceImpl.java new file mode 100644 index 00000000..7ac64e1d --- /dev/null +++ b/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeServiceImpl.java @@ -0,0 +1,19 @@ +package moim_today.application.email_subscribe; + +import moim_today.implement.email_subscribe.EmailSubscribeUpdater; +import org.springframework.stereotype.Service; + +@Service +public class EmailSubscribeServiceImpl implements EmailSubscribeService { + + private final EmailSubscribeUpdater emailSubscribeUpdater; + + public EmailSubscribeServiceImpl(final EmailSubscribeUpdater emailSubscribeUpdater) { + this.emailSubscribeUpdater = emailSubscribeUpdater; + } + + @Override + public void updateSubscribeStatus(final long memberId, final boolean subscribedStatus) { + emailSubscribeUpdater.updateSubscribeStatus(memberId, subscribedStatus); + } +} diff --git a/backend/src/main/java/moim_today/dto/mail/EmailSubscribeRequest.java b/backend/src/main/java/moim_today/dto/mail/EmailSubscribeRequest.java new file mode 100644 index 00000000..986f0785 --- /dev/null +++ b/backend/src/main/java/moim_today/dto/mail/EmailSubscribeRequest.java @@ -0,0 +1,6 @@ +package moim_today.dto.mail; + +public record EmailSubscribeRequest( + boolean subscribeStatus +) { +} diff --git a/backend/src/main/java/moim_today/global/constant/exception/MailExceptionConstant.java b/backend/src/main/java/moim_today/global/constant/exception/MailExceptionConstant.java index a59f4a13..b6be6796 100644 --- a/backend/src/main/java/moim_today/global/constant/exception/MailExceptionConstant.java +++ b/backend/src/main/java/moim_today/global/constant/exception/MailExceptionConstant.java @@ -5,7 +5,9 @@ public enum MailExceptionConstant { MAIL_SEND_ERROR("메일 전송 도중에 에러가 발생했습니다. 관리자에게 문의 바랍니다."), MAIL_CERTIFICATION_TOKEN_NOT_FOUND_ERROR("메일 인증 정보를 찾을 수 없습니다."), WRONG_EMAIL_FROM_ERROR("잘못된 이메일 형식입니다."), - MAIL_INVALID_FORMAT_ERROR("올바른 메일 형식이 아닙니다."); + MAIL_INVALID_FORMAT_ERROR("올바른 메일 형식이 아닙니다."), + + MAIL_SUBSCRIBE_NOT_FOUND_ERROR("메일 수신 여부가 존재하지 않습니다."); private final String message; diff --git a/backend/src/main/java/moim_today/implement/email_subscribe/EmailSubscribeUpdater.java b/backend/src/main/java/moim_today/implement/email_subscribe/EmailSubscribeUpdater.java new file mode 100644 index 00000000..883b85c0 --- /dev/null +++ b/backend/src/main/java/moim_today/implement/email_subscribe/EmailSubscribeUpdater.java @@ -0,0 +1,22 @@ +package moim_today.implement.email_subscribe; + +import moim_today.global.annotation.Implement; +import moim_today.persistence.entity.email_subscribe.EmailSubscribeJpaEntity; +import moim_today.persistence.repository.email_subscribe.EmailSubscribeRepository; +import org.springframework.transaction.annotation.Transactional; + +@Implement +public class EmailSubscribeUpdater { + + private final EmailSubscribeRepository emailSubscribeRepository; + + public EmailSubscribeUpdater(final EmailSubscribeRepository emailSubscribeRepository) { + this.emailSubscribeRepository = emailSubscribeRepository; + } + + @Transactional + public void updateSubscribeStatus(final long memberId, final boolean subscribeStatus) { + EmailSubscribeJpaEntity emailSubscribeJpaEntity = emailSubscribeRepository.getByMemberId(memberId); + emailSubscribeJpaEntity.updateSubscribeStatus(subscribeStatus); + } +} diff --git a/backend/src/main/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntity.java b/backend/src/main/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntity.java index 9b62b772..c317a0cd 100644 --- a/backend/src/main/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntity.java +++ b/backend/src/main/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntity.java @@ -3,6 +3,7 @@ import jakarta.persistence.*; import lombok.Builder; import lombok.Getter; +import moim_today.global.annotation.Association; import moim_today.global.base_entity.BaseTimeEntity; @Getter @@ -14,13 +15,21 @@ public class EmailSubscribeJpaEntity extends BaseTimeEntity { @Column(name = "email_subscribe_id") private long id; + @Association + private long memberId; + private boolean subscribeStatus; protected EmailSubscribeJpaEntity() { } @Builder - private EmailSubscribeJpaEntity(final boolean subscribeStatus) { + private EmailSubscribeJpaEntity(final long memberId, final boolean subscribeStatus) { + this.memberId = memberId; + this.subscribeStatus = subscribeStatus; + } + + public void updateSubscribeStatus(final boolean subscribeStatus) { this.subscribeStatus = subscribeStatus; } } diff --git a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeJpaRepository.java b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeJpaRepository.java index 1cf8df70..e766cfc1 100644 --- a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeJpaRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeJpaRepository.java @@ -3,5 +3,9 @@ import moim_today.persistence.entity.email_subscribe.EmailSubscribeJpaEntity; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface EmailSubscribeJpaRepository extends JpaRepository { + + Optional findByMemberId(final long memberId); } diff --git a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java index eff4fedb..5b73b500 100644 --- a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java @@ -1,4 +1,9 @@ package moim_today.persistence.repository.email_subscribe; +import moim_today.persistence.entity.email_subscribe.EmailSubscribeJpaEntity; + + public interface EmailSubscribeRepository { + + EmailSubscribeJpaEntity getByMemberId(final long memberId); } diff --git a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java index 717ca520..41152385 100644 --- a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java @@ -1,7 +1,11 @@ package moim_today.persistence.repository.email_subscribe; +import moim_today.global.error.NotFoundException; +import moim_today.persistence.entity.email_subscribe.EmailSubscribeJpaEntity; import org.springframework.stereotype.Repository; +import static moim_today.global.constant.exception.MailExceptionConstant.MAIL_SUBSCRIBE_NOT_FOUND_ERROR; + @Repository public class EmailSubscribeRepositoryImpl implements EmailSubscribeRepository { @@ -10,4 +14,10 @@ public class EmailSubscribeRepositoryImpl implements EmailSubscribeRepository { public EmailSubscribeRepositoryImpl(final EmailSubscribeJpaRepository emailSubscribeJpaRepository) { this.emailSubscribeJpaRepository = emailSubscribeJpaRepository; } + + @Override + public EmailSubscribeJpaEntity getByMemberId(final long memberId) { + return emailSubscribeJpaRepository.findByMemberId(memberId) + .orElseThrow(() -> new NotFoundException(MAIL_SUBSCRIBE_NOT_FOUND_ERROR.message())); + } } diff --git a/backend/src/main/java/moim_today/presentation/email_subscribe/EmailSubscribeController.java b/backend/src/main/java/moim_today/presentation/email_subscribe/EmailSubscribeController.java new file mode 100644 index 00000000..fe75c52c --- /dev/null +++ b/backend/src/main/java/moim_today/presentation/email_subscribe/EmailSubscribeController.java @@ -0,0 +1,27 @@ +package moim_today.presentation.email_subscribe; + +import moim_today.application.email_subscribe.EmailSubscribeService; +import moim_today.domain.member.MemberSession; +import moim_today.dto.mail.EmailSubscribeRequest; +import moim_today.global.annotation.Login; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequestMapping("/api") +@RestController +public class EmailSubscribeController { + + private final EmailSubscribeService emailSubscribeService; + + public EmailSubscribeController(final EmailSubscribeService emailSubscribeService) { + this.emailSubscribeService = emailSubscribeService; + } + + @PostMapping("/email-subscription") + public void subscribeEmail(@Login final MemberSession memberSession, + @RequestBody final EmailSubscribeRequest emailSubscribeRequest) { + emailSubscribeService.updateSubscribeStatus(memberSession.id(), emailSubscribeRequest.subscribeStatus()); + } +} From fca90a3818a5643576906c65a1441977365f5779 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Mon, 20 May 2024 20:39:52 +0900 Subject: [PATCH 47/60] =?UTF-8?q?[BE]=20test=20:=20=EC=9D=B4=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=EC=88=98=EC=8B=A0=20=EC=B0=A8=EB=8B=A8=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/mail/EmailSubscribeRequest.java | 9 ++++ .../EmailSubscribeRepository.java | 4 ++ .../EmailSubscribeRepositoryImpl.java | 11 ++++ .../FakeEmailSubscribeService.java | 11 ++++ .../EmailSubscribeUpdaterTest.java | 38 ++++++++++++++ .../EmailSubscribeJpaEntityTest.java | 24 +++++++++ .../EmailSubscribeControllerTest.java | 51 +++++++++++++++++++ .../java/moim_today/util/ImplementTest.java | 4 ++ 8 files changed, 152 insertions(+) create mode 100644 backend/src/test/java/moim_today/fake_class/email_subscribe/FakeEmailSubscribeService.java create mode 100644 backend/src/test/java/moim_today/implement/email_subscribe/EmailSubscribeUpdaterTest.java create mode 100644 backend/src/test/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntityTest.java create mode 100644 backend/src/test/java/moim_today/presentation/email_subscribe/EmailSubscribeControllerTest.java diff --git a/backend/src/main/java/moim_today/dto/mail/EmailSubscribeRequest.java b/backend/src/main/java/moim_today/dto/mail/EmailSubscribeRequest.java index 986f0785..f930fd6a 100644 --- a/backend/src/main/java/moim_today/dto/mail/EmailSubscribeRequest.java +++ b/backend/src/main/java/moim_today/dto/mail/EmailSubscribeRequest.java @@ -1,6 +1,15 @@ package moim_today.dto.mail; +import lombok.Builder; + +@Builder public record EmailSubscribeRequest( boolean subscribeStatus ) { + + public static EmailSubscribeRequest of(final boolean subscribeStatus) { + return EmailSubscribeRequest.builder() + .subscribeStatus(subscribeStatus) + .build(); + } } diff --git a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java index 5b73b500..29c5cd21 100644 --- a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java @@ -5,5 +5,9 @@ public interface EmailSubscribeRepository { + EmailSubscribeJpaEntity getById(final long emailSubscribeId); + EmailSubscribeJpaEntity getByMemberId(final long memberId); + + EmailSubscribeJpaEntity save(final EmailSubscribeJpaEntity emailSubscribeJpaEntity); } diff --git a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java index 41152385..6a66d06c 100644 --- a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java @@ -15,9 +15,20 @@ public EmailSubscribeRepositoryImpl(final EmailSubscribeJpaRepository emailSubsc this.emailSubscribeJpaRepository = emailSubscribeJpaRepository; } + @Override + public EmailSubscribeJpaEntity getById(final long emailSubscribeId) { + return emailSubscribeJpaRepository.findById(emailSubscribeId) + .orElseThrow(() -> new NotFoundException(MAIL_SUBSCRIBE_NOT_FOUND_ERROR.message())); + } + @Override public EmailSubscribeJpaEntity getByMemberId(final long memberId) { return emailSubscribeJpaRepository.findByMemberId(memberId) .orElseThrow(() -> new NotFoundException(MAIL_SUBSCRIBE_NOT_FOUND_ERROR.message())); } + + @Override + public EmailSubscribeJpaEntity save(final EmailSubscribeJpaEntity emailSubscribeJpaEntity) { + return emailSubscribeJpaRepository.save(emailSubscribeJpaEntity); + } } diff --git a/backend/src/test/java/moim_today/fake_class/email_subscribe/FakeEmailSubscribeService.java b/backend/src/test/java/moim_today/fake_class/email_subscribe/FakeEmailSubscribeService.java new file mode 100644 index 00000000..e18a4b59 --- /dev/null +++ b/backend/src/test/java/moim_today/fake_class/email_subscribe/FakeEmailSubscribeService.java @@ -0,0 +1,11 @@ +package moim_today.fake_class.email_subscribe; + +import moim_today.application.email_subscribe.EmailSubscribeService; + +public class FakeEmailSubscribeService implements EmailSubscribeService { + + @Override + public void updateSubscribeStatus(final long memberId, final boolean subscribedStatus) { + + } +} diff --git a/backend/src/test/java/moim_today/implement/email_subscribe/EmailSubscribeUpdaterTest.java b/backend/src/test/java/moim_today/implement/email_subscribe/EmailSubscribeUpdaterTest.java new file mode 100644 index 00000000..cc2047b6 --- /dev/null +++ b/backend/src/test/java/moim_today/implement/email_subscribe/EmailSubscribeUpdaterTest.java @@ -0,0 +1,38 @@ +package moim_today.implement.email_subscribe; + +import moim_today.persistence.entity.email_subscribe.EmailSubscribeJpaEntity; +import moim_today.util.ImplementTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static moim_today.util.TestConstant.*; +import static org.assertj.core.api.Assertions.*; + + +class EmailSubscribeUpdaterTest extends ImplementTest { + + @Autowired + private EmailSubscribeUpdater emailSubscribeUpdater; + + @DisplayName("이메일 수신 여부 설정을 변경한다.") + @Test + void updateSubscribeStatus() { + // given + long memberId = MEMBER_ID.longValue(); + + EmailSubscribeJpaEntity emailSubscribeJpaEntity = EmailSubscribeJpaEntity.builder() + .memberId(memberId) + .subscribeStatus(true) + .build(); + + emailSubscribeRepository.save(emailSubscribeJpaEntity); + + // when + emailSubscribeUpdater.updateSubscribeStatus(memberId, false); + + // then + EmailSubscribeJpaEntity findEntity = emailSubscribeRepository.getById(emailSubscribeJpaEntity.getId()); + assertThat(findEntity.isSubscribeStatus()).isFalse(); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntityTest.java b/backend/src/test/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntityTest.java new file mode 100644 index 00000000..4413f91b --- /dev/null +++ b/backend/src/test/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntityTest.java @@ -0,0 +1,24 @@ +package moim_today.persistence.entity.email_subscribe; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +class EmailSubscribeJpaEntityTest { + + @DisplayName("이메일 수신 여부 설정을 변경한다.") + @Test + void updateSubscribeStatus() { + // given + EmailSubscribeJpaEntity emailSubscribeJpaEntity = EmailSubscribeJpaEntity.builder() + .subscribeStatus(true) + .build(); + + // when + emailSubscribeJpaEntity.updateSubscribeStatus(false); + + // then + assertThat(emailSubscribeJpaEntity.isSubscribeStatus()).isFalse(); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/presentation/email_subscribe/EmailSubscribeControllerTest.java b/backend/src/test/java/moim_today/presentation/email_subscribe/EmailSubscribeControllerTest.java new file mode 100644 index 00000000..535d8374 --- /dev/null +++ b/backend/src/test/java/moim_today/presentation/email_subscribe/EmailSubscribeControllerTest.java @@ -0,0 +1,51 @@ +package moim_today.presentation.email_subscribe; + +import com.epages.restdocs.apispec.ResourceSnippetParameters; +import moim_today.application.email_subscribe.EmailSubscribeService; +import moim_today.dto.mail.EmailSubscribeRequest; +import moim_today.fake_class.email_subscribe.FakeEmailSubscribeService; +import moim_today.util.ControllerTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + + +import static com.epages.restdocs.apispec.ResourceDocumentation.resource; +import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.restdocs.payload.JsonFieldType.*; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +class EmailSubscribeControllerTest extends ControllerTest { + + private final EmailSubscribeService emailSubscribeService = new FakeEmailSubscribeService(); + + @Override + protected Object initController() { + return new EmailSubscribeController(emailSubscribeService); + } + + @DisplayName("이메일 수신 여부 정보를 변경한다.") + @Test + void subscribeEmail() throws Exception { + EmailSubscribeRequest emailSubscribeRequest = EmailSubscribeRequest.of(true); + String json = objectMapper.writeValueAsString(emailSubscribeRequest); + + mockMvc.perform( + post("/api/email-subscription") + .contentType(APPLICATION_JSON) + .content(json) + ) + .andExpect(status().isOk()) + .andDo(document("이메일 수신 여부를 변경한다.", + resource(ResourceSnippetParameters.builder() + .tag("미팅") + .summary("이메일 수신 정보 변경") + .requestFields( + fieldWithPath("subscribeStatus").type(BOOLEAN).description("수신 여부") + ) + .build() + ))); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/util/ImplementTest.java b/backend/src/test/java/moim_today/util/ImplementTest.java index 674324b9..dac801ee 100644 --- a/backend/src/test/java/moim_today/util/ImplementTest.java +++ b/backend/src/test/java/moim_today/util/ImplementTest.java @@ -4,6 +4,7 @@ import moim_today.persistence.repository.certification.email.EmailCertificationRepository; import moim_today.persistence.repository.certification.password.PasswordCertificationRepository; import moim_today.persistence.repository.department.DepartmentRepository; +import moim_today.persistence.repository.email_subscribe.EmailSubscribeRepository; import moim_today.persistence.repository.meeting.joined_meeting.JoinedMeetingRepository; import moim_today.persistence.repository.meeting.meeting.MeetingRepository; import moim_today.persistence.repository.meeting.meeting_comment.MeetingCommentRepository; @@ -76,6 +77,9 @@ public abstract class ImplementTest { @Autowired protected MeetingCommentRepository meetingCommentRepository; + @Autowired + protected EmailSubscribeRepository emailSubscribeRepository; + @BeforeEach void setUpDatabase() { databaseCleaner.cleanUp(); From 08f6126c220931fe749f0182e90b33a647de1137 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Mon, 20 May 2024 20:49:22 +0900 Subject: [PATCH 48/60] =?UTF-8?q?[BE]=20feat=20:=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=ED=95=9C=20=ED=9A=8C=EC=9B=90=EC=9D=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A9=94=EC=9D=BC=20=EC=88=98=EC=8B=A0=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EmailSubscribeService.java | 4 ++++ .../EmailSubscribeServiceImpl.java | 13 +++++++++++- .../dto/mail/EmailSubscriptionResponse.java | 15 ++++++++++++++ .../EmailSubscriptionFinder.java | 20 +++++++++++++++++++ .../EmailSubscribeRepository.java | 2 ++ .../EmailSubscribeRepositoryImpl.java | 15 +++++++++++++- .../EmailSubscribeController.java | 11 ++++++---- .../FakeEmailSubscribeService.java | 6 ++++++ 8 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 backend/src/main/java/moim_today/dto/mail/EmailSubscriptionResponse.java create mode 100644 backend/src/main/java/moim_today/implement/email_subscribe/EmailSubscriptionFinder.java diff --git a/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeService.java b/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeService.java index e4dfc28b..dd8eb02b 100644 --- a/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeService.java +++ b/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeService.java @@ -1,6 +1,10 @@ package moim_today.application.email_subscribe; +import moim_today.dto.mail.EmailSubscriptionResponse; + public interface EmailSubscribeService { + EmailSubscriptionResponse getSubscriptionStatus(final long memberId); + void updateSubscribeStatus(final long memberId, final boolean subscribedStatus); } diff --git a/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeServiceImpl.java b/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeServiceImpl.java index 7ac64e1d..1a5dea63 100644 --- a/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeServiceImpl.java +++ b/backend/src/main/java/moim_today/application/email_subscribe/EmailSubscribeServiceImpl.java @@ -1,15 +1,26 @@ package moim_today.application.email_subscribe; +import moim_today.dto.mail.EmailSubscriptionResponse; import moim_today.implement.email_subscribe.EmailSubscribeUpdater; +import moim_today.implement.email_subscribe.EmailSubscriptionFinder; import org.springframework.stereotype.Service; @Service public class EmailSubscribeServiceImpl implements EmailSubscribeService { private final EmailSubscribeUpdater emailSubscribeUpdater; + private final EmailSubscriptionFinder emailSubscriptionFinder; - public EmailSubscribeServiceImpl(final EmailSubscribeUpdater emailSubscribeUpdater) { + public EmailSubscribeServiceImpl(final EmailSubscribeUpdater emailSubscribeUpdater, + final EmailSubscriptionFinder emailSubscriptionFinder) { this.emailSubscribeUpdater = emailSubscribeUpdater; + this.emailSubscriptionFinder = emailSubscriptionFinder; + } + + @Override + public EmailSubscriptionResponse getSubscriptionStatus(final long memberId) { + boolean subscriptionStatus = emailSubscriptionFinder.getSubscriptionStatus(memberId); + return EmailSubscriptionResponse.of(subscriptionStatus); } @Override diff --git a/backend/src/main/java/moim_today/dto/mail/EmailSubscriptionResponse.java b/backend/src/main/java/moim_today/dto/mail/EmailSubscriptionResponse.java new file mode 100644 index 00000000..5d12d851 --- /dev/null +++ b/backend/src/main/java/moim_today/dto/mail/EmailSubscriptionResponse.java @@ -0,0 +1,15 @@ +package moim_today.dto.mail; + +import lombok.Builder; + +@Builder +public record EmailSubscriptionResponse( + boolean subscribeStatus +) { + + public static EmailSubscriptionResponse of(final boolean subscribeStatus) { + return EmailSubscriptionResponse.builder() + .subscribeStatus(subscribeStatus) + .build(); + } +} diff --git a/backend/src/main/java/moim_today/implement/email_subscribe/EmailSubscriptionFinder.java b/backend/src/main/java/moim_today/implement/email_subscribe/EmailSubscriptionFinder.java new file mode 100644 index 00000000..39df3f8b --- /dev/null +++ b/backend/src/main/java/moim_today/implement/email_subscribe/EmailSubscriptionFinder.java @@ -0,0 +1,20 @@ +package moim_today.implement.email_subscribe; + +import moim_today.global.annotation.Implement; +import moim_today.persistence.repository.email_subscribe.EmailSubscribeRepository; +import org.springframework.transaction.annotation.Transactional; + +@Implement +public class EmailSubscriptionFinder { + + private final EmailSubscribeRepository emailSubscribeRepository; + + public EmailSubscriptionFinder(final EmailSubscribeRepository emailSubscribeRepository) { + this.emailSubscribeRepository = emailSubscribeRepository; + } + + @Transactional(readOnly = true) + public boolean getSubscriptionStatus(final long memberId) { + return emailSubscribeRepository.getSubscriptionStatus(memberId); + } +} diff --git a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java index 29c5cd21..a0ce8299 100644 --- a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java @@ -10,4 +10,6 @@ public interface EmailSubscribeRepository { EmailSubscribeJpaEntity getByMemberId(final long memberId); EmailSubscribeJpaEntity save(final EmailSubscribeJpaEntity emailSubscribeJpaEntity); + + boolean getSubscriptionStatus(final long memberId); } diff --git a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java index 6a66d06c..a29e036c 100644 --- a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java @@ -1,18 +1,23 @@ package moim_today.persistence.repository.email_subscribe; +import com.querydsl.jpa.impl.JPAQueryFactory; import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.email_subscribe.EmailSubscribeJpaEntity; import org.springframework.stereotype.Repository; import static moim_today.global.constant.exception.MailExceptionConstant.MAIL_SUBSCRIBE_NOT_FOUND_ERROR; +import static moim_today.persistence.entity.email_subscribe.QEmailSubscribeJpaEntity.*; @Repository public class EmailSubscribeRepositoryImpl implements EmailSubscribeRepository { private final EmailSubscribeJpaRepository emailSubscribeJpaRepository; + private final JPAQueryFactory queryFactory; - public EmailSubscribeRepositoryImpl(final EmailSubscribeJpaRepository emailSubscribeJpaRepository) { + public EmailSubscribeRepositoryImpl(final EmailSubscribeJpaRepository emailSubscribeJpaRepository, + final JPAQueryFactory queryFactory) { this.emailSubscribeJpaRepository = emailSubscribeJpaRepository; + this.queryFactory = queryFactory; } @Override @@ -31,4 +36,12 @@ public EmailSubscribeJpaEntity getByMemberId(final long memberId) { public EmailSubscribeJpaEntity save(final EmailSubscribeJpaEntity emailSubscribeJpaEntity) { return emailSubscribeJpaRepository.save(emailSubscribeJpaEntity); } + + @Override + public boolean getSubscriptionStatus(final long memberId) { + return queryFactory.select(emailSubscribeJpaEntity.subscribeStatus) + .from(emailSubscribeJpaEntity) + .where(emailSubscribeJpaEntity.memberId.eq(memberId)) + .fetchFirst(); + } } diff --git a/backend/src/main/java/moim_today/presentation/email_subscribe/EmailSubscribeController.java b/backend/src/main/java/moim_today/presentation/email_subscribe/EmailSubscribeController.java index fe75c52c..8f16564d 100644 --- a/backend/src/main/java/moim_today/presentation/email_subscribe/EmailSubscribeController.java +++ b/backend/src/main/java/moim_today/presentation/email_subscribe/EmailSubscribeController.java @@ -3,11 +3,9 @@ import moim_today.application.email_subscribe.EmailSubscribeService; import moim_today.domain.member.MemberSession; import moim_today.dto.mail.EmailSubscribeRequest; +import moim_today.dto.mail.EmailSubscriptionResponse; import moim_today.global.annotation.Login; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RequestMapping("/api") @RestController @@ -19,6 +17,11 @@ public EmailSubscribeController(final EmailSubscribeService emailSubscribeServic this.emailSubscribeService = emailSubscribeService; } + @GetMapping("/email-subscription") + public EmailSubscriptionResponse getEmailSubscriptionStatus(@Login final MemberSession memberSession) { + return emailSubscribeService.getSubscriptionStatus(memberSession.id()); + } + @PostMapping("/email-subscription") public void subscribeEmail(@Login final MemberSession memberSession, @RequestBody final EmailSubscribeRequest emailSubscribeRequest) { diff --git a/backend/src/test/java/moim_today/fake_class/email_subscribe/FakeEmailSubscribeService.java b/backend/src/test/java/moim_today/fake_class/email_subscribe/FakeEmailSubscribeService.java index e18a4b59..673a5d3f 100644 --- a/backend/src/test/java/moim_today/fake_class/email_subscribe/FakeEmailSubscribeService.java +++ b/backend/src/test/java/moim_today/fake_class/email_subscribe/FakeEmailSubscribeService.java @@ -1,6 +1,7 @@ package moim_today.fake_class.email_subscribe; import moim_today.application.email_subscribe.EmailSubscribeService; +import moim_today.dto.mail.EmailSubscriptionResponse; public class FakeEmailSubscribeService implements EmailSubscribeService { @@ -8,4 +9,9 @@ public class FakeEmailSubscribeService implements EmailSubscribeService { public void updateSubscribeStatus(final long memberId, final boolean subscribedStatus) { } + + @Override + public EmailSubscriptionResponse getSubscriptionStatus(final long memberId) { + return null; + } } From d847970146af0f613814b10b4f9d8575781d2dd9 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Tue, 21 May 2024 09:24:06 +0900 Subject: [PATCH 49/60] =?UTF-8?q?[BE]=20test=20:=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=ED=95=9C=20=ED=9A=8C=EC=9B=90=EC=9D=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A9=94=EC=9D=BC=20=EC=88=98=EC=8B=A0=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EmailSubscribeController.java | 2 +- .../FakeEmailSubscribeService.java | 2 +- .../EmailSubscriptionFinderTest.java | 36 +++++++++++++++++++ .../EmailSubscribeControllerTest.java | 21 ++++++++++- 4 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 backend/src/test/java/moim_today/implement/email_subscribe/EmailSubscriptionFinderTest.java diff --git a/backend/src/main/java/moim_today/presentation/email_subscribe/EmailSubscribeController.java b/backend/src/main/java/moim_today/presentation/email_subscribe/EmailSubscribeController.java index 8f16564d..b729a829 100644 --- a/backend/src/main/java/moim_today/presentation/email_subscribe/EmailSubscribeController.java +++ b/backend/src/main/java/moim_today/presentation/email_subscribe/EmailSubscribeController.java @@ -23,7 +23,7 @@ public EmailSubscriptionResponse getEmailSubscriptionStatus(@Login final MemberS } @PostMapping("/email-subscription") - public void subscribeEmail(@Login final MemberSession memberSession, + public void updateEmailSubscribeStatus(@Login final MemberSession memberSession, @RequestBody final EmailSubscribeRequest emailSubscribeRequest) { emailSubscribeService.updateSubscribeStatus(memberSession.id(), emailSubscribeRequest.subscribeStatus()); } diff --git a/backend/src/test/java/moim_today/fake_class/email_subscribe/FakeEmailSubscribeService.java b/backend/src/test/java/moim_today/fake_class/email_subscribe/FakeEmailSubscribeService.java index 673a5d3f..1fdcd655 100644 --- a/backend/src/test/java/moim_today/fake_class/email_subscribe/FakeEmailSubscribeService.java +++ b/backend/src/test/java/moim_today/fake_class/email_subscribe/FakeEmailSubscribeService.java @@ -12,6 +12,6 @@ public void updateSubscribeStatus(final long memberId, final boolean subscribedS @Override public EmailSubscriptionResponse getSubscriptionStatus(final long memberId) { - return null; + return EmailSubscriptionResponse.of(true); } } diff --git a/backend/src/test/java/moim_today/implement/email_subscribe/EmailSubscriptionFinderTest.java b/backend/src/test/java/moim_today/implement/email_subscribe/EmailSubscriptionFinderTest.java new file mode 100644 index 00000000..3468bc64 --- /dev/null +++ b/backend/src/test/java/moim_today/implement/email_subscribe/EmailSubscriptionFinderTest.java @@ -0,0 +1,36 @@ +package moim_today.implement.email_subscribe; + +import moim_today.persistence.entity.email_subscribe.EmailSubscribeJpaEntity; +import moim_today.util.ImplementTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static moim_today.util.TestConstant.*; +import static org.assertj.core.api.Assertions.*; + +class EmailSubscriptionFinderTest extends ImplementTest { + + @Autowired + private EmailSubscriptionFinder emailSubscriptionFinder; + + @DisplayName("해당 회원의 이메일 수신 여부를 조회한다.") + @Test + void getSubscriptionStatus() { + // given + long memberId = MEMBER_ID.longValue(); + + EmailSubscribeJpaEntity emailSubscribeJpaEntity = EmailSubscribeJpaEntity.builder() + .memberId(memberId) + .subscribeStatus(true) + .build(); + + emailSubscribeRepository.save(emailSubscribeJpaEntity); + + // when + boolean subscriptionStatus = emailSubscriptionFinder.getSubscriptionStatus(memberId); + + // then + assertThat(subscriptionStatus).isTrue(); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/presentation/email_subscribe/EmailSubscribeControllerTest.java b/backend/src/test/java/moim_today/presentation/email_subscribe/EmailSubscribeControllerTest.java index 535d8374..393aaadb 100644 --- a/backend/src/test/java/moim_today/presentation/email_subscribe/EmailSubscribeControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/email_subscribe/EmailSubscribeControllerTest.java @@ -12,6 +12,7 @@ import static com.epages.restdocs.apispec.ResourceDocumentation.resource; import static org.springframework.http.MediaType.APPLICATION_JSON; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; import static org.springframework.restdocs.payload.JsonFieldType.*; import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; @@ -26,9 +27,27 @@ protected Object initController() { return new EmailSubscribeController(emailSubscribeService); } + @DisplayName("해당 회원의 이메일 수신 여부 정보를 조회한다.") + @Test + void getEmailSubscriptionStatus() throws Exception { + mockMvc.perform( + get("/api/email-subscription") + ) + .andExpect(status().isOk()) + .andDo(document("해당 회원의 이메일 수신 여부를 조회한다.", + resource(ResourceSnippetParameters.builder() + .tag("미팅") + .summary("이메일 수신 정보 조회") + .responseFields( + fieldWithPath("subscribeStatus").type(BOOLEAN).description("수신 여부") + ) + .build() + ))); + } + @DisplayName("이메일 수신 여부 정보를 변경한다.") @Test - void subscribeEmail() throws Exception { + void updateEmailSubscribeStatus() throws Exception { EmailSubscribeRequest emailSubscribeRequest = EmailSubscribeRequest.of(true); String json = objectMapper.writeValueAsString(emailSubscribeRequest); From 468e274166043891a91e95fe6ae83a2ffeb9e4d4 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Tue, 21 May 2024 09:32:18 +0900 Subject: [PATCH 50/60] =?UTF-8?q?[BE]=20feat=20:=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=EC=8B=9C=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=8B=A0=20=EC=B0=A8=EB=8B=A8=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EmailSubscribeAppender.java | 22 +++++++++++++++++++ .../implement/member/AuthManager.java | 7 +++++- .../EmailSubscribeJpaEntity.java | 7 ++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/moim_today/implement/email_subscribe/EmailSubscribeAppender.java diff --git a/backend/src/main/java/moim_today/implement/email_subscribe/EmailSubscribeAppender.java b/backend/src/main/java/moim_today/implement/email_subscribe/EmailSubscribeAppender.java new file mode 100644 index 00000000..8da7676e --- /dev/null +++ b/backend/src/main/java/moim_today/implement/email_subscribe/EmailSubscribeAppender.java @@ -0,0 +1,22 @@ +package moim_today.implement.email_subscribe; + +import moim_today.global.annotation.Implement; +import moim_today.persistence.entity.email_subscribe.EmailSubscribeJpaEntity; +import moim_today.persistence.repository.email_subscribe.EmailSubscribeRepository; +import org.springframework.transaction.annotation.Transactional; + +@Implement +public class EmailSubscribeAppender { + + private final EmailSubscribeRepository emailSubscribeRepository; + + public EmailSubscribeAppender(final EmailSubscribeRepository emailSubscribeRepository) { + this.emailSubscribeRepository = emailSubscribeRepository; + } + + @Transactional + public void saveEmailSubscription(final long memberId, final boolean subscribeStatus) { + EmailSubscribeJpaEntity emailSubscribeJpaEntity = EmailSubscribeJpaEntity.toEntity(memberId, subscribeStatus); + emailSubscribeRepository.save(emailSubscribeJpaEntity); + } +} diff --git a/backend/src/main/java/moim_today/implement/member/AuthManager.java b/backend/src/main/java/moim_today/implement/member/AuthManager.java index aa1ce758..bbc8eb6a 100644 --- a/backend/src/main/java/moim_today/implement/member/AuthManager.java +++ b/backend/src/main/java/moim_today/implement/member/AuthManager.java @@ -8,6 +8,7 @@ import moim_today.dto.auth.MemberSignUpRequest; import moim_today.global.annotation.Implement; import moim_today.global.error.NotFoundException; +import moim_today.implement.email_subscribe.EmailSubscribeAppender; import moim_today.persistence.entity.member.MemberJpaEntity; import moim_today.persistence.repository.member.MemberRepository; import org.springframework.security.crypto.password.PasswordEncoder; @@ -21,13 +22,16 @@ public class AuthManager { private final MemberRepository memberRepository; private final PasswordEncoder passwordEncoder; private final ObjectMapper objectMapper; + private final EmailSubscribeAppender emailSubscribeAppender; public AuthManager(final MemberRepository memberRepository, final PasswordEncoder passwordEncoder, - final ObjectMapper objectMapper) { + final ObjectMapper objectMapper, + final EmailSubscribeAppender emailSubscribeAppender) { this.memberRepository = memberRepository; this.passwordEncoder = passwordEncoder; this.objectMapper = objectMapper; + this.emailSubscribeAppender = emailSubscribeAppender; } @Transactional(readOnly = true) @@ -58,6 +62,7 @@ public void signUp(final MemberSignUpRequest memberSignUpRequest, final HttpServ MemberSession memberSession = MemberSession.from(saveMember); String memberSessionJson = memberSession.toJson(objectMapper); memberSession.setSession(request, memberSessionJson, false); + emailSubscribeAppender.saveEmailSubscription(memberSession.id(), true); } private String passwordEncode(final String password){ diff --git a/backend/src/main/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntity.java b/backend/src/main/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntity.java index c317a0cd..65859290 100644 --- a/backend/src/main/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntity.java +++ b/backend/src/main/java/moim_today/persistence/entity/email_subscribe/EmailSubscribeJpaEntity.java @@ -29,6 +29,13 @@ private EmailSubscribeJpaEntity(final long memberId, final boolean subscribeStat this.subscribeStatus = subscribeStatus; } + public static EmailSubscribeJpaEntity toEntity(final long memberId, final boolean subscribeStatus) { + return EmailSubscribeJpaEntity.builder() + .memberId(memberId) + .subscribeStatus(subscribeStatus) + .build(); + } + public void updateSubscribeStatus(final boolean subscribeStatus) { this.subscribeStatus = subscribeStatus; } From 0bdb9ac3bdc8348ec81fdd60fc8cbc4ae9b4124c Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Tue, 21 May 2024 09:39:26 +0900 Subject: [PATCH 51/60] =?UTF-8?q?[BE]=20test=20:=20=ED=9A=8C=EC=9B=90?= =?UTF-8?q?=EA=B0=80=EC=9E=85=EC=8B=9C=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=8B=A0=20=EC=B0=A8=EB=8B=A8=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EmailSubscribeRepository.java | 2 ++ .../EmailSubscribeRepositoryImpl.java | 5 +++ .../EmailSubscribeAppenderTest.java | 33 +++++++++++++++++++ .../implement/member/AuthManagerTest.java | 3 +- 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 backend/src/test/java/moim_today/implement/email_subscribe/EmailSubscribeAppenderTest.java diff --git a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java index a0ce8299..5d5e7497 100644 --- a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepository.java @@ -12,4 +12,6 @@ public interface EmailSubscribeRepository { EmailSubscribeJpaEntity save(final EmailSubscribeJpaEntity emailSubscribeJpaEntity); boolean getSubscriptionStatus(final long memberId); + + long count(); } diff --git a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java index a29e036c..80a66240 100644 --- a/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/email_subscribe/EmailSubscribeRepositoryImpl.java @@ -44,4 +44,9 @@ public boolean getSubscriptionStatus(final long memberId) { .where(emailSubscribeJpaEntity.memberId.eq(memberId)) .fetchFirst(); } + + @Override + public long count() { + return emailSubscribeJpaRepository.count(); + } } diff --git a/backend/src/test/java/moim_today/implement/email_subscribe/EmailSubscribeAppenderTest.java b/backend/src/test/java/moim_today/implement/email_subscribe/EmailSubscribeAppenderTest.java new file mode 100644 index 00000000..d0e9a5b1 --- /dev/null +++ b/backend/src/test/java/moim_today/implement/email_subscribe/EmailSubscribeAppenderTest.java @@ -0,0 +1,33 @@ +package moim_today.implement.email_subscribe; + +import moim_today.persistence.entity.email_subscribe.EmailSubscribeJpaEntity; +import moim_today.util.ImplementTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static moim_today.util.TestConstant.*; +import static org.assertj.core.api.Assertions.*; + +class EmailSubscribeAppenderTest extends ImplementTest { + + @Autowired + private EmailSubscribeAppender emailSubscribeAppender; + + @DisplayName("이메일 수신 여부 정보를 저장한다.") + @Test + void saveEmailSubscription() { + // given + long memberId = MEMBER_ID.longValue(); + boolean subscriptionStatus = true; + + // when + emailSubscribeAppender.saveEmailSubscription(memberId, subscriptionStatus); + + // then + EmailSubscribeJpaEntity findEntity = emailSubscribeRepository.getByMemberId(memberId); + + assertThat(emailSubscribeRepository.count()).isEqualTo(1); + assertThat(findEntity.isSubscribeStatus()).isTrue(); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/implement/member/AuthManagerTest.java b/backend/src/test/java/moim_today/implement/member/AuthManagerTest.java index ed703a52..91732698 100644 --- a/backend/src/test/java/moim_today/implement/member/AuthManagerTest.java +++ b/backend/src/test/java/moim_today/implement/member/AuthManagerTest.java @@ -126,7 +126,7 @@ void logoutTest() { @DisplayName("정상적으로 회원가입을 완료하면 멤버 데이터를 넣고 세션에 등록한다") @Test - void register() throws JsonProcessingException { + void signUp() throws JsonProcessingException { // given LocalDate birthDate = LocalDate.now(); MockHttpServletRequest mockHttpServletRequest = new MockHttpServletRequest(); @@ -152,5 +152,6 @@ void register() throws JsonProcessingException { assertThat(memberSessionObject).isNotBlank(); MemberSession memberSession = objectMapper.readValue(memberSessionObject, MemberSession.class); assertThat(memberSession.username()).isEqualTo(USERNAME.value()); + assertThat(emailSubscribeRepository.count()).isEqualTo(1); } } \ No newline at end of file From 78cbaf199f3f6a80c666dac7dee798da12fe510a Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Tue, 21 May 2024 09:53:08 +0900 Subject: [PATCH 52/60] =?UTF-8?q?[BE]=20feat=20:=20=EC=9D=B4=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=EC=A0=84=EC=86=A1=ED=95=A0=20=EB=95=8C=20=EC=88=98?= =?UTF-8?q?=EC=8B=A0=20=EC=97=AC=EB=B6=80=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/moim_today/implement/mail/MailScheduler.java | 4 ++-- .../repository/meeting/meeting/MeetingRepositoryImpl.java | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/moim_today/implement/mail/MailScheduler.java b/backend/src/main/java/moim_today/implement/mail/MailScheduler.java index 8a15d8dd..993ccc21 100644 --- a/backend/src/main/java/moim_today/implement/mail/MailScheduler.java +++ b/backend/src/main/java/moim_today/implement/mail/MailScheduler.java @@ -17,7 +17,7 @@ @Implement public class MailScheduler { - private static final int ONE_HOUR_IN_MILLISECONDS = 60 * 60 * 1000; + private static final String HOURLY_CRON_EXPRESSION = "0 0 * * * *"; private final MailSender mailSender; private final MeetingFinder meetingFinder; @@ -30,7 +30,7 @@ public MailScheduler(final MailSender mailSender, final MeetingFinder meetingFin this.joinedMeetingUpdater = joinedMeetingUpdater; } - @Scheduled(fixedRate = ONE_HOUR_IN_MILLISECONDS) + @Scheduled(cron = HOURLY_CRON_EXPRESSION) public void sendUpcomingMeetingMails() { LocalDateTime currentDateTime = LocalDateTime.now(); List upcomingNotices = meetingFinder.findUpcomingNotices(currentDateTime); diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java index 62e05c59..103f5439 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java @@ -6,7 +6,9 @@ import moim_today.dto.meeting.meeting.MeetingSimpleDao; import moim_today.dto.meeting.meeting.QMeetingSimpleDao; import moim_today.global.error.NotFoundException; +import moim_today.persistence.entity.email_subscribe.QEmailSubscribeJpaEntity; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; +import moim_today.persistence.entity.member.QMemberJpaEntity; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -14,6 +16,7 @@ import java.util.List; import static moim_today.global.constant.exception.MeetingExceptionConstant.MEETING_NOT_FOUND_ERROR; +import static moim_today.persistence.entity.email_subscribe.QEmailSubscribeJpaEntity.*; import static moim_today.persistence.entity.meeting.joined_meeting.QJoinedMeetingJpaEntity.joinedMeetingJpaEntity; import static moim_today.persistence.entity.meeting.meeting.QMeetingJpaEntity.meetingJpaEntity; import static moim_today.persistence.entity.member.QMemberJpaEntity.memberJpaEntity; @@ -130,10 +133,13 @@ public List findUpcomingNotices(final LocalDateTi .from(meetingJpaEntity) .innerJoin(joinedMeetingJpaEntity).on(joinedMeetingJpaEntity.meetingId.eq(meetingJpaEntity.id)) .innerJoin(memberJpaEntity).on(memberJpaEntity.id.eq(joinedMeetingJpaEntity.memberId)) + .innerJoin(emailSubscribeJpaEntity).on(memberJpaEntity.id.eq(emailSubscribeJpaEntity.memberId)) .where( meetingJpaEntity.startDateTime.loe(upcomingDateTime) .and(meetingJpaEntity.startDateTime.after(currentDateTime) - .and(joinedMeetingJpaEntity.upcomingNoticeSent.isFalse())) + .and(joinedMeetingJpaEntity.upcomingNoticeSent.isFalse()) + .and(emailSubscribeJpaEntity.subscribeStatus.isTrue()) + ) ) .fetch(); } From bde748aa67f7f827cd2b994cdabc6d0bbe8f1445 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Tue, 21 May 2024 09:59:36 +0900 Subject: [PATCH 53/60] =?UTF-8?q?[BE]=20test=20:=20=EC=9D=B4=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=EC=A0=84=EC=86=A1=ED=95=A0=20=EB=95=8C=20=EC=88=98?= =?UTF-8?q?=EC=8B=A0=20=EC=97=AC=EB=B6=80=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/meeting/MeetingFinderTest.java | 124 +++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java index fb36bc30..cc432816 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingFinderTest.java @@ -5,6 +5,7 @@ import moim_today.dto.meeting.meeting.MeetingDetailResponse; import moim_today.dto.meeting.meeting.MeetingSimpleDao; import moim_today.global.error.NotFoundException; +import moim_today.persistence.entity.email_subscribe.EmailSubscribeJpaEntity; import moim_today.persistence.entity.meeting.joined_meeting.JoinedMeetingJpaEntity; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import moim_today.persistence.entity.member.MemberJpaEntity; @@ -308,7 +309,6 @@ void findAllPastByMoimIdOrderByStartDateTimeAsc() { assertThat(meetingSimpleDaos.get(1).agenda()).isEqualTo(SECOND_CREATED_MEETING_AGENDA.value()); } - @DisplayName("하나의 모임의 모든 미팅의 엔티티 정보를 반환한다.") @Test void findAllByMoimId() { @@ -456,6 +456,13 @@ void findUpcomingNotices() { joinedMeetingRepository.save(joinedMeetingJpaEntity); + EmailSubscribeJpaEntity emailSubscribeJpaEntity = EmailSubscribeJpaEntity.builder() + .memberId(memberJpaEntity.getId()) + .subscribeStatus(true) + .build(); + + emailSubscribeRepository.save(emailSubscribeJpaEntity); + // when List upcomingNotices = meetingFinder.findUpcomingNotices(currentDateTime); @@ -471,6 +478,100 @@ void findUpcomingNotices() { assertThat(upcomingNotice.attendance()).isEqualTo(joinedMeetingJpaEntity.isAttendance()); } + @DisplayName("이메일 수신 여부를 수락한 사람만 다가오는 미팅 정보를 조회한다.") + @Test + void findUpcomingNoticesOnlySubscribeStatusTrue() { + // given 1 + LocalDateTime currentDateTime = LocalDateTime.of(2024, 3, 4, 8, 0, 0); + + // given 2 + MemberJpaEntity memberJpaEntity = MemberJpaEntity.builder() + .email(EMAIL.value()) + .build(); + + memberRepository.save(memberJpaEntity); + + // given 3 + MeetingJpaEntity meetingJpaEntity = MeetingJpaEntity.builder() + .agenda(MEETING_AGENDA.value()) + .startDateTime(LocalDateTime.of(2024, 3, 4, 10, 0, 0)) + .endDateTime(LocalDateTime.of(2024, 3, 4, 12, 0, 0)) + .place(MEETING_PLACE.value()) + .build(); + + meetingRepository.save(meetingJpaEntity); + + // given 4 + JoinedMeetingJpaEntity joinedMeetingJpaEntity = JoinedMeetingJpaEntity.builder() + .meetingId(meetingJpaEntity.getId()) + .memberId(memberJpaEntity.getId()) + .attendance(true) + .upcomingNoticeSent(false) + .build(); + + joinedMeetingRepository.save(joinedMeetingJpaEntity); + + EmailSubscribeJpaEntity emailSubscribeJpaEntity = EmailSubscribeJpaEntity.builder() + .memberId(memberJpaEntity.getId()) + .subscribeStatus(true) + .build(); + + emailSubscribeRepository.save(emailSubscribeJpaEntity); + + // when + List upcomingNotices = meetingFinder.findUpcomingNotices(currentDateTime); + + // then + assertThat(upcomingNotices.size()).isEqualTo(1); + } + + @DisplayName("이메일 수신 여부를 거절한 사람은 다가오는 미팅 정보가 조회되지 않는다.") + @Test + void findUpcomingNoticesOnlySubscribeStatusFalse() { + // given 1 + LocalDateTime currentDateTime = LocalDateTime.of(2024, 3, 4, 8, 0, 0); + + // given 2 + MemberJpaEntity memberJpaEntity = MemberJpaEntity.builder() + .email(EMAIL.value()) + .build(); + + memberRepository.save(memberJpaEntity); + + // given 3 + MeetingJpaEntity meetingJpaEntity = MeetingJpaEntity.builder() + .agenda(MEETING_AGENDA.value()) + .startDateTime(LocalDateTime.of(2024, 3, 4, 10, 0, 0)) + .endDateTime(LocalDateTime.of(2024, 3, 4, 12, 0, 0)) + .place(MEETING_PLACE.value()) + .build(); + + meetingRepository.save(meetingJpaEntity); + + // given 4 + JoinedMeetingJpaEntity joinedMeetingJpaEntity = JoinedMeetingJpaEntity.builder() + .meetingId(meetingJpaEntity.getId()) + .memberId(memberJpaEntity.getId()) + .attendance(true) + .upcomingNoticeSent(false) + .build(); + + joinedMeetingRepository.save(joinedMeetingJpaEntity); + + EmailSubscribeJpaEntity emailSubscribeJpaEntity = EmailSubscribeJpaEntity.builder() + .memberId(memberJpaEntity.getId()) + .subscribeStatus(false) + .build(); + + emailSubscribeRepository.save(emailSubscribeJpaEntity); + + // when + List upcomingNotices = meetingFinder.findUpcomingNotices(currentDateTime); + + // then + assertThat(upcomingNotices.size()).isEqualTo(0); + } + @DisplayName("다가오는 미팅은 시작 시간이 현재 시간보다 뒤에 있는 시간대를 조회한다.") @Test void findUpcomingNoticesOnlyAfter() { @@ -520,6 +621,13 @@ void findUpcomingNoticesOnlyAfter() { joinedMeetingRepository.save(beforeJoinedMeetingJpaEntity); joinedMeetingRepository.save(afterJoinedMeetingJpaEntity); + EmailSubscribeJpaEntity emailSubscribeJpaEntity = EmailSubscribeJpaEntity.builder() + .memberId(memberJpaEntity.getId()) + .subscribeStatus(true) + .build(); + + emailSubscribeRepository.save(emailSubscribeJpaEntity); + // when List upcomingNotices = meetingFinder.findUpcomingNotices(currentDateTime); @@ -576,6 +684,13 @@ void findUpcomingNoticesUntilAfter24Hours() { joinedMeetingRepository.save(beforeJoinedMeetingJpaEntity); joinedMeetingRepository.save(afterJoinedMeetingJpaEntity); + EmailSubscribeJpaEntity emailSubscribeJpaEntity = EmailSubscribeJpaEntity.builder() + .memberId(memberJpaEntity.getId()) + .subscribeStatus(true) + .build(); + + emailSubscribeRepository.save(emailSubscribeJpaEntity); + // when List upcomingNotices = meetingFinder.findUpcomingNotices(currentDateTime); @@ -632,6 +747,13 @@ void findUpcomingNoticesOnlyUpcomingNoticeSentFalse() { joinedMeetingRepository.save(beforeJoinedMeetingJpaEntity); joinedMeetingRepository.save(afterJoinedMeetingJpaEntity); + EmailSubscribeJpaEntity emailSubscribeJpaEntity = EmailSubscribeJpaEntity.builder() + .memberId(memberJpaEntity.getId()) + .subscribeStatus(true) + .build(); + + emailSubscribeRepository.save(emailSubscribeJpaEntity); + // when List upcomingNotices = meetingFinder.findUpcomingNotices(currentDateTime); From 469c306e373600bf20136661e29c5110a1b8e72c Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Wed, 22 May 2024 14:26:37 +0900 Subject: [PATCH 54/60] =?UTF-8?q?[BE]=20feat=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=EC=8B=9C=20=EC=8A=A4=EC=BC=80=EC=A4=84=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C,=20=EC=B0=B8=EC=97=AC=20=EB=AF=B8=ED=8C=85?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../joined_meeting/JoinedMeetingService.java | 3 +++ .../joined_meeting/JoinedMeetingServiceImpl.java | 16 +++++++++++++++- .../meeting/meeting/MeetingServiceImpl.java | 12 +++++++++++- .../application/schedule/ScheduleService.java | 2 ++ .../schedule/ScheduleServiceImpl.java | 5 +++++ .../joined_meeting/JoinedMeetingRemover.java | 5 +++++ .../schedule/schedule/ScheduleRemover.java | 5 +++++ .../JoinedMeetingJpaRepository.java | 2 ++ .../joined_meeting/JoinedMeetingRepository.java | 2 ++ .../JoinedMeetingRepositoryImpl.java | 7 +++++-- .../schedule/schedule/ScheduleJpaRepository.java | 2 ++ .../schedule/schedule/ScheduleRepository.java | 2 ++ .../schedule/ScheduleRepositoryImpl.java | 8 +++++--- .../joined_meeting/FakeJoinedMeetingService.java | 5 +++++ .../fake_class/schedule/FakeScheduleService.java | 5 +++++ 15 files changed, 74 insertions(+), 7 deletions(-) diff --git a/backend/src/main/java/moim_today/application/meeting/joined_meeting/JoinedMeetingService.java b/backend/src/main/java/moim_today/application/meeting/joined_meeting/JoinedMeetingService.java index 65585d18..241c0c82 100644 --- a/backend/src/main/java/moim_today/application/meeting/joined_meeting/JoinedMeetingService.java +++ b/backend/src/main/java/moim_today/application/meeting/joined_meeting/JoinedMeetingService.java @@ -1,8 +1,11 @@ package moim_today.application.meeting.joined_meeting; + public interface JoinedMeetingService { void acceptanceJoinMeeting(final long memberId, final long meetingId); void refuseJoinMeeting(final long memberId, final long meetingId); + + void deleteAllByMeetingId(final long meetingId); } diff --git a/backend/src/main/java/moim_today/application/meeting/joined_meeting/JoinedMeetingServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/joined_meeting/JoinedMeetingServiceImpl.java index 965cc423..df4c163f 100644 --- a/backend/src/main/java/moim_today/application/meeting/joined_meeting/JoinedMeetingServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/joined_meeting/JoinedMeetingServiceImpl.java @@ -1,26 +1,40 @@ package moim_today.application.meeting.joined_meeting; +import moim_today.implement.meeting.joined_meeting.JoinedMeetingRemover; import moim_today.implement.meeting.joined_meeting.JoinedMeetingUpdater; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + @Service public class JoinedMeetingServiceImpl implements JoinedMeetingService { private final JoinedMeetingUpdater joinedMeetingUpdater; + private final JoinedMeetingRemover joinedMeetingRemover; - public JoinedMeetingServiceImpl(final JoinedMeetingUpdater joinedMeetingUpdater) { + public JoinedMeetingServiceImpl(final JoinedMeetingUpdater joinedMeetingUpdater, + final JoinedMeetingRemover joinedMeetingRemover) { this.joinedMeetingUpdater = joinedMeetingUpdater; + this.joinedMeetingRemover = joinedMeetingRemover; } + @Transactional @Override public void acceptanceJoinMeeting(final long memberId, final long meetingId) { boolean attendance = true; joinedMeetingUpdater.updateAttendance(memberId, meetingId, attendance); } + @Transactional @Override public void refuseJoinMeeting(final long memberId, final long meetingId) { boolean attendance = false; joinedMeetingUpdater.updateAttendance(memberId, meetingId, attendance); } + + @Transactional + @Override + public void deleteAllByMeetingId(final long meetingId) { + joinedMeetingRemover.deleteAllByMeetingId(meetingId); + } } diff --git a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java index 0d772e1a..b3564846 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java @@ -1,5 +1,7 @@ package moim_today.application.meeting.meeting; +import moim_today.application.meeting.joined_meeting.JoinedMeetingService; +import moim_today.application.schedule.ScheduleService; import moim_today.domain.meeting.enums.MeetingStatus; import moim_today.dto.meeting.*; import moim_today.dto.meeting.meeting.MeetingCreateRequest; @@ -10,6 +12,7 @@ import moim_today.implement.meeting.meeting.MeetingManager; import moim_today.implement.meeting.meeting.MeetingRemover; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.time.LocalDateTime; @@ -21,12 +24,16 @@ public class MeetingServiceImpl implements MeetingService { private final MeetingManager meetingManager; private final MeetingFinder meetingFinder; private final MeetingRemover meetingRemover; + private final ScheduleService scheduleService; + private final JoinedMeetingService joinedMeetingService; public MeetingServiceImpl(final MeetingManager meetingManager, final MeetingFinder meetingFinder, - final MeetingRemover meetingRemover) { + final MeetingRemover meetingRemover, final ScheduleService scheduleService, final JoinedMeetingService joinedMeetingService) { this.meetingManager = meetingManager; this.meetingFinder = meetingFinder; this.meetingRemover = meetingRemover; + this.scheduleService = scheduleService; + this.joinedMeetingService = joinedMeetingService; } @Override @@ -47,8 +54,11 @@ public MeetingDetailResponse findDetailsById(final long meetingId) { return meetingFinder.findDetailsById(meetingId); } + @Transactional @Override public void deleteMeeting(final long memberId, final long meetingId) { meetingRemover.deleteMeeting(meetingId, meetingId); + scheduleService.deleteAllByMeetingId(meetingId); + joinedMeetingService.deleteAllByMeetingId(meetingId); } } diff --git a/backend/src/main/java/moim_today/application/schedule/ScheduleService.java b/backend/src/main/java/moim_today/application/schedule/ScheduleService.java index a6431f84..005ced8f 100644 --- a/backend/src/main/java/moim_today/application/schedule/ScheduleService.java +++ b/backend/src/main/java/moim_today/application/schedule/ScheduleService.java @@ -24,4 +24,6 @@ public interface ScheduleService { void updateSchedule(final long memberId, final ScheduleUpdateRequest scheduleUpdateRequest); void deleteSchedule(final long memberId, final long scheduleId); + + void deleteAllByMeetingId(final long meetingId); } diff --git a/backend/src/main/java/moim_today/application/schedule/ScheduleServiceImpl.java b/backend/src/main/java/moim_today/application/schedule/ScheduleServiceImpl.java index 444e36a2..48c5ef2b 100644 --- a/backend/src/main/java/moim_today/application/schedule/ScheduleServiceImpl.java +++ b/backend/src/main/java/moim_today/application/schedule/ScheduleServiceImpl.java @@ -96,4 +96,9 @@ public void updateSchedule(final long memberId, final ScheduleUpdateRequest sche public void deleteSchedule(final long memberId, final long scheduleId) { scheduleRemover.deleteSchedule(memberId, scheduleId); } + + @Override + public void deleteAllByMeetingId(final long meetingId) { + scheduleRemover.deleteAllByMeetingId(meetingId); + } } \ No newline at end of file diff --git a/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingRemover.java b/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingRemover.java index 122fc770..2f1a4bf3 100644 --- a/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingRemover.java +++ b/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingRemover.java @@ -22,6 +22,11 @@ public void deleteAllByMeetingIdIn(final List meetingIds) { } } + @Transactional + public void deleteAllByMeetingId(final long meetingId) { + joinedMeetingRepository.deleteAllByMeetingId(meetingId); + } + @Transactional public void deleteAllByMemberInMeeting(final long memberId, final List meetingIds) { if(!meetingIds.isEmpty()){ diff --git a/backend/src/main/java/moim_today/implement/schedule/schedule/ScheduleRemover.java b/backend/src/main/java/moim_today/implement/schedule/schedule/ScheduleRemover.java index 070dbab5..36586df3 100644 --- a/backend/src/main/java/moim_today/implement/schedule/schedule/ScheduleRemover.java +++ b/backend/src/main/java/moim_today/implement/schedule/schedule/ScheduleRemover.java @@ -30,6 +30,11 @@ public void deleteAllByMeetingIdIn(final List meetingIds) { } } + @Transactional + public void deleteAllByMeetingId(final long meetingId) { + scheduleRepository.deleteAllByMeetingId(meetingId); + } + @Transactional public void deleteAllByMemberInMeeting(final long memberId, final List meetingIds) { if(!meetingIds.isEmpty()){ diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingJpaRepository.java b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingJpaRepository.java index 72eed007..790fae83 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingJpaRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingJpaRepository.java @@ -10,5 +10,7 @@ public interface JoinedMeetingJpaRepository extends JpaRepository meetingIds); + void deleteAllByMeetingId(final long meetingId); + Optional findByMemberIdAndMeetingId(final long memberId, final long meetingId); } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepository.java b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepository.java index 9ef3cdaa..410763de 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepository.java @@ -9,6 +9,8 @@ public interface JoinedMeetingRepository { void deleteAllByMeetingIdIn(final List meetingIds); + void deleteAllByMeetingId(final long meetingId); + JoinedMeetingJpaEntity save(final JoinedMeetingJpaEntity joinedMeetingJpaEntity); void saveAll(final List joinedMeetingJpaEntities); diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepositoryImpl.java index b536d8a1..d2ffd048 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/joined_meeting/JoinedMeetingRepositoryImpl.java @@ -5,11 +5,9 @@ import moim_today.dto.member.QMemberSimpleResponse; import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.meeting.joined_meeting.JoinedMeetingJpaEntity; -import moim_today.persistence.entity.meeting.joined_meeting.QJoinedMeetingJpaEntity; import org.springframework.stereotype.Repository; import java.util.List; -import java.util.Optional; import static moim_today.global.constant.exception.MeetingExceptionConstant.JOINED_MEETING_NOT_FOUND_ERROR; import static moim_today.persistence.entity.meeting.joined_meeting.QJoinedMeetingJpaEntity.joinedMeetingJpaEntity; @@ -32,6 +30,11 @@ public void deleteAllByMeetingIdIn(final List meetingIds) { joinedMeetingJpaRepository.deleteAllByMeetingIdIn(meetingIds); } + @Override + public void deleteAllByMeetingId(final long meetingId) { + joinedMeetingJpaRepository.deleteAllByMeetingId(meetingId); + } + @Override public JoinedMeetingJpaEntity save(final JoinedMeetingJpaEntity joinedMeetingJpaEntity) { return joinedMeetingJpaRepository.save(joinedMeetingJpaEntity); diff --git a/backend/src/main/java/moim_today/persistence/repository/schedule/schedule/ScheduleJpaRepository.java b/backend/src/main/java/moim_today/persistence/repository/schedule/schedule/ScheduleJpaRepository.java index 65bca9d9..74b64fa3 100644 --- a/backend/src/main/java/moim_today/persistence/repository/schedule/schedule/ScheduleJpaRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/schedule/schedule/ScheduleJpaRepository.java @@ -9,5 +9,7 @@ public interface ScheduleJpaRepository extends JpaRepository meetingIds); + void deleteAllByMeetingId(final long meetingId); + List findAllByMemberId(final long memberId); } diff --git a/backend/src/main/java/moim_today/persistence/repository/schedule/schedule/ScheduleRepository.java b/backend/src/main/java/moim_today/persistence/repository/schedule/schedule/ScheduleRepository.java index 7844cab9..133f22e6 100644 --- a/backend/src/main/java/moim_today/persistence/repository/schedule/schedule/ScheduleRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/schedule/schedule/ScheduleRepository.java @@ -35,4 +35,6 @@ public interface ScheduleRepository { void deleteAllByMeetingIdIn(final List meetingIds); void deleteAllByMemberInMeeting(final long memberId, final List meetingIds); + + void deleteAllByMeetingId(final long meetingId); } diff --git a/backend/src/main/java/moim_today/persistence/repository/schedule/schedule/ScheduleRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/schedule/schedule/ScheduleRepositoryImpl.java index eb35b889..a4012857 100644 --- a/backend/src/main/java/moim_today/persistence/repository/schedule/schedule/ScheduleRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/schedule/schedule/ScheduleRepositoryImpl.java @@ -2,11 +2,8 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import moim_today.domain.schedule.Schedule; -import moim_today.dto.moim.moim.QMoimMemberResponse; import moim_today.dto.schedule.*; import moim_today.global.error.NotFoundException; -import moim_today.persistence.entity.member.QMemberJpaEntity; -import moim_today.persistence.entity.schedule.schedule.QScheduleJpaEntity; import moim_today.persistence.entity.schedule.schedule.ScheduleJpaEntity; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; @@ -184,4 +181,9 @@ public void deleteAllByMemberInMeeting(final long memberId, final List mee .and(scheduleJpaEntity.meetingId.in(meetingIds))) .execute(); } + + @Override + public void deleteAllByMeetingId(final long meetingId) { + scheduleJpaRepository.deleteAllByMeetingId(meetingId); + } } diff --git a/backend/src/test/java/moim_today/fake_class/meeting/joined_meeting/FakeJoinedMeetingService.java b/backend/src/test/java/moim_today/fake_class/meeting/joined_meeting/FakeJoinedMeetingService.java index 8e70c8d8..e070482a 100644 --- a/backend/src/test/java/moim_today/fake_class/meeting/joined_meeting/FakeJoinedMeetingService.java +++ b/backend/src/test/java/moim_today/fake_class/meeting/joined_meeting/FakeJoinedMeetingService.java @@ -13,4 +13,9 @@ public void acceptanceJoinMeeting(final long memberId, final long meetingId) { public void refuseJoinMeeting(final long memberId, final long meetingId) { } + + @Override + public void deleteAllByMeetingId(final long meetingId) { + + } } diff --git a/backend/src/test/java/moim_today/fake_class/schedule/FakeScheduleService.java b/backend/src/test/java/moim_today/fake_class/schedule/FakeScheduleService.java index 5e64ac04..0b4842bd 100644 --- a/backend/src/test/java/moim_today/fake_class/schedule/FakeScheduleService.java +++ b/backend/src/test/java/moim_today/fake_class/schedule/FakeScheduleService.java @@ -201,4 +201,9 @@ public void deleteSchedule(final long memberId, final long scheduleId) { throw new ForbiddenException(SCHEDULE_FORBIDDEN.message()); } } + + @Override + public void deleteAllByMeetingId(final long meetingId) { + + } } From 7bb52f5cebb24239009585a2493e50124f5c3ec4 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Wed, 22 May 2024 14:48:27 +0900 Subject: [PATCH 55/60] =?UTF-8?q?[BE]=20test=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=EC=8B=9C=20=EC=8A=A4=EC=BC=80=EC=A4=84=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C,=20=EC=B0=B8=EC=97=AC=20=EB=AF=B8=ED=8C=85?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JoinedMeetingRemoverTest.java | 30 +++++++++++++++++++ .../schedule/ScheduleRemoverTest.java | 30 +++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingRemoverTest.java b/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingRemoverTest.java index e64cc588..488b65fb 100644 --- a/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingRemoverTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingRemoverTest.java @@ -1,7 +1,9 @@ package moim_today.implement.meeting.joined_meeting; import moim_today.persistence.entity.meeting.joined_meeting.JoinedMeetingJpaEntity; +import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import moim_today.util.ImplementTest; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -91,6 +93,34 @@ void deleteAllByMemberInMeeting() { assertThat(joinedMeetingRepository.count()).isEqualTo(0L); } + @DisplayName("해당 미팅의 참여 정보를 삭제한다.") + @Test + void deleteAllByMeetingId() { + // given 1 + MeetingJpaEntity meetingJpaEntity = MeetingJpaEntity.builder() + .build(); + + meetingRepository.save(meetingJpaEntity); + + // given 2 + JoinedMeetingJpaEntity joinedMeetingJpaEntity1 = JoinedMeetingJpaEntity.builder() + .meetingId(meetingJpaEntity.getId()) + .build(); + + JoinedMeetingJpaEntity joinedMeetingJpaEntity2 = JoinedMeetingJpaEntity.builder() + .meetingId(meetingJpaEntity.getId()) + .build(); + + joinedMeetingRepository.save(joinedMeetingJpaEntity1); + joinedMeetingRepository.save(joinedMeetingJpaEntity2); + + // when + joinedMeetingRemover.deleteAllByMeetingId(meetingJpaEntity.getId()); + + // then + assertThat(joinedMeetingRepository.count()).isEqualTo(0); + } + @DisplayName("미팅에서 특정 멤버만 삭제된다") @Test void deleteOnlySpecifiedMemberInMeeting() { diff --git a/backend/src/test/java/moim_today/implement/schedule/schedule/ScheduleRemoverTest.java b/backend/src/test/java/moim_today/implement/schedule/schedule/ScheduleRemoverTest.java index faa2132d..0fb27d9f 100644 --- a/backend/src/test/java/moim_today/implement/schedule/schedule/ScheduleRemoverTest.java +++ b/backend/src/test/java/moim_today/implement/schedule/schedule/ScheduleRemoverTest.java @@ -2,8 +2,10 @@ import moim_today.global.error.ForbiddenException; import moim_today.global.error.NotFoundException; +import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import moim_today.persistence.entity.schedule.schedule.ScheduleJpaEntity; import moim_today.util.ImplementTest; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -105,6 +107,34 @@ void deleteSchedulesByMeetingIdsTest() { assertThat(scheduleRepository.count()).isEqualTo(1L); } + @DisplayName("미팅에 있는 모든 스케줄을 삭제한다.") + @Test + void deleteAllByMeetingId() { + // given 1 + MeetingJpaEntity meetingJpaEntity = MeetingJpaEntity.builder() + .build(); + + meetingRepository.save(meetingJpaEntity); + + // given 2 + ScheduleJpaEntity scheduleJpaEntity1 = ScheduleJpaEntity.builder() + .meetingId(meetingJpaEntity.getId()) + .build(); + + ScheduleJpaEntity scheduleJpaEntity2 = ScheduleJpaEntity.builder() + .meetingId(meetingJpaEntity.getId()) + .build(); + + scheduleRepository.save(scheduleJpaEntity1); + scheduleRepository.save(scheduleJpaEntity2); + + // when + scheduleRemover.deleteAllByMeetingId(meetingJpaEntity.getId()); + + // then + assertThat(scheduleRepository.count()).isEqualTo(0); + } + @DisplayName("한 멤버의 미팅에 참여하는 기록들을 삭제한다") @Test void deleteAllByMemberInMeeting() { From aab74958a4c14538d4ce927ca595ebebd32df42e Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Wed, 22 May 2024 15:15:13 +0900 Subject: [PATCH 56/60] =?UTF-8?q?[BE]=20feat=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/meeting/MeetingService.java | 7 ++-- .../meeting/meeting/MeetingServiceImpl.java | 17 ++++++---- .../{ => meeting}/MeetingCreateResponse.java | 3 +- .../meeting/meeting/MeetingUpdateRequest.java | 9 +++++ .../meeting/meeting/MeetingManager.java | 2 +- .../meeting/meeting/MeetingRemover.java | 2 +- .../meeting/meeting/MeetingUpdater.java | 34 +++++++++++++++++++ .../meeting/meeting/MeetingJpaEntity.java | 5 +++ .../meeting/meeting/MeetingRepository.java | 2 +- .../meeting/MeetingRepositoryImpl.java | 5 +-- .../meeting/meeting/MeetingController.java | 11 +++--- .../meeting/meeting/FakeMeetingService.java | 10 +++--- .../meeting/meeting/MeetingManagerTest.java | 2 +- 13 files changed, 83 insertions(+), 26 deletions(-) rename backend/src/main/java/moim_today/dto/meeting/{ => meeting}/MeetingCreateResponse.java (92%) create mode 100644 backend/src/main/java/moim_today/dto/meeting/meeting/MeetingUpdateRequest.java create mode 100644 backend/src/main/java/moim_today/implement/meeting/meeting/MeetingUpdater.java diff --git a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java index 11279964..07c90eab 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingService.java @@ -1,10 +1,7 @@ package moim_today.application.meeting.meeting; import moim_today.domain.meeting.enums.MeetingStatus; -import moim_today.dto.meeting.MeetingCreateResponse; -import moim_today.dto.meeting.meeting.MeetingCreateRequest; -import moim_today.dto.meeting.meeting.MeetingDetailResponse; -import moim_today.dto.meeting.meeting.MeetingSimpleResponse; +import moim_today.dto.meeting.meeting.*; import java.util.List; @@ -16,5 +13,7 @@ public interface MeetingService { MeetingDetailResponse findDetailsById(final long meetingId); + void updateMeeting(final long memberId, final MeetingUpdateRequest meetingUpdateRequest); + void deleteMeeting(final long memberId, final long meetingId); } diff --git a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java index b3564846..a65ad131 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java @@ -3,14 +3,11 @@ import moim_today.application.meeting.joined_meeting.JoinedMeetingService; import moim_today.application.schedule.ScheduleService; import moim_today.domain.meeting.enums.MeetingStatus; -import moim_today.dto.meeting.*; -import moim_today.dto.meeting.meeting.MeetingCreateRequest; -import moim_today.dto.meeting.meeting.MeetingDetailResponse; -import moim_today.dto.meeting.meeting.MeetingSimpleDao; -import moim_today.dto.meeting.meeting.MeetingSimpleResponse; +import moim_today.dto.meeting.meeting.*; import moim_today.implement.meeting.meeting.MeetingFinder; import moim_today.implement.meeting.meeting.MeetingManager; import moim_today.implement.meeting.meeting.MeetingRemover; +import moim_today.implement.meeting.meeting.MeetingUpdater; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,14 +20,17 @@ public class MeetingServiceImpl implements MeetingService { private final MeetingManager meetingManager; private final MeetingFinder meetingFinder; + private final MeetingUpdater meetingUpdater; private final MeetingRemover meetingRemover; private final ScheduleService scheduleService; private final JoinedMeetingService joinedMeetingService; public MeetingServiceImpl(final MeetingManager meetingManager, final MeetingFinder meetingFinder, - final MeetingRemover meetingRemover, final ScheduleService scheduleService, final JoinedMeetingService joinedMeetingService) { + final MeetingUpdater meetingUpdater, final MeetingRemover meetingRemover, + final ScheduleService scheduleService, final JoinedMeetingService joinedMeetingService) { this.meetingManager = meetingManager; this.meetingFinder = meetingFinder; + this.meetingUpdater = meetingUpdater; this.meetingRemover = meetingRemover; this.scheduleService = scheduleService; this.joinedMeetingService = joinedMeetingService; @@ -54,6 +54,11 @@ public MeetingDetailResponse findDetailsById(final long meetingId) { return meetingFinder.findDetailsById(meetingId); } + @Override + public void updateMeeting(final long memberId, final MeetingUpdateRequest meetingUpdateRequest) { + meetingUpdater.updateMeeting(memberId, meetingUpdateRequest); + } + @Transactional @Override public void deleteMeeting(final long memberId, final long meetingId) { diff --git a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateResponse.java b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingCreateResponse.java similarity index 92% rename from backend/src/main/java/moim_today/dto/meeting/MeetingCreateResponse.java rename to backend/src/main/java/moim_today/dto/meeting/meeting/MeetingCreateResponse.java index 5ed83b49..43eb1c35 100644 --- a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateResponse.java +++ b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingCreateResponse.java @@ -1,9 +1,8 @@ -package moim_today.dto.meeting; +package moim_today.dto.meeting.meeting; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Builder; import moim_today.domain.meeting.enums.MeetingCategory; -import moim_today.dto.meeting.meeting.MeetingCreateRequest; import java.time.LocalDateTime; diff --git a/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingUpdateRequest.java b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingUpdateRequest.java new file mode 100644 index 00000000..2e35b67a --- /dev/null +++ b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingUpdateRequest.java @@ -0,0 +1,9 @@ +package moim_today.dto.meeting.meeting; + + +public record MeetingUpdateRequest( + long meetingId, + String agenda, + String place +) { +} diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java index 7c3fa7a7..f3f732de 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java @@ -1,7 +1,7 @@ package moim_today.implement.meeting.meeting; import moim_today.domain.meeting.enums.MeetingCategory; -import moim_today.dto.meeting.MeetingCreateResponse; +import moim_today.dto.meeting.meeting.MeetingCreateResponse; import moim_today.dto.meeting.meeting.MeetingCreateRequest; import moim_today.dto.moim.moim.MoimDateResponse; import moim_today.global.annotation.Implement; diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingRemover.java b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingRemover.java index 3d78cc9a..9fdf7f60 100644 --- a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingRemover.java +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingRemover.java @@ -20,7 +20,7 @@ public MeetingRemover(final MeetingRepository meetingRepository) { @Transactional public void deleteMeeting(final long memberId, final long meetingId) { MeetingJpaEntity meetingJpaEntity = meetingRepository.getById(meetingId); - long hostId = meetingRepository.findHostIdByMeetingId(meetingId); + long hostId = meetingRepository.getHostIdByMeetingId(meetingId); validateHostId(memberId, hostId); meetingRepository.delete(meetingJpaEntity); diff --git a/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingUpdater.java b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingUpdater.java new file mode 100644 index 00000000..8c56a5f5 --- /dev/null +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingUpdater.java @@ -0,0 +1,34 @@ +package moim_today.implement.meeting.meeting; + +import moim_today.dto.meeting.meeting.MeetingUpdateRequest; +import moim_today.global.annotation.Implement; +import moim_today.global.error.ForbiddenException; +import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; +import moim_today.persistence.repository.meeting.meeting.MeetingRepository; +import org.springframework.transaction.annotation.Transactional; + +import static moim_today.global.constant.exception.MeetingExceptionConstant.MEETING_FORBIDDEN_ERROR; + +@Implement +public class MeetingUpdater { + + private final MeetingRepository meetingRepository; + + public MeetingUpdater(final MeetingRepository meetingRepository) { + this.meetingRepository = meetingRepository; + } + + @Transactional + public void updateMeeting(final long memberId, final MeetingUpdateRequest meetingUpdateRequest) { + MeetingJpaEntity meetingJpaEntity = meetingRepository.getById(meetingUpdateRequest.meetingId()); + long hostId = meetingRepository.getHostIdByMeetingId(meetingUpdateRequest.meetingId()); + validateHostId(memberId, hostId); + meetingJpaEntity.updateMeeting(meetingUpdateRequest.agenda(), meetingUpdateRequest.place()); + } + + private void validateHostId(final long memberId, final long hostId) { + if (memberId != hostId) { + throw new ForbiddenException(MEETING_FORBIDDEN_ERROR.message()); + } + } +} diff --git a/backend/src/main/java/moim_today/persistence/entity/meeting/meeting/MeetingJpaEntity.java b/backend/src/main/java/moim_today/persistence/entity/meeting/meeting/MeetingJpaEntity.java index 802f63cb..c5a8e21a 100644 --- a/backend/src/main/java/moim_today/persistence/entity/meeting/meeting/MeetingJpaEntity.java +++ b/backend/src/main/java/moim_today/persistence/entity/meeting/meeting/MeetingJpaEntity.java @@ -40,4 +40,9 @@ private MeetingJpaEntity(final long moimId, final String agenda, final LocalDate this.endDateTime = endDateTime; this.place = place; } + + public void updateMeeting(final String agenda, final String place) { + this.agenda = agenda; + this.place = place; + } } diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepository.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepository.java index fe5ddd48..888ffd6a 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepository.java @@ -17,7 +17,7 @@ public interface MeetingRepository { List findAllPastByMoimId(final long moimId, final long memberId, final LocalDateTime currentDateTime); - long findHostIdByMeetingId(final long meetingId); + long getHostIdByMeetingId(final long meetingId); List findUpcomingNotices(final LocalDateTime currentDateTime); diff --git a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java index 103f5439..334106d0 100644 --- a/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/meeting/meeting/MeetingRepositoryImpl.java @@ -107,11 +107,12 @@ public List findAllPastByMoimId(final long moimId, final long } @Override - public long findHostIdByMeetingId(final long meetingId) { + public long getHostIdByMeetingId(final long meetingId) { return queryFactory.select(moimJpaEntity.memberId) .from(meetingJpaEntity) .join(moimJpaEntity).on(moimJpaEntity.id.eq(meetingJpaEntity.moimId)) - .fetchFirst(); + .stream().findAny() + .orElseThrow(() -> new NotFoundException(MEETING_NOT_FOUND_ERROR.message())); } @Override diff --git a/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java b/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java index 89415f52..1e137562 100644 --- a/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java +++ b/backend/src/main/java/moim_today/presentation/meeting/meeting/MeetingController.java @@ -3,10 +3,7 @@ import moim_today.application.meeting.meeting.MeetingService; import moim_today.domain.meeting.enums.MeetingStatus; import moim_today.domain.member.MemberSession; -import moim_today.dto.meeting.MeetingCreateResponse; -import moim_today.dto.meeting.meeting.MeetingCreateRequest; -import moim_today.dto.meeting.meeting.MeetingDetailResponse; -import moim_today.dto.meeting.meeting.MeetingSimpleResponse; +import moim_today.dto.meeting.meeting.*; import moim_today.global.annotation.Login; import moim_today.global.response.CollectionResponse; import org.springframework.web.bind.annotation.*; @@ -46,6 +43,12 @@ public MeetingDetailResponse findDetailsByMoimId(@PathVariable final long meetin return meetingService.findDetailsById(meetingId); } + @PatchMapping + public void updateMeeting(@Login final MemberSession memberSession, + @RequestBody final MeetingUpdateRequest meetingUpdateRequest) { + meetingService.updateMeeting(memberSession.id(), meetingUpdateRequest); + } + @DeleteMapping("/{meetingId}") public void deleteMeeting(@Login final MemberSession memberSession, @PathVariable final long meetingId) { diff --git a/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java b/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java index 291b5d3d..802f93dc 100644 --- a/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java +++ b/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java @@ -2,10 +2,7 @@ import moim_today.application.meeting.meeting.MeetingService; import moim_today.domain.meeting.enums.MeetingStatus; -import moim_today.dto.meeting.MeetingCreateResponse; -import moim_today.dto.meeting.meeting.MeetingCreateRequest; -import moim_today.dto.meeting.meeting.MeetingDetailResponse; -import moim_today.dto.meeting.meeting.MeetingSimpleResponse; +import moim_today.dto.meeting.meeting.*; import moim_today.dto.member.MemberSimpleResponse; import moim_today.global.error.ForbiddenException; @@ -80,6 +77,11 @@ public MeetingDetailResponse findDetailsById(final long meetingId) { .build(); } + @Override + public void updateMeeting(final long memberId, final MeetingUpdateRequest meetingUpdateRequest) { + + } + @Override public void deleteMeeting(final long memberId, final long meetingId) { if (meetingId != MEETING_ID.longValue()) { diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java index 458bf0c9..803e12e2 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java @@ -1,7 +1,7 @@ package moim_today.implement.meeting.meeting; import moim_today.domain.meeting.enums.MeetingCategory; -import moim_today.dto.meeting.MeetingCreateResponse; +import moim_today.dto.meeting.meeting.MeetingCreateResponse; import moim_today.dto.meeting.meeting.MeetingCreateRequest; import moim_today.persistence.entity.member.MemberJpaEntity; import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; From 90cf9f197f6277590c9357f33443d8c2bacd69db Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Wed, 22 May 2024 15:45:48 +0900 Subject: [PATCH 57/60] =?UTF-8?q?[BE]=20test=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/meeting/MeetingServiceImpl.java | 1 + .../meeting/meeting/MeetingUpdateRequest.java | 10 ++ .../meeting/meeting/FakeMeetingService.java | 5 +- .../meeting/meeting/MeetingUpdaterTest.java | 93 +++++++++++++++++++ .../meeting/meeting/MeetingJpaEntityTest.java | 33 +++++++ .../meeting/MeetingControllerTest.java | 62 +++++++++++++ 6 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 backend/src/test/java/moim_today/implement/meeting/meeting/MeetingUpdaterTest.java create mode 100644 backend/src/test/java/moim_today/persistence/entity/meeting/meeting/MeetingJpaEntityTest.java diff --git a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java index a65ad131..705a4d47 100644 --- a/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/meeting/MeetingServiceImpl.java @@ -8,6 +8,7 @@ import moim_today.implement.meeting.meeting.MeetingManager; import moim_today.implement.meeting.meeting.MeetingRemover; import moim_today.implement.meeting.meeting.MeetingUpdater; +import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingUpdateRequest.java b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingUpdateRequest.java index 2e35b67a..daccc4f5 100644 --- a/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingUpdateRequest.java +++ b/backend/src/main/java/moim_today/dto/meeting/meeting/MeetingUpdateRequest.java @@ -1,9 +1,19 @@ package moim_today.dto.meeting.meeting; +import lombok.Builder; +@Builder public record MeetingUpdateRequest( long meetingId, String agenda, String place ) { + + public static MeetingUpdateRequest of(final long meetingId, final String agenda, final String place) { + return MeetingUpdateRequest.builder() + .meetingId(meetingId) + .agenda(agenda) + .place(place) + .build(); + } } diff --git a/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java b/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java index 802f93dc..1beba52d 100644 --- a/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java +++ b/backend/src/test/java/moim_today/fake_class/meeting/meeting/FakeMeetingService.java @@ -5,6 +5,7 @@ import moim_today.dto.meeting.meeting.*; import moim_today.dto.member.MemberSimpleResponse; import moim_today.global.error.ForbiddenException; +import moim_today.util.TestConstant; import java.time.LocalDate; import java.time.LocalDateTime; @@ -79,7 +80,9 @@ public MeetingDetailResponse findDetailsById(final long meetingId) { @Override public void updateMeeting(final long memberId, final MeetingUpdateRequest meetingUpdateRequest) { - + if (meetingUpdateRequest.meetingId() != MEETING_ID.longValue()) { + throw new ForbiddenException(MEETING_FORBIDDEN_ERROR.message()); + } } @Override diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingUpdaterTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingUpdaterTest.java new file mode 100644 index 00000000..723b1d71 --- /dev/null +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingUpdaterTest.java @@ -0,0 +1,93 @@ +package moim_today.implement.meeting.meeting; + +import moim_today.dto.meeting.meeting.MeetingUpdateRequest; +import moim_today.global.error.ForbiddenException; +import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; +import moim_today.persistence.entity.moim.moim.MoimJpaEntity; +import moim_today.util.ImplementTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static moim_today.global.constant.exception.MeetingExceptionConstant.MEETING_FORBIDDEN_ERROR; +import static moim_today.util.TestConstant.*; +import static org.assertj.core.api.Assertions.*; + + +class MeetingUpdaterTest extends ImplementTest { + + @Autowired + protected MeetingUpdater meetingUpdater; + + @DisplayName("미팅 정보를 업데이트한다.") + @Test + void updateMeeting() { + // given 1 + long memberId = MEMBER_ID.longValue(); + + MoimJpaEntity moimJpaEntity = MoimJpaEntity.builder() + .memberId(memberId) + .build(); + + moimRepository.save(moimJpaEntity); + + // given 2 + MeetingJpaEntity meetingJpaEntity = MeetingJpaEntity.builder() + .moimId(moimJpaEntity.getId()) + .agenda(MEETING_AGENDA.value()) + .place(MEETING_PLACE.value()) + .build(); + + meetingRepository.save(meetingJpaEntity); + + // given 3 + String newAgenda = "newAgenda"; + String newPlace = "newPlace"; + + MeetingUpdateRequest meetingUpdateRequest = + MeetingUpdateRequest.of(meetingJpaEntity.getId(), newAgenda, newPlace); + + // when + meetingUpdater.updateMeeting(memberId, meetingUpdateRequest); + + // then + MeetingJpaEntity findEntity = meetingRepository.getById(meetingJpaEntity.getId()); + assertThat(findEntity.getAgenda()).isEqualTo(newAgenda); + assertThat(findEntity.getPlace()).isEqualTo(newPlace); + } + + @DisplayName("해당 미팅 생성자가 아니면 미팅을 수정할 수 없다.") + @Test + void updateMeetingFail() { + // given 1 + long memberId = MEMBER_ID.longValue(); + long otherMemberId = 9999L; + + MoimJpaEntity moimJpaEntity = MoimJpaEntity.builder() + .memberId(memberId) + .build(); + + moimRepository.save(moimJpaEntity); + + // given 2 + MeetingJpaEntity meetingJpaEntity = MeetingJpaEntity.builder() + .moimId(moimJpaEntity.getId()) + .agenda(MEETING_AGENDA.value()) + .place(MEETING_PLACE.value()) + .build(); + + meetingRepository.save(meetingJpaEntity); + + // given 3 + String newAgenda = "newAgenda"; + String newPlace = "newPlace"; + + MeetingUpdateRequest meetingUpdateRequest = + MeetingUpdateRequest.of(meetingJpaEntity.getId(), newAgenda, newPlace); + + // when && then + assertThatThrownBy(() -> meetingUpdater.updateMeeting(otherMemberId, meetingUpdateRequest)) + .isInstanceOf(ForbiddenException.class) + .hasMessage(MEETING_FORBIDDEN_ERROR.message()); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/persistence/entity/meeting/meeting/MeetingJpaEntityTest.java b/backend/src/test/java/moim_today/persistence/entity/meeting/meeting/MeetingJpaEntityTest.java new file mode 100644 index 00000000..ac42dd0c --- /dev/null +++ b/backend/src/test/java/moim_today/persistence/entity/meeting/meeting/MeetingJpaEntityTest.java @@ -0,0 +1,33 @@ +package moim_today.persistence.entity.meeting.meeting; + +import moim_today.persistence.entity.moim.moim.MoimJpaEntity; +import moim_today.util.TestConstant; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static moim_today.util.TestConstant.*; +import static org.assertj.core.api.Assertions.*; + + +class MeetingJpaEntityTest { + + @DisplayName("미팅 정보를 수정한다.") + @Test + void updateMeeting() { + // given + MeetingJpaEntity meetingJpaEntity = MeetingJpaEntity.builder() + .agenda(MEETING_AGENDA.value()) + .place(MEETING_PLACE.value()) + .build(); + + String newAgenda = "newAgenda"; + String newPlace = "newPlace"; + + // when + meetingJpaEntity.updateMeeting(newAgenda, newPlace); + + // then + assertThat(meetingJpaEntity.getAgenda()).isEqualTo(newAgenda); + assertThat(meetingJpaEntity.getPlace()).isEqualTo(newPlace); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/presentation/meeting/meeting/MeetingControllerTest.java b/backend/src/test/java/moim_today/presentation/meeting/meeting/MeetingControllerTest.java index 31a89f43..5c4973cd 100644 --- a/backend/src/test/java/moim_today/presentation/meeting/meeting/MeetingControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/meeting/meeting/MeetingControllerTest.java @@ -5,9 +5,11 @@ import moim_today.domain.meeting.enums.MeetingCategory; import moim_today.domain.meeting.enums.MeetingStatus; import moim_today.dto.meeting.meeting.MeetingCreateRequest; +import moim_today.dto.meeting.meeting.MeetingUpdateRequest; import moim_today.fake_class.meeting.meeting.FakeMeetingService; import moim_today.util.ControllerTest; import moim_today.util.EnumDocsUtils; +import moim_today.util.TestConstant; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -226,6 +228,66 @@ void findDetailsById() throws Exception { ))); } + @DisplayName("미팅 정보를 수정한다.") + @Test + void updateMeeting() throws Exception { + MeetingUpdateRequest meetingUpdateRequest = MeetingUpdateRequest.builder() + .meetingId(MEETING_ID.longValue()) + .agenda(MEETING_AGENDA.value()) + .place(MEETING_PLACE.value()) + .build(); + + String json = objectMapper.writeValueAsString(meetingUpdateRequest); + + mockMvc.perform( + patch("/api/meetings") + .contentType(APPLICATION_JSON) + .content(json) + ) + .andExpect(status().isOk()) + .andDo(document("미팅 정보 수정 성공", + resource(ResourceSnippetParameters.builder() + .tag("미팅") + .summary("미팅 정보 수정") + .requestFields( + fieldWithPath("meetingId").type(NUMBER).description("미팅 id"), + fieldWithPath("agenda").type(STRING).description("미팅 의제"), + fieldWithPath("place").type(STRING).description("미팅 장소") + ) + .build() + ))); + } + + @DisplayName("해당 미팅의 주최자가 아닌 사람은 미팅을 수정할 수 없다.") + @Test + void updateMeetingFail() throws Exception { + MeetingUpdateRequest meetingUpdateRequest = MeetingUpdateRequest.builder() + .meetingId(9999L) + .agenda(MEETING_AGENDA.value()) + .place(MEETING_PLACE.value()) + .build(); + + String json = objectMapper.writeValueAsString(meetingUpdateRequest); + + mockMvc.perform( + patch("/api/meetings") + .contentType(APPLICATION_JSON) + .content(json) + ) + .andExpect(status().isForbidden()) + .andDo(document("미팅 수정 실패 - 주최자가 아님", + resource(ResourceSnippetParameters.builder() + .tag("미팅") + .summary("미팅 정보 수정") + .requestFields( + fieldWithPath("meetingId").type(NUMBER).description("미팅 id"), + fieldWithPath("agenda").type(STRING).description("미팅 의제"), + fieldWithPath("place").type(STRING).description("미팅 장소") + ) + .build() + ))); + } + @DisplayName("미팅을 삭제한다.") @Test void deleteMeeting() throws Exception { From 3f54c6b5e9c0c9b59e9a1fc9c44213ead522977e Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Thu, 23 May 2024 11:04:03 +0900 Subject: [PATCH 58/60] =?UTF-8?q?[BE]=20test=20:=20=EC=8A=A4=EC=BC=80?= =?UTF-8?q?=EC=A4=84=20=EB=82=A0=EC=A7=9C=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schedule/ScheduleLocalDateTest.java | 44 +++++++++++++++++++ .../schedule/ScheduleYearMonthTest.java | 44 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 backend/src/test/java/moim_today/domain/schedule/ScheduleLocalDateTest.java create mode 100644 backend/src/test/java/moim_today/domain/schedule/ScheduleYearMonthTest.java diff --git a/backend/src/test/java/moim_today/domain/schedule/ScheduleLocalDateTest.java b/backend/src/test/java/moim_today/domain/schedule/ScheduleLocalDateTest.java new file mode 100644 index 00000000..f108a0ea --- /dev/null +++ b/backend/src/test/java/moim_today/domain/schedule/ScheduleLocalDateTest.java @@ -0,0 +1,44 @@ +package moim_today.domain.schedule; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +import static org.assertj.core.api.Assertions.assertThat; + +class ScheduleLocalDateTest { + + @DisplayName("날짜 정보를 입력받아 해당 날짜의 자정 시간으로 반환한다.") + @Test + void atWeeklyStartDateTime() { + // given + LocalDate localDate = LocalDate.of(2024, 3, 4); + ScheduleLocalDate scheduleLocalDate = ScheduleLocalDate.from(localDate); + + // when + LocalDateTime startDateTime = scheduleLocalDate.atWeeklyStartDateTime(); + + // then + assertThat(startDateTime).isEqualTo( + LocalDateTime.of(2024, 3, 4, 0, 0, 0) + ); + } + + @DisplayName("날짜 정보를 입력받아 해당 날짜의 7일 후의 자정전 시간으로 반환한다.") + @Test + void atWeeklyEndDateTime() { + // given + LocalDate localDate = LocalDate.of(2024, 3, 4); + ScheduleLocalDate scheduleLocalDate = ScheduleLocalDate.from(localDate); + + // when + LocalDateTime startDateTime = scheduleLocalDate.atWeeklyEndDateTime(); + + // then + assertThat(startDateTime).isEqualTo( + LocalDateTime.of(2024, 3, 10, 23, 59, 59, 999999999) + ); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/domain/schedule/ScheduleYearMonthTest.java b/backend/src/test/java/moim_today/domain/schedule/ScheduleYearMonthTest.java new file mode 100644 index 00000000..49b1a3e4 --- /dev/null +++ b/backend/src/test/java/moim_today/domain/schedule/ScheduleYearMonthTest.java @@ -0,0 +1,44 @@ +package moim_today.domain.schedule; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.time.YearMonth; + +import static org.assertj.core.api.Assertions.*; + +class ScheduleYearMonthTest { + + @DisplayName("당월 1일 자정 시간을 반환한다.") + @Test + void atMonthlyStartDateTime() { + // given + YearMonth yearMonth = YearMonth.of(2024, 3); + ScheduleYearMonth scheduleYearMonth = ScheduleYearMonth.from(yearMonth); + + // when + LocalDateTime startDateTime = scheduleYearMonth.atMonthlyStartDateTime(); + + // then + assertThat(startDateTime).isEqualTo( + LocalDateTime.of(2024, 3, 1, 0, 0, 0) + ); + } + + @DisplayName("다음달 1일 자정전 시간을 반환한다.") + @Test + void atMonthlyEndDateTime() { + // given + YearMonth yearMonth = YearMonth.of(2024, 3); + ScheduleYearMonth scheduleYearMonth = ScheduleYearMonth.from(yearMonth); + + // when + LocalDateTime startDateTime = scheduleYearMonth.atMonthlyEndDateTime(); + + // then + assertThat(startDateTime).isEqualTo( + LocalDateTime.of(2024, 3, 31, 23, 59, 59, 999999999) + ); + } +} \ No newline at end of file From 303a28364ad73065353dc8090f910393de06f2e4 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Thu, 23 May 2024 11:24:21 +0900 Subject: [PATCH 59/60] =?UTF-8?q?[BE]=20test=20:=20=EC=8A=A4=EC=BC=80?= =?UTF-8?q?=EC=A4=84/=EA=B0=80=EC=9A=A9=EC=8B=9C=EA=B0=84=20=EC=83=89?= =?UTF-8?q?=EC=83=81=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/schedule/enums/ColorHex.java | 1 - .../schedule/enums/AvailableColorHexTest.java | 54 ++++++++++++++++++ .../domain/schedule/enums/ColorHexTest.java | 55 +++++++++++++++++++ 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 backend/src/test/java/moim_today/domain/schedule/enums/AvailableColorHexTest.java create mode 100644 backend/src/test/java/moim_today/domain/schedule/enums/ColorHexTest.java diff --git a/backend/src/main/java/moim_today/domain/schedule/enums/ColorHex.java b/backend/src/main/java/moim_today/domain/schedule/enums/ColorHex.java index 7393a2da..ca7a620b 100644 --- a/backend/src/main/java/moim_today/domain/schedule/enums/ColorHex.java +++ b/backend/src/main/java/moim_today/domain/schedule/enums/ColorHex.java @@ -24,7 +24,6 @@ public enum ColorHex { GRAY("#999999"), CORAL("#CC6666"); - private final String value; ColorHex(final String value) { diff --git a/backend/src/test/java/moim_today/domain/schedule/enums/AvailableColorHexTest.java b/backend/src/test/java/moim_today/domain/schedule/enums/AvailableColorHexTest.java new file mode 100644 index 00000000..3adf8e3b --- /dev/null +++ b/backend/src/test/java/moim_today/domain/schedule/enums/AvailableColorHexTest.java @@ -0,0 +1,54 @@ +package moim_today.domain.schedule.enums; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + + +class AvailableColorHexTest { + + @DisplayName("인덱스에 따른 각각의 색상 정보를 반환한다.") + @Test + void getHexByCount() { + // when + String hexByCount0 = AvailableColorHex.getHexByCount(0); + String hexByCount1 = AvailableColorHex.getHexByCount(1); + String hexByCount2 = AvailableColorHex.getHexByCount(2); + String hexByCount3 = AvailableColorHex.getHexByCount(3); + String hexByCount4 = AvailableColorHex.getHexByCount(4); + String hexByCount5 = AvailableColorHex.getHexByCount(5); + String hexByCount6 = AvailableColorHex.getHexByCount(6); + String hexByCount7 = AvailableColorHex.getHexByCount(7); + String hexByCount8 = AvailableColorHex.getHexByCount(8); + String hexByCount9 = AvailableColorHex.getHexByCount(9); + String hexByCount10 = AvailableColorHex.getHexByCount(10); + + // then + assertThat(hexByCount0).isEqualTo(AvailableColorHex.WHITE.colorHex()); + assertThat(hexByCount1).isEqualTo(AvailableColorHex.VERY_LIGHT_RED.colorHex()); + assertThat(hexByCount2).isEqualTo(AvailableColorHex.LIGHT_RED.colorHex()); + assertThat(hexByCount3).isEqualTo(AvailableColorHex.PALE_RED.colorHex()); + assertThat(hexByCount4).isEqualTo(AvailableColorHex.SALMON.colorHex()); + assertThat(hexByCount5).isEqualTo(AvailableColorHex.CORAL.colorHex()); + assertThat(hexByCount6).isEqualTo(AvailableColorHex.BRIGHT_RED.colorHex()); + assertThat(hexByCount7).isEqualTo(AvailableColorHex.CRIMSON.colorHex()); + assertThat(hexByCount8).isEqualTo(AvailableColorHex.DARK_RED.colorHex()); + assertThat(hexByCount9).isEqualTo(AvailableColorHex.DEEP_RED.colorHex()); + assertThat(hexByCount10).isEqualTo(AvailableColorHex.VERY_DARK_RED.colorHex()); + } + + @DisplayName("인덱스가 색상의 개수인 10을 넘어가면 가장 마지막 색상을 반환한다.") + @Test + void getHexByCountOverIndex() { + // when + String hexByCount11 = AvailableColorHex.getHexByCount(11); + String hexByCount12 = AvailableColorHex.getHexByCount(12); + String hexByCount13 = AvailableColorHex.getHexByCount(13); + + // then + assertThat(hexByCount11).isEqualTo(AvailableColorHex.VERY_DARK_RED.colorHex()); + assertThat(hexByCount12).isEqualTo(AvailableColorHex.VERY_DARK_RED.colorHex()); + assertThat(hexByCount13).isEqualTo(AvailableColorHex.VERY_DARK_RED.colorHex()); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/domain/schedule/enums/ColorHexTest.java b/backend/src/test/java/moim_today/domain/schedule/enums/ColorHexTest.java new file mode 100644 index 00000000..aa9c476b --- /dev/null +++ b/backend/src/test/java/moim_today/domain/schedule/enums/ColorHexTest.java @@ -0,0 +1,55 @@ +package moim_today.domain.schedule.enums; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.*; + +class ColorHexTest { + + @DisplayName("인덱스에 따른 각각의 색상 정보를 반환한다.") + @Test + void getHexByCount() { + // when + ColorHex hexByCount0 = ColorHex.getHexByCount(0); + ColorHex hexByCount1 = ColorHex.getHexByCount(1); + ColorHex hexByCount2 = ColorHex.getHexByCount(2); + ColorHex hexByCount3 = ColorHex.getHexByCount(3); + ColorHex hexByCount4 = ColorHex.getHexByCount(4); + ColorHex hexByCount5 = ColorHex.getHexByCount(5); + + ColorHex hexByCount20 = ColorHex.getHexByCount(19); + + // then + assertThat(hexByCount0).isEqualTo(ColorHex.RED); + assertThat(hexByCount1).isEqualTo(ColorHex.GREEN); + assertThat(hexByCount2).isEqualTo(ColorHex.BLUE); + assertThat(hexByCount3).isEqualTo(ColorHex.YELLOW); + assertThat(hexByCount4).isEqualTo(ColorHex.MAGENTA); + assertThat(hexByCount5).isEqualTo(ColorHex.PURPLE); + + assertThat(hexByCount20).isEqualTo(ColorHex.CORAL); + } + + @DisplayName("인덱스가 색상의 개수인 20을 넘어가면 처음 인덱스에서 다시 시작한다.") + @Test + void getHexByCountOverIndex() { + // when + ColorHex hexByCount21 = ColorHex.getHexByCount(20); + ColorHex hexByCount22 = ColorHex.getHexByCount(21); + ColorHex hexByCount23 = ColorHex.getHexByCount(22); + ColorHex hexByCount24 = ColorHex.getHexByCount(23); + ColorHex hexByCount25 = ColorHex.getHexByCount(24); + + ColorHex hexByCount41 = ColorHex.getHexByCount(40); + + // then + assertThat(hexByCount21).isEqualTo(ColorHex.RED); + assertThat(hexByCount22).isEqualTo(ColorHex.GREEN); + assertThat(hexByCount23).isEqualTo(ColorHex.BLUE); + assertThat(hexByCount24).isEqualTo(ColorHex.YELLOW); + assertThat(hexByCount25).isEqualTo(ColorHex.MAGENTA); + + assertThat(hexByCount41).isEqualTo(ColorHex.RED); + } +} \ No newline at end of file From e2b2d5ea1ad4125fccf8228795fe045c80a4d927 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Thu, 23 May 2024 11:42:07 +0900 Subject: [PATCH 60/60] =?UTF-8?q?[BE]=20test=20:=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=EC=84=B8=EC=85=98=20=EC=83=9D=EC=84=B1/=EA=B2=80?= =?UTF-8?q?=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/MemberSessionTest.java | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 backend/src/test/java/moim_today/domain/member/MemberSessionTest.java diff --git a/backend/src/test/java/moim_today/domain/member/MemberSessionTest.java b/backend/src/test/java/moim_today/domain/member/MemberSessionTest.java new file mode 100644 index 00000000..5568cb3c --- /dev/null +++ b/backend/src/test/java/moim_today/domain/member/MemberSessionTest.java @@ -0,0 +1,109 @@ +package moim_today.domain.member; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpSession; +import moim_today.dto.auth.MemberSessionValidateResponse; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.mock.web.MockHttpServletRequest; + +import static moim_today.global.constant.MemberSessionConstant.MEMBER_SESSION; +import static moim_today.util.TestConstant.*; +import static org.assertj.core.api.Assertions.*; + + +class MemberSessionTest { + + @DisplayName("세션 정보를 생성한다.") + @Test + void setSession() throws JsonProcessingException { + // given + MemberSession memberSession = new MemberSession( + MEMBER_ID.longValue(), + UNIV_ID.longValue(), + DEPARTMENT_ID.longValue(), + USERNAME.value(), + PROFILE_IMAGE_URL.value() + ); + + ObjectMapper objectMapper = new ObjectMapper(); + MockHttpServletRequest request = new MockHttpServletRequest(); + String memberSessionJson = objectMapper.writeValueAsString(memberSession); + + // when + memberSession.setSession(request, memberSessionJson, true); + + // then + HttpSession session = request.getSession(false); + assertThat(session).isNotNull(); + } + + @DisplayName("세션에 있는 정보가 일치하는지 확인한다.") + @Test + void setSessionCorrect() throws JsonProcessingException { + // given + MemberSession memberSession = new MemberSession( + MEMBER_ID.longValue(), + UNIV_ID.longValue(), + DEPARTMENT_ID.longValue(), + USERNAME.value(), + PROFILE_IMAGE_URL.value() + ); + + ObjectMapper objectMapper = new ObjectMapper(); + MockHttpServletRequest request = new MockHttpServletRequest(); + String memberSessionJson = objectMapper.writeValueAsString(memberSession); + + // when + memberSession.setSession(request, memberSessionJson, true); + HttpSession session = request.getSession(false); + assert session != null; + String sessionAttribute = (String) session.getAttribute(MEMBER_SESSION.value()); + MemberSession findSession = objectMapper.readValue(sessionAttribute, MemberSession.class); + + // then + assertThat(findSession.id()).isEqualTo(MEMBER_ID.longValue()); + assertThat(findSession.universityId()).isEqualTo(UNIV_ID.longValue()); + assertThat(findSession.departmentId()).isEqualTo(DEPARTMENT_ID.longValue()); + assertThat(findSession.username()).isEqualTo(USERNAME.value()); + assertThat(findSession.memberProfileImageUrl()).isEqualTo(PROFILE_IMAGE_URL.value()); + } + + @DisplayName("세션이 존재하면 true를 반환한다.") + @Test + void validateMemberSession() throws JsonProcessingException { + // given + MemberSession memberSession = new MemberSession( + MEMBER_ID.longValue(), + UNIV_ID.longValue(), + DEPARTMENT_ID.longValue(), + USERNAME.value(), + PROFILE_IMAGE_URL.value() + ); + + ObjectMapper objectMapper = new ObjectMapper(); + MockHttpServletRequest request = new MockHttpServletRequest(); + String memberSessionJson = objectMapper.writeValueAsString(memberSession); + memberSession.setSession(request, memberSessionJson, true); + + // when + MemberSessionValidateResponse memberSessionValidateResponse = MemberSession.validateMemberSession(request); + + // then + assertThat(memberSessionValidateResponse.isValidateMemberSession()).isTrue(); + } + + @DisplayName("세션이 존재하지 않으면 false 반환한다.") + @Test + void validateMemberSessionFail() { + // given + MockHttpServletRequest request = new MockHttpServletRequest(); + + // when + MemberSessionValidateResponse memberSessionValidateResponse = MemberSession.validateMemberSession(request); + + // then + assertThat(memberSessionValidateResponse.isValidateMemberSession()).isFalse(); + } +} \ No newline at end of file