diff --git a/src/main/java/com/dokdok/meeting/service/MeetingService.java b/src/main/java/com/dokdok/meeting/service/MeetingService.java index 2cfce18..3b9e89f 100644 --- a/src/main/java/com/dokdok/meeting/service/MeetingService.java +++ b/src/main/java/com/dokdok/meeting/service/MeetingService.java @@ -30,6 +30,7 @@ import com.dokdok.topic.entity.TopicType; import com.dokdok.topic.repository.TopicAnswerRepository; import com.dokdok.topic.repository.TopicRepository; +import com.dokdok.topic.service.TopicService; import com.dokdok.user.entity.User; import com.dokdok.user.service.UserValidator; import lombok.RequiredArgsConstructor; @@ -50,6 +51,7 @@ public class MeetingService { private final MeetingMemberRepository meetingMemberRepository; private final TopicRepository topicRepository; private final TopicAnswerRepository topicAnswerRepository; + private final TopicService topicService; private final GatheringRepository gatheringRepository; private final GatheringMemberRepository gatheringMemberRepository; private final GatheringValidator gatheringValidator; @@ -155,6 +157,7 @@ public MeetingStatusResponse confirmMeeting(Long meetingId) { meeting.changeStatus(MeetingStatus.CONFIRMED); saveMeetingBookForUser(meeting, meeting.getGathering(), meeting.getMeetingLeader().getId()); + topicService.createDefaultTopic(meeting); return MeetingStatusResponse.from(meeting); } diff --git a/src/main/java/com/dokdok/topic/service/TopicService.java b/src/main/java/com/dokdok/topic/service/TopicService.java index 14556f8..b00dfc8 100644 --- a/src/main/java/com/dokdok/topic/service/TopicService.java +++ b/src/main/java/com/dokdok/topic/service/TopicService.java @@ -19,6 +19,7 @@ import com.dokdok.topic.entity.TopicLike; import com.dokdok.topic.entity.TopicMessage; import com.dokdok.topic.entity.TopicStatus; +import com.dokdok.topic.entity.TopicType; import com.dokdok.topic.exception.TopicErrorCode; import com.dokdok.topic.exception.TopicException; import com.dokdok.topic.repository.TopicAnswerRepository; @@ -50,6 +51,32 @@ public class TopicService { private final MeetingValidator meetingValidator; private final TopicValidator topicValidator; + @Transactional + public void createDefaultTopic(Meeting meeting) { + if (meeting == null || meeting.getId() == null) { + return; + } + if (topicRepository.countByMeetingIdAndDeletedAtIsNull(meeting.getId()) > 0) { + return; + } + + User leader = meeting.getMeetingLeader(); + if (leader == null) { + return; + } + TopicType type = TopicType.FREE; + + Topic topic = Topic.create( + meeting, + leader, + type.getDisplayName(), + type.getDescription(), + type + ); + + topicRepository.save(topic); + } + @Transactional public SuggestTopicResponse createTopic( Long gatheringId, diff --git a/src/test/java/com/dokdok/meeting/service/MeetingServiceTest.java b/src/test/java/com/dokdok/meeting/service/MeetingServiceTest.java index 8c0abdb..1afefd2 100644 --- a/src/test/java/com/dokdok/meeting/service/MeetingServiceTest.java +++ b/src/test/java/com/dokdok/meeting/service/MeetingServiceTest.java @@ -26,6 +26,7 @@ import com.dokdok.topic.entity.TopicType; import com.dokdok.topic.repository.TopicAnswerRepository; import com.dokdok.topic.repository.TopicRepository; +import com.dokdok.topic.service.TopicService; import com.dokdok.user.entity.User; import com.dokdok.user.service.UserValidator; import org.junit.jupiter.api.BeforeEach; @@ -68,6 +69,9 @@ class MeetingServiceTest { @Mock private TopicAnswerRepository topicAnswerRepository; + @Mock + private TopicService topicService; + @Mock private GatheringRepository gatheringRepository; @@ -561,6 +565,7 @@ void givenMeetingStatus_whenConfirm_thenMeetingStatusChange() { MeetingMember savedMember = meetingMemberCaptor.getValue(); assertThat(savedMember.getUser().getId()).isEqualTo(leader.getId()); assertThat(savedMember.getMeetingRole()).isEqualTo(MeetingMemberRole.LEADER); + verify(topicService).createDefaultTopic(meeting); } } diff --git a/src/test/java/com/dokdok/topic/service/TopicServiceTest.java b/src/test/java/com/dokdok/topic/service/TopicServiceTest.java index 8da1b65..4812f22 100644 --- a/src/test/java/com/dokdok/topic/service/TopicServiceTest.java +++ b/src/test/java/com/dokdok/topic/service/TopicServiceTest.java @@ -120,6 +120,61 @@ void setUp() { ); } + @Test + @DisplayName("기본 자유형 토픽이 없으면 생성한다") + void createDefaultTopic_Success() { + Meeting meeting = Meeting.builder() + .id(10L) + .meetingLeader(testUser) + .build(); + + given(topicRepository.countByMeetingIdAndDeletedAtIsNull(meeting.getId())) + .willReturn(0L); + + topicService.createDefaultTopic(meeting); + + var captor = org.mockito.ArgumentCaptor.forClass(Topic.class); + verify(topicRepository).save(captor.capture()); + Topic saved = captor.getValue(); + assertThat(saved.getMeeting()).isEqualTo(meeting); + assertThat(saved.getProposedBy()).isEqualTo(testUser); + assertThat(saved.getTopicType()).isEqualTo(TopicType.FREE); + assertThat(saved.getTitle()).isEqualTo(TopicType.FREE.getDisplayName()); + assertThat(saved.getDescription()).isEqualTo(TopicType.FREE.getDescription()); + } + + @Test + @DisplayName("이미 토픽이 있으면 기본 토픽을 생성하지 않는다") + void createDefaultTopic_SkipWhenExists() { + Meeting meeting = Meeting.builder() + .id(10L) + .meetingLeader(testUser) + .build(); + + given(topicRepository.countByMeetingIdAndDeletedAtIsNull(meeting.getId())) + .willReturn(1L); + + topicService.createDefaultTopic(meeting); + + verify(topicRepository, never()).save(any()); + } + + @Test + @DisplayName("약속장이 없으면 기본 토픽을 생성하지 않는다") + void createDefaultTopic_SkipWhenLeaderMissing() { + Meeting meeting = Meeting.builder() + .id(10L) + .meetingLeader(null) + .build(); + + given(topicRepository.countByMeetingIdAndDeletedAtIsNull(meeting.getId())) + .willReturn(0L); + + topicService.createDefaultTopic(meeting); + + verify(topicRepository, never()).save(any()); + } + @Test @DisplayName("선택한 주제를 확정 상태로 변경한다") void confirmTopics_Success() {