From ba7bf664e0669b9fca36e4014b956a95ba0e2190 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Thu, 2 May 2024 18:39:08 +0900 Subject: [PATCH 01/13] =?UTF-8?q?[BE]=20feat=20:=20=EB=8B=A8=EC=9D=BC=20?= =?UTF-8?q?=EB=AF=B8=ED=8C=85=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/meeting/MeetingService.java | 8 +++++ .../meeting/MeetingServiceImpl.java | 20 ++++++++++++ .../moim_today/domain/meeting/Meeting.java | 15 +++++++++ .../domain/meeting/enums/MeetingCategory.java | 6 ++++ .../dto/meeting/MeetingCreateRequest.java | 31 +++++++++++++++++++ .../meeting/meeting/MeetingAppender.java | 28 +++++++++++++++++ .../meeting/meeting/MeetingJpaEntity.java | 11 +++---- .../meeting/MeetingController.java | 24 ++++++++++++++ 8 files changed, 137 insertions(+), 6 deletions(-) create mode 100644 backend/src/main/java/moim_today/application/meeting/MeetingService.java create mode 100644 backend/src/main/java/moim_today/application/meeting/MeetingServiceImpl.java create mode 100644 backend/src/main/java/moim_today/domain/meeting/Meeting.java create mode 100644 backend/src/main/java/moim_today/domain/meeting/enums/MeetingCategory.java create mode 100644 backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java create mode 100644 backend/src/main/java/moim_today/implement/meeting/meeting/MeetingAppender.java create mode 100644 backend/src/main/java/moim_today/presentation/meeting/MeetingController.java diff --git a/backend/src/main/java/moim_today/application/meeting/MeetingService.java b/backend/src/main/java/moim_today/application/meeting/MeetingService.java new file mode 100644 index 00000000..1cf4cc3c --- /dev/null +++ b/backend/src/main/java/moim_today/application/meeting/MeetingService.java @@ -0,0 +1,8 @@ +package moim_today.application.meeting; + +import moim_today.dto.meeting.MeetingCreateRequest; + +public interface MeetingService { + + void createMeeting(final MeetingCreateRequest meetingCreateRequest); +} diff --git a/backend/src/main/java/moim_today/application/meeting/MeetingServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/MeetingServiceImpl.java new file mode 100644 index 00000000..361e33af --- /dev/null +++ b/backend/src/main/java/moim_today/application/meeting/MeetingServiceImpl.java @@ -0,0 +1,20 @@ +package moim_today.application.meeting; + +import moim_today.dto.meeting.MeetingCreateRequest; +import moim_today.implement.meeting.meeting.MeetingAppender; +import org.springframework.stereotype.Service; + +@Service +public class MeetingServiceImpl implements MeetingService { + + private final MeetingAppender meetingAppender; + + public MeetingServiceImpl(final MeetingAppender meetingAppender) { + this.meetingAppender = meetingAppender; + } + + @Override + public void createMeeting(final MeetingCreateRequest meetingCreateRequest) { + meetingAppender.createMeeting(meetingCreateRequest); + } +} diff --git a/backend/src/main/java/moim_today/domain/meeting/Meeting.java b/backend/src/main/java/moim_today/domain/meeting/Meeting.java new file mode 100644 index 00000000..aa4946ad --- /dev/null +++ b/backend/src/main/java/moim_today/domain/meeting/Meeting.java @@ -0,0 +1,15 @@ +package moim_today.domain.meeting; + +import moim_today.domain.meeting.enums.MeetingCategory; + +import java.time.LocalDateTime; + +public record Meeting( + long moimId, + String agenda, + LocalDateTime startDateTime, + LocalDateTime endDateTime, + String place, + MeetingCategory meetingCategory +) { +} diff --git a/backend/src/main/java/moim_today/domain/meeting/enums/MeetingCategory.java b/backend/src/main/java/moim_today/domain/meeting/enums/MeetingCategory.java new file mode 100644 index 00000000..8d1dbe63 --- /dev/null +++ b/backend/src/main/java/moim_today/domain/meeting/enums/MeetingCategory.java @@ -0,0 +1,6 @@ +package moim_today.domain.meeting.enums; + +public enum MeetingCategory { + + SINGLE, REGULAR +} diff --git a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java b/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java new file mode 100644 index 00000000..f8697584 --- /dev/null +++ b/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java @@ -0,0 +1,31 @@ +package moim_today.dto.meeting; + +import com.fasterxml.jackson.annotation.JsonFormat; +import moim_today.domain.meeting.enums.MeetingCategory; +import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; + +import java.time.LocalDateTime; + +public record MeetingCreateRequest( + long moimId, + 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 MeetingJpaEntity toEntity() { + return MeetingJpaEntity.builder() + .moimId(moimId) + .agenda(agenda) + .startDateTime(startDateTime) + .endDateTime(endDateTime) + .place(place) + .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 new file mode 100644 index 00000000..7e53a249 --- /dev/null +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingAppender.java @@ -0,0 +1,28 @@ +package moim_today.implement.meeting.meeting; + +import moim_today.domain.meeting.enums.MeetingCategory; +import moim_today.dto.meeting.MeetingCreateRequest; +import moim_today.global.annotation.Implement; +import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; +import moim_today.persistence.repository.meeting.meeting.MeetingRepository; +import org.springframework.transaction.annotation.Transactional; + +@Implement +public class MeetingAppender { + + private final MeetingRepository meetingRepository; + + public MeetingAppender(final MeetingRepository meetingRepository) { + this.meetingRepository = meetingRepository; + } + + @Transactional + public void createMeeting(final MeetingCreateRequest meetingCreateRequest) { + MeetingCategory meetingCategory = meetingCreateRequest.meetingCategory(); + + if (meetingCategory.equals(MeetingCategory.SINGLE)) { + MeetingJpaEntity meetingJpaEntity = meetingCreateRequest.toEntity(); + meetingRepository.save(meetingJpaEntity); + } + } +} 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 d9917f6b..802f63cb 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 @@ -20,25 +20,24 @@ public class MeetingJpaEntity extends BaseTimeEntity { @Association private long moimId; - @Association - private long memberId; - private String agenda; private LocalDateTime startDateTime; private LocalDateTime endDateTime; + private String place; + protected MeetingJpaEntity() { } @Builder - private MeetingJpaEntity(final long moimId, final long memberId, final String agenda, - final LocalDateTime startDateTime, final LocalDateTime endDateTime) { + private MeetingJpaEntity(final long moimId, final String agenda, final LocalDateTime startDateTime, + final LocalDateTime endDateTime, final String place) { this.moimId = moimId; - this.memberId = memberId; this.agenda = agenda; this.startDateTime = startDateTime; this.endDateTime = endDateTime; + this.place = place; } } diff --git a/backend/src/main/java/moim_today/presentation/meeting/MeetingController.java b/backend/src/main/java/moim_today/presentation/meeting/MeetingController.java new file mode 100644 index 00000000..708ac124 --- /dev/null +++ b/backend/src/main/java/moim_today/presentation/meeting/MeetingController.java @@ -0,0 +1,24 @@ +package moim_today.presentation.meeting; + +import moim_today.application.meeting.MeetingService; +import moim_today.dto.meeting.MeetingCreateRequest; +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/meetings") +@RestController +public class MeetingController { + + private final MeetingService meetingService; + + public MeetingController(final MeetingService meetingService) { + this.meetingService = meetingService; + } + + @PostMapping + public void createMeeting(@RequestBody final MeetingCreateRequest meetingCreateRequest) { + meetingService.createMeeting(meetingCreateRequest); + } +} From 5679bab00458c51f0e374cb57d60632b87c5f920 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Thu, 2 May 2024 18:52:57 +0900 Subject: [PATCH 02/13] =?UTF-8?q?[BE]=20test=20:=20=EB=8B=A8=EC=9D=BC=20?= =?UTF-8?q?=EB=AF=B8=ED=8C=85=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/meeting/MeetingCreateRequest.java | 2 + .../exception/MeetingExceptionConstant.java | 16 +++++ .../meeting/meeting/MeetingRepository.java | 4 ++ .../meeting/MeetingRepositoryImpl.java | 14 ++++ .../meeting/FakeMeetingService.java | 12 ++++ .../meeting/meeting/MeetingAppenderTest.java | 42 ++++++++++++ .../meeting/MeetingControllerTest.java | 68 +++++++++++++++++++ .../java/moim_today/util/TestConstant.java | 2 + 8 files changed, 160 insertions(+) create mode 100644 backend/src/main/java/moim_today/global/constant/exception/MeetingExceptionConstant.java create mode 100644 backend/src/test/java/moim_today/fake_class/meeting/FakeMeetingService.java create mode 100644 backend/src/test/java/moim_today/implement/meeting/meeting/MeetingAppenderTest.java create mode 100644 backend/src/test/java/moim_today/presentation/meeting/MeetingControllerTest.java diff --git a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java b/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java index f8697584..54058c72 100644 --- a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java +++ b/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java @@ -1,11 +1,13 @@ package moim_today.dto.meeting; import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Builder; import moim_today.domain.meeting.enums.MeetingCategory; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import java.time.LocalDateTime; +@Builder public record MeetingCreateRequest( long moimId, String agenda, 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 new file mode 100644 index 00000000..a9cbcbf8 --- /dev/null +++ b/backend/src/main/java/moim_today/global/constant/exception/MeetingExceptionConstant.java @@ -0,0 +1,16 @@ +package moim_today.global.constant.exception; + +public enum MeetingExceptionConstant { + + MEETING_NOT_FOUND_ERROR("미팅이 존재하지 않습니다."); + + private final String message; + + MeetingExceptionConstant(final String message) { + this.message = message; + } + + public String message() { + return message; + } +} 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 818c37d9..34a35831 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 @@ -8,5 +8,9 @@ public interface MeetingRepository { List findAllByMoimId(final long moimId); + MeetingJpaEntity getById(final long meetingId); + void save(final MeetingJpaEntity meetingJpaEntity); + + long count(); } 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 b2dc7b5d..cee69c05 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 @@ -1,12 +1,15 @@ package moim_today.persistence.repository.meeting.meeting; import com.querydsl.jpa.impl.JPAQueryFactory; +import moim_today.global.constant.exception.MeetingExceptionConstant; +import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import moim_today.persistence.entity.meeting.meeting.QMeetingJpaEntity; import org.springframework.stereotype.Repository; import java.util.List; +import static moim_today.global.constant.exception.MeetingExceptionConstant.*; import static moim_today.persistence.entity.meeting.meeting.QMeetingJpaEntity.*; @Repository @@ -30,8 +33,19 @@ public List findAllByMoimId(final long moimId) { .fetch(); } + @Override + public MeetingJpaEntity getById(final long meetingId) { + return meetingJpaRepository.findById(meetingId) + .orElseThrow(() -> new NotFoundException(MEETING_NOT_FOUND_ERROR.message())); + } + @Override public void save(final MeetingJpaEntity meetingJpaEntity) { meetingJpaRepository.save(meetingJpaEntity); } + + @Override + public long count() { + return meetingJpaRepository.count(); + } } diff --git a/backend/src/test/java/moim_today/fake_class/meeting/FakeMeetingService.java b/backend/src/test/java/moim_today/fake_class/meeting/FakeMeetingService.java new file mode 100644 index 00000000..04f82f3d --- /dev/null +++ b/backend/src/test/java/moim_today/fake_class/meeting/FakeMeetingService.java @@ -0,0 +1,12 @@ +package moim_today.fake_class.meeting; + +import moim_today.application.meeting.MeetingService; +import moim_today.dto.meeting.MeetingCreateRequest; + +public class FakeMeetingService implements MeetingService { + + @Override + public void createMeeting(final MeetingCreateRequest meetingCreateRequest) { + + } +} 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 new file mode 100644 index 00000000..827df7ee --- /dev/null +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingAppenderTest.java @@ -0,0 +1,42 @@ +package moim_today.implement.meeting.meeting; + +import moim_today.domain.meeting.enums.MeetingCategory; +import moim_today.dto.meeting.MeetingCreateRequest; +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.LocalDateTime; + +import static moim_today.util.TestConstant.MEETING_AGENDA; +import static moim_today.util.TestConstant.MEETING_PLACE; +import static org.assertj.core.api.Assertions.*; + +class MeetingAppenderTest extends ImplementTest { + + @Autowired + private MeetingAppender meetingAppender; + + @DisplayName("단일 미팅을 생성한다.") + @Test + void createMeeting() { + // given + long moimId = 1L; + + MeetingCreateRequest meetingCreateRequest = MeetingCreateRequest.builder() + .moimId(moimId) + .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.SINGLE) + .build(); + + // when + meetingAppender.createMeeting(meetingCreateRequest); + + // then + assertThat(meetingRepository.count()).isEqualTo(1); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/presentation/meeting/MeetingControllerTest.java b/backend/src/test/java/moim_today/presentation/meeting/MeetingControllerTest.java new file mode 100644 index 00000000..a2792459 --- /dev/null +++ b/backend/src/test/java/moim_today/presentation/meeting/MeetingControllerTest.java @@ -0,0 +1,68 @@ +package moim_today.presentation.meeting; + +import com.epages.restdocs.apispec.ResourceSnippetParameters; +import moim_today.application.meeting.MeetingService; +import moim_today.domain.meeting.enums.MeetingCategory; +import moim_today.dto.meeting.MeetingCreateRequest; +import moim_today.fake_class.meeting.FakeMeetingService; +import moim_today.util.ControllerTest; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; + +import static com.epages.restdocs.apispec.ResourceDocumentation.resource; +import static moim_today.util.TestConstant.*; +import static moim_today.util.TestConstant.MEETING_PLACE; +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.NUMBER; +import static org.springframework.restdocs.payload.JsonFieldType.STRING; +import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +class MeetingControllerTest extends ControllerTest { + + private final MeetingService meetingService = new FakeMeetingService(); + + @Override + protected Object initController() { + return new MeetingController(meetingService); + } + + @DisplayName("단일 미팅을 생성한다.") + @Test + void createMeeting() throws Exception { + MeetingCreateRequest meetingCreateRequest = MeetingCreateRequest.builder() + .moimId(1) + .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.SINGLE) + .build(); + + String json = objectMapper.writeValueAsString(meetingCreateRequest); + + mockMvc.perform(post("/api/meetings") + .contentType(APPLICATION_JSON) + .content(json) + ) + .andExpect(status().isOk()) + .andDo(document("단일 미팅 생성 성공", + resource(ResourceSnippetParameters.builder() + .tag("미팅") + .summary("단일 미팅 생성") + .requestFields( + fieldWithPath("moimId").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() + ))); + } +} \ 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 989d408a..1e44a77d 100644 --- a/backend/src/test/java/moim_today/util/TestConstant.java +++ b/backend/src/test/java/moim_today/util/TestConstant.java @@ -65,6 +65,8 @@ public enum TestConstant { //미팅 MEETING_ID("123"), + MEETING_AGENDA("meeting agenda"), + MEETING_PLACE("meeting place"), STATUS_CODE("200"), MESSAGE("message"), From 64a25a7f867136e4e24bc6eaf2414e6db42c4a98 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Thu, 2 May 2024 19:36:04 +0900 Subject: [PATCH 03/13] =?UTF-8?q?[BE]=20feat=20:=20=EC=A0=95=EA=B8=B0=20?= =?UTF-8?q?=EB=AF=B8=ED=8C=85=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/meeting/MeetingCreateRequest.java | 11 +++++ .../dto/moim/moim/MoimDateResponse.java | 15 +++++++ .../meeting/meeting/MeetingAppender.java | 43 ++++++++++++++++++- .../implement/moim/moim/MoimFinder.java | 6 +++ .../repository/moim/moim/MoimRepository.java | 3 ++ .../moim/moim/MoimRepositoryImpl.java | 21 ++++++++- 6 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 backend/src/main/java/moim_today/dto/moim/moim/MoimDateResponse.java diff --git a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java b/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java index 54058c72..de17d3c6 100644 --- a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java +++ b/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java @@ -5,6 +5,7 @@ import moim_today.domain.meeting.enums.MeetingCategory; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; +import java.time.DayOfWeek; import java.time.LocalDateTime; @Builder @@ -30,4 +31,14 @@ public MeetingJpaEntity toEntity() { .place(place) .build(); } + + public MeetingJpaEntity toEntity(final LocalDateTime startDateTime, final LocalDateTime endDateTime) { + return MeetingJpaEntity.builder() + .moimId(moimId) + .agenda(agenda) + .startDateTime(startDateTime) + .endDateTime(endDateTime) + .place(place) + .build(); + } } diff --git a/backend/src/main/java/moim_today/dto/moim/moim/MoimDateResponse.java b/backend/src/main/java/moim_today/dto/moim/moim/MoimDateResponse.java new file mode 100644 index 00000000..e31625f7 --- /dev/null +++ b/backend/src/main/java/moim_today/dto/moim/moim/MoimDateResponse.java @@ -0,0 +1,15 @@ +package moim_today.dto.moim.moim; + +import com.querydsl.core.annotations.QueryProjection; + +import java.time.LocalDate; + +public record MoimDateResponse( + LocalDate startDate, + LocalDate endDate +) { + + @QueryProjection + public MoimDateResponse { + } +} 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 7e53a249..5ea00534 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 @@ -2,18 +2,29 @@ import moim_today.domain.meeting.enums.MeetingCategory; import moim_today.dto.meeting.MeetingCreateRequest; +import moim_today.dto.moim.moim.MoimDateResponse; import moim_today.global.annotation.Implement; +import moim_today.implement.moim.moim.MoimFinder; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import moim_today.persistence.repository.meeting.meeting.MeetingRepository; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; + +import static moim_today.global.constant.TimeConstant.*; + + @Implement public class MeetingAppender { private final MeetingRepository meetingRepository; + private final MoimFinder moimFinder; - public MeetingAppender(final MeetingRepository meetingRepository) { + public MeetingAppender(final MeetingRepository meetingRepository, final MoimFinder moimFinder) { this.meetingRepository = meetingRepository; + this.moimFinder = moimFinder; } @Transactional @@ -21,7 +32,35 @@ public void createMeeting(final MeetingCreateRequest meetingCreateRequest) { MeetingCategory meetingCategory = meetingCreateRequest.meetingCategory(); if (meetingCategory.equals(MeetingCategory.SINGLE)) { - MeetingJpaEntity meetingJpaEntity = meetingCreateRequest.toEntity(); + createSingleMeeting(meetingCreateRequest); + + } else if (meetingCategory.equals(MeetingCategory.REGULAR)) { + createRegularMeeting(meetingCreateRequest); + } + } + + private void createSingleMeeting(final MeetingCreateRequest meetingCreateRequest) { + MeetingJpaEntity meetingJpaEntity = meetingCreateRequest.toEntity( + meetingCreateRequest.startDateTime(), + meetingCreateRequest.endDateTime() + ); + + meetingRepository.save(meetingJpaEntity); + } + + private void createRegularMeeting(final MeetingCreateRequest meetingCreateRequest) { + MoimDateResponse moimDateResponse = moimFinder.findMoimDate(meetingCreateRequest.moimId()); + LocalDate startDate = moimDateResponse.startDate(); + LocalDate endDate = moimDateResponse.endDate(); + + LocalTime startTime = meetingCreateRequest.startDateTime().toLocalTime(); + LocalTime endTime = meetingCreateRequest.endDateTime().toLocalTime(); + + 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); meetingRepository.save(meetingJpaEntity); } } 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 ab855911..055bf742 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 @@ -1,5 +1,6 @@ package moim_today.implement.moim.moim; +import moim_today.dto.moim.moim.MoimDateResponse; import moim_today.global.annotation.Implement; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; import moim_today.persistence.repository.moim.moim.MoimRepository; @@ -18,4 +19,9 @@ public MoimFinder(final MoimRepository moimRepository) { public MoimJpaEntity getById(final long moimId) { return moimRepository.getById(moimId); } + + @Transactional(readOnly = true) + public MoimDateResponse findMoimDate(final long moimId) { + return moimRepository.findMoimDate(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 176f5e42..e3761781 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 @@ -1,5 +1,6 @@ package moim_today.persistence.repository.moim.moim; +import moim_today.dto.moim.moim.MoimDateResponse; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; public interface MoimRepository { @@ -10,5 +11,7 @@ public interface MoimRepository { MoimJpaEntity getById(final long moimId); + MoimDateResponse findMoimDate(final long moimId); + void deleteById(final long moimId); } 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 5b047328..da40c733 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 @@ -1,18 +1,25 @@ package moim_today.persistence.repository.moim.moim; +import com.querydsl.jpa.impl.JPAQueryFactory; +import moim_today.dto.moim.moim.MoimDateResponse; +import moim_today.dto.moim.moim.QMoimDateResponse; import moim_today.global.error.NotFoundException; import moim_today.persistence.entity.moim.moim.MoimJpaEntity; import org.springframework.stereotype.Repository; import static moim_today.global.constant.exception.MoimExceptionConstant.MOIM_NOT_FOUND_ERROR; +import static moim_today.persistence.entity.moim.moim.QMoimJpaEntity.*; @Repository public class MoimRepositoryImpl implements MoimRepository { private final MoimJpaRepository moimJpaRepository; + private final JPAQueryFactory queryFactory; - public MoimRepositoryImpl(final MoimJpaRepository moimJpaRepository) { + public MoimRepositoryImpl(final MoimJpaRepository moimJpaRepository, + final JPAQueryFactory queryFactory) { this.moimJpaRepository = moimJpaRepository; + this.queryFactory = queryFactory; } @Override @@ -31,6 +38,18 @@ public MoimJpaEntity getById(final long moimId) { .orElseThrow(() -> new NotFoundException(MOIM_NOT_FOUND_ERROR.message())); } + @Override + public MoimDateResponse findMoimDate(final long moimId) { + return queryFactory.select( + new QMoimDateResponse( + moimJpaEntity.startDate, + moimJpaEntity.endDate + )) + .from(moimJpaEntity) + .where(moimJpaEntity.id.eq(moimId)) + .fetchOne(); + } + @Override public void deleteById(final long moimId) { moimJpaRepository.deleteById(moimId); From cf8e0416bbd679c16cbdfea5f21e3d9e7791825b Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Thu, 2 May 2024 19:59:39 +0900 Subject: [PATCH 04/13] =?UTF-8?q?[BE]=20test=20:=20=EC=A0=95=EA=B8=B0=20?= =?UTF-8?q?=EB=AF=B8=ED=8C=85=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/meeting/MeetingAppenderTest.java | 39 ++++++++++++++++++- .../meeting/MeetingControllerTest.java | 39 ++++++++++++++++++- 2 files changed, 75 insertions(+), 3 deletions(-) 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 827df7ee..a7d3a1bf 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 @@ -2,12 +2,15 @@ import moim_today.domain.meeting.enums.MeetingCategory; import moim_today.dto.meeting.MeetingCreateRequest; +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.time.LocalDateTime; +import java.time.temporal.ChronoUnit; import static moim_today.util.TestConstant.MEETING_AGENDA; import static moim_today.util.TestConstant.MEETING_PLACE; @@ -20,7 +23,7 @@ class MeetingAppenderTest extends ImplementTest { @DisplayName("단일 미팅을 생성한다.") @Test - void createMeeting() { + void createSingleMeeting() { // given long moimId = 1L; @@ -39,4 +42,38 @@ void createMeeting() { // then assertThat(meetingRepository.count()).isEqualTo(1); } + + @DisplayName("정기 미팅을 생성한다.") + @Test + void createRegularMeeting() { + // given 1 + long memberId = 1; + 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 + meetingAppender.createMeeting(meetingCreateRequest); + + // then + long between = ChronoUnit.WEEKS.between(startDate, endDate) + 1; + assertThat(meetingRepository.count()).isEqualTo(between); + } } \ No newline at end of file diff --git a/backend/src/test/java/moim_today/presentation/meeting/MeetingControllerTest.java b/backend/src/test/java/moim_today/presentation/meeting/MeetingControllerTest.java index a2792459..f544fbdd 100644 --- a/backend/src/test/java/moim_today/presentation/meeting/MeetingControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/meeting/MeetingControllerTest.java @@ -33,7 +33,7 @@ protected Object initController() { @DisplayName("단일 미팅을 생성한다.") @Test - void createMeeting() throws Exception { + void createSingleMeeting() throws Exception { MeetingCreateRequest meetingCreateRequest = MeetingCreateRequest.builder() .moimId(1) .agenda(MEETING_AGENDA.value()) @@ -53,7 +53,42 @@ void createMeeting() throws Exception { .andDo(document("단일 미팅 생성 성공", resource(ResourceSnippetParameters.builder() .tag("미팅") - .summary("단일 미팅 생성") + .summary("미팅 생성") + .requestFields( + fieldWithPath("moimId").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() + ))); + } + + @DisplayName("정기 미팅을 생성한다.") + @Test + void createRegularMeeting() throws Exception { + MeetingCreateRequest meetingCreateRequest = MeetingCreateRequest.builder() + .moimId(1) + .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(); + + String json = objectMapper.writeValueAsString(meetingCreateRequest); + + mockMvc.perform(post("/api/meetings") + .contentType(APPLICATION_JSON) + .content(json) + ) + .andExpect(status().isOk()) + .andDo(document("정기 미팅 생성 성공", + resource(ResourceSnippetParameters.builder() + .tag("미팅") + .summary("미팅 생성") .requestFields( fieldWithPath("moimId").type(NUMBER).description("모임 id"), fieldWithPath("agenda").type(STRING).description("미팅 의제"), From d3208f638cd32260bfff1010c9fa0d4799724021 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Thu, 2 May 2024 20:52:13 +0900 Subject: [PATCH 05/13] =?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=AF=B8=ED=8C=85=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=20=EB=AA=A9=EB=A1=9D=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/meeting/MeetingCreateRequest.java | 1 - .../joined_meeting/JoinedMeetingAppender.java | 32 +++++++++++++++++++ .../meeting/meeting/MeetingAppender.java | 14 +++++--- .../moim/joined_moim/JoinedMoimFinder.java | 22 +++++++++++++ .../JoinedMeetingJpaEntity.java | 13 ++++++-- .../meeting/meeting/MeetingRepository.java | 2 +- .../meeting/MeetingRepositoryImpl.java | 4 +-- .../joined_moim/JoinedMoimRepository.java | 5 +++ .../joined_moim/JoinedMoimRepositoryImpl.java | 20 +++++++++++- .../JoinedMeetingAppenderTest.java | 4 +++ .../joined_moim/JoinedMoimFinderTest.java | 4 +++ 11 files changed, 110 insertions(+), 11 deletions(-) create mode 100644 backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppender.java create mode 100644 backend/src/main/java/moim_today/implement/moim/joined_moim/JoinedMoimFinder.java create mode 100644 backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java create mode 100644 backend/src/test/java/moim_today/implement/moim/joined_moim/JoinedMoimFinderTest.java diff --git a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java b/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java index de17d3c6..43e39576 100644 --- a/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java +++ b/backend/src/main/java/moim_today/dto/meeting/MeetingCreateRequest.java @@ -5,7 +5,6 @@ import moim_today.domain.meeting.enums.MeetingCategory; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; -import java.time.DayOfWeek; import java.time.LocalDateTime; @Builder 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 new file mode 100644 index 00000000..4d417fbb --- /dev/null +++ b/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppender.java @@ -0,0 +1,32 @@ +package moim_today.implement.meeting.joined_meeting; + +import moim_today.global.annotation.Implement; +import moim_today.implement.moim.joined_moim.JoinedMoimFinder; +import moim_today.persistence.entity.meeting.joined_meeting.JoinedMeetingJpaEntity; +import moim_today.persistence.repository.meeting.joined_meeting.JoinedMeetingRepository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Implement +public class JoinedMeetingAppender { + + private final JoinedMeetingRepository joinedMeetingRepository; + private final JoinedMoimFinder joinedMoimFinder; + + public JoinedMeetingAppender(final JoinedMeetingRepository joinedMeetingRepository, + final JoinedMoimFinder joinedMoimFinder) { + this.joinedMeetingRepository = joinedMeetingRepository; + this.joinedMoimFinder = joinedMoimFinder; + } + + @Transactional + public void saveJoinedMeeting(final long moimId, final long meetingId) { + List memberIds = joinedMoimFinder.findAllJoinedMemberId(moimId); + + memberIds.stream() + .mapToLong(memberId -> memberId) + .mapToObj(memberId -> JoinedMeetingJpaEntity.toEntity(meetingId, memberId, true)) + .forEach(joinedMeetingRepository::save); + } +} 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 5ea00534..d8eeece1 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 @@ -4,6 +4,7 @@ import moim_today.dto.meeting.MeetingCreateRequest; import moim_today.dto.moim.moim.MoimDateResponse; import moim_today.global.annotation.Implement; +import moim_today.implement.meeting.joined_meeting.JoinedMeetingAppender; import moim_today.implement.moim.moim.MoimFinder; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import moim_today.persistence.repository.meeting.meeting.MeetingRepository; @@ -21,10 +22,13 @@ public class MeetingAppender { private final MeetingRepository meetingRepository; private final MoimFinder moimFinder; + private final JoinedMeetingAppender joinedMeetingAppender; - public MeetingAppender(final MeetingRepository meetingRepository, final MoimFinder moimFinder) { + public MeetingAppender(final MeetingRepository meetingRepository, final MoimFinder moimFinder, + final JoinedMeetingAppender joinedMeetingAppender) { this.meetingRepository = meetingRepository; this.moimFinder = moimFinder; + this.joinedMeetingAppender = joinedMeetingAppender; } @Transactional @@ -32,20 +36,21 @@ public void createMeeting(final MeetingCreateRequest meetingCreateRequest) { MeetingCategory meetingCategory = meetingCreateRequest.meetingCategory(); if (meetingCategory.equals(MeetingCategory.SINGLE)) { - createSingleMeeting(meetingCreateRequest); + MeetingJpaEntity meetingJpaEntity = createSingleMeeting(meetingCreateRequest); + joinedMeetingAppender.saveJoinedMeeting(meetingCreateRequest.moimId(), meetingJpaEntity.getId()); } else if (meetingCategory.equals(MeetingCategory.REGULAR)) { createRegularMeeting(meetingCreateRequest); } } - private void createSingleMeeting(final MeetingCreateRequest meetingCreateRequest) { + private MeetingJpaEntity createSingleMeeting(final MeetingCreateRequest meetingCreateRequest) { MeetingJpaEntity meetingJpaEntity = meetingCreateRequest.toEntity( meetingCreateRequest.startDateTime(), meetingCreateRequest.endDateTime() ); - meetingRepository.save(meetingJpaEntity); + return meetingRepository.save(meetingJpaEntity); } private void createRegularMeeting(final MeetingCreateRequest meetingCreateRequest) { @@ -62,6 +67,7 @@ private void createRegularMeeting(final MeetingCreateRequest meetingCreateReques MeetingJpaEntity meetingJpaEntity = meetingCreateRequest.toEntity(startDateTime, endDateTime); meetingRepository.save(meetingJpaEntity); + joinedMeetingAppender.saveJoinedMeeting(meetingCreateRequest.moimId(), meetingJpaEntity.getId()); } } } 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 new file mode 100644 index 00000000..51380c8f --- /dev/null +++ b/backend/src/main/java/moim_today/implement/moim/joined_moim/JoinedMoimFinder.java @@ -0,0 +1,22 @@ +package moim_today.implement.moim.joined_moim; + +import moim_today.global.annotation.Implement; +import moim_today.persistence.repository.moim.joined_moim.JoinedMoimRepository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Implement +public class JoinedMoimFinder { + + private final JoinedMoimRepository joinedMoimRepository; + + public JoinedMoimFinder(final JoinedMoimRepository joinedMoimRepository) { + this.joinedMoimRepository = joinedMoimRepository; + } + + @Transactional(readOnly = true) + public List findAllJoinedMemberId(final long moimId) { + return joinedMoimRepository.findAllJoinedMemberId(moimId); + } +} diff --git a/backend/src/main/java/moim_today/persistence/entity/meeting/joined_meeting/JoinedMeetingJpaEntity.java b/backend/src/main/java/moim_today/persistence/entity/meeting/joined_meeting/JoinedMeetingJpaEntity.java index f0ab0c13..9dc648fd 100644 --- a/backend/src/main/java/moim_today/persistence/entity/meeting/joined_meeting/JoinedMeetingJpaEntity.java +++ b/backend/src/main/java/moim_today/persistence/entity/meeting/joined_meeting/JoinedMeetingJpaEntity.java @@ -21,7 +21,7 @@ public class JoinedMeetingJpaEntity extends BaseTimeEntity { @Association private long memberId; - private boolean Attendance; + private boolean attendance; protected JoinedMeetingJpaEntity() { } @@ -30,6 +30,15 @@ protected JoinedMeetingJpaEntity() { private JoinedMeetingJpaEntity(final long meetingId, final long memberId, final boolean attendance) { this.meetingId = meetingId; this.memberId = memberId; - Attendance = attendance; + this.attendance = attendance; + } + + public static JoinedMeetingJpaEntity toEntity(final long meetingId, final long memberId, + final boolean attendance) { + return JoinedMeetingJpaEntity.builder() + .meetingId(meetingId) + .memberId(memberId) + .attendance(attendance) + .build(); } } 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 34a35831..23e8edbc 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 @@ -10,7 +10,7 @@ public interface MeetingRepository { MeetingJpaEntity getById(final long meetingId); - void save(final MeetingJpaEntity meetingJpaEntity); + MeetingJpaEntity save(final MeetingJpaEntity meetingJpaEntity); long count(); } 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 cee69c05..811d7373 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 @@ -40,8 +40,8 @@ public MeetingJpaEntity getById(final long meetingId) { } @Override - public void save(final MeetingJpaEntity meetingJpaEntity) { - meetingJpaRepository.save(meetingJpaEntity); + public MeetingJpaEntity save(final MeetingJpaEntity meetingJpaEntity) { + return meetingJpaRepository.save(meetingJpaEntity); } @Override diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepository.java b/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepository.java index b8cc456d..9a1d8f2c 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepository.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepository.java @@ -2,7 +2,12 @@ import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; +import java.util.List; + public interface JoinedMoimRepository { + + List findAllJoinedMemberId(final long moimId); + void deleteAllByMoimId(final long moimId); void save(final JoinedMoimJpaEntity joinedMoimJpaEntity); diff --git a/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepositoryImpl.java b/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepositoryImpl.java index 062e6fd7..50c339dc 100644 --- a/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepositoryImpl.java +++ b/backend/src/main/java/moim_today/persistence/repository/moim/joined_moim/JoinedMoimRepositoryImpl.java @@ -1,15 +1,33 @@ package moim_today.persistence.repository.moim.joined_moim; +import com.querydsl.jpa.impl.JPAQueryFactory; import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; +import moim_today.persistence.entity.moim.joined_moim.QJoinedMoimJpaEntity; import org.springframework.stereotype.Repository; +import java.util.ArrayList; +import java.util.List; + +import static moim_today.persistence.entity.moim.joined_moim.QJoinedMoimJpaEntity.*; + @Repository public class JoinedMoimRepositoryImpl implements JoinedMoimRepository { private final JoinedMoimJpaRepository joinedMoimJpaRepository; + private final JPAQueryFactory queryFactory; - public JoinedMoimRepositoryImpl(final JoinedMoimJpaRepository joinedMoimJpaRepository) { + public JoinedMoimRepositoryImpl(final JoinedMoimJpaRepository joinedMoimJpaRepository, + final JPAQueryFactory queryFactory) { this.joinedMoimJpaRepository = joinedMoimJpaRepository; + this.queryFactory = queryFactory; + } + + @Override + public List findAllJoinedMemberId(final long moimId) { + return queryFactory.select(joinedMoimJpaEntity.memberId) + .from(joinedMoimJpaEntity) + .where(joinedMoimJpaEntity.moimId.eq(moimId)) + .fetch(); } @Override diff --git a/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java b/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java new file mode 100644 index 00000000..99fd47be --- /dev/null +++ b/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class JoinedMeetingAppenderTest { + +} \ No newline at end of file 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 new file mode 100644 index 00000000..9ab32d8c --- /dev/null +++ b/backend/src/test/java/moim_today/implement/moim/joined_moim/JoinedMoimFinderTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class JoinedMoimFinderTest { + +} \ No newline at end of file From e0fd17872a3906494b898d6ed70e7536c9e61a8b Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Thu, 2 May 2024 23:28:50 +0900 Subject: [PATCH 06/13] =?UTF-8?q?[BE]=20test=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=8B=9C=20=EC=B0=B8=EC=97=AC=ED=95=9C=20?= =?UTF-8?q?=ED=9A=8C=EC=9B=90=EC=9D=98=20=EC=8A=A4=EC=BC=80=EC=A4=84=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JoinedMeetingAppenderTest.java | 40 +++++++++++++++++- .../joined_moim/JoinedMoimFinderTest.java | 41 +++++++++++++++++-- 2 files changed, 76 insertions(+), 5 deletions(-) diff --git a/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java b/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java index 99fd47be..e7d46134 100644 --- a/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java @@ -1,4 +1,40 @@ +package moim_today.implement.meeting.joined_meeting; + +import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; +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 org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; -class JoinedMeetingAppenderTest { - + +class JoinedMeetingAppenderTest extends ImplementTest { + + @Autowired + private JoinedMeetingAppender joinedMeetingAppender; + + @DisplayName("모임 참여자를 바탕으로 미팅 참여 정보를 추가한다.") + @Test + void saveJoinedMeeting() { + // given + long moimId = 1L; + long meetingId = 2L; + + for (long i = 0; i < 3; i++) { + JoinedMoimJpaEntity joinedMoimJpaEntity = JoinedMoimJpaEntity.builder() + .memberId(i) + .moimId(moimId) + .build(); + + joinedMoimRepository.save(joinedMoimJpaEntity); + } + + // when + joinedMeetingAppender.saveJoinedMeeting(moimId, meetingId); + + // then + assertThat(joinedMeetingRepository.count()).isEqualTo(3); + } } \ No newline at end of file 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 9ab32d8c..de3e54fc 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 @@ -1,4 +1,39 @@ -import static org.junit.jupiter.api.Assertions.*; -class JoinedMoimFinderTest { - +package moim_today.implement.moim.joined_moim; + +import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; +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 org.assertj.core.api.Assertions.*; + +class JoinedMoimFinderTest extends ImplementTest { + + @Autowired + private JoinedMoimFinder joinedMoimFinder; + + @DisplayName("특정 모임에 참여한 회원의 id 리스트를 가져온다.") + @Test + void findAllJoinedMemberId() { + // given + long moimId = 1L; + + for (long i = 0; i < 3; i++) { + JoinedMoimJpaEntity joinedMoimJpaEntity = JoinedMoimJpaEntity.builder() + .memberId(i) + .moimId(moimId) + .build(); + + joinedMoimRepository.save(joinedMoimJpaEntity); + } + + // when + List memberIds = joinedMoimFinder.findAllJoinedMemberId(moimId); + + // then + assertThat(memberIds.size()).isEqualTo(3); + } } \ No newline at end of file From 220f5b8b66707ebbae858d121facbdd19ae585d5 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Fri, 3 May 2024 17:11:00 +0900 Subject: [PATCH 07/13] =?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=8A=A4=EC=BC=80=EC=A4=84=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=EB=B9=84=EB=8F=99=EA=B8=B0=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/MeetingServiceImpl.java | 10 +- .../joined_meeting/JoinedMeetingAppender.java | 9 +- .../joined_meeting/JoinedMeetingFinder.java | 22 ++++ .../meeting/meeting/MeetingAppender.java | 58 +--------- .../meeting/meeting/MeetingManager.java | 100 ++++++++++++++++++ .../implement/moim/moim/MoimFinder.java | 5 + .../schedule/schedule/ScheduleJpaEntity.java | 13 +++ .../JoinedMeetingRepository.java | 2 + .../JoinedMeetingRepositoryImpl.java | 17 ++- .../repository/moim/moim/MoimRepository.java | 2 + .../moim/moim/MoimRepositoryImpl.java | 8 ++ ...est.java => JoinedMeetingManagerTest.java} | 2 +- ...enderTest.java => MeetingManagerTest.java} | 20 ++-- 13 files changed, 195 insertions(+), 73 deletions(-) create mode 100644 backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingFinder.java create mode 100644 backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java rename backend/src/test/java/moim_today/implement/meeting/joined_meeting/{JoinedMeetingAppenderTest.java => JoinedMeetingManagerTest.java} (95%) rename backend/src/test/java/moim_today/implement/meeting/meeting/{MeetingAppenderTest.java => MeetingManagerTest.java} (82%) diff --git a/backend/src/main/java/moim_today/application/meeting/MeetingServiceImpl.java b/backend/src/main/java/moim_today/application/meeting/MeetingServiceImpl.java index 361e33af..2a1e3e52 100644 --- a/backend/src/main/java/moim_today/application/meeting/MeetingServiceImpl.java +++ b/backend/src/main/java/moim_today/application/meeting/MeetingServiceImpl.java @@ -1,20 +1,20 @@ package moim_today.application.meeting; import moim_today.dto.meeting.MeetingCreateRequest; -import moim_today.implement.meeting.meeting.MeetingAppender; +import moim_today.implement.meeting.meeting.MeetingManager; import org.springframework.stereotype.Service; @Service public class MeetingServiceImpl implements MeetingService { - private final MeetingAppender meetingAppender; + private final MeetingManager meetingManager; - public MeetingServiceImpl(final MeetingAppender meetingAppender) { - this.meetingAppender = meetingAppender; + public MeetingServiceImpl(final MeetingManager meetingManager) { + this.meetingManager = meetingManager; } @Override public void createMeeting(final MeetingCreateRequest meetingCreateRequest) { - meetingAppender.createMeeting(meetingCreateRequest); + meetingManager.createMeeting(meetingCreateRequest); } } 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 4d417fbb..30c9925f 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 @@ -24,9 +24,10 @@ public JoinedMeetingAppender(final JoinedMeetingRepository joinedMeetingReposito public void saveJoinedMeeting(final long moimId, final long meetingId) { List memberIds = joinedMoimFinder.findAllJoinedMemberId(moimId); - memberIds.stream() - .mapToLong(memberId -> memberId) - .mapToObj(memberId -> JoinedMeetingJpaEntity.toEntity(meetingId, memberId, true)) - .forEach(joinedMeetingRepository::save); + for (long memberId : memberIds) { + JoinedMeetingJpaEntity joinedMeetingJpaEntity = + JoinedMeetingJpaEntity.toEntity(meetingId, memberId, true); + joinedMeetingRepository.save(joinedMeetingJpaEntity); + } } } diff --git a/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingFinder.java b/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingFinder.java new file mode 100644 index 00000000..d46ebc83 --- /dev/null +++ b/backend/src/main/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingFinder.java @@ -0,0 +1,22 @@ +package moim_today.implement.meeting.joined_meeting; + +import moim_today.global.annotation.Implement; +import moim_today.persistence.repository.meeting.joined_meeting.JoinedMeetingRepository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Implement +public class JoinedMeetingFinder { + + private final JoinedMeetingRepository joinedMeetingRepository; + + public JoinedMeetingFinder(final JoinedMeetingRepository joinedMeetingRepository) { + this.joinedMeetingRepository = joinedMeetingRepository; + } + + @Transactional(readOnly = true) + public List findAllMemberId(final long meetingId) { + return joinedMeetingRepository.findAllMemberIdByMeetingId(meetingId); + } +} 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 d8eeece1..43f17e8a 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 @@ -1,73 +1,21 @@ package moim_today.implement.meeting.meeting; -import moim_today.domain.meeting.enums.MeetingCategory; -import moim_today.dto.meeting.MeetingCreateRequest; -import moim_today.dto.moim.moim.MoimDateResponse; import moim_today.global.annotation.Implement; -import moim_today.implement.meeting.joined_meeting.JoinedMeetingAppender; -import moim_today.implement.moim.moim.MoimFinder; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import moim_today.persistence.repository.meeting.meeting.MeetingRepository; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; - -import static moim_today.global.constant.TimeConstant.*; - - @Implement public class MeetingAppender { private final MeetingRepository meetingRepository; - private final MoimFinder moimFinder; - private final JoinedMeetingAppender joinedMeetingAppender; - public MeetingAppender(final MeetingRepository meetingRepository, final MoimFinder moimFinder, - final JoinedMeetingAppender joinedMeetingAppender) { + public MeetingAppender(final MeetingRepository meetingRepository) { this.meetingRepository = meetingRepository; - this.moimFinder = moimFinder; - this.joinedMeetingAppender = joinedMeetingAppender; } @Transactional - public void createMeeting(final MeetingCreateRequest meetingCreateRequest) { - MeetingCategory meetingCategory = meetingCreateRequest.meetingCategory(); - - if (meetingCategory.equals(MeetingCategory.SINGLE)) { - MeetingJpaEntity meetingJpaEntity = createSingleMeeting(meetingCreateRequest); - joinedMeetingAppender.saveJoinedMeeting(meetingCreateRequest.moimId(), meetingJpaEntity.getId()); - - } else if (meetingCategory.equals(MeetingCategory.REGULAR)) { - createRegularMeeting(meetingCreateRequest); - } - } - - private MeetingJpaEntity createSingleMeeting(final MeetingCreateRequest meetingCreateRequest) { - MeetingJpaEntity meetingJpaEntity = meetingCreateRequest.toEntity( - meetingCreateRequest.startDateTime(), - meetingCreateRequest.endDateTime() - ); - - return meetingRepository.save(meetingJpaEntity); - } - - private void createRegularMeeting(final MeetingCreateRequest meetingCreateRequest) { - MoimDateResponse moimDateResponse = moimFinder.findMoimDate(meetingCreateRequest.moimId()); - LocalDate startDate = moimDateResponse.startDate(); - LocalDate endDate = moimDateResponse.endDate(); - - LocalTime startTime = meetingCreateRequest.startDateTime().toLocalTime(); - LocalTime endTime = meetingCreateRequest.endDateTime().toLocalTime(); - - 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); - meetingRepository.save(meetingJpaEntity); - joinedMeetingAppender.saveJoinedMeeting(meetingCreateRequest.moimId(), meetingJpaEntity.getId()); - } + public void saveMeeting(final MeetingJpaEntity meetingJpaEntity) { + 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 new file mode 100644 index 00000000..ef044bc5 --- /dev/null +++ b/backend/src/main/java/moim_today/implement/meeting/meeting/MeetingManager.java @@ -0,0 +1,100 @@ +package moim_today.implement.meeting.meeting; + +import moim_today.domain.meeting.enums.MeetingCategory; +import moim_today.dto.meeting.MeetingCreateRequest; +import moim_today.dto.moim.moim.MoimDateResponse; +import moim_today.global.annotation.Implement; +import moim_today.implement.meeting.joined_meeting.JoinedMeetingAppender; +import moim_today.implement.meeting.joined_meeting.JoinedMeetingFinder; +import moim_today.implement.moim.moim.MoimFinder; +import moim_today.implement.schedule.ScheduleAppender; +import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; +import moim_today.persistence.entity.schedule.ScheduleJpaEntity; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import static moim_today.global.constant.TimeConstant.*; + + +@Implement +public class MeetingManager { + + private final MeetingAppender meetingAppender; + private final MoimFinder moimFinder; + private final ScheduleAppender scheduleAppender; + private final JoinedMeetingAppender joinedMeetingAppender; + private final JoinedMeetingFinder joinedMeetingFinder; + + public MeetingManager(final MeetingAppender meetingAppender, final MoimFinder moimFinder, + final ScheduleAppender scheduleAppender, final JoinedMeetingAppender joinedMeetingAppender, + final JoinedMeetingFinder joinedMeetingFinder) { + this.meetingAppender = meetingAppender; + this.moimFinder = moimFinder; + this.scheduleAppender = scheduleAppender; + this.joinedMeetingAppender = joinedMeetingAppender; + this.joinedMeetingFinder = joinedMeetingFinder; + } + + public void 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); + } + } + + private void createSingleMeeting(final MeetingCreateRequest meetingCreateRequest, final String moimTitle) { + MeetingJpaEntity meetingJpaEntity = meetingCreateRequest.toEntity( + meetingCreateRequest.startDateTime(), + meetingCreateRequest.endDateTime() + ); + + meetingAppender.saveMeeting(meetingJpaEntity); + joinedMeetingAppender.saveJoinedMeeting(meetingCreateRequest.moimId(), meetingJpaEntity.getId()); + createSchedules(moimTitle, meetingJpaEntity); + } + + private void 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(); + + 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); + joinedMeetingAppender.saveJoinedMeeting(meetingCreateRequest.moimId(), meetingJpaEntity.getId()); + createSchedules(moimTitle, meetingJpaEntity); + } + } + + private void createSchedules(final String moimTitle, final MeetingJpaEntity meetingJpaEntity) { + List memberIds = joinedMeetingFinder.findAllMemberId(meetingJpaEntity.getId()); + List> futures = new ArrayList<>(); + + for (long memberId : memberIds) { + CompletableFuture future = CompletableFuture.runAsync(() -> { + ScheduleJpaEntity scheduleJpaEntity = ScheduleJpaEntity.toEntity(memberId, moimTitle, meetingJpaEntity); + scheduleAppender.createSchedule(scheduleJpaEntity); + }); + + futures.add(future); + } + + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); + } +} 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 055bf742..ac397ef3 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 @@ -20,6 +20,11 @@ public MoimJpaEntity getById(final long moimId) { return moimRepository.getById(moimId); } + @Transactional(readOnly = true) + public String getTitleById(final long moimId) { + return moimRepository.getTitleById(moimId); + } + @Transactional(readOnly = true) public MoimDateResponse findMoimDate(final long moimId) { return moimRepository.findMoimDate(moimId); diff --git a/backend/src/main/java/moim_today/persistence/entity/schedule/schedule/ScheduleJpaEntity.java b/backend/src/main/java/moim_today/persistence/entity/schedule/schedule/ScheduleJpaEntity.java index b0cc9f15..5ca71cee 100644 --- a/backend/src/main/java/moim_today/persistence/entity/schedule/schedule/ScheduleJpaEntity.java +++ b/backend/src/main/java/moim_today/persistence/entity/schedule/schedule/ScheduleJpaEntity.java @@ -7,6 +7,7 @@ import lombok.Builder; import lombok.Getter; import moim_today.global.error.ForbiddenException; +import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import java.time.DayOfWeek; import java.time.LocalDateTime; @@ -55,6 +56,18 @@ private ScheduleJpaEntity(final long memberId, final long meetingId, final Strin this.endDateTime = endDateTime; } + public static ScheduleJpaEntity toEntity(final long memberId, final String moimTitle, + final MeetingJpaEntity meetingJpaEntity) { + return ScheduleJpaEntity.builder() + .memberId(memberId) + .meetingId(meetingJpaEntity.getId()) + .scheduleName(moimTitle) + .dayOfWeek(meetingJpaEntity.getStartDateTime().getDayOfWeek()) + .startDateTime(meetingJpaEntity.getStartDateTime()) + .endDateTime(meetingJpaEntity.getEndDateTime()) + .build(); + } + public void updateSchedule(final ScheduleUpdateRequest scheduleUpdateRequest) { this.scheduleName = scheduleUpdateRequest.scheduleName(); this.dayOfWeek = scheduleUpdateRequest.dayOfWeek(); 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 183ad3d1..57cfab37 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 @@ -10,5 +10,7 @@ public interface JoinedMeetingRepository { void save(final JoinedMeetingJpaEntity joinedMeetingJpaEntity); + List findAllMemberIdByMeetingId(final long meetingId); + long count(); } 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 cf812ccb..b9aed778 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 @@ -1,17 +1,24 @@ package moim_today.persistence.repository.meeting.joined_meeting; +import com.querydsl.jpa.impl.JPAQueryFactory; 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 static moim_today.persistence.entity.meeting.joined_meeting.QJoinedMeetingJpaEntity.*; + @Repository public class JoinedMeetingRepositoryImpl implements JoinedMeetingRepository { private final JoinedMeetingJpaRepository joinedMeetingJpaRepository; + private final JPAQueryFactory queryFactory; - public JoinedMeetingRepositoryImpl(final JoinedMeetingJpaRepository joinedMeetingJpaRepository) { + public JoinedMeetingRepositoryImpl(final JoinedMeetingJpaRepository joinedMeetingJpaRepository, + final JPAQueryFactory queryFactory) { this.joinedMeetingJpaRepository = joinedMeetingJpaRepository; + this.queryFactory = queryFactory; } @Override @@ -24,6 +31,14 @@ public void save(final JoinedMeetingJpaEntity joinedMeetingJpaEntity) { joinedMeetingJpaRepository.save(joinedMeetingJpaEntity); } + @Override + public List findAllMemberIdByMeetingId(final long meetingId) { + return queryFactory.select(joinedMeetingJpaEntity.memberId) + .from(joinedMeetingJpaEntity) + .where(joinedMeetingJpaEntity.meetingId.eq(meetingId)) + .fetch(); + } + @Override public long count() { return joinedMeetingJpaRepository.count(); 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 e3761781..15ca28f5 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 @@ -11,6 +11,8 @@ public interface MoimRepository { MoimJpaEntity getById(final long moimId); + String getTitleById(final long moimId); + MoimDateResponse findMoimDate(final long moimId); void deleteById(final long moimId); 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 da40c733..8daff5d0 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 @@ -38,6 +38,14 @@ public MoimJpaEntity getById(final long moimId) { .orElseThrow(() -> new NotFoundException(MOIM_NOT_FOUND_ERROR.message())); } + @Override + public String getTitleById(final long moimId) { + return queryFactory.select(moimJpaEntity.title) + .from(moimJpaEntity) + .where(moimJpaEntity.id.eq(moimId)) + .fetchOne(); + } + @Override public MoimDateResponse findMoimDate(final long moimId) { return queryFactory.select( diff --git a/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java b/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingManagerTest.java similarity index 95% rename from backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java rename to backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingManagerTest.java index e7d46134..42954c25 100644 --- a/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingManagerTest.java @@ -10,7 +10,7 @@ import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*; -class JoinedMeetingAppenderTest extends ImplementTest { +class JoinedMeetingManagerTest extends ImplementTest { @Autowired private JoinedMeetingAppender joinedMeetingAppender; diff --git a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingAppenderTest.java b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java similarity index 82% rename from backend/src/test/java/moim_today/implement/meeting/meeting/MeetingAppenderTest.java rename to backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java index a7d3a1bf..985ba8d3 100644 --- a/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingAppenderTest.java +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingManagerTest.java @@ -12,23 +12,29 @@ import java.time.LocalDateTime; 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.*; -class MeetingAppenderTest extends ImplementTest { +class MeetingManagerTest extends ImplementTest { @Autowired - private MeetingAppender meetingAppender; + private MeetingManager meetingManager; @DisplayName("단일 미팅을 생성한다.") @Test void createSingleMeeting() { - // given - long moimId = 1L; + // given 1 + MoimJpaEntity moimJpaEntity = MoimJpaEntity.builder() + .title(TITLE.value()) + .build(); + moimRepository.save(moimJpaEntity); + + // given 2 MeetingCreateRequest meetingCreateRequest = MeetingCreateRequest.builder() - .moimId(moimId) + .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)) @@ -37,7 +43,7 @@ void createSingleMeeting() { .build(); // when - meetingAppender.createMeeting(meetingCreateRequest); + meetingManager.createMeeting(meetingCreateRequest); // then assertThat(meetingRepository.count()).isEqualTo(1); @@ -70,7 +76,7 @@ void createRegularMeeting() { .build(); // when - meetingAppender.createMeeting(meetingCreateRequest); + meetingManager.createMeeting(meetingCreateRequest); // then long between = ChronoUnit.WEEKS.between(startDate, endDate) + 1; From dad200b02f1f04c296f330f568272141ff3f61fc Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Fri, 3 May 2024 17:40:16 +0900 Subject: [PATCH 08/13] =?UTF-8?q?[BE]=20test=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=8B=9C=20=EC=B0=B8=EC=97=AC=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D,=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JoinedMeetingRepository.java | 2 + .../JoinedMeetingRepositoryImpl.java | 5 + .../JoinedMeetingAppenderTest.java | 93 +++++++++++++++++++ .../JoinedMeetingFinderTest.java | 38 ++++++++ .../meeting/meeting/MeetingAppenderTest.java | 44 +++++++++ .../meeting/meeting/MeetingManagerTest.java | 2 + .../implement/moim/moim/MoimFinderTest.java | 40 +++++++- 7 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java create mode 100644 backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingFinderTest.java create mode 100644 backend/src/test/java/moim_today/implement/meeting/meeting/MeetingAppenderTest.java 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 57cfab37..ee8e6deb 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 @@ -12,5 +12,7 @@ public interface JoinedMeetingRepository { List findAllMemberIdByMeetingId(final long meetingId); + List findAll(); + long count(); } 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 b9aed778..38ba493e 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 @@ -39,6 +39,11 @@ public List findAllMemberIdByMeetingId(final long meetingId) { .fetch(); } + @Override + public List findAll() { + return joinedMeetingJpaRepository.findAll(); + } + @Override public long count() { return joinedMeetingJpaRepository.count(); diff --git a/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java b/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java new file mode 100644 index 00000000..a00b07a5 --- /dev/null +++ b/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingAppenderTest.java @@ -0,0 +1,93 @@ +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.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; + +import java.util.List; + +import static moim_today.util.TestConstant.*; +import static org.assertj.core.api.Assertions.*; + + +class JoinedMeetingAppenderTest extends ImplementTest { + + @Autowired + private JoinedMeetingAppender joinedMeetingAppender; + + @DisplayName("모임 참여 정보를 바탕으로 미팅 참여 정보를 생성한다.") + @Test + void saveJoinedMeeting() { + // given 1 + MoimJpaEntity moimJpaEntity = MoimJpaEntity.builder() + .title(TITLE.value()) + .build(); + + moimRepository.save(moimJpaEntity); + + // given 2 + for (int i = 1; i < 11; i++) { + JoinedMoimJpaEntity joinedMoimJpaEntity = JoinedMoimJpaEntity.builder() + .moimId(moimJpaEntity.getId()) + .memberId(i) + .build(); + + joinedMoimRepository.save(joinedMoimJpaEntity); + } + + // given 3 + MeetingJpaEntity meetingJpaEntity = MeetingJpaEntity.builder() + .moimId(moimJpaEntity.getId()) + .build(); + + meetingRepository.save(meetingJpaEntity); + + // when + joinedMeetingAppender.saveJoinedMeeting(moimJpaEntity.getId(), meetingJpaEntity.getId()); + + // then + assertThat(joinedMeetingRepository.count()).isEqualTo(10); + } + + @DisplayName("모임 참여 정보를 바탕으로 미팅 참여 정보를 생성할 때 모두 참여 상태로 등록한다.") + @Test + void saveJoinedMeetingWithAttendance() { + // given 1 + MoimJpaEntity moimJpaEntity = MoimJpaEntity.builder() + .title(TITLE.value()) + .build(); + + moimRepository.save(moimJpaEntity); + + // given 2 + JoinedMoimJpaEntity joinedMoimJpaEntity = JoinedMoimJpaEntity.builder() + .moimId(moimJpaEntity.getId()) + .memberId(MEMBER_ID.intValue()) + .build(); + + joinedMoimRepository.save(joinedMoimJpaEntity); + + // given 3 + MeetingJpaEntity meetingJpaEntity = MeetingJpaEntity.builder() + .moimId(moimJpaEntity.getId()) + .build(); + + meetingRepository.save(meetingJpaEntity); + + // when + joinedMeetingAppender.saveJoinedMeeting(moimJpaEntity.getId(), meetingJpaEntity.getId()); + + // then + List findEntities = joinedMeetingRepository.findAll(); + JoinedMeetingJpaEntity joinedMeetingJpaEntity = findEntities.get(0); + + assertThat(joinedMeetingJpaEntity.isAttendance()).isTrue(); + } +} \ No newline at end of file diff --git a/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingFinderTest.java b/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingFinderTest.java new file mode 100644 index 00000000..b7074775 --- /dev/null +++ b/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingFinderTest.java @@ -0,0 +1,38 @@ +package moim_today.implement.meeting.joined_meeting; + +import moim_today.persistence.entity.meeting.joined_meeting.JoinedMeetingJpaEntity; +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 java.util.List; + +import static moim_today.util.TestConstant.*; + +class JoinedMeetingFinderTest extends ImplementTest { + + @Autowired + private JoinedMeetingFinder joinedMeetingFinder; + + @DisplayName("미팅에 참여한 회원 id 목록을 가져온다.") + @Test + void findAllMemberId() { + // given + for (int i = 1; i < 11; i++) { + JoinedMeetingJpaEntity joinedMeetingJpaEntity = JoinedMeetingJpaEntity.builder() + .meetingId(MEETING_ID.intValue()) + .memberId(i) + .build(); + + joinedMeetingRepository.save(joinedMeetingJpaEntity); + } + + // when + List memberIds = joinedMeetingFinder.findAllMemberId(MEETING_ID.intValue()); + + // then + Assertions.assertThat(memberIds.size()).isEqualTo(10); + } +} \ No newline at end of file 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 new file mode 100644 index 00000000..6b567fcf --- /dev/null +++ b/backend/src/test/java/moim_today/implement/meeting/meeting/MeetingAppenderTest.java @@ -0,0 +1,44 @@ +package moim_today.implement.meeting.meeting; + +import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; +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.LocalDateTime; + +import static moim_today.util.TestConstant.*; +import static org.assertj.core.api.Assertions.*; + +class MeetingAppenderTest extends ImplementTest { + + @Autowired + private MeetingAppender meetingAppender; + + @DisplayName("미팅 정보를 저장한다.") + @Test + void saveMeeting() { + // given + MeetingJpaEntity meetingJpaEntity = MeetingJpaEntity.builder() + .moimId(MOIM_ID.intValue()) + .agenda(MEETING_AGENDA.value()) + .startDateTime(LocalDateTime.of(2024,3,4, 10, 0, 0)) + .endDateTime(LocalDateTime.of(2024,6,30, 10, 0, 0)) + .place(MEETING_PLACE.value()) + .build(); + + // when + 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()); + } +} \ 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 985ba8d3..9646bdc9 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,8 +2,10 @@ import moim_today.domain.meeting.enums.MeetingCategory; import moim_today.dto.meeting.MeetingCreateRequest; +import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; 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; 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 d2c6cca9..66a3a6d0 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 @@ -1,13 +1,15 @@ package moim_today.implement.moim.moim; +import moim_today.dto.moim.moim.MoimDateResponse; import moim_today.global.error.NotFoundException; -import moim_today.implement.moim.moim.MoimFinder; 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 static moim_today.global.constant.exception.MoimExceptionConstant.MOIM_NOT_FOUND_ERROR; import static moim_today.util.TestConstant.MOIM_ID; import static moim_today.util.TestConstant.TITLE; @@ -45,4 +47,40 @@ void getByIdThrowExceptionTest(){ .isInstanceOf(NotFoundException.class) .hasMessage(MOIM_NOT_FOUND_ERROR.message()); } + + @DisplayName("모임 id로 모임명을 가져온다.") + @Test + void getTitleById() { + // given + MoimJpaEntity moimJpaEntity = MoimJpaEntity.builder() + .title(TITLE.value()) + .build(); + + moimRepository.save(moimJpaEntity); + + // when + String title = moimFinder.getTitleById(moimJpaEntity.getId()); + + // then + assertThat(title).isEqualTo(TITLE.value()); + } + + @DisplayName("모임 id로 모임명을 가져온다.") + @Test + void findMoimDate() { + // given + MoimJpaEntity moimJpaEntity = MoimJpaEntity.builder() + .startDate(LocalDate.of(2024, 3, 4)) + .endDate(LocalDate.of(2024, 6, 30)) + .build(); + + moimRepository.save(moimJpaEntity); + + // when + MoimDateResponse moimDateResponse = moimFinder.findMoimDate(moimJpaEntity.getId()); + + // then + assertThat(moimDateResponse.startDate()).isEqualTo(LocalDate.of(2024, 3, 4)); + assertThat(moimDateResponse.endDate()).isEqualTo(LocalDate.of(2024, 6, 30)); + } } From 0bb83d0bd495c9d52042c3e801204165d931f5da Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Fri, 3 May 2024 17:48:07 +0900 Subject: [PATCH 09/13] =?UTF-8?q?[BE]=20refactor=20:=20=EC=8A=A4=EC=BC=80?= =?UTF-8?q?=EC=A4=84=20=EB=B0=98=ED=99=98=20=ED=95=84=EB=93=9C=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 --- .../java/moim_today/dto/schedule/ScheduleResponse.java | 1 + .../src/main/java/moim_today/global/config/WebConfig.java | 2 +- .../implement/meeting/meeting/MeetingManager.java | 4 ++-- .../schedule/schedule/ScheduleRepositoryImpl.java | 3 ++- .../fake_class/schedule/FakeScheduleService.java | 7 +++++++ .../presentation/schedule/ScheduleControllerTest.java | 2 ++ 6 files changed, 15 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/moim_today/dto/schedule/ScheduleResponse.java b/backend/src/main/java/moim_today/dto/schedule/ScheduleResponse.java index 8fd2beff..8512a5d5 100644 --- a/backend/src/main/java/moim_today/dto/schedule/ScheduleResponse.java +++ b/backend/src/main/java/moim_today/dto/schedule/ScheduleResponse.java @@ -13,6 +13,7 @@ public record ScheduleResponse( long meetingId, String scheduleName, DayOfWeek dayOfWeek, + String colorHex, @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") LocalDateTime startDateTime, 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 b9b4b193..df7f8098 100644 --- a/backend/src/main/java/moim_today/global/config/WebConfig.java +++ b/backend/src/main/java/moim_today/global/config/WebConfig.java @@ -45,7 +45,7 @@ public void addArgumentResolvers(final List resol @Override public void addCorsMappings(final CorsRegistry registry) { registry.addMapping("/**") - .allowedOrigins("*") + .allowedOriginPatterns("**") .allowCredentials(true) .allowedHeaders("*") .allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS") 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 ef044bc5..857650e8 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 @@ -7,9 +7,9 @@ import moim_today.implement.meeting.joined_meeting.JoinedMeetingAppender; import moim_today.implement.meeting.joined_meeting.JoinedMeetingFinder; import moim_today.implement.moim.moim.MoimFinder; -import moim_today.implement.schedule.ScheduleAppender; +import moim_today.implement.schedule.schedule.ScheduleAppender; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; -import moim_today.persistence.entity.schedule.ScheduleJpaEntity; +import moim_today.persistence.entity.schedule.schedule.ScheduleJpaEntity; import java.time.LocalDate; import java.time.LocalDateTime; 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 668343ef..6a943a0d 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 @@ -20,8 +20,8 @@ import static moim_today.global.constant.NumberConstant.SCHEDULE_MEETING_ID; import static moim_today.global.constant.exception.ScheduleExceptionConstant.*; -import static moim_today.persistence.entity.schedule.schedule.QScheduleJpaEntity.scheduleJpaEntity; import static moim_today.global.constant.exception.ScheduleExceptionConstant.SCHEDULE_NOT_FOUND; +import static moim_today.persistence.entity.schedule.schedule.QScheduleJpaEntity.scheduleJpaEntity; @Repository @@ -59,6 +59,7 @@ public List findAllByDateTime(final long memberId, final Local scheduleJpaEntity.meetingId, scheduleJpaEntity.scheduleName, scheduleJpaEntity.dayOfWeek, + scheduleJpaEntity.colorHex, scheduleJpaEntity.startDateTime, scheduleJpaEntity.endDateTime )) 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 bda86a64..973321a8 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 @@ -1,6 +1,7 @@ package moim_today.fake_class.schedule; import moim_today.application.schedule.ScheduleService; +import moim_today.domain.schedule.enums.ColorHex; import moim_today.dto.schedule.ScheduleCreateRequest; import moim_today.dto.schedule.ScheduleResponse; import moim_today.dto.schedule.ScheduleUpdateRequest; @@ -25,6 +26,7 @@ public List findAllByWeekly(final long memberId, final LocalDa .meetingId(0L) .scheduleName("스케줄명 1") .dayOfWeek(DayOfWeek.MONDAY) + .colorHex(ColorHex.getHexByCount(0).value()) .startDateTime(LocalDateTime.of(2024, 03, 04, 10, 0, 0)) .endDateTime(LocalDateTime.of(2024, 03, 04, 12, 0, 0)) .build(); @@ -34,6 +36,7 @@ public List findAllByWeekly(final long memberId, final LocalDa .meetingId(0L) .scheduleName("스케줄명 2") .dayOfWeek(DayOfWeek.TUESDAY) + .colorHex(ColorHex.getHexByCount(1).value()) .startDateTime(LocalDateTime.of(2024, 03, 05, 12, 0, 0)) .endDateTime(LocalDateTime.of(2024, 03, 05, 13, 15, 0)) .build(); @@ -43,6 +46,7 @@ public List findAllByWeekly(final long memberId, final LocalDa .meetingId(1L) .scheduleName("스케줄명 3") .dayOfWeek(DayOfWeek.WEDNESDAY) + .colorHex(ColorHex.getHexByCount(3).value()) .startDateTime(LocalDateTime.of(2024, 03, 06, 12, 0, 0)) .endDateTime(LocalDateTime.of(2024, 03, 06, 13, 15, 0)) .build(); @@ -57,6 +61,7 @@ public List findAllByMonthly(final long memberId, final YearMo .meetingId(0L) .scheduleName("스케줄명 1") .dayOfWeek(DayOfWeek.MONDAY) + .colorHex(ColorHex.getHexByCount(0).value()) .startDateTime(LocalDateTime.of(2024, 03, 04, 10, 0, 0)) .endDateTime(LocalDateTime.of(2024, 03, 04, 12, 0, 0)) .build(); @@ -66,6 +71,7 @@ public List findAllByMonthly(final long memberId, final YearMo .meetingId(0L) .scheduleName("스케줄명 2") .dayOfWeek(DayOfWeek.TUESDAY) + .colorHex(ColorHex.getHexByCount(1).value()) .startDateTime(LocalDateTime.of(2024, 03, 05, 12, 0, 0)) .endDateTime(LocalDateTime.of(2024, 03, 05, 13, 15, 0)) .build(); @@ -75,6 +81,7 @@ public List findAllByMonthly(final long memberId, final YearMo .meetingId(1L) .scheduleName("스케줄명 3") .dayOfWeek(DayOfWeek.WEDNESDAY) + .colorHex(ColorHex.getHexByCount(2).value()) .startDateTime(LocalDateTime.of(2024, 03, 06, 12, 0, 0)) .endDateTime(LocalDateTime.of(2024, 03, 06, 13, 15, 0)) .build(); diff --git a/backend/src/test/java/moim_today/presentation/schedule/ScheduleControllerTest.java b/backend/src/test/java/moim_today/presentation/schedule/ScheduleControllerTest.java index 8f067dd7..9f03768f 100644 --- a/backend/src/test/java/moim_today/presentation/schedule/ScheduleControllerTest.java +++ b/backend/src/test/java/moim_today/presentation/schedule/ScheduleControllerTest.java @@ -56,6 +56,7 @@ void findAllByWeekly() throws Exception { fieldWithPath("data[0].meetingId").type(NUMBER).description("미팅 id"), fieldWithPath("data[0].scheduleName").type(STRING).description("스케줄명"), fieldWithPath("data[0].dayOfWeek").type(STRING).description("요일"), + fieldWithPath("data[0].colorHex").type(STRING).description("색상"), fieldWithPath("data[0].startDateTime").type(STRING).description("시작 시간"), fieldWithPath("data[0].endDateTime").type(STRING).description("종료 시간") ) @@ -82,6 +83,7 @@ void findAllByMonthly() throws Exception { fieldWithPath("data[0].meetingId").type(NUMBER).description("미팅 id"), fieldWithPath("data[0].scheduleName").type(STRING).description("스케줄명"), fieldWithPath("data[0].dayOfWeek").type(STRING).description("요일"), + fieldWithPath("data[0].colorHex").type(STRING).description("색상"), fieldWithPath("data[0].startDateTime").type(STRING).description("시작 시간"), fieldWithPath("data[0].endDateTime").type(STRING).description("종료 시간") ) From f092cf657aea880244b3abb694c1d645e9651589 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sat, 4 May 2024 12:33:40 +0900 Subject: [PATCH 10/13] =?UTF-8?q?[BE]=20fix=20:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JoinedMeetingManagerTest.java | 40 ------------------- 1 file changed, 40 deletions(-) delete mode 100644 backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingManagerTest.java diff --git a/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingManagerTest.java b/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingManagerTest.java deleted file mode 100644 index 42954c25..00000000 --- a/backend/src/test/java/moim_today/implement/meeting/joined_meeting/JoinedMeetingManagerTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package moim_today.implement.meeting.joined_meeting; - -import moim_today.persistence.entity.moim.joined_moim.JoinedMoimJpaEntity; -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 org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; - -class JoinedMeetingManagerTest extends ImplementTest { - - @Autowired - private JoinedMeetingAppender joinedMeetingAppender; - - @DisplayName("모임 참여자를 바탕으로 미팅 참여 정보를 추가한다.") - @Test - void saveJoinedMeeting() { - // given - long moimId = 1L; - long meetingId = 2L; - - for (long i = 0; i < 3; i++) { - JoinedMoimJpaEntity joinedMoimJpaEntity = JoinedMoimJpaEntity.builder() - .memberId(i) - .moimId(moimId) - .build(); - - joinedMoimRepository.save(joinedMoimJpaEntity); - } - - // when - joinedMeetingAppender.saveJoinedMeeting(moimId, meetingId); - - // then - assertThat(joinedMeetingRepository.count()).isEqualTo(3); - } -} \ No newline at end of file From 5793c2217abc346b3eb607a29bae8e9f48602c25 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sat, 4 May 2024 14:18:27 +0900 Subject: [PATCH 11/13] =?UTF-8?q?[BE]=20refactor=20:=20=EB=AF=B8=ED=8C=85?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=ED=8A=B8=EB=9E=9C=EC=9E=AD=EC=85=98=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../implement/meeting/meeting/MeetingManager.java | 15 ++++----------- .../schedule/schedule/ScheduleAppender.java | 7 +++++++ 2 files changed, 11 insertions(+), 11 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 857650e8..f0707bac 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 @@ -10,13 +10,12 @@ import moim_today.implement.schedule.schedule.ScheduleAppender; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; import moim_today.persistence.entity.schedule.schedule.ScheduleJpaEntity; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; -import java.util.ArrayList; import java.util.List; -import java.util.concurrent.CompletableFuture; import static moim_today.global.constant.TimeConstant.*; @@ -40,6 +39,7 @@ public MeetingManager(final MeetingAppender meetingAppender, final MoimFinder mo this.joinedMeetingFinder = joinedMeetingFinder; } + @Transactional public void createMeeting(final MeetingCreateRequest meetingCreateRequest) { MeetingCategory meetingCategory = meetingCreateRequest.meetingCategory(); String moimTitle = moimFinder.getTitleById(meetingCreateRequest.moimId()); @@ -84,17 +84,10 @@ private void createRegularMeeting(final MeetingCreateRequest meetingCreateReques private void createSchedules(final String moimTitle, final MeetingJpaEntity meetingJpaEntity) { List memberIds = joinedMeetingFinder.findAllMemberId(meetingJpaEntity.getId()); - List> futures = new ArrayList<>(); for (long memberId : memberIds) { - CompletableFuture future = CompletableFuture.runAsync(() -> { - ScheduleJpaEntity scheduleJpaEntity = ScheduleJpaEntity.toEntity(memberId, moimTitle, meetingJpaEntity); - scheduleAppender.createSchedule(scheduleJpaEntity); - }); - - futures.add(future); + ScheduleJpaEntity scheduleJpaEntity = ScheduleJpaEntity.toEntity(memberId, moimTitle, meetingJpaEntity); + scheduleAppender.createIfNotExist(scheduleJpaEntity); } - - CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); } } diff --git a/backend/src/main/java/moim_today/implement/schedule/schedule/ScheduleAppender.java b/backend/src/main/java/moim_today/implement/schedule/schedule/ScheduleAppender.java index e3ed299b..6c5ffc14 100644 --- a/backend/src/main/java/moim_today/implement/schedule/schedule/ScheduleAppender.java +++ b/backend/src/main/java/moim_today/implement/schedule/schedule/ScheduleAppender.java @@ -39,6 +39,13 @@ public void createSchedule(final ScheduleJpaEntity scheduleJpaEntity) { scheduleRepository.save(scheduleJpaEntity); } + @Transactional + public void createIfNotExist(final ScheduleJpaEntity scheduleJpaEntity) { + if (!scheduleRepository.exists(scheduleJpaEntity)) { + scheduleRepository.save(scheduleJpaEntity); + } + } + private void validateAlreadyExist(final ScheduleJpaEntity scheduleJpaEntity) { if (scheduleRepository.exists(scheduleJpaEntity)) { throw new BadRequestException(SCHEDULE_ALREADY_EXIST.message()); From 0a2414f000551ba93382c91a90ce7c364a5dae7a Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sat, 4 May 2024 14:31:32 +0900 Subject: [PATCH 12/13] =?UTF-8?q?[BE]=20test=20:=20=EB=AF=B8=ED=8C=85=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=ED=8A=B8=EB=9E=9C=EC=9E=AD=EC=85=98=20?= =?UTF-8?q?=EB=B2=94=EC=9C=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/meeting/MeetingManager.java | 2 +- .../schedule/schedule/ScheduleAppender.java | 2 +- .../meeting/meeting/MeetingManagerTest.java | 145 ++++++++++++++++++ .../schedule/ScheduleAppenderTest.java | 49 ++++++ 4 files changed, 196 insertions(+), 2 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 f0707bac..d38089c7 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 @@ -87,7 +87,7 @@ private void createSchedules(final String moimTitle, final MeetingJpaEntity meet for (long memberId : memberIds) { ScheduleJpaEntity scheduleJpaEntity = ScheduleJpaEntity.toEntity(memberId, moimTitle, meetingJpaEntity); - scheduleAppender.createIfNotExist(scheduleJpaEntity); + scheduleAppender.createScheduleIfNotExist(scheduleJpaEntity); } } } diff --git a/backend/src/main/java/moim_today/implement/schedule/schedule/ScheduleAppender.java b/backend/src/main/java/moim_today/implement/schedule/schedule/ScheduleAppender.java index 6c5ffc14..638c4edf 100644 --- a/backend/src/main/java/moim_today/implement/schedule/schedule/ScheduleAppender.java +++ b/backend/src/main/java/moim_today/implement/schedule/schedule/ScheduleAppender.java @@ -40,7 +40,7 @@ public void createSchedule(final ScheduleJpaEntity scheduleJpaEntity) { } @Transactional - public void createIfNotExist(final ScheduleJpaEntity scheduleJpaEntity) { + public void createScheduleIfNotExist(final ScheduleJpaEntity scheduleJpaEntity) { if (!scheduleRepository.exists(scheduleJpaEntity)) { scheduleRepository.save(scheduleJpaEntity); } 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 9646bdc9..bb0d608e 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,7 +3,9 @@ import moim_today.domain.meeting.enums.MeetingCategory; import moim_today.dto.meeting.MeetingCreateRequest; import moim_today.persistence.entity.meeting.meeting.MeetingJpaEntity; +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; import moim_today.util.ImplementTest; import moim_today.util.TestConstant; import org.junit.jupiter.api.DisplayName; @@ -84,4 +86,147 @@ void createRegularMeeting() { long between = ChronoUnit.WEEKS.between(startDate, endDate) + 1; assertThat(meetingRepository.count()).isEqualTo(between); } + + @DisplayName("일회 미팅 생성시 참여 정보, 스케줄 정보를 등록한다.") + @Test + void createSingleMeetingWithJoinedAndSchedule() { + // given 1 + long memberId = 1; + 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 + for (int i = 1; i < 11; i++) { + JoinedMoimJpaEntity joinedMoimJpaEntity = JoinedMoimJpaEntity.builder() + .moimId(moimJpaEntity.getId()) + .memberId(i) + .build(); + + joinedMoimRepository.save(joinedMoimJpaEntity); + } + + // given 3 + 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.SINGLE) + .build(); + + // when + meetingManager.createMeeting(meetingCreateRequest); + + // then + assertThat(meetingRepository.count()).isEqualTo(1); + assertThat(joinedMeetingRepository.count()).isEqualTo(10); + assertThat(scheduleRepository.count()).isEqualTo(10); + } + + @DisplayName("정기 미팅 생성시 참여 정보, 스케줄 정보를 등록한다.") + @Test + void createRegularMeetingWithJoinedAndSchedule() { + // given 1 + long memberId = 1; + 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 + for (int i = 1; i < 11; i++) { + JoinedMoimJpaEntity joinedMoimJpaEntity = JoinedMoimJpaEntity.builder() + .moimId(moimJpaEntity.getId()) + .memberId(i) + .build(); + + joinedMoimRepository.save(joinedMoimJpaEntity); + } + + // given 3 + 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 + meetingManager.createMeeting(meetingCreateRequest); + + // then + long between = ChronoUnit.WEEKS.between(startDate, endDate) + 1; + assertThat(meetingRepository.count()).isEqualTo(between); + assertThat(joinedMeetingRepository.count()).isEqualTo(10 * between); + assertThat(scheduleRepository.count()).isEqualTo(10 * between); + } + + @DisplayName("원래 있던 일정과 겹치면 스케줄을 등록하지 않는다.") + @Test + void createMeetingScheduleIfNotExist() { + // given 1 + long memberId = 1; + 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 + JoinedMoimJpaEntity joinedMoimJpaEntity = JoinedMoimJpaEntity.builder() + .moimId(moimJpaEntity.getId()) + .memberId(memberId) + .build(); + + joinedMoimRepository.save(joinedMoimJpaEntity); + + + ScheduleJpaEntity scheduleJpaEntity = ScheduleJpaEntity.builder() + .memberId(memberId) + .startDateTime(LocalDateTime.of(2024, 3, 4, 10, 0, 0)) + .endDateTime(LocalDateTime.of(2024, 3, 4, 12, 0, 0)) + .build(); + + scheduleRepository.save(scheduleJpaEntity); + + // given 3 + 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.SINGLE) + .build(); + + // when + meetingManager.createMeeting(meetingCreateRequest); + + // then + assertThat(meetingRepository.count()).isEqualTo(1); + assertThat(joinedMeetingRepository.count()).isEqualTo(1); + assertThat(scheduleRepository.count()).isEqualTo(1); + } } \ No newline at end of file diff --git a/backend/src/test/java/moim_today/implement/schedule/schedule/ScheduleAppenderTest.java b/backend/src/test/java/moim_today/implement/schedule/schedule/ScheduleAppenderTest.java index 2dc3772f..f6e618b3 100644 --- a/backend/src/test/java/moim_today/implement/schedule/schedule/ScheduleAppenderTest.java +++ b/backend/src/test/java/moim_today/implement/schedule/schedule/ScheduleAppenderTest.java @@ -4,6 +4,7 @@ import moim_today.global.error.BadRequestException; 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; @@ -265,4 +266,52 @@ void createScheduleFailAlreadyExistAfterSchedule() { assertThat(scheduleRepository.count()).isEqualTo(1); } + + @DisplayName("원래 있던 일정과 겹치지 않으면 스케줄을 등록한다.") + @Test + void createScheduleIfNotExist() { + // given 1 + ScheduleJpaEntity beforeScheduleJpaEntity = ScheduleJpaEntity.builder() + .startDateTime(LocalDateTime.of(2024, 1, 1, 10, 0, 0)) + .endDateTime(LocalDateTime.of(2024, 1, 1, 12, 0, 0)) + .build(); + + scheduleRepository.save(beforeScheduleJpaEntity); + + // given 2 + ScheduleJpaEntity newScheduleJpaEntity = ScheduleJpaEntity.builder() + .startDateTime(LocalDateTime.of(2024, 1, 1, 12, 0, 0)) + .endDateTime(LocalDateTime.of(2024, 1, 1, 14, 0, 0)) + .build(); + + // when + scheduleAppender.createScheduleIfNotExist(newScheduleJpaEntity); + + // then + assertThat(scheduleRepository.count()).isEqualTo(2); + } + + @DisplayName("원래 있던 일정과 겹치면 스케줄을 등록하지 않는다.") + @Test + void notCreateScheduleIfExist() { + // given 1 + ScheduleJpaEntity beforeScheduleJpaEntity = ScheduleJpaEntity.builder() + .startDateTime(LocalDateTime.of(2024, 1, 1, 10, 0, 0)) + .endDateTime(LocalDateTime.of(2024, 1, 1, 12, 0, 0)) + .build(); + + scheduleRepository.save(beforeScheduleJpaEntity); + + // given 2 + ScheduleJpaEntity newScheduleJpaEntity = ScheduleJpaEntity.builder() + .startDateTime(LocalDateTime.of(2024, 1, 1, 11, 59, 59)) + .endDateTime(LocalDateTime.of(2024, 1, 1, 14, 0, 0)) + .build(); + + // when + scheduleAppender.createScheduleIfNotExist(newScheduleJpaEntity); + + // then + assertThat(scheduleRepository.count()).isEqualTo(1); + } } \ No newline at end of file From 5c7f6e20ca64e1d023fc37d82c560fab2200ac62 Mon Sep 17 00:00:00 2001 From: Jung-YouHwan Date: Sat, 4 May 2024 14:38:49 +0900 Subject: [PATCH 13/13] =?UTF-8?q?[BE]=20refactor=20:=20=EC=B0=B8=EC=97=AC?= =?UTF-8?q?=20=EB=AA=A9=EB=A1=9D=20=EC=A0=80=EC=9E=A5=EC=8B=9C=20saveAll?= =?UTF-8?q?=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meeting/joined_meeting/JoinedMeetingAppender.java | 9 ++++++--- .../meeting/joined_meeting/JoinedMeetingRepository.java | 2 ++ .../joined_meeting/JoinedMeetingRepositoryImpl.java | 5 +++++ 3 files changed, 13 insertions(+), 3 deletions(-) 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 30c9925f..e07c7c9f 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 @@ -6,6 +6,7 @@ import moim_today.persistence.repository.meeting.joined_meeting.JoinedMeetingRepository; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.List; @Implement @@ -23,11 +24,13 @@ public JoinedMeetingAppender(final JoinedMeetingRepository joinedMeetingReposito @Transactional public void saveJoinedMeeting(final long moimId, final long meetingId) { List memberIds = joinedMoimFinder.findAllJoinedMemberId(moimId); + List joinedMeetings = new ArrayList<>(); for (long memberId : memberIds) { - JoinedMeetingJpaEntity joinedMeetingJpaEntity = - JoinedMeetingJpaEntity.toEntity(meetingId, memberId, true); - joinedMeetingRepository.save(joinedMeetingJpaEntity); + JoinedMeetingJpaEntity joinedMeeting = JoinedMeetingJpaEntity.toEntity(meetingId, memberId, true); + joinedMeetings.add(joinedMeeting); } + + joinedMeetingRepository.saveAll(joinedMeetings); } } 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 ee8e6deb..9db85a8c 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 @@ -10,6 +10,8 @@ public interface JoinedMeetingRepository { void save(final JoinedMeetingJpaEntity joinedMeetingJpaEntity); + void saveAll(final List joinedMeetingJpaEntities); + List findAllMemberIdByMeetingId(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 38ba493e..f5205d6b 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 @@ -31,6 +31,11 @@ public void save(final JoinedMeetingJpaEntity joinedMeetingJpaEntity) { joinedMeetingJpaRepository.save(joinedMeetingJpaEntity); } + @Override + public void saveAll(final List joinedMeetingJpaEntities) { + joinedMeetingJpaRepository.saveAll(joinedMeetingJpaEntities); + } + @Override public List findAllMemberIdByMeetingId(final long meetingId) { return queryFactory.select(joinedMeetingJpaEntity.memberId)