diff --git a/application/src/main/java/com/callv2/drive/application/folder/create/CreateFolderInput.java b/application/src/main/java/com/callv2/drive/application/folder/create/CreateFolderInput.java index 2297bc3d..62946e9d 100644 --- a/application/src/main/java/com/callv2/drive/application/folder/create/CreateFolderInput.java +++ b/application/src/main/java/com/callv2/drive/application/folder/create/CreateFolderInput.java @@ -2,10 +2,10 @@ import java.util.UUID; -public record CreateFolderInput(String name, UUID parentFolderId) { +public record CreateFolderInput(String ownerId, String name, UUID parentFolderId) { - public static CreateFolderInput from(String name, UUID parentFolderId) { - return new CreateFolderInput(name, parentFolderId); + public static CreateFolderInput from(String ownerdId, String name, UUID parentFolderId) { + return new CreateFolderInput(ownerdId, name, parentFolderId); } } diff --git a/application/src/main/java/com/callv2/drive/application/folder/create/DefaultCreateFolderUseCase.java b/application/src/main/java/com/callv2/drive/application/folder/create/DefaultCreateFolderUseCase.java index 0db208f5..8d67ff3c 100644 --- a/application/src/main/java/com/callv2/drive/application/folder/create/DefaultCreateFolderUseCase.java +++ b/application/src/main/java/com/callv2/drive/application/folder/create/DefaultCreateFolderUseCase.java @@ -6,34 +6,44 @@ import com.callv2.drive.domain.folder.FolderGateway; import com.callv2.drive.domain.folder.FolderID; import com.callv2.drive.domain.folder.FolderName; +import com.callv2.drive.domain.member.Member; +import com.callv2.drive.domain.member.MemberGateway; +import com.callv2.drive.domain.member.MemberID; import com.callv2.drive.domain.validation.Error; import com.callv2.drive.domain.validation.handler.Notification; public class DefaultCreateFolderUseCase extends CreateFolderUseCase { + private final MemberGateway memberGateway; private final FolderGateway folderGateway; - public DefaultCreateFolderUseCase(final FolderGateway folderGateway) { + public DefaultCreateFolderUseCase(final MemberGateway memberGateway, final FolderGateway folderGateway) { + this.memberGateway = memberGateway; this.folderGateway = folderGateway; } @Override public CreateFolderOutput execute(final CreateFolderInput input) { + final MemberID ownerId = MemberID.of(input.ownerId()); + + if (!memberGateway.existsById(ownerId)) + throw NotFoundException.with(Member.class, input.ownerId().toString()); + final Folder parentFolder = folderGateway .findById(FolderID.of(input.parentFolderId())) .orElseThrow(() -> NotFoundException.with( Folder.class, "Parent folder with id %s not found".formatted(input.parentFolderId().toString()))); - return CreateFolderOutput.from(createFolder(FolderName.of(input.name()), parentFolder)); + return CreateFolderOutput.from(createFolder(ownerId, FolderName.of(input.name()), parentFolder)); } - private Folder createFolder(final FolderName name, final Folder parentFolder) { + private Folder createFolder(final MemberID ownerId, FolderName name, final Folder parentFolder) { final Notification notification = Notification.create(); if (parentFolder.getSubFolders().stream().anyMatch(subFolder -> subFolder.name().equals(name))) notification.append(Error.with("Folder with the same name already exists")); - final Folder folder = notification.valdiate(() -> Folder.create(name, parentFolder)); + final Folder folder = notification.valdiate(() -> Folder.create(ownerId, name, parentFolder)); if (notification.hasError()) throw ValidationException.with("Could not create Aggregate Folder", notification); diff --git a/application/src/main/java/com/callv2/drive/application/folder/retrieve/get/root/DefaultGetRootFolderUseCase.java b/application/src/main/java/com/callv2/drive/application/folder/retrieve/get/root/DefaultGetRootFolderUseCase.java index de352d7e..29af302b 100644 --- a/application/src/main/java/com/callv2/drive/application/folder/retrieve/get/root/DefaultGetRootFolderUseCase.java +++ b/application/src/main/java/com/callv2/drive/application/folder/retrieve/get/root/DefaultGetRootFolderUseCase.java @@ -3,26 +3,39 @@ import java.util.Objects; import java.util.Optional; +import com.callv2.drive.domain.exception.NotFoundException; import com.callv2.drive.domain.file.FileGateway; import com.callv2.drive.domain.folder.Folder; import com.callv2.drive.domain.folder.FolderGateway; +import com.callv2.drive.domain.member.Member; +import com.callv2.drive.domain.member.MemberGateway; +import com.callv2.drive.domain.member.MemberID; public class DefaultGetRootFolderUseCase extends GetRootFolderUseCase { + private final MemberGateway memberGateway; private final FolderGateway folderGateway; private final FileGateway fileGateway; public DefaultGetRootFolderUseCase( + final MemberGateway memberGateway, final FolderGateway folderGateway, final FileGateway fileGateway) { + this.memberGateway = Objects.requireNonNull(memberGateway); this.folderGateway = Objects.requireNonNull(folderGateway); this.fileGateway = Objects.requireNonNull(fileGateway); } @Override - public GetRootFolderOutput execute() { + public GetRootFolderOutput execute(final GetRootFolderInput input) { + + final MemberID owner = MemberID.of(input.ownerId()); + + if (!memberGateway.existsById(owner)) + throw NotFoundException.with(Member.class, owner.getValue().toString()); + final Optional root = folderGateway.findRoot(); - final Folder folder = root.isPresent() ? root.get() : folderGateway.create(Folder.createRoot()); + final Folder folder = root.isPresent() ? root.get() : folderGateway.create(Folder.createRoot(owner)); return GetRootFolderOutput.from(folder, fileGateway.findByFolder(folder.getId())); } diff --git a/application/src/main/java/com/callv2/drive/application/folder/retrieve/get/root/GetRootFolderInput.java b/application/src/main/java/com/callv2/drive/application/folder/retrieve/get/root/GetRootFolderInput.java new file mode 100644 index 00000000..28e9bf78 --- /dev/null +++ b/application/src/main/java/com/callv2/drive/application/folder/retrieve/get/root/GetRootFolderInput.java @@ -0,0 +1,8 @@ +package com.callv2.drive.application.folder.retrieve.get.root; +public record GetRootFolderInput(String ownerId) { + + public static GetRootFolderInput from(final String ownerId) { + return new GetRootFolderInput(ownerId); + } + +} diff --git a/application/src/main/java/com/callv2/drive/application/folder/retrieve/get/root/GetRootFolderUseCase.java b/application/src/main/java/com/callv2/drive/application/folder/retrieve/get/root/GetRootFolderUseCase.java index dcefcdb4..33e76f12 100644 --- a/application/src/main/java/com/callv2/drive/application/folder/retrieve/get/root/GetRootFolderUseCase.java +++ b/application/src/main/java/com/callv2/drive/application/folder/retrieve/get/root/GetRootFolderUseCase.java @@ -1,7 +1,7 @@ package com.callv2.drive.application.folder.retrieve.get.root; -import com.callv2.drive.application.NullaryUseCase; +import com.callv2.drive.application.UseCase; -public abstract class GetRootFolderUseCase extends NullaryUseCase { +public abstract class GetRootFolderUseCase extends UseCase { } diff --git a/application/src/test/java/com/callv2/drive/application/file/create/DefaultCreateFileUseCaseTest.java b/application/src/test/java/com/callv2/drive/application/file/create/DefaultCreateFileUseCaseTest.java index 2d1f7792..95b9f380 100644 --- a/application/src/test/java/com/callv2/drive/application/file/create/DefaultCreateFileUseCaseTest.java +++ b/application/src/test/java/com/callv2/drive/application/file/create/DefaultCreateFileUseCaseTest.java @@ -42,406 +42,406 @@ @ExtendWith(MockitoExtension.class) public class DefaultCreateFileUseCaseTest { - @InjectMocks - DefaultCreateFileUseCase useCase; + @InjectMocks + DefaultCreateFileUseCase useCase; - @Mock - MemberGateway memberGateway; + @Mock + MemberGateway memberGateway; - @Mock - FolderGateway folderGateway; + @Mock + FolderGateway folderGateway; - @Mock - StorageService storageService; + @Mock + StorageService storageService; - @Mock - FileGateway fileGateway; + @Mock + FileGateway fileGateway; - @Test - void givenAValidParams_whenCallsExecute_thenShouldCreateFile() { + @Test + void givenAValidParams_whenCallsExecute_thenShouldCreateFile() { - final var owner = Member.create(MemberID.of("owner")) - .requestQuota(Quota.of(1, QuotaUnit.GIGABYTE)) - .approveQuotaRequest(); + final var owner = Member.create(MemberID.of("owner")) + .requestQuota(Quota.of(1, QuotaUnit.GIGABYTE)) + .approveQuotaRequest(); - final var ownerId = owner.getId(); + final var ownerId = owner.getId(); - final var folder = Folder.createRoot(); - final var expectedFolderId = folder.getId(); + final var folder = Folder.createRoot(ownerId); + final var expectedFolderId = folder.getId(); - final var expectedFileName = FileName.of("file"); - final var expectedContentType = "image/jpeg"; - final var contentBytes = "content".getBytes(); + final var expectedFileName = FileName.of("file"); + final var expectedContentType = "image/jpeg"; + final var contentBytes = "content".getBytes(); - final var expectedContent = new ByteArrayInputStream(contentBytes); - final var expectedContentSize = (long) contentBytes.length; + final var expectedContent = new ByteArrayInputStream(contentBytes); + final var expectedContentSize = (long) contentBytes.length; - when(memberGateway.findById(any())) - .thenReturn(Optional.of(owner)); + when(memberGateway.findById(any())) + .thenReturn(Optional.of(owner)); - when(fileGateway.findByFolder(any())) - .thenReturn(List.of()); + when(fileGateway.findByFolder(any())) + .thenReturn(List.of()); - when(folderGateway.findById(any())) - .thenReturn(Optional.of(folder)); + when(folderGateway.findById(any())) + .thenReturn(Optional.of(folder)); - when(storageService.store(any(), any())) - .then(returnsFirstArg()); + when(storageService.store(any(), any())) + .then(returnsFirstArg()); - when(fileGateway.create(any())) - .thenAnswer(returnsFirstArg()); + when(fileGateway.create(any())) + .thenAnswer(returnsFirstArg()); - final var input = CreateFileInput.of( - ownerId.getValue(), - expectedFolderId.getValue(), - expectedFileName.value(), - expectedContentType, - expectedContent, - expectedContentSize); + final var input = CreateFileInput.of( + ownerId.getValue(), + expectedFolderId.getValue(), + expectedFileName.value(), + expectedContentType, + expectedContent, + expectedContentSize); - final var actualOuptut = useCase.execute(input); + final var actualOuptut = useCase.execute(input); - assertNotNull(actualOuptut.id()); + assertNotNull(actualOuptut.id()); - verify(folderGateway, times(1)).findById(any()); - verify(folderGateway, times(1)).findById(eq(expectedFolderId)); - verify(storageService, times(1)).store(any(), any()); - verify(storageService, times(1)).store(any(), eq(expectedContent)); - verify(storageService, times(0)).delete(any()); - verify(fileGateway, times(1)).findByFolder(any()); - verify(fileGateway, times(1)).findByFolder(eq(folder.getId())); - verify(fileGateway, times(1)).create(any()); - verify(fileGateway, times(1)).create(argThat(file -> { + verify(folderGateway, times(1)).findById(any()); + verify(folderGateway, times(1)).findById(eq(expectedFolderId)); + verify(storageService, times(1)).store(any(), any()); + verify(storageService, times(1)).store(any(), eq(expectedContent)); + verify(storageService, times(0)).delete(any()); + verify(fileGateway, times(1)).findByFolder(any()); + verify(fileGateway, times(1)).findByFolder(eq(folder.getId())); + verify(fileGateway, times(1)).create(any()); + verify(fileGateway, times(1)).create(argThat(file -> { - assertEquals(actualOuptut.id().getValue(), file.getId().getValue()); - assertEquals(expectedFileName, file.getName()); - assertEquals(expectedContentType, file.getContent().type()); - assertNotNull(file.getCreatedAt()); - assertNotNull(file.getUpdatedAt()); - assertNotNull(file.getContent().location()); - assertEquals(file.getCreatedAt(), file.getUpdatedAt()); + assertEquals(actualOuptut.id().getValue(), file.getId().getValue()); + assertEquals(expectedFileName, file.getName()); + assertEquals(expectedContentType, file.getContent().type()); + assertNotNull(file.getCreatedAt()); + assertNotNull(file.getUpdatedAt()); + assertNotNull(file.getContent().location()); + assertEquals(file.getCreatedAt(), file.getUpdatedAt()); - return true; - })); + return true; + })); - } + } - @Test - void givenAnInvalidId_whenCallsExecute_thenShouldThrowNotFoundException() { + @Test + void givenAnInvalidId_whenCallsExecute_thenShouldThrowNotFoundException() { - final var owner = Member.create(MemberID.of("owner")) - .requestQuota(Quota.of(1, QuotaUnit.GIGABYTE)) - .approveQuotaRequest(); + final var owner = Member.create(MemberID.of("owner")) + .requestQuota(Quota.of(1, QuotaUnit.GIGABYTE)) + .approveQuotaRequest(); - final var ownerId = owner.getId(); + final var ownerId = owner.getId(); - final var folder = Folder.createRoot(); + final var folder = Folder.createRoot(ownerId); - final var expectedFolderId = folder.getId(); + final var expectedFolderId = folder.getId(); - final var expectedFileName = FileName.of("file"); - final var expectedContentType = "image/jpeg"; - final var contentBytes = "content".getBytes(); + final var expectedFileName = FileName.of("file"); + final var expectedContentType = "image/jpeg"; + final var contentBytes = "content".getBytes(); - final var expectedContent = new ByteArrayInputStream(contentBytes); - final var expectedContentSize = (long) contentBytes.length; + final var expectedContent = new ByteArrayInputStream(contentBytes); + final var expectedContentSize = (long) contentBytes.length; - final var expectedExceptionMessage = "Folder with id '%s' not found" - .formatted(expectedFolderId.getValue()); + final var expectedExceptionMessage = "Folder with id '%s' not found" + .formatted(expectedFolderId.getValue()); - when(memberGateway.findById(any())) - .thenReturn(Optional.of(owner)); + when(memberGateway.findById(any())) + .thenReturn(Optional.of(owner)); - when(folderGateway.findById(any())) - .thenReturn(Optional.empty()); + when(folderGateway.findById(any())) + .thenReturn(Optional.empty()); - final var input = CreateFileInput.of( - ownerId.getValue(), - expectedFolderId.getValue(), - expectedFileName.value(), - expectedContentType, - expectedContent, - expectedContentSize); + final var input = CreateFileInput.of( + ownerId.getValue(), + expectedFolderId.getValue(), + expectedFileName.value(), + expectedContentType, + expectedContent, + expectedContentSize); - final var actualException = assertThrows(NotFoundException.class, () -> useCase.execute(input)); + final var actualException = assertThrows(NotFoundException.class, () -> useCase.execute(input)); - assertEquals(expectedExceptionMessage, actualException.getMessage()); + assertEquals(expectedExceptionMessage, actualException.getMessage()); - verify(folderGateway, times(1)).findById(any()); - verify(folderGateway, times(1)).findById(eq(expectedFolderId)); - verify(storageService, times(0)).store(any(), any()); - verify(storageService, times(0)).store(any(), eq(expectedContent)); - verify(storageService, times(0)).delete(any()); - verify(fileGateway, times(0)).findByFolder(any()); - verify(fileGateway, times(0)).create(any()); + verify(folderGateway, times(1)).findById(any()); + verify(folderGateway, times(1)).findById(eq(expectedFolderId)); + verify(storageService, times(0)).store(any(), any()); + verify(storageService, times(0)).store(any(), eq(expectedContent)); + verify(storageService, times(0)).delete(any()); + verify(fileGateway, times(0)).findByFolder(any()); + verify(fileGateway, times(0)).create(any()); - } + } - @Test - void givenAValidParamsWithAlreadyExistingFileNameOnSameFolder_whenCallsExecute_thenShouldThrowValidationException() { + @Test + void givenAValidParamsWithAlreadyExistingFileNameOnSameFolder_whenCallsExecute_thenShouldThrowValidationException() { - final var owner = Member.create(MemberID.of("owner")) - .requestQuota(Quota.of(1, QuotaUnit.GIGABYTE)) - .approveQuotaRequest(); + final var owner = Member.create(MemberID.of("owner")) + .requestQuota(Quota.of(1, QuotaUnit.GIGABYTE)) + .approveQuotaRequest(); - final var ownerId = owner.getId(); + final var ownerId = owner.getId(); - final var folder = Folder.createRoot(); + final var folder = Folder.createRoot(ownerId); - final var expectedFolderId = folder.getId(); + final var expectedFolderId = folder.getId(); - final var expectedFileName = FileName.of("file"); - final var expectedContentType = "image/jpeg"; - final var contentBytes = "content".getBytes(); + final var expectedFileName = FileName.of("file"); + final var expectedContentType = "image/jpeg"; + final var contentBytes = "content".getBytes(); - final var expectedContent = new ByteArrayInputStream(contentBytes); - final var expectedContentSize = (long) contentBytes.length; + final var expectedContent = new ByteArrayInputStream(contentBytes); + final var expectedContentSize = (long) contentBytes.length; - final var fileWithSameName = File.create(ownerId, folder.getId(), expectedFileName, - Content.of("location", "text", 10)); + final var fileWithSameName = File.create(ownerId, folder.getId(), expectedFileName, + Content.of("location", "text", 10)); - final var expectedExceptionMessage = "Could not create Aggregate File"; - final var expectedErrorMessage = "File with same name already exists on this folder"; + final var expectedExceptionMessage = "Could not create Aggregate File"; + final var expectedErrorMessage = "File with same name already exists on this folder"; - when(memberGateway.findById(ownerId)) - .thenReturn(Optional.of(owner)); + when(memberGateway.findById(ownerId)) + .thenReturn(Optional.of(owner)); - when(fileGateway.findByFolder(any())) - .thenReturn(List.of(fileWithSameName)); + when(fileGateway.findByFolder(any())) + .thenReturn(List.of(fileWithSameName)); - when(folderGateway.findById(any())) - .thenReturn(Optional.of(folder)); + when(folderGateway.findById(any())) + .thenReturn(Optional.of(folder)); - when(storageService.store(any(), any())) - .then(returnsFirstArg()); + when(storageService.store(any(), any())) + .then(returnsFirstArg()); - final var input = CreateFileInput.of( - ownerId.getValue(), - expectedFolderId.getValue(), - expectedFileName.value(), - expectedContentType, - expectedContent, - expectedContentSize); + final var input = CreateFileInput.of( + ownerId.getValue(), + expectedFolderId.getValue(), + expectedFileName.value(), + expectedContentType, + expectedContent, + expectedContentSize); - final var actualException = assertThrows(ValidationException.class, () -> useCase.execute(input)); + final var actualException = assertThrows(ValidationException.class, () -> useCase.execute(input)); - assertEquals(expectedExceptionMessage, actualException.getMessage()); - assertEquals(expectedErrorMessage, actualException.getErrors().get(0).message()); + assertEquals(expectedExceptionMessage, actualException.getMessage()); + assertEquals(expectedErrorMessage, actualException.getErrors().get(0).message()); - verify(folderGateway, times(1)).findById(any()); - verify(folderGateway, times(1)).findById(eq(expectedFolderId)); - verify(storageService, times(1)).store(any(), any()); - verify(storageService, times(1)).store(any(), eq(expectedContent)); - verify(storageService, times(0)).delete(any()); - verify(fileGateway, times(1)).findByFolder(any()); - verify(fileGateway, times(1)).findByFolder(eq(folder.getId())); - verify(fileGateway, times(0)).create(any()); + verify(folderGateway, times(1)).findById(any()); + verify(folderGateway, times(1)).findById(eq(expectedFolderId)); + verify(storageService, times(1)).store(any(), any()); + verify(storageService, times(1)).store(any(), eq(expectedContent)); + verify(storageService, times(0)).delete(any()); + verify(fileGateway, times(1)).findByFolder(any()); + verify(fileGateway, times(1)).findByFolder(eq(folder.getId())); + verify(fileGateway, times(0)).create(any()); - } + } - @Test - void givenAValidParams_whenCallsExecuteAndFileGatewayCreateThrowsRandomException_thenShouldThrowInternalErrorException() { + @Test + void givenAValidParams_whenCallsExecuteAndFileGatewayCreateThrowsRandomException_thenShouldThrowInternalErrorException() { - final var owner = Member.create(MemberID.of("owner")) - .requestQuota(Quota.of(1, QuotaUnit.GIGABYTE)) - .approveQuotaRequest(); + final var owner = Member.create(MemberID.of("owner")) + .requestQuota(Quota.of(1, QuotaUnit.GIGABYTE)) + .approveQuotaRequest(); - final var ownerId = owner.getId(); + final var ownerId = owner.getId(); - final var folder = Folder.createRoot(); - final var expectedFolderId = folder.getId(); + final var folder = Folder.createRoot(ownerId); + final var expectedFolderId = folder.getId(); - final var expectedFileName = FileName.of("file"); - final var expectedContentType = "image/jpeg"; - final var contentBytes = "content".getBytes(); + final var expectedFileName = FileName.of("file"); + final var expectedContentType = "image/jpeg"; + final var contentBytes = "content".getBytes(); - final var expectedContent = new ByteArrayInputStream(contentBytes); - final var expectedContentSize = (long) contentBytes.length; + final var expectedContent = new ByteArrayInputStream(contentBytes); + final var expectedContentSize = (long) contentBytes.length; - final var expectedExceptionMessage = "Could not store File"; + final var expectedExceptionMessage = "Could not store File"; - when(memberGateway.findById(ownerId)) - .thenReturn(Optional.of(owner)); + when(memberGateway.findById(ownerId)) + .thenReturn(Optional.of(owner)); - when(fileGateway.findByFolder(any())) - .thenReturn(List.of()); + when(fileGateway.findByFolder(any())) + .thenReturn(List.of()); - when(folderGateway.findById(any())) - .thenReturn(Optional.of(folder)); + when(folderGateway.findById(any())) + .thenReturn(Optional.of(folder)); - when(storageService.store(any(), any())) - .then(returnsFirstArg()); + when(storageService.store(any(), any())) + .then(returnsFirstArg()); - when(fileGateway.create(any())) - .thenThrow(new IllegalStateException("FileGateway Exception")); + when(fileGateway.create(any())) + .thenThrow(new IllegalStateException("FileGateway Exception")); - doNothing() - .when(storageService) - .delete(any()); + doNothing() + .when(storageService) + .delete(any()); - final var input = CreateFileInput.of( - ownerId.getValue(), - expectedFolderId.getValue(), - expectedFileName.value(), - expectedContentType, - expectedContent, - expectedContentSize); + final var input = CreateFileInput.of( + ownerId.getValue(), + expectedFolderId.getValue(), + expectedFileName.value(), + expectedContentType, + expectedContent, + expectedContentSize); - final var actualException = assertThrows(InternalErrorException.class, () -> useCase.execute(input)); + final var actualException = assertThrows(InternalErrorException.class, () -> useCase.execute(input)); - assertEquals(expectedExceptionMessage, actualException.getMessage()); - assertEquals("FileGateway Exception", actualException.getCause().getMessage()); + assertEquals(expectedExceptionMessage, actualException.getMessage()); + assertEquals("FileGateway Exception", actualException.getCause().getMessage()); - verify(folderGateway, times(1)).findById(any()); - verify(folderGateway, times(1)).findById(eq(expectedFolderId)); - verify(storageService, times(1)).store(any(), any()); - verify(storageService, times(1)).store(any(), eq(expectedContent)); - verify(storageService, times(1)).delete(any()); - verify(fileGateway, times(1)).findByFolder(any()); - verify(fileGateway, times(1)).findByFolder(eq(folder.getId())); - verify(fileGateway, times(1)).create(any()); - verify(fileGateway, times(1)).create(argThat(file -> { + verify(folderGateway, times(1)).findById(any()); + verify(folderGateway, times(1)).findById(eq(expectedFolderId)); + verify(storageService, times(1)).store(any(), any()); + verify(storageService, times(1)).store(any(), eq(expectedContent)); + verify(storageService, times(1)).delete(any()); + verify(fileGateway, times(1)).findByFolder(any()); + verify(fileGateway, times(1)).findByFolder(eq(folder.getId())); + verify(fileGateway, times(1)).create(any()); + verify(fileGateway, times(1)).create(argThat(file -> { - assertNotNull(file.getId().getValue()); - assertEquals(expectedFileName, file.getName()); - assertEquals(expectedContentType, file.getContent().type()); - assertNotNull(file.getCreatedAt()); - assertNotNull(file.getUpdatedAt()); - assertNotNull(file.getContent().location()); - assertEquals(file.getCreatedAt(), file.getUpdatedAt()); + assertNotNull(file.getId().getValue()); + assertEquals(expectedFileName, file.getName()); + assertEquals(expectedContentType, file.getContent().type()); + assertNotNull(file.getCreatedAt()); + assertNotNull(file.getUpdatedAt()); + assertNotNull(file.getContent().location()); + assertEquals(file.getCreatedAt(), file.getUpdatedAt()); - return true; - })); + return true; + })); - } + } - @Test - void givenAValidParams_whenCallsExecuteAndFileGatewayCreateAndContentGatewayDeleteThrowsRandomException_thenShouldThrowInternalErrorException() { + @Test + void givenAValidParams_whenCallsExecuteAndFileGatewayCreateAndContentGatewayDeleteThrowsRandomException_thenShouldThrowInternalErrorException() { - final var owner = Member.create(MemberID.of("owner")) - .requestQuota(Quota.of(1, QuotaUnit.GIGABYTE)) - .approveQuotaRequest(); + final var owner = Member.create(MemberID.of("owner")) + .requestQuota(Quota.of(1, QuotaUnit.GIGABYTE)) + .approveQuotaRequest(); - final var ownerId = owner.getId(); + final var ownerId = owner.getId(); - final var folder = Folder.createRoot(); - final var expectedFolderId = folder.getId(); + final var folder = Folder.createRoot(ownerId); + final var expectedFolderId = folder.getId(); - final var expectedFileName = FileName.of("file"); - final var expectedContentType = "image/jpeg"; - final var contentBytes = "content".getBytes(); + final var expectedFileName = FileName.of("file"); + final var expectedContentType = "image/jpeg"; + final var contentBytes = "content".getBytes(); - final var expectedContent = new ByteArrayInputStream(contentBytes); - final var expectedContentSize = (long) contentBytes.length; + final var expectedContent = new ByteArrayInputStream(contentBytes); + final var expectedContentSize = (long) contentBytes.length; - final var expectedExceptionMessage = "Could not delete BinaryContent"; + final var expectedExceptionMessage = "Could not delete BinaryContent"; - when(memberGateway.findById(ownerId)) - .thenReturn(Optional.of(owner)); + when(memberGateway.findById(ownerId)) + .thenReturn(Optional.of(owner)); - when(fileGateway.findByFolder(any())) - .thenReturn(List.of()); + when(fileGateway.findByFolder(any())) + .thenReturn(List.of()); - when(folderGateway.findById(any())) - .thenReturn(Optional.of(folder)); + when(folderGateway.findById(any())) + .thenReturn(Optional.of(folder)); - when(storageService.store(any(), any())) - .then(returnsFirstArg()); + when(storageService.store(any(), any())) + .then(returnsFirstArg()); - when(fileGateway.create(any())) - .thenThrow(new IllegalStateException("FileGateway Exception")); + when(fileGateway.create(any())) + .thenThrow(new IllegalStateException("FileGateway Exception")); - doThrow(new IllegalStateException("ContentGateway Exception")) - .when(storageService) - .delete(any()); + doThrow(new IllegalStateException("ContentGateway Exception")) + .when(storageService) + .delete(any()); - final var input = CreateFileInput.of( - ownerId.getValue(), - expectedFolderId.getValue(), - expectedFileName.value(), - expectedContentType, - expectedContent, - expectedContentSize); + final var input = CreateFileInput.of( + ownerId.getValue(), + expectedFolderId.getValue(), + expectedFileName.value(), + expectedContentType, + expectedContent, + expectedContentSize); - final var actualException = assertThrows(InternalErrorException.class, () -> useCase.execute(input)); + final var actualException = assertThrows(InternalErrorException.class, () -> useCase.execute(input)); - assertEquals(expectedExceptionMessage, actualException.getMessage()); - assertEquals("ContentGateway Exception", actualException.getCause().getMessage()); + assertEquals(expectedExceptionMessage, actualException.getMessage()); + assertEquals("ContentGateway Exception", actualException.getCause().getMessage()); - verify(folderGateway, times(1)).findById(any()); - verify(folderGateway, times(1)).findById(eq(expectedFolderId)); - verify(storageService, times(1)).store(any(), any()); - verify(storageService, times(1)).store(any(), eq(expectedContent)); - verify(storageService, times(1)).delete(any()); - verify(fileGateway, times(1)).findByFolder(any()); - verify(fileGateway, times(1)).findByFolder(eq(folder.getId())); - verify(fileGateway, times(1)).create(any()); - verify(fileGateway, times(1)).create(argThat(file -> { + verify(folderGateway, times(1)).findById(any()); + verify(folderGateway, times(1)).findById(eq(expectedFolderId)); + verify(storageService, times(1)).store(any(), any()); + verify(storageService, times(1)).store(any(), eq(expectedContent)); + verify(storageService, times(1)).delete(any()); + verify(fileGateway, times(1)).findByFolder(any()); + verify(fileGateway, times(1)).findByFolder(eq(folder.getId())); + verify(fileGateway, times(1)).create(any()); + verify(fileGateway, times(1)).create(argThat(file -> { - assertNotNull(file.getId().getValue()); - assertEquals(expectedFileName, file.getName()); - assertEquals(expectedContentType, file.getContent().type()); - assertNotNull(file.getCreatedAt()); - assertNotNull(file.getUpdatedAt()); - assertNotNull(file.getContent().location()); - assertEquals(file.getCreatedAt(), file.getUpdatedAt()); + assertNotNull(file.getId().getValue()); + assertEquals(expectedFileName, file.getName()); + assertEquals(expectedContentType, file.getContent().type()); + assertNotNull(file.getCreatedAt()); + assertNotNull(file.getUpdatedAt()); + assertNotNull(file.getContent().location()); + assertEquals(file.getCreatedAt(), file.getUpdatedAt()); - return true; - })); + return true; + })); - } + } - @Test - void givenAValidParams_whenCallsExecuteAndContentGatewayStoreThrowsRandomException_thenShouldThrowInternalErrorException() { + @Test + void givenAValidParams_whenCallsExecuteAndContentGatewayStoreThrowsRandomException_thenShouldThrowInternalErrorException() { - final var owner = Member.create(MemberID.of("owner")) - .requestQuota(Quota.of(1, QuotaUnit.GIGABYTE)) - .approveQuotaRequest(); + final var owner = Member.create(MemberID.of("owner")) + .requestQuota(Quota.of(1, QuotaUnit.GIGABYTE)) + .approveQuotaRequest(); - final var ownerId = owner.getId(); + final var ownerId = owner.getId(); - final var folder = Folder.createRoot(); - final var expectedFolderId = folder.getId(); + final var folder = Folder.createRoot(ownerId); + final var expectedFolderId = folder.getId(); - final var expectedFileName = FileName.of("file"); - final var expectedContentType = "image/jpeg"; - final var contentBytes = "content".getBytes(); + final var expectedFileName = FileName.of("file"); + final var expectedContentType = "image/jpeg"; + final var contentBytes = "content".getBytes(); - final var expectedContent = new ByteArrayInputStream(contentBytes); - final var expectedContentSize = (long) contentBytes.length; + final var expectedContent = new ByteArrayInputStream(contentBytes); + final var expectedContentSize = (long) contentBytes.length; - final var expectedExceptionMessage = "Could not store BinaryContent"; + final var expectedExceptionMessage = "Could not store BinaryContent"; - when(memberGateway.findById(ownerId)) - .thenReturn(Optional.of(owner)); + when(memberGateway.findById(ownerId)) + .thenReturn(Optional.of(owner)); - when(folderGateway.findById(any())) - .thenReturn(Optional.of(folder)); + when(folderGateway.findById(any())) + .thenReturn(Optional.of(folder)); - when(storageService.store(any(), any())) - .thenThrow(new IllegalStateException("ContentGateway Exception")); + when(storageService.store(any(), any())) + .thenThrow(new IllegalStateException("ContentGateway Exception")); - final var input = CreateFileInput.of( - ownerId.getValue(), - expectedFolderId.getValue(), - expectedFileName.value(), - expectedContentType, - expectedContent, - expectedContentSize); + final var input = CreateFileInput.of( + ownerId.getValue(), + expectedFolderId.getValue(), + expectedFileName.value(), + expectedContentType, + expectedContent, + expectedContentSize); - final var actualException = assertThrows(InternalErrorException.class, () -> useCase.execute(input)); + final var actualException = assertThrows(InternalErrorException.class, () -> useCase.execute(input)); - assertEquals(expectedExceptionMessage, actualException.getMessage()); - assertEquals("ContentGateway Exception", actualException.getCause().getMessage()); + assertEquals(expectedExceptionMessage, actualException.getMessage()); + assertEquals("ContentGateway Exception", actualException.getCause().getMessage()); - verify(folderGateway, times(1)).findById(any()); - verify(folderGateway, times(1)).findById(eq(expectedFolderId)); - verify(storageService, times(1)).store(any(), any()); - verify(storageService, times(1)).store(any(), eq(expectedContent)); - verify(storageService, times(0)).delete(any()); - verify(fileGateway, times(0)).findByFolder(any()); - verify(fileGateway, times(0)).create(any()); + verify(folderGateway, times(1)).findById(any()); + verify(folderGateway, times(1)).findById(eq(expectedFolderId)); + verify(storageService, times(1)).store(any(), any()); + verify(storageService, times(1)).store(any(), eq(expectedContent)); + verify(storageService, times(0)).delete(any()); + verify(fileGateway, times(0)).findByFolder(any()); + verify(fileGateway, times(0)).create(any()); - } + } } diff --git a/application/src/test/java/com/callv2/drive/application/file/retrieve/get/DefaultGetFileUseCaseTest.java b/application/src/test/java/com/callv2/drive/application/file/retrieve/get/DefaultGetFileUseCaseTest.java index de3a5171..6f93cbd9 100644 --- a/application/src/test/java/com/callv2/drive/application/file/retrieve/get/DefaultGetFileUseCaseTest.java +++ b/application/src/test/java/com/callv2/drive/application/file/retrieve/get/DefaultGetFileUseCaseTest.java @@ -40,7 +40,7 @@ void givenAValidId_whenCallsExecute_thenShouldReturnFile() { final var ownerId = MemberID.of("owner"); - final var expectedFolder = Folder.createRoot(); + final var expectedFolder = Folder.createRoot(ownerId); final var expectedName = "file.jpeg"; @@ -50,7 +50,8 @@ void givenAValidId_whenCallsExecute_thenShouldReturnFile() { final var expectedContent = Content.of(expectedContentLocation, expectedContentType, expectedContentSize); - final var expectedFile = File.create(ownerId, expectedFolder.getId(), FileName.of(expectedName), expectedContent); + final var expectedFile = File.create(ownerId, expectedFolder.getId(), FileName.of(expectedName), + expectedContent); final var expectedId = expectedFile.getId(); diff --git a/application/src/test/java/com/callv2/drive/application/folder/move/DefaultMoveFolderUseCaseTest.java b/application/src/test/java/com/callv2/drive/application/folder/move/DefaultMoveFolderUseCaseTest.java index 802d719f..e079f46e 100644 --- a/application/src/test/java/com/callv2/drive/application/folder/move/DefaultMoveFolderUseCaseTest.java +++ b/application/src/test/java/com/callv2/drive/application/folder/move/DefaultMoveFolderUseCaseTest.java @@ -17,6 +17,7 @@ import com.callv2.drive.domain.folder.Folder; import com.callv2.drive.domain.folder.FolderGateway; import com.callv2.drive.domain.folder.FolderName; +import com.callv2.drive.domain.member.MemberID; @ExtendWith(MockitoExtension.class) public class DefaultMoveFolderUseCaseTest { @@ -30,10 +31,12 @@ public class DefaultMoveFolderUseCaseTest { @Test void givenVAlidInput_whenCallsExecute_thenMoveFolder() { - final var expectedRootFolder = Folder.createRoot(); + final var ownerId = MemberID.of("owner"); - final var expectedFolderToMove = Folder.create(FolderName.of("folder1"), expectedRootFolder); - final var expectedFolderTarget = Folder.create(FolderName.of("folder2"), expectedRootFolder); + final var expectedRootFolder = Folder.createRoot(ownerId); + + final var expectedFolderToMove = Folder.create(ownerId, FolderName.of("folder1"), expectedRootFolder); + final var expectedFolderTarget = Folder.create(ownerId, FolderName.of("folder2"), expectedRootFolder); when(folderGateway.findById(expectedFolderToMove.getId())) .thenReturn(Optional.of(expectedFolderToMove)); diff --git a/application/src/test/java/com/callv2/drive/application/folder/retrieve/get/DefaultGetFolderUseCaseTest.java b/application/src/test/java/com/callv2/drive/application/folder/retrieve/get/DefaultGetFolderUseCaseTest.java index 768418d7..68e524fc 100644 --- a/application/src/test/java/com/callv2/drive/application/folder/retrieve/get/DefaultGetFolderUseCaseTest.java +++ b/application/src/test/java/com/callv2/drive/application/folder/retrieve/get/DefaultGetFolderUseCaseTest.java @@ -23,6 +23,7 @@ import com.callv2.drive.domain.folder.FolderGateway; import com.callv2.drive.domain.folder.FolderID; import com.callv2.drive.domain.folder.FolderName; +import com.callv2.drive.domain.member.MemberID; @ExtendWith(MockitoExtension.class) public class DefaultGetFolderUseCaseTest { @@ -39,8 +40,14 @@ public class DefaultGetFolderUseCaseTest { @Test void givenAValidFolderId_whenCallsExecute_thenShouldReturnFolder() { + final var ownerId = MemberID.of("owner"); + final var expectedFolderName = "folder"; - final var expectedFolder = Folder.create(FolderName.of(expectedFolderName), Folder.createRoot()); + final var expectedFolder = Folder.create( + ownerId, + FolderName.of(expectedFolderName), + Folder.createRoot(ownerId)); + final var expectedFolderId = expectedFolder.getId(); final var expectedSubFolders = expectedFolder.getSubFolders(); final var expectedCreatedAt = expectedFolder.getCreatedAt(); diff --git a/domain/src/main/java/com/callv2/drive/domain/folder/Folder.java b/domain/src/main/java/com/callv2/drive/domain/folder/Folder.java index 4d52b76f..39a42fda 100644 --- a/domain/src/main/java/com/callv2/drive/domain/folder/Folder.java +++ b/domain/src/main/java/com/callv2/drive/domain/folder/Folder.java @@ -6,6 +6,7 @@ import com.callv2.drive.domain.AggregateRoot; import com.callv2.drive.domain.exception.ValidationException; +import com.callv2.drive.domain.member.MemberID; import com.callv2.drive.domain.validation.Error; import com.callv2.drive.domain.validation.ValidationHandler; import com.callv2.drive.domain.validation.handler.Notification; @@ -14,6 +15,8 @@ public class Folder extends AggregateRoot { private boolean rootFolder; + private MemberID owner; + private FolderName name; private FolderID parentFolder; private Set subFolders; @@ -24,6 +27,7 @@ public class Folder extends AggregateRoot { private Folder( final FolderID id, + final MemberID owner, final FolderName name, final FolderID parentFolder, final Set subFolders, @@ -32,6 +36,8 @@ private Folder( final Instant deletedAt, final boolean rootFolder) { super(id); + + this.owner = owner; this.name = name; this.parentFolder = parentFolder; this.subFolders = subFolders == null ? new HashSet<>() : new HashSet<>(subFolders); @@ -45,6 +51,7 @@ private Folder( public static Folder with( final FolderID id, + final MemberID owner, final FolderName name, final FolderID parentFolder, final Set subFolders, @@ -52,14 +59,15 @@ public static Folder with( final Instant updatedAt, final Instant deletedAt, final boolean rootFolder) { - return new Folder(id, name, parentFolder, subFolders, createdAt, updatedAt, deletedAt, rootFolder); + return new Folder(id, owner, name, parentFolder, subFolders, createdAt, updatedAt, deletedAt, rootFolder); } - public static Folder createRoot() { + public static Folder createRoot(final MemberID owner) { Instant now = Instant.now(); return Folder.with( FolderID.unique(), + owner, FolderName.of("Root"), null, new HashSet<>(), @@ -70,6 +78,7 @@ public static Folder createRoot() { } public static Folder create( + final MemberID owner, final FolderName name, final Folder parentFolder) { @@ -77,6 +86,7 @@ public static Folder create( final var folder = Folder.with( FolderID.unique(), + owner, name, parentFolder.getId(), new HashSet<>(), @@ -162,6 +172,10 @@ public boolean isRootFolder() { return rootFolder; } + public MemberID getOwner() { + return owner; + } + public FolderID getParentFolder() { return parentFolder; } diff --git a/domain/src/main/java/com/callv2/drive/domain/member/MemberGateway.java b/domain/src/main/java/com/callv2/drive/domain/member/MemberGateway.java index ac18ec44..394345e3 100644 --- a/domain/src/main/java/com/callv2/drive/domain/member/MemberGateway.java +++ b/domain/src/main/java/com/callv2/drive/domain/member/MemberGateway.java @@ -15,4 +15,6 @@ public interface MemberGateway { Page findAllQuotaRequests(final SearchQuery searchQuery); + Boolean existsById(MemberID id); + } diff --git a/domain/src/test/java/com/callv2/drive/domain/file/FileTest.java b/domain/src/test/java/com/callv2/drive/domain/file/FileTest.java index 7c89ee2e..ae1f9414 100644 --- a/domain/src/test/java/com/callv2/drive/domain/file/FileTest.java +++ b/domain/src/test/java/com/callv2/drive/domain/file/FileTest.java @@ -17,8 +17,10 @@ public class FileTest { @Test void givenAValidParams_whenCallsCreate_thenShouldCreateFile() { + final var ownerId = MemberID.of("owner"); + final var expectedOwner = MemberID.of("owner"); - final var expectedFolder = Folder.createRoot().getId(); + final var expectedFolder = Folder.createRoot(ownerId).getId(); final var expectedName = "file"; @@ -44,7 +46,7 @@ void givenAValidParams_whenCallsCreate_thenShouldCreateFile() { void givenEmptyName_whenCallsCreate_thenShouldThrowsValidationException() { final var expectedOwner = MemberID.of("owner"); - final var expectedFolder = Folder.createRoot().getId(); + final var expectedFolder = Folder.createRoot(expectedOwner).getId(); final var expectedName = ""; @@ -70,7 +72,7 @@ void givenEmptyName_whenCallsCreate_thenShouldThrowsValidationException() { void givenNullName_whenCallsCreate_thenShouldThrowsValidationException() { final var expectedOwner = MemberID.of("owner"); - final var expectedFolder = Folder.createRoot().getId(); + final var expectedFolder = Folder.createRoot(expectedOwner).getId(); final String expectedName = null; @@ -100,7 +102,7 @@ void givenNullName_whenCallsCreate_thenShouldThrowsValidationException() { void givenNameWithMoreThan64Chars_whenCallsCreate_thenShouldThrowsValidationException() { final var expectedOwner = MemberID.of("owner"); - final var expectedFolder = Folder.createRoot().getId(); + final var expectedFolder = Folder.createRoot(expectedOwner).getId(); final var expectedName = """ filefilefilefilefilefilefilefilefilefilefilefilefilefilefilefilefilefile @@ -133,7 +135,7 @@ void givenNameWithMoreThan64Chars_whenCallsCreate_thenShouldThrowsValidationExce void givenReservedName_whenCallsCreate_thenShouldThrowsValidationException() { final var expectedOwner = MemberID.of("owner"); - final var expectedFolder = Folder.createRoot().getId(); + final var expectedFolder = Folder.createRoot(expectedOwner).getId(); final var expectedName = "nul"; @@ -164,7 +166,7 @@ void givenReservedName_whenCallsCreate_thenShouldThrowsValidationException() { void givenMultipleInvalidParams_whenCallsCreate_thenShouldThrowsValidationExceptionWithMultipleErrors() { final var expectedOwner = MemberID.of("owner"); - final var expectedFolder = Folder.createRoot().getId(); + final var expectedFolder = Folder.createRoot(expectedOwner).getId(); final String expectedName = "nul"; @@ -196,7 +198,7 @@ void givenMultipleInvalidParams_whenCallsCreate_thenShouldThrowsValidationExcept void givenAValidParams_whenCallsUpdate_thenShouldCreateFile() { final var expectedOwner = MemberID.of("owner"); - final var expectedFolder = Folder.createRoot().getId(); + final var expectedFolder = Folder.createRoot(expectedOwner).getId(); final var expectedName = FileName.of("File"); @@ -227,7 +229,7 @@ void givenAValidParams_whenCallsUpdate_thenShouldCreateFile() { void givenEmptyName_whenCallsUpdate_thenShouldThrowsValidationException() { final var expectedOwner = MemberID.of("owner"); - final var expectedFolder = Folder.createRoot().getId(); + final var expectedFolder = Folder.createRoot(expectedOwner).getId(); final var expectedName = ""; @@ -254,7 +256,7 @@ void givenEmptyName_whenCallsUpdate_thenShouldThrowsValidationException() { void givenNullName_whenCallsUpdate_thenShouldThrowsValidationException() { final var expectedOwner = MemberID.of("owner"); - final var expectedFolder = Folder.createRoot().getId(); + final var expectedFolder = Folder.createRoot(expectedOwner).getId(); final String expectedName = null; @@ -282,7 +284,7 @@ void givenNullName_whenCallsUpdate_thenShouldThrowsValidationException() { void givenNameWithMoreThan64Chars_whenCallsUpdate_thenShouldThrowsValidationException() { final var expectedOwner = MemberID.of("owner"); - final var expectedFolder = Folder.createRoot().getId(); + final var expectedFolder = Folder.createRoot(expectedOwner).getId(); final var expectedName = """ filefilefilefilefilefilefilefilefilefilefilefilefilefilefilefilefilefile @@ -312,7 +314,7 @@ void givenNameWithMoreThan64Chars_whenCallsUpdate_thenShouldThrowsValidationExce void givenReservedName_whenCallsUpdate_thenShouldThrowsValidationException() { final var expectedOwner = MemberID.of("owner"); - final var expectedFolder = Folder.createRoot().getId(); + final var expectedFolder = Folder.createRoot(expectedOwner).getId(); final var expectedName = "nul"; diff --git a/infrastructure/src/main/java/com/callv2/drive/infrastructure/api/controller/FolderController.java b/infrastructure/src/main/java/com/callv2/drive/infrastructure/api/controller/FolderController.java index f2c4e21a..1a13f32e 100644 --- a/infrastructure/src/main/java/com/callv2/drive/infrastructure/api/controller/FolderController.java +++ b/infrastructure/src/main/java/com/callv2/drive/infrastructure/api/controller/FolderController.java @@ -11,6 +11,7 @@ import com.callv2.drive.application.folder.move.MoveFolderInput; import com.callv2.drive.application.folder.move.MoveFolderUseCase; import com.callv2.drive.application.folder.retrieve.get.GetFolderUseCase; +import com.callv2.drive.application.folder.retrieve.get.root.GetRootFolderInput; import com.callv2.drive.application.folder.retrieve.get.root.GetRootFolderUseCase; import com.callv2.drive.application.folder.retrieve.list.ListFoldersUseCase; import com.callv2.drive.domain.pagination.Filter; @@ -27,6 +28,7 @@ import com.callv2.drive.infrastructure.folder.model.GetRootFolderResponse; import com.callv2.drive.infrastructure.folder.model.MoveFolderRequest; import com.callv2.drive.infrastructure.folder.presenter.FolderPresenter; +import com.callv2.drive.infrastructure.security.SecurityContext; @RestController public class FolderController implements FolderAPI { @@ -52,12 +54,15 @@ public FolderController( @Override public ResponseEntity getRoot() { - return ResponseEntity.ok(FolderPresenter.present(getRootFolderUseCase.execute())); + return ResponseEntity.ok(FolderPresenter.present( + getRootFolderUseCase.execute(GetRootFolderInput.from(SecurityContext.getAuthenticatedUser())))); } @Override public ResponseEntity create(final CreateFolderRequest request) { - final var response = FolderPresenter.present(createFolderUseCase.execute(FolderAdapter.adapt(request))); + final String ownerId = SecurityContext.getAuthenticatedUser(); + final var response = FolderPresenter + .present(createFolderUseCase.execute(FolderAdapter.adapt(request, ownerId))); return ResponseEntity .created(URI.create("/folders/" + response.id())) diff --git a/infrastructure/src/main/java/com/callv2/drive/infrastructure/configuration/usecase/FolderUseCaseConfig.java b/infrastructure/src/main/java/com/callv2/drive/infrastructure/configuration/usecase/FolderUseCaseConfig.java index 79365121..960229c1 100644 --- a/infrastructure/src/main/java/com/callv2/drive/infrastructure/configuration/usecase/FolderUseCaseConfig.java +++ b/infrastructure/src/main/java/com/callv2/drive/infrastructure/configuration/usecase/FolderUseCaseConfig.java @@ -15,28 +15,32 @@ import com.callv2.drive.application.folder.retrieve.list.ListFoldersUseCase; import com.callv2.drive.domain.file.FileGateway; import com.callv2.drive.domain.folder.FolderGateway; +import com.callv2.drive.domain.member.MemberGateway; @Configuration public class FolderUseCaseConfig { private final FolderGateway folderGateway; private final FileGateway fileGateway; + private final MemberGateway memberGateway; public FolderUseCaseConfig( final FolderGateway folderGateway, - final FileGateway fileGateway) { + final FileGateway fileGateway, + final MemberGateway memberGateway) { this.folderGateway = folderGateway; this.fileGateway = fileGateway; + this.memberGateway = memberGateway; } @Bean GetRootFolderUseCase getRootFolderUseCase() { - return new DefaultGetRootFolderUseCase(folderGateway, fileGateway); + return new DefaultGetRootFolderUseCase(memberGateway, folderGateway, fileGateway); } @Bean CreateFolderUseCase createFolderUseCase() { - return new DefaultCreateFolderUseCase(folderGateway); + return new DefaultCreateFolderUseCase(memberGateway, folderGateway); } @Bean diff --git a/infrastructure/src/main/java/com/callv2/drive/infrastructure/folder/adapter/FolderAdapter.java b/infrastructure/src/main/java/com/callv2/drive/infrastructure/folder/adapter/FolderAdapter.java index 0e0322f8..8093410f 100644 --- a/infrastructure/src/main/java/com/callv2/drive/infrastructure/folder/adapter/FolderAdapter.java +++ b/infrastructure/src/main/java/com/callv2/drive/infrastructure/folder/adapter/FolderAdapter.java @@ -8,8 +8,8 @@ public interface FolderAdapter { - static CreateFolderInput adapt(CreateFolderRequest request) { - return CreateFolderInput.from(request.name(), request.parentFolderId()); + static CreateFolderInput adapt(CreateFolderRequest request, String ownerId) { + return CreateFolderInput.from(ownerId, request.name(), request.parentFolderId()); } static GetFolderInput adapt(UUID id) { diff --git a/infrastructure/src/main/java/com/callv2/drive/infrastructure/folder/persistence/FolderJpaEntity.java b/infrastructure/src/main/java/com/callv2/drive/infrastructure/folder/persistence/FolderJpaEntity.java index 285f12b7..53eb4d6d 100644 --- a/infrastructure/src/main/java/com/callv2/drive/infrastructure/folder/persistence/FolderJpaEntity.java +++ b/infrastructure/src/main/java/com/callv2/drive/infrastructure/folder/persistence/FolderJpaEntity.java @@ -10,6 +10,7 @@ import com.callv2.drive.domain.folder.FolderID; import com.callv2.drive.domain.folder.FolderName; import com.callv2.drive.domain.folder.SubFolder; +import com.callv2.drive.domain.member.MemberID; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; @@ -31,6 +32,9 @@ public class FolderJpaEntity { @Column(name = "name", nullable = false) private String name; + @Column(name = "owner_id", nullable = false) + private String ownerId; + @Column(name = "parent_folder_id") private UUID parentFolderId; @@ -50,6 +54,7 @@ private FolderJpaEntity( final UUID id, final Boolean rootFolder, final String name, + final String ownerId, final UUID parentFolderId, final Instant createdAt, final Instant updatedAt, @@ -57,6 +62,7 @@ private FolderJpaEntity( this.id = id; this.rootFolder = rootFolder; this.name = name; + this.ownerId = ownerId; this.parentFolderId = parentFolderId; this.createdAt = createdAt; this.updatedAt = updatedAt; @@ -69,13 +75,13 @@ public FolderJpaEntity() { } public static FolderJpaEntity fromDomain(final Folder folder) { - final UUID parentFolderId = folder.getParentFolder() == null ? null : folder.getParentFolder().getValue(); final var entity = new FolderJpaEntity( folder.getId().getValue(), folder.isRootFolder(), folder.getName().value(), + folder.getOwner().getValue(), parentFolderId, folder.getCreatedAt(), folder.getUpdatedAt(), @@ -90,6 +96,7 @@ public static FolderJpaEntity fromDomain(final Folder folder) { public Folder toDomain() { return Folder.with( FolderID.of(id), + MemberID.of(ownerId), FolderName.of(name), FolderID.of(parentFolderId), subFolders.stream() @@ -99,7 +106,6 @@ public Folder toDomain() { updatedAt, deletedAt, rootFolder); - } public void addSubFolder(final SubFolder anId) { @@ -130,6 +136,14 @@ public void setName(String name) { this.name = name; } + public String getOwnerId() { + return ownerId; + } + + public void setOwnerId(String ownerId) { + this.ownerId = ownerId; + } + public UUID getParentFolderId() { return parentFolderId; } @@ -169,5 +183,4 @@ public Instant getDeletedAt() { public void setDeletedAt(Instant deletedAt) { this.deletedAt = deletedAt; } - -} +} \ No newline at end of file diff --git a/infrastructure/src/main/java/com/callv2/drive/infrastructure/member/DefaultMemberGateway.java b/infrastructure/src/main/java/com/callv2/drive/infrastructure/member/DefaultMemberGateway.java index 2ce444ff..12a0000f 100644 --- a/infrastructure/src/main/java/com/callv2/drive/infrastructure/member/DefaultMemberGateway.java +++ b/infrastructure/src/main/java/com/callv2/drive/infrastructure/member/DefaultMemberGateway.java @@ -60,4 +60,9 @@ public Page findAllQuotaRequests(SearchQuery searchQuery) { pageResult.toList()); } + @Override + public Boolean existsById(MemberID id) { + return this.memberJpaRepository.existsById(id.getValue()); + } + }