diff --git a/src/main/java/com/wooteco/wiki/organizationdocument/controller/OrganizationDocumentController.java b/src/main/java/com/wooteco/wiki/organizationdocument/controller/OrganizationDocumentController.java index 7e2f03f..580ad2f 100644 --- a/src/main/java/com/wooteco/wiki/organizationdocument/controller/OrganizationDocumentController.java +++ b/src/main/java/com/wooteco/wiki/organizationdocument/controller/OrganizationDocumentController.java @@ -4,6 +4,7 @@ import com.wooteco.wiki.global.common.ApiResponse.SuccessBody; import com.wooteco.wiki.global.common.ApiResponseGenerator; import com.wooteco.wiki.organizationdocument.dto.request.OrganizationDocumentCreateRequest; +import com.wooteco.wiki.organizationdocument.dto.request.OrganizationDocumentLinkRequest; import com.wooteco.wiki.organizationdocument.dto.request.OrganizationDocumentUpdateRequest; import com.wooteco.wiki.organizationdocument.dto.response.OrganizationDocumentAndEventResponse; import com.wooteco.wiki.organizationdocument.dto.response.OrganizationDocumentResponse; @@ -42,6 +43,16 @@ public ApiResponse> createOrganization return ApiResponseGenerator.success(organizationDocumentResponse); } + @Operation(summary = "기존 조직 문서를 크루 문서에 연결", description = "이미 존재하는 조직 문서를 크루 문서와 연결합니다.") + @PostMapping("/link") + public ApiResponse> linkOrganizationDocument( + @RequestBody OrganizationDocumentLinkRequest organizationDocumentLinkRequest) { + OrganizationDocumentResponse organizationDocumentResponse = organizationDocumentService.link( + organizationDocumentLinkRequest); + + return ApiResponseGenerator.success(organizationDocumentResponse); + } + @Operation(summary = "조직 위키 글 수정", description = "조직 위키 글을 수정합니다.") @PutMapping public ApiResponse> modifyOrganizationDocumentContents( diff --git a/src/main/java/com/wooteco/wiki/organizationdocument/dto/request/OrganizationDocumentLinkRequest.java b/src/main/java/com/wooteco/wiki/organizationdocument/dto/request/OrganizationDocumentLinkRequest.java new file mode 100644 index 0000000..722fff5 --- /dev/null +++ b/src/main/java/com/wooteco/wiki/organizationdocument/dto/request/OrganizationDocumentLinkRequest.java @@ -0,0 +1,9 @@ +package com.wooteco.wiki.organizationdocument.dto.request; + +import java.util.UUID; + +public record OrganizationDocumentLinkRequest( + UUID crewDocumentUuid, + UUID organizationDocumentUuid +) { +} \ No newline at end of file diff --git a/src/main/java/com/wooteco/wiki/organizationdocument/service/OrganizationDocumentService.java b/src/main/java/com/wooteco/wiki/organizationdocument/service/OrganizationDocumentService.java index 520c10e..7075111 100644 --- a/src/main/java/com/wooteco/wiki/organizationdocument/service/OrganizationDocumentService.java +++ b/src/main/java/com/wooteco/wiki/organizationdocument/service/OrganizationDocumentService.java @@ -10,6 +10,7 @@ import com.wooteco.wiki.history.service.HistoryService; import com.wooteco.wiki.organizationdocument.domain.OrganizationDocument; import com.wooteco.wiki.organizationdocument.dto.request.OrganizationDocumentCreateRequest; +import com.wooteco.wiki.organizationdocument.dto.request.OrganizationDocumentLinkRequest; import com.wooteco.wiki.organizationdocument.dto.request.OrganizationDocumentUpdateRequest; import com.wooteco.wiki.organizationdocument.dto.response.OrganizationDocumentAndEventResponse; import com.wooteco.wiki.organizationdocument.dto.response.OrganizationDocumentResponse; @@ -47,6 +48,14 @@ public OrganizationDocumentResponse create(OrganizationDocumentCreateRequest org return new OrganizationDocumentResponse(savedOrganizationDocument); } + public OrganizationDocumentResponse link(OrganizationDocumentLinkRequest organizationDocumentLinkRequest) { + CrewDocument crewDocument = getCrewDocument(organizationDocumentLinkRequest.crewDocumentUuid()); + OrganizationDocument organizationDocument = getOrganizationDocument( + organizationDocumentLinkRequest.organizationDocumentUuid()); + documentOrganizationLinkService.link(crewDocument, organizationDocument); + return new OrganizationDocumentResponse(organizationDocument); + } + public OrganizationDocumentResponse update(OrganizationDocumentUpdateRequest organizationDocumentUpdateRequest) { OrganizationDocument organizationDocument = organizationDocumentRepository.findByUuid( organizationDocumentUpdateRequest.uuid()) diff --git a/src/test/java/com/wooteco/wiki/organizationdocument/service/OrganizationDocumentServiceTest.java b/src/test/java/com/wooteco/wiki/organizationdocument/service/OrganizationDocumentServiceTest.java new file mode 100644 index 0000000..6715d6c --- /dev/null +++ b/src/test/java/com/wooteco/wiki/organizationdocument/service/OrganizationDocumentServiceTest.java @@ -0,0 +1,108 @@ +package com.wooteco.wiki.organizationdocument.service; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.SoftAssertions.assertSoftly; + +import com.wooteco.wiki.document.domain.CrewDocument; +import com.wooteco.wiki.document.fixture.CrewDocumentFixture; +import com.wooteco.wiki.document.repository.CrewDocumentRepository; +import com.wooteco.wiki.global.exception.WikiException; +import com.wooteco.wiki.organizationdocument.domain.DocumentOrganizationLink; +import com.wooteco.wiki.organizationdocument.domain.OrganizationDocument; +import com.wooteco.wiki.organizationdocument.dto.request.OrganizationDocumentLinkRequest; +import com.wooteco.wiki.organizationdocument.fixture.OrganizationDocumentFixture; +import com.wooteco.wiki.organizationdocument.repository.DocumentOrganizationLinkRepository; +import com.wooteco.wiki.organizationdocument.repository.OrganizationDocumentRepository; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +class OrganizationDocumentServiceTest { + + @Autowired + private OrganizationDocumentService organizationDocumentService; + + @Autowired + private CrewDocumentRepository crewDocumentRepository; + + @Autowired + private OrganizationDocumentRepository organizationDocumentRepository; + + @Autowired + private DocumentOrganizationLinkRepository documentOrganizationLinkRepository; + + @DisplayName("기존 조직 문서를 크루 문서에 연결할 때") + @Nested + class LinkExistingOrganization { + + private CrewDocument savedCrewDocument; + private OrganizationDocument savedOrganizationDocument; + + @BeforeEach + void setUp() { + CrewDocument crewDocument = CrewDocumentFixture.createDefaultCrewDocument(); + savedCrewDocument = crewDocumentRepository.save(crewDocument); + + OrganizationDocument organizationDocument = OrganizationDocumentFixture.createDefault(); + savedOrganizationDocument = organizationDocumentRepository.save(organizationDocument); + } + + @DisplayName("성공적으로 기존 조직 문서를 크루 문서와 연결한다") + @Test + void link_success() { + // given + OrganizationDocumentLinkRequest request = new OrganizationDocumentLinkRequest( + savedCrewDocument.getUuid(), + savedOrganizationDocument.getUuid() + ); + + // when + organizationDocumentService.link(request); + + // then + DocumentOrganizationLink link = documentOrganizationLinkRepository + .findByCrewDocumentAndOrganizationDocument(savedCrewDocument, savedOrganizationDocument) + .orElseThrow(); + + assertSoftly(softly -> { + softly.assertThat(link.getCrewDocument().getId()).isEqualTo(savedCrewDocument.getId()); + softly.assertThat(link.getOrganizationDocument().getId()).isEqualTo(savedOrganizationDocument.getId()); + }); + } + + @DisplayName("존재하지 않는 크루 문서 UUID로 연결을 시도하면 예외가 발생한다") + @Test + void link_fail_crewDocumentNotFound() { + // given + OrganizationDocumentLinkRequest request = new OrganizationDocumentLinkRequest( + UUID.randomUUID(), + savedOrganizationDocument.getUuid() + ); + + // when & then + assertThatThrownBy(() -> organizationDocumentService.link(request)) + .isInstanceOf(WikiException.class); + } + + @DisplayName("존재하지 않는 조직 문서 UUID로 연결을 시도하면 예외가 발생한다") + @Test + void link_fail_organizationDocumentNotFound() { + // given + OrganizationDocumentLinkRequest request = new OrganizationDocumentLinkRequest( + savedCrewDocument.getUuid(), + UUID.randomUUID() + ); + + // when & then + assertThatThrownBy(() -> organizationDocumentService.link(request)) + .isInstanceOf(WikiException.class); + } + } +}