Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 4 additions & 7 deletions src/main/java/com/wooteco/wiki/admin/service/AdminService.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
package com.wooteco.wiki.admin.service;

import com.wooteco.wiki.document.service.DocumentService;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@RequiredArgsConstructor
@Service
public class AdminService {

private final DocumentService documentService;

public AdminService(DocumentService documentService) {
this.documentService = documentService;
}
private final CrewDocumentService crewDocumentService;

public void deleteDocumentByDocumentUuid(UUID documentUuid) {
documentService.deleteByUuid(documentUuid);
crewDocumentService.deleteByUuid(documentUuid);
}
}
106 changes: 106 additions & 0 deletions src/main/java/com/wooteco/wiki/admin/service/CrewDocumentService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package com.wooteco.wiki.admin.service;

import com.wooteco.wiki.document.domain.CrewDocument;
import com.wooteco.wiki.document.domain.Document;
import com.wooteco.wiki.document.domain.dto.CrewDocumentCreateRequest;
import com.wooteco.wiki.document.domain.dto.DocumentResponse;
import com.wooteco.wiki.document.domain.dto.DocumentUpdateRequest;
import com.wooteco.wiki.document.repository.CrewDocumentRepository;
import com.wooteco.wiki.document.repository.DocumentRepository;
import com.wooteco.wiki.global.exception.ErrorCode;
import com.wooteco.wiki.global.exception.WikiException;
import com.wooteco.wiki.history.service.HistoryService;
import com.wooteco.wiki.organizationdocument.dto.response.OrganizationDocumentResponse;
import com.wooteco.wiki.organizationdocument.service.DocumentOrganizationLinkService;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Random;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@RequiredArgsConstructor
@Transactional(readOnly = true)
@Service
public class CrewDocumentService {

private final DocumentOrganizationLinkService documentOrganizationLinkService;
private final CrewDocumentRepository crewDocumentRepository;
private final DocumentRepository documentRepository;
private final HistoryService historyService;
private final Random random;

@Transactional
public void deleteByUuid(UUID documentUuid) {
CrewDocument crewDocument = crewDocumentRepository.findByUuid(documentUuid)
.orElseThrow(() -> new WikiException(ErrorCode.DOCUMENT_NOT_FOUND));

documentOrganizationLinkService.unlinkAll(crewDocument);

documentRepository.deleteByUuid(documentUuid);
}

@Transactional
public DocumentResponse create(CrewDocumentCreateRequest request) {
String title = request.title();
if (documentRepository.existsByTitle(title)) {
throw new WikiException(ErrorCode.DOCUMENT_DUPLICATE);
}

CrewDocument crewDocument = request.toCrewDocument();
CrewDocument savedDocument = crewDocumentRepository.save(crewDocument);
historyService.save(savedDocument);
return mapToResponse(savedDocument);
}

public DocumentResponse getByUuid(UUID uuid) {
CrewDocument crewDocument = crewDocumentRepository.findByUuid(uuid)
.orElseThrow(() -> new WikiException(ErrorCode.DOCUMENT_NOT_FOUND));
return mapToResponse(crewDocument);
}

public DocumentResponse getByTitle(String title) {
Document document = documentRepository.findByTitle(title)
.orElseThrow(() -> new WikiException(ErrorCode.DOCUMENT_NOT_FOUND));

if (!(document instanceof CrewDocument crewDocument)) {
throw new WikiException(ErrorCode.DOCUMENT_NOT_FOUND);
}

return mapToResponse(crewDocument);
}

public DocumentResponse getRandom() {
List<CrewDocument> documents = crewDocumentRepository.findAll();
if (documents.isEmpty()) {
throw new WikiException(ErrorCode.DOCUMENT_NOT_FOUND);
}
CrewDocument document = documents.get(random.nextInt(documents.size()));
return mapToResponse(document);
}

@Transactional
public DocumentResponse update(UUID uuid, DocumentUpdateRequest request) {
CrewDocument crewDocument = crewDocumentRepository.findByUuid(uuid)
.orElseThrow(() -> new WikiException(ErrorCode.DOCUMENT_NOT_FOUND));

Document updateData = crewDocument.update(
request.title(),
request.contents(),
request.writer(),
request.documentBytes(),
LocalDateTime.now()
);
historyService.save(updateData);
return mapToResponse(crewDocument);
}

private DocumentResponse mapToResponse(CrewDocument crewDocument) {
long latestVersion = historyService.findLatestVersionByDocument(crewDocument);
List<OrganizationDocumentResponse> organizationDocumentResponses =
documentOrganizationLinkService.findOrganizationDocumentResponsesByDocument(crewDocument);

return DocumentResponse.toDocumentResponse(crewDocument, latestVersion, organizationDocumentResponses);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.wooteco.wiki.document.controller;

import com.wooteco.wiki.admin.service.CrewDocumentService;
import com.wooteco.wiki.document.domain.Document;
import com.wooteco.wiki.document.domain.dto.*;
import com.wooteco.wiki.document.service.DocumentSearchService;
Expand Down Expand Up @@ -27,6 +28,7 @@
@RequiredArgsConstructor
public class DocumentController {

private final CrewDocumentService crewDocumentService;
private final DocumentService documentService;
private final HistoryService historyService;
private final DocumentSearchService documentSearchService;
Expand All @@ -35,14 +37,14 @@ public class DocumentController {
@Operation(summary = "위키 글 작성", description = "위키 글을 작성합니다.")
@PostMapping
public ApiResponse<SuccessBody<DocumentResponse>> post(@RequestBody CrewDocumentCreateRequest crewDocumentCreateRequest) {
DocumentResponse response = documentService.postCrewDocument(crewDocumentCreateRequest);
DocumentResponse response = crewDocumentService.create(crewDocumentCreateRequest);
return ApiResponseGenerator.success(response);
}

@Operation(summary = "랜덤 위키 글 조회", description = "랜덤으로 위키 글을 조회합니다.")
@GetMapping("/random")
public ApiResponse<SuccessBody<DocumentResponse>> getRandom() {
DocumentResponse response = documentService.getRandom();
DocumentResponse response = crewDocumentService.getRandom();
return ApiResponseGenerator.success(response);
}

Expand All @@ -56,8 +58,8 @@ public ApiResponse<SuccessBody<PagedResponse<List<DocumentListResponse>>>> findA

@Operation(summary = "제목으로 위키 글 조회", description = "제목을 통해 위키 글을 조회합니다.")
@GetMapping("title/{title}")
public ApiResponse<SuccessBody<Object>> get(@PathVariable String title) {
Object response = documentService.get(title);
public ApiResponse<SuccessBody<DocumentResponse>> get(@PathVariable String title) {
DocumentResponse response = crewDocumentService.getByTitle(title);
return ApiResponseGenerator.success(response);
}

Expand All @@ -70,9 +72,9 @@ public ApiResponse<SuccessBody<Object>> getUuidByTitle(@PathVariable String titl

@Operation(summary = "UUID로 위키 글 조회", description = "UUID를 통해 위키 글을 조회합니다.")
@GetMapping("uuid/{uuidText}")
public ApiResponse<SuccessBody<Object>> getByUuid(@PathVariable String uuidText) {
public ApiResponse<SuccessBody<DocumentResponse>> getByUuid(@PathVariable String uuidText) {
UUID uuid = UUID.fromString(uuidText);
Object response = documentService.getByUuid(uuid);
DocumentResponse response = crewDocumentService.getByUuid(uuid);
return ApiResponseGenerator.success(response);
}

Expand All @@ -99,7 +101,7 @@ public ApiResponse<SuccessBody<HistoryDetailResponse>> getDocumentLogs(@PathVari
public ApiResponse<SuccessBody<DocumentResponse>> put(
@RequestBody DocumentUpdateRequest documentUpdateRequest
) {
DocumentResponse response = documentService.put(documentUpdateRequest.uuid(), documentUpdateRequest);
DocumentResponse response = crewDocumentService.update(documentUpdateRequest.uuid(), documentUpdateRequest);
return ApiResponseGenerator.success(response);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,39 @@
package com.wooteco.wiki.document.domain.dto;

import com.wooteco.wiki.document.domain.CrewDocument;
import com.wooteco.wiki.organizationdocument.dto.response.OrganizationDocumentResponse;
import java.time.LocalDateTime;
import java.util.List;
import java.util.UUID;

public record DocumentResponse(
Long documentId,
UUID documentUUID,
String title,
String contents,
String writer,
LocalDateTime generateTime,
Integer viewCount,
Long documentId,
UUID documentUUID,
String title,
String contents,
String writer,
LocalDateTime generateTime,
Integer viewCount,
Long latestVersion,
List<OrganizationDocumentResponse> organizationDocumentResponses
) {

public static DocumentResponse toDocumentResponse(
CrewDocument crewDocument,
Long latestVersion,
List<OrganizationDocumentResponse> organizationDocumentResponses
) {
) {
return new DocumentResponse(
crewDocument.getId(),
crewDocument.getUuid(),
crewDocument.getTitle(),
crewDocument.getContents(),
crewDocument.getWriter(),
crewDocument.getGenerateTime(),
crewDocument.getViewCount(),
latestVersion,
organizationDocumentResponses
);
}
}

120 changes: 8 additions & 112 deletions src/main/java/com/wooteco/wiki/document/service/DocumentService.java
Original file line number Diff line number Diff line change
@@ -1,111 +1,38 @@
package com.wooteco.wiki.document.service;

import com.wooteco.wiki.document.domain.CrewDocument;
import com.wooteco.wiki.document.domain.Document;
import com.wooteco.wiki.document.domain.dto.CrewDocumentCreateRequest;
import com.wooteco.wiki.document.domain.dto.DocumentResponse;
import com.wooteco.wiki.document.domain.dto.DocumentUpdateRequest;
import com.wooteco.wiki.document.domain.dto.DocumentUuidResponse;
import com.wooteco.wiki.document.repository.DocumentRepository;
import com.wooteco.wiki.global.common.PagingRequest;
import com.wooteco.wiki.global.exception.ErrorCode;
import com.wooteco.wiki.global.exception.WikiException;
import com.wooteco.wiki.history.service.HistoryService;
import com.wooteco.wiki.organizationdocument.dto.response.OrganizationDocumentResponse;
import com.wooteco.wiki.organizationdocument.service.DocumentOrganizationLinkService;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@RequiredArgsConstructor
@Transactional(readOnly = true)
@Service
@Transactional
public class DocumentService {

private final DocumentRepository documentRepository;
private final DocumentOrganizationLinkService organizationDocumentLinkService;
private final HistoryService historyService;
private final Random random;

public DocumentService(
DocumentRepository documentRepository,
DocumentOrganizationLinkService organizationDocumentLinkService,
HistoryService historyService,
Random random
) {
this.documentRepository = documentRepository;
this.organizationDocumentLinkService = organizationDocumentLinkService;
this.historyService = historyService;
this.random = random;
}

public DocumentResponse postCrewDocument(CrewDocumentCreateRequest request) {
String title = request.title();
if (documentRepository.existsByTitle(title)) {
throw new WikiException(ErrorCode.DOCUMENT_DUPLICATE);
}

CrewDocument crewDocument = request.toCrewDocument();
Document savedDocument = documentRepository.save(crewDocument);
historyService.save(savedDocument);
return mapToResponse(savedDocument);
}

@Transactional(readOnly = true)
public DocumentResponse getRandom() {
List<Document> documents = documentRepository.findAll();
if (documents.isEmpty()) {
throw new WikiException(ErrorCode.DOCUMENT_NOT_FOUND);
}
Document document = documents.get(random.nextInt(documents.size()));
return mapToResponse(document);
}

@Transactional(readOnly = true)
public Page<Document> findAll(PagingRequest requestDto) {
return documentRepository.findAll(requestDto.toPageable());
public Page<Document> findAll(PagingRequest pagingRequest) {
return documentRepository.findAll(pagingRequest.toPageable());
}

@Transactional(readOnly = true)
public DocumentResponse get(String title) {
Document document = documentRepository.findByTitle(title)
.orElseThrow(() -> new WikiException(ErrorCode.DOCUMENT_NOT_FOUND));
return mapToResponse(document);
}

@Transactional(readOnly = true)
public DocumentUuidResponse getUuidByTitle(String title) {
return documentRepository.findUuidByTitle(title)
.map(DocumentUuidResponse::new)
.orElseThrow(() -> new WikiException(ErrorCode.DOCUMENT_NOT_FOUND));
}

@Transactional(readOnly = true)
public DocumentResponse getByUuid(UUID uuid) {
Document document = documentRepository.findByUuid(uuid)
.orElseThrow(() -> new WikiException(ErrorCode.DOCUMENT_NOT_FOUND));
return mapToResponse(document);
}

public DocumentResponse put(UUID uuid, DocumentUpdateRequest request) {
String title = request.title();
String contents = request.contents();
String writer = request.writer();
Long documentBytes = request.documentBytes();

Document document = documentRepository.findByUuid(uuid)
.orElseThrow(() -> new WikiException(ErrorCode.DOCUMENT_NOT_FOUND));

Document updateData = document.update(title, contents, writer, documentBytes, LocalDateTime.now());
historyService.save(updateData);
return mapToResponse(document);
.map(DocumentUuidResponse::new)
.orElseThrow(() -> new WikiException(ErrorCode.DOCUMENT_NOT_FOUND));
}

@Transactional
public void flushViews(Map<UUID, Integer> views) {
List<Document> documents = documentRepository.findAllByUuidIn(views.keySet());

Expand All @@ -119,36 +46,5 @@ public void flushViews(Map<UUID, Integer> views) {

documentRepository.saveAll(documents);
}

public void deleteByUuid(UUID documentUuid) {
documentRepository.findByUuid(documentUuid)
.orElseThrow(() -> new WikiException(ErrorCode.DOCUMENT_NOT_FOUND));
documentRepository.deleteByUuid(documentUuid);
}

private DocumentResponse mapToResponse(Document document) {
long latestVersion = historyService.findLatestVersionByDocument(document);
List<OrganizationDocumentResponse> organizationDocumentResponses =
(document instanceof CrewDocument crew)
? organizationDocumentLinkService.findOrganizationDocumentResponsesByDocument(crew)
: Collections.emptyList();

return new DocumentResponse(
document.getId() != null ? document.getId() :
throwNotFound(),
document.getUuid(),
document.getTitle(),
document.getContents(),
document.getWriter(),
document.getGenerateTime(),
document.getViewCount(),
latestVersion,
organizationDocumentResponses
);
}

private Long throwNotFound() {
throw new WikiException(ErrorCode.DOCUMENT_NOT_FOUND);
}
}

Loading
Loading