diff --git a/src/main/java/com/project/bumawiki/domain/docs/domain/Docs.java b/src/main/java/com/project/bumawiki/domain/docs/domain/Docs.java index 71b0f580..fee67292 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/domain/Docs.java +++ b/src/main/java/com/project/bumawiki/domain/docs/domain/Docs.java @@ -13,8 +13,6 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -31,7 +29,7 @@ public class Docs { private String title; @Column - private int enroll; + private Integer enroll; @Enumerated(EnumType.STRING) private DocsType docsType; @@ -41,11 +39,11 @@ public class Docs { @Enumerated(EnumType.STRING) private Status status; - public Docs(String title, int enroll, DocsType docsType, Status status) { + public Docs(String title, int enroll, DocsType docsType) { this.title = title; this.enroll = enroll; this.docsType = docsType; - this.status = status; + this.status = Status.GOOD; } public void updateDocsType(DocsType docsType) { diff --git a/src/main/java/com/project/bumawiki/domain/docs/domain/VersionDocs.java b/src/main/java/com/project/bumawiki/domain/docs/domain/VersionDocs.java index 94505818..6ddc07a3 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/domain/VersionDocs.java +++ b/src/main/java/com/project/bumawiki/domain/docs/domain/VersionDocs.java @@ -4,37 +4,27 @@ import org.springframework.data.annotation.CreatedDate; -import com.project.bumawiki.domain.contribute.domain.Contribute; import com.project.bumawiki.domain.user.domain.User; -import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.IdClass; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; -import jakarta.persistence.OneToOne; -import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Entity @Getter -@Builder @IdClass(VersionDocsPk.class) @NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor(access = AccessLevel.PROTECTED) public class VersionDocs { @Id - private int version; + private Integer version; @Id @ManyToOne(fetch = FetchType.LAZY) @@ -51,5 +41,10 @@ public class VersionDocs { @JoinColumn(name = "user_id") private User contributor; - + public VersionDocs(int version, Docs docs, String contents, User contributor) { + this.version = version; + this.docs = docs; + this.contents = contents; + this.contributor = contributor; + } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/domain/repository/DocsRepository.java b/src/main/java/com/project/bumawiki/domain/docs/domain/repository/DocsRepository.java index 06a4bc5e..0a944e01 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/domain/repository/DocsRepository.java +++ b/src/main/java/com/project/bumawiki/domain/docs/domain/repository/DocsRepository.java @@ -31,4 +31,6 @@ public interface DocsRepository extends JpaRepository, CustomDocsRep @Query("select d from Docs d order by d.lastModifiedAt desc") List findByLastModifiedAtAll(); + + boolean existsByTitle(String title); } diff --git a/src/main/java/com/project/bumawiki/domain/docs/exception/DocsTitleAlreadyExistException.java b/src/main/java/com/project/bumawiki/domain/docs/exception/DocsTitleAlreadyExistException.java deleted file mode 100644 index ec39bab9..00000000 --- a/src/main/java/com/project/bumawiki/domain/docs/exception/DocsTitleAlreadyExistException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.project.bumawiki.domain.docs.exception; - -import com.project.bumawiki.global.error.exception.BumawikiException; -import com.project.bumawiki.global.error.exception.ErrorCode; - -public class DocsTitleAlreadyExistException extends BumawikiException { - - public static final DocsTitleAlreadyExistException EXCEPTION = new DocsTitleAlreadyExistException( - ErrorCode.POST_TITLE_ALREADY_EXIST); - - public DocsTitleAlreadyExistException(ErrorCode errorCode) { - super(errorCode); - } -} diff --git a/src/main/java/com/project/bumawiki/domain/docs/implementation/DocsCreator.java b/src/main/java/com/project/bumawiki/domain/docs/implementation/DocsCreator.java new file mode 100644 index 00000000..28d87e63 --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/docs/implementation/DocsCreator.java @@ -0,0 +1,30 @@ +package com.project.bumawiki.domain.docs.implementation; + +import com.project.bumawiki.domain.docs.domain.Docs; +import com.project.bumawiki.domain.docs.domain.VersionDocs; +import com.project.bumawiki.domain.docs.domain.repository.DocsRepository; +import com.project.bumawiki.domain.docs.domain.repository.VersionDocsRepository; +import com.project.bumawiki.domain.user.domain.User; +import com.project.bumawiki.global.annotation.Implementation; + +import lombok.RequiredArgsConstructor; + +@Implementation +@RequiredArgsConstructor +public class DocsCreator { + private final DocsRepository docsRepository; + private final VersionDocsRepository versionDocsRepository; + + public void create(Docs docs, User user, String contents) { + docsRepository.save(docs); + + versionDocsRepository.save( + new VersionDocs( + 0, + docs, + contents, + user + ) + ); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/docs/implementation/DocsDeleter.java b/src/main/java/com/project/bumawiki/domain/docs/implementation/DocsDeleter.java new file mode 100644 index 00000000..374bc63f --- /dev/null +++ b/src/main/java/com/project/bumawiki/domain/docs/implementation/DocsDeleter.java @@ -0,0 +1,16 @@ +package com.project.bumawiki.domain.docs.implementation; + +import com.project.bumawiki.domain.docs.domain.repository.DocsRepository; +import com.project.bumawiki.global.annotation.Implementation; + +import lombok.RequiredArgsConstructor; + +@Implementation +@RequiredArgsConstructor +public class DocsDeleter { + private final DocsRepository docsRepository; + + public void delete(Long id) { + docsRepository.deleteById(id); + } +} diff --git a/src/main/java/com/project/bumawiki/domain/docs/implementation/DocsValidator.java b/src/main/java/com/project/bumawiki/domain/docs/implementation/DocsValidator.java index 37c6ca99..05f165bb 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/implementation/DocsValidator.java +++ b/src/main/java/com/project/bumawiki/domain/docs/implementation/DocsValidator.java @@ -1,10 +1,7 @@ package com.project.bumawiki.domain.docs.implementation; -import java.util.Optional; - import com.project.bumawiki.domain.docs.domain.Docs; import com.project.bumawiki.domain.docs.domain.repository.DocsRepository; -import com.project.bumawiki.domain.docs.exception.DocsTitleAlreadyExistException; import com.project.bumawiki.global.annotation.Implementation; import com.project.bumawiki.global.error.exception.BumawikiException; import com.project.bumawiki.global.error.exception.ErrorCode; @@ -16,10 +13,9 @@ public class DocsValidator { private final DocsRepository docsRepository; - public void checkTitleAlreadyExist(String title) { - Optional byTitle = docsRepository.findByTitle(title); - if (byTitle.isPresent()) { - throw DocsTitleAlreadyExistException.EXCEPTION; + public void checkTitleAlreadyExist(Docs docs) { + if (docsRepository.existsByTitle(docs.getTitle())) { + throw new BumawikiException(ErrorCode.DOCS_TITLE_ALREADY_EXIST); } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsCreateUpdateController.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsCreateUpdateController.java index aeed70c0..a4cee494 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsCreateUpdateController.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsCreateUpdateController.java @@ -1,7 +1,6 @@ package com.project.bumawiki.domain.docs.presentation; -import java.io.IOException; - +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PathVariable; @@ -10,6 +9,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import com.project.bumawiki.domain.docs.presentation.dto.request.DocsCreateRequestDto; @@ -18,6 +18,7 @@ import com.project.bumawiki.domain.docs.presentation.dto.request.DocsUpdateRequestDto; import com.project.bumawiki.domain.docs.service.DocsCreateService; import com.project.bumawiki.domain.docs.service.DocsUpdateService; +import com.project.bumawiki.global.util.SecurityUtil; import lombok.RequiredArgsConstructor; @@ -31,13 +32,14 @@ public class DocsCreateUpdateController { private final DocsCreateService docsCreateService; @PostMapping("/create") - public ResponseEntity createDocs(@RequestBody DocsCreateRequestDto request) throws IOException { - return ResponseEntity.ok(docsCreateService.execute(request)); + @ResponseStatus(HttpStatus.NO_CONTENT) + public void createDocs(@RequestBody DocsCreateRequestDto request) { + docsCreateService.execute(request.toEntity(), SecurityUtil.getCurrentUserWithLogin(), request.contents()); } @PutMapping("/update/{title}") public ResponseEntity updateDocs(@RequestHeader("Authorization") String bearer, @PathVariable String title, - @RequestBody DocsUpdateRequestDto request) throws IOException { + @RequestBody DocsUpdateRequestDto request) { return ResponseEntity.ok(docsUpdateService.execute(bearer, title, request)); } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsDeleteController.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsDeleteController.java index baecdfb2..30a10ae4 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsDeleteController.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/DocsDeleteController.java @@ -1,10 +1,11 @@ package com.project.bumawiki.domain.docs.presentation; -import org.springframework.http.ResponseEntity; +import org.springframework.http.HttpStatus; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import com.project.bumawiki.domain.docs.service.DocsDeleteService; @@ -12,14 +13,15 @@ import lombok.RequiredArgsConstructor; @Validated -@RequiredArgsConstructor @RestController +@RequiredArgsConstructor @RequestMapping("/api/docs") public class DocsDeleteController { private final DocsDeleteService docsDeleteService; @DeleteMapping("delete/{id}") - public ResponseEntity deleteDocs(@PathVariable Long id) { - return ResponseEntity.ok(docsDeleteService.execute(id)); + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deleteDocs(@PathVariable Long id) { + docsDeleteService.execute(id); } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsCreateRequestDto.java b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsCreateRequestDto.java index 1e9a922c..d44f8792 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsCreateRequestDto.java +++ b/src/main/java/com/project/bumawiki/domain/docs/presentation/dto/request/DocsCreateRequestDto.java @@ -1,26 +1,26 @@ package com.project.bumawiki.domain.docs.presentation.dto.request; +import com.project.bumawiki.domain.docs.domain.Docs; import com.project.bumawiki.domain.docs.domain.type.DocsType; import jakarta.validation.constraints.NotBlank; -import lombok.Getter; - -@Getter -public class DocsCreateRequestDto { +public record DocsCreateRequestDto( @NotBlank - private String title; - + String title, @NotBlank - private int enroll; - + Integer enroll, @NotBlank - private String contents; - + String contents, @NotBlank - private DocsType docsType; - - public void updateContent(String setContent) { - this.contents = setContent; + DocsType docsType +) { + + public Docs toEntity() { + return new Docs( + title, + enroll, + docsType + ); } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/service/DocsCreateService.java b/src/main/java/com/project/bumawiki/domain/docs/service/DocsCreateService.java index 093c5bcf..14b0a770 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/service/DocsCreateService.java +++ b/src/main/java/com/project/bumawiki/domain/docs/service/DocsCreateService.java @@ -1,79 +1,25 @@ package com.project.bumawiki.domain.docs.service; -import java.io.IOException; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.project.bumawiki.domain.contribute.domain.Contribute; -import com.project.bumawiki.domain.contribute.service.ContributeService; import com.project.bumawiki.domain.docs.domain.Docs; -import com.project.bumawiki.domain.docs.domain.VersionDocs; -import com.project.bumawiki.domain.docs.domain.repository.DocsRepositoryMapper; -import com.project.bumawiki.domain.docs.domain.repository.VersionDocsRepository; -import com.project.bumawiki.domain.docs.presentation.dto.request.DocsCreateRequestDto; -import com.project.bumawiki.domain.image.service.ImageService; +import com.project.bumawiki.domain.docs.implementation.DocsCreator; +import com.project.bumawiki.domain.docs.implementation.DocsValidator; +import com.project.bumawiki.domain.user.domain.User; import lombok.RequiredArgsConstructor; @Service -@RequiredArgsConstructor @Transactional +@RequiredArgsConstructor public class DocsCreateService { - private final VersionDocsRepository versionDocsRepository; - private final ImageService imageService; - private final ContributeService contributeService; - private final DocsRepositoryMapper docsRepositoryMapper; - - private static void setVersionDocs(final Docs docs, final VersionDocs savedVersionDocs, - final Contribute contribute) { - List versionDocs = new ArrayList<>(); - - versionDocs.add(savedVersionDocs); - - savedVersionDocs.updateContributor(contribute); - - docs.setVersionDocs(versionDocs); - } - - @Transactional - public Long execute(final DocsCreateRequestDto docsCreateRequestDto) throws IOException { - - docsRepositoryMapper.checkTitleAlreadyExist(docsCreateRequestDto.getTitle()); - - Docs docs = docsRepositoryMapper.createDocs(docsCreateRequestDto); - - VersionDocs savedVersionDocs = saveVersionDocs(docsCreateRequestDto, docs.getId()); - Contribute contribute = contributeService.setContribute(savedVersionDocs); - - setVersionDocs(docs, savedVersionDocs, contribute); - - return docs.getId(); - } - - /** - * 프론트가 [사진1]이라고 보낸거 우리가 저장한 이미지 주소로 바꾸는 로직 - */ - public void setImageUrlInContents(final DocsCreateRequestDto docsCreateRequestDto, final ArrayList urls) { - String content = docsCreateRequestDto.getContents(); - for (String url : urls) { - content = content.replaceFirst("<<사진>>", url); - } - docsCreateRequestDto.updateContent(content); - } + private final DocsValidator docsValidator; + private final DocsCreator docsCreator; - private VersionDocs saveVersionDocs(final DocsCreateRequestDto docsCreateRequestDto, final Long id) { - return versionDocsRepository.save( - VersionDocs.builder() - .docsId(id) - .contents(docsCreateRequestDto.getContents()) - .thisVersionCreatedAt(LocalDateTime.now()) - .version(1) - .build() - ); + public void execute(Docs docs, User user, String contents) { + docsValidator.checkTitleAlreadyExist(docs); + docsCreator.create(docs, user, contents); } } diff --git a/src/main/java/com/project/bumawiki/domain/docs/service/DocsDeleteService.java b/src/main/java/com/project/bumawiki/domain/docs/service/DocsDeleteService.java index c5697f4e..7178cd66 100644 --- a/src/main/java/com/project/bumawiki/domain/docs/service/DocsDeleteService.java +++ b/src/main/java/com/project/bumawiki/domain/docs/service/DocsDeleteService.java @@ -3,19 +3,17 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.project.bumawiki.domain.docs.domain.repository.DocsRepository; +import com.project.bumawiki.domain.docs.implementation.DocsDeleter; import lombok.RequiredArgsConstructor; @Service -@RequiredArgsConstructor @Transactional +@RequiredArgsConstructor public class DocsDeleteService { - private final DocsRepository docsRepository; - - public Long execute(Long id) { - docsRepository.deleteById(id); + private final DocsDeleter docsDeleter; - return id; + public void execute(Long id) { + docsDeleter.delete(id); } } diff --git a/src/main/java/com/project/bumawiki/global/error/exception/ErrorCode.java b/src/main/java/com/project/bumawiki/global/error/exception/ErrorCode.java index 959c8c5d..600cca43 100644 --- a/src/main/java/com/project/bumawiki/global/error/exception/ErrorCode.java +++ b/src/main/java/com/project/bumawiki/global/error/exception/ErrorCode.java @@ -19,7 +19,7 @@ public enum ErrorCode { DOCS_IS_NOT_CONFLICTED(400, "DOCS-400-1", "문서가 충돌나지 않았습니다."), DOCS_CONFLICTED(400, "DOCS-400-2", "문서가 충돌 상태이기 때문에 수정할 수 없습니다."), NO_UPDATABLE_DOCS(403, "DOCS-403-1", "없데이트 하려고 하는 문서가 없습니다."), - POST_TITLE_ALREADY_EXIST(403, "DOCS-403-1", "같은 제목의 문서가 이미 존재합니다."), + DOCS_TITLE_ALREADY_EXIST(403, "DOCS-403-1", "같은 제목의 문서가 이미 존재합니다."), CANNOT_CHANGE_YOUR_DOCS(403, "DOCS-403-2", "본인의 문서는 수정할 수 없습니다."), DOCS_NOT_FOUND(404, "DOCS-404-2", "문서를 조회할 수 없습니다."), DOCS_TYPE_NOT_FOUND(404, "DOCS-404-3", "문서 타입이 존재하지 않습니다."),