From 162c4255124f9bfad74cb5260e7c04a2aa8568f5 Mon Sep 17 00:00:00 2001 From: PPakSang Date: Wed, 10 Aug 2022 17:51:22 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20FileManager=20Class=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20InDIR=20Class=20=EA=B0=9D=EC=B2=B4=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A5=BC=20=EC=A0=9C=EA=B3=B5=ED=95=98=EA=B3=A0,=20?= =?UTF-8?q?=EC=8B=A4=EC=A0=9C=20Page,=20Unit=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EC=A0=84=20Validation=20=EC=97=AD=ED=95=A0=EC=9D=84=20?= =?UTF-8?q?=EC=88=98=ED=96=89=ED=95=98=EB=8A=94=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=A9=EB=8B=88?= =?UTF-8?q?=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/filemanage/dto/CreateDIRForm.java | 18 ++ .../filemanage/dto/CreatePageForm.java | 18 ++ .../filemanage/dto/FindFilesInDIRForm.java | 18 ++ .../backend/filemanage/dto/FindPageForm.java | 16 ++ .../filemanage/service/FileManager.java | 160 ++++++++++++++++++ .../share/dto/CreateSharedPageForm.java | 13 ++ .../backend/service/FileManagerTest.java | 79 +++++++++ 7 files changed, 322 insertions(+) create mode 100644 src/main/java/com/mergedoc/backend/filemanage/dto/CreateDIRForm.java create mode 100644 src/main/java/com/mergedoc/backend/filemanage/dto/CreatePageForm.java create mode 100644 src/main/java/com/mergedoc/backend/filemanage/dto/FindFilesInDIRForm.java create mode 100644 src/main/java/com/mergedoc/backend/filemanage/dto/FindPageForm.java create mode 100644 src/main/java/com/mergedoc/backend/filemanage/service/FileManager.java create mode 100644 src/main/java/com/mergedoc/backend/share/dto/CreateSharedPageForm.java create mode 100644 src/test/java/com/mergedoc/backend/service/FileManagerTest.java diff --git a/src/main/java/com/mergedoc/backend/filemanage/dto/CreateDIRForm.java b/src/main/java/com/mergedoc/backend/filemanage/dto/CreateDIRForm.java new file mode 100644 index 0000000..6cc5968 --- /dev/null +++ b/src/main/java/com/mergedoc/backend/filemanage/dto/CreateDIRForm.java @@ -0,0 +1,18 @@ +package com.mergedoc.backend.filemanage.dto; + +import com.sun.istack.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CreateDIRForm { + @NotNull + private Long dirId; + @NotNull + private String name; + + private Long memberId; +} diff --git a/src/main/java/com/mergedoc/backend/filemanage/dto/CreatePageForm.java b/src/main/java/com/mergedoc/backend/filemanage/dto/CreatePageForm.java new file mode 100644 index 0000000..4d3b532 --- /dev/null +++ b/src/main/java/com/mergedoc/backend/filemanage/dto/CreatePageForm.java @@ -0,0 +1,18 @@ +package com.mergedoc.backend.filemanage.dto; + +import com.sun.istack.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CreatePageForm { + @NotNull + private Long dirId; + @NotNull + private String name; + + private Long memberId; +} diff --git a/src/main/java/com/mergedoc/backend/filemanage/dto/FindFilesInDIRForm.java b/src/main/java/com/mergedoc/backend/filemanage/dto/FindFilesInDIRForm.java new file mode 100644 index 0000000..bdcf354 --- /dev/null +++ b/src/main/java/com/mergedoc/backend/filemanage/dto/FindFilesInDIRForm.java @@ -0,0 +1,18 @@ +package com.mergedoc.backend.filemanage.dto; + +import com.mergedoc.backend.dir.entity.FileType; +import com.sun.istack.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FindFilesInDIRForm { + @NotNull + private Long dirId; + + private FileType type; + private Long memberId; +} diff --git a/src/main/java/com/mergedoc/backend/filemanage/dto/FindPageForm.java b/src/main/java/com/mergedoc/backend/filemanage/dto/FindPageForm.java new file mode 100644 index 0000000..f423351 --- /dev/null +++ b/src/main/java/com/mergedoc/backend/filemanage/dto/FindPageForm.java @@ -0,0 +1,16 @@ +package com.mergedoc.backend.filemanage.dto; + +import com.sun.istack.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FindPageForm { + @NotNull + private Long pageId; + @NotNull + private Long memberId; +} diff --git a/src/main/java/com/mergedoc/backend/filemanage/service/FileManager.java b/src/main/java/com/mergedoc/backend/filemanage/service/FileManager.java new file mode 100644 index 0000000..2d030ce --- /dev/null +++ b/src/main/java/com/mergedoc/backend/filemanage/service/FileManager.java @@ -0,0 +1,160 @@ +package com.mergedoc.backend.filemanage.service; + +import com.mergedoc.backend.dir.entity.DIR; +import com.mergedoc.backend.dir.entity.InDIR; +import com.mergedoc.backend.dir.entity.PageInDIR; +import com.mergedoc.backend.dir.repository.DIRRepository; +import com.mergedoc.backend.filemanage.dto.CreateDIRForm; +import com.mergedoc.backend.filemanage.dto.CreatePageForm; +import com.mergedoc.backend.filemanage.dto.FindFilesInDIRForm; +import com.mergedoc.backend.filemanage.dto.FindPageForm; +import com.mergedoc.backend.member.entity.Member; +import com.mergedoc.backend.member.repository.MemberRepository; +import com.mergedoc.backend.page.entity.Page; +import com.mergedoc.backend.page.repository.PageRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class FileManager { + + private final String ROOT_PATH = "/"; + private final String ROOT_NAME = "root"; + + private final PageRepository pageRepository; + private final DIRRepository dirRepository; + private final MemberRepository memberRepository; + + @Transactional + public Long createRootDIR(Long memberId) { + Member findMember = memberRepository.findById(memberId); + + DIR dir = DIR.builder() + .path(ROOT_PATH) + .name(ROOT_NAME) + .member(findMember) + .build(); + + dirRepository.saveDIR(dir); + return dir.getId(); + } + + // dir 내부에 있는 file 을 찾는데 찾으려는 파일들의 생성 유저가 요청 유저 정보랑 다르면 예외 + public List findDIRsInDIR(FindFilesInDIRForm form) { + List dirs = dirRepository.findDIRsInDIR(form.getDirId()); + + dirs.stream().findFirst().ifPresent(d -> validateDirOwner(form.getMemberId(), d)); + + return dirs; + } + public List findPagesInDIR(FindFilesInDIRForm form) { + List pages = dirRepository.findPagesInDIR(form.getDirId()); + + pages.stream().findFirst().ifPresent(p -> validatePageOwner(form.getMemberId(), p)); + + return pages; + } + + /* Member 가입 시 생성되는 Root DIR*/ + + public List findAllFiles(FindFilesInDIRForm form) { + List result = new ArrayList<>(); + result.addAll(findDIRsInDIR(form)); + result.addAll(findPagesInDIR(form)); + + return result; +// 각 파일들에 대해서 type 을 포함해서 데이터로 돌려줄 수 있어야함 + } + + @Transactional + public Long createDIR(CreateDIRForm form) { + DIR parentDir = dirRepository.findDIRById(form.getDirId()); + +// 생성하려는 dir 의 소유자가 요청 유저와 일치해야한다 + validateDirOwner(form.getMemberId(), parentDir); + validateDirDuplicated(form.getDirId(), form.getName()); + +// member id 만 저장하면 되는데 select 한 개가 더 나간다,, 이 부분은 개선이 필요한듯, JpaRepository getOne 혹은 직접 쿼리문 작성 + Member member = memberRepository.findById(form.getMemberId()); + + DIR dir = DIR.builder() + .parent(parentDir) + .path(producePathFromParentDIR(parentDir.getPath(), parentDir.getName())) + .name(form.getName()) + .member(member) + .build(); + + dirRepository.saveDIR(dir); + + return dir.getId(); + } + + @Transactional + public Long createPage(CreatePageForm form) { + DIR dir = dirRepository.findDIRById(form.getDirId()); + + validateDirOwner(form.getMemberId(), dir); + validatePageDuplicated(dir.getId(), form.getName()); + + Member member = memberRepository.findById(form.getMemberId()); + + Page page = Page.builder() + .name(form.getName()) + .build(); + pageRepository.savePage(page); + + PageInDIR pageInDIR = PageInDIR.builder() + .page(page) + .dir(dir) + .member(member) + .path(producePathFromParentDIR(dir.getPath(), dir.getName())) + .name(form.getName()) + .build(); + dirRepository.savePageInDIR(pageInDIR); + + return pageInDIR.getId(); + } + + public Page findPage(FindPageForm form) { + PageInDIR findPage = dirRepository.findPageById(form.getPageId()); + + validatePageOwner(form.getMemberId(), findPage); + + return pageRepository.findPageById(findPage.getPage().getId()); + } + + + + private String producePathFromParentDIR(String path, String name) { + return path + name + "/"; + } + + private void validateDirOwner(Long memberId, DIR dir) { + if(!dir.getMember().getId().equals(memberId)) { + throw new IllegalStateException("올바르지 않은 접근입니다."); + } + } + + private void validatePageOwner(Long memberId, PageInDIR page) { + if(!page.getMember().getId().equals(memberId)) { + throw new IllegalStateException("올바르지 않은 접근입니다."); + } + } + + private void validateDirDuplicated(Long dirId, String name) { + if (dirRepository.dirExistsInDirByName(dirId, name)) { + throw new IllegalStateException("중복된 디렉토리가 존재합니다."); + } + } + private void validatePageDuplicated(Long dirId, String name) { + if (dirRepository.pageExistsInDirByName(dirId, name)) { + throw new IllegalStateException("중복된 페이지가 존재합니다."); + } + } +} diff --git a/src/main/java/com/mergedoc/backend/share/dto/CreateSharedPageForm.java b/src/main/java/com/mergedoc/backend/share/dto/CreateSharedPageForm.java new file mode 100644 index 0000000..18225fe --- /dev/null +++ b/src/main/java/com/mergedoc/backend/share/dto/CreateSharedPageForm.java @@ -0,0 +1,13 @@ +package com.mergedoc.backend.share.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CreateSharedPageForm { + private Long pageId; + private Long memberId; +} diff --git a/src/test/java/com/mergedoc/backend/service/FileManagerTest.java b/src/test/java/com/mergedoc/backend/service/FileManagerTest.java new file mode 100644 index 0000000..0be307d --- /dev/null +++ b/src/test/java/com/mergedoc/backend/service/FileManagerTest.java @@ -0,0 +1,79 @@ +package com.mergedoc.backend.service; + +import com.mergedoc.backend.dir.entity.DIR; +import com.mergedoc.backend.dir.entity.PageInDIR; +import com.mergedoc.backend.filemanage.dto.CreateDIRForm; +import com.mergedoc.backend.filemanage.dto.CreatePageForm; +import com.mergedoc.backend.filemanage.dto.FindFilesInDIRForm; +import com.mergedoc.backend.filemanage.dto.FindPageForm; +import com.mergedoc.backend.filemanage.service.FileManager; +import com.mergedoc.backend.member.entity.Member; +import com.mergedoc.backend.member.repository.MemberRepository; +import com.mergedoc.backend.page.entity.Page; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@SpringBootTest +@Transactional +public class FileManagerTest { + + @Autowired private FileManager fileManager; + @Autowired private MemberRepository memberRepository; + + + private final String ROOT_PATH = "/"; + private final String ROOT_NAME = "root"; + + Member member; + Long rootId; + + @BeforeEach + public void createRootDIR() { + member = Member.builder().build(); + memberRepository.save(member); + + rootId = fileManager.createRootDIR(member.getId()); + } + + @Test + public void createDIR() { + CreateDIRForm form = new CreateDIRForm(rootId, "sampleDIR", member.getId()); + fileManager.createDIR(form); + + FindFilesInDIRForm findForm = new FindFilesInDIRForm(rootId, null, member.getId()); + List findDIRs = fileManager.findDIRsInDIR(findForm); + + for (DIR dir : findDIRs) { + System.out.println(dir.getName()); + } + } + + @Test + public void createPage() { + CreatePageForm form = new CreatePageForm(rootId, "samplePage", member.getId()); + fileManager.createPage(form); + FindFilesInDIRForm findForm = new FindFilesInDIRForm(rootId, null, member.getId()); + List findPages = fileManager.findPagesInDIR(findForm); + + for (PageInDIR page : findPages) { + System.out.println(page.getName()); + } + } + + @Test + public void findPage() { + CreatePageForm form = new CreatePageForm(rootId, "samplePage", member.getId()); + Long pageId = fileManager.createPage(form); + + FindPageForm form2 = new FindPageForm(pageId, member.getId()); + Page page = fileManager.findPage(form2); + + System.out.println(page.getName()); + } + +}