From d420f61dd490c36f20f3c4af6917b448117e8b50 Mon Sep 17 00:00:00 2001 From: 101 Date: Thu, 15 Feb 2024 13:43:45 +0900 Subject: [PATCH] =?UTF-8?q?File=20=EC=A0=80=EC=9E=A5=20=EB=B0=8F=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/file/api/FileController.java | 4 +-- .../domain/file/dto/DeleteFileRequest.java | 2 +- .../domain/file/model/DefaultProfile.java | 6 +++- .../daemawiki/domain/file/model/File.java | 33 +++++++++++++++++++ .../domain/file/model/FileResponse.java | 12 ------- .../file/repository/FileRepository.java | 9 +++++ .../daemawiki/domain/user/model/User.java | 8 ++--- .../infra/s3/service/S3DeleteObject.java | 2 +- .../infra/s3/service/S3UploadObject.java | 30 ++++++++++------- 9 files changed, 73 insertions(+), 33 deletions(-) create mode 100644 src/main/java/com/example/daemawiki/domain/file/model/File.java delete mode 100644 src/main/java/com/example/daemawiki/domain/file/model/FileResponse.java create mode 100644 src/main/java/com/example/daemawiki/domain/file/repository/FileRepository.java diff --git a/src/main/java/com/example/daemawiki/domain/file/api/FileController.java b/src/main/java/com/example/daemawiki/domain/file/api/FileController.java index 5ae558da..3330c8e2 100644 --- a/src/main/java/com/example/daemawiki/domain/file/api/FileController.java +++ b/src/main/java/com/example/daemawiki/domain/file/api/FileController.java @@ -1,9 +1,9 @@ package com.example.daemawiki.domain.file.api; import com.example.daemawiki.domain.file.dto.DeleteFileRequest; +import com.example.daemawiki.domain.file.model.File; import com.example.daemawiki.infra.s3.service.S3DeleteObject; import com.example.daemawiki.infra.s3.service.S3UploadObject; -import com.example.daemawiki.domain.file.model.FileResponse; import jakarta.validation.Valid; import org.springframework.http.MediaType; import org.springframework.http.codec.multipart.FilePart; @@ -22,7 +22,7 @@ public FileController(S3UploadObject s3UploadObject, S3DeleteObject s3DeleteObje } @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public Mono uploadFile(@RequestPart(value = "file", required = true) FilePart filePart, @RequestParam("type") String fileType) { + public Mono uploadFile(@RequestPart(value = "file", required = true) FilePart filePart, @RequestParam("type") String fileType) { return s3UploadObject.uploadObject(filePart, fileType); } diff --git a/src/main/java/com/example/daemawiki/domain/file/dto/DeleteFileRequest.java b/src/main/java/com/example/daemawiki/domain/file/dto/DeleteFileRequest.java index f4c1f807..bdd21986 100644 --- a/src/main/java/com/example/daemawiki/domain/file/dto/DeleteFileRequest.java +++ b/src/main/java/com/example/daemawiki/domain/file/dto/DeleteFileRequest.java @@ -4,6 +4,6 @@ public record DeleteFileRequest( @NotBlank(message = "삭제할 파일의 이름을 작성해주세요.") - String fileName + String key ) { } diff --git a/src/main/java/com/example/daemawiki/domain/file/model/DefaultProfile.java b/src/main/java/com/example/daemawiki/domain/file/model/DefaultProfile.java index bb05d748..4e4a764a 100644 --- a/src/main/java/com/example/daemawiki/domain/file/model/DefaultProfile.java +++ b/src/main/java/com/example/daemawiki/domain/file/model/DefaultProfile.java @@ -4,9 +4,13 @@ import lombok.AccessLevel; import lombok.RequiredArgsConstructor; +import java.util.UUID; + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class DefaultProfile { - public static final FileResponse DEFAULT_PROFILE = FileResponse.builder() + private static final UUID id = UUID.randomUUID(); + public static final File DEFAULT_PROFILE = File.builder() + .id(id) .fileName("") .fileType("") .detail(FileDetail.builder() diff --git a/src/main/java/com/example/daemawiki/domain/file/model/File.java b/src/main/java/com/example/daemawiki/domain/file/model/File.java new file mode 100644 index 00000000..94aa854c --- /dev/null +++ b/src/main/java/com/example/daemawiki/domain/file/model/File.java @@ -0,0 +1,33 @@ +package com.example.daemawiki.domain.file.model; + +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.MongoId; + +import java.util.UUID; + +@Getter +@Document +@NoArgsConstructor +public class File { + + @MongoId + private UUID id; + + private String fileName; + + private String fileType; + + private FileDetail detail; + + @Builder + public File(UUID id, String fileName, String fileType, FileDetail detail) { + this.id = id; + this.fileName = fileName; + this.fileType = fileType; + this.detail = detail; + } + +} diff --git a/src/main/java/com/example/daemawiki/domain/file/model/FileResponse.java b/src/main/java/com/example/daemawiki/domain/file/model/FileResponse.java deleted file mode 100644 index e17aa0dd..00000000 --- a/src/main/java/com/example/daemawiki/domain/file/model/FileResponse.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.daemawiki.domain.file.model; - -import lombok.Builder; - -@Builder -public record FileResponse( - String fileName, - String fileType, - FileDetail detail - -) { -} diff --git a/src/main/java/com/example/daemawiki/domain/file/repository/FileRepository.java b/src/main/java/com/example/daemawiki/domain/file/repository/FileRepository.java new file mode 100644 index 00000000..294921d1 --- /dev/null +++ b/src/main/java/com/example/daemawiki/domain/file/repository/FileRepository.java @@ -0,0 +1,9 @@ +package com.example.daemawiki.domain.file.repository; + +import com.example.daemawiki.domain.file.model.File; +import org.springframework.data.mongodb.repository.ReactiveMongoRepository; + +import java.util.UUID; + +public interface FileRepository extends ReactiveMongoRepository { +} diff --git a/src/main/java/com/example/daemawiki/domain/user/model/User.java b/src/main/java/com/example/daemawiki/domain/user/model/User.java index b5ec8720..92cdd8d3 100644 --- a/src/main/java/com/example/daemawiki/domain/user/model/User.java +++ b/src/main/java/com/example/daemawiki/domain/user/model/User.java @@ -1,6 +1,6 @@ package com.example.daemawiki.domain.user.model; -import com.example.daemawiki.domain.file.model.FileResponse; +import com.example.daemawiki.domain.file.model.File; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Builder; import lombok.Getter; @@ -23,17 +23,17 @@ public class User { @JsonIgnore private String password; - private FileResponse profile; + private File profile; @Builder - public User(String nickname, String email, String password, FileResponse profile) { + public User(String nickname, String email, String password, File profile) { this.nickname = nickname; this.email = email; this.password = password; this.profile = profile; } - public void editProfile(FileResponse fileResponse) { + public void editProfile(File fileResponse) { this.profile = fileResponse; } diff --git a/src/main/java/com/example/daemawiki/infra/s3/service/S3DeleteObject.java b/src/main/java/com/example/daemawiki/infra/s3/service/S3DeleteObject.java index ab8647c2..8a9fbde4 100644 --- a/src/main/java/com/example/daemawiki/infra/s3/service/S3DeleteObject.java +++ b/src/main/java/com/example/daemawiki/infra/s3/service/S3DeleteObject.java @@ -21,7 +21,7 @@ public S3DeleteObject(S3AsyncClient s3AsyncClient) { public Mono deleteObject(DeleteFileRequest request) { return Mono.just(DeleteObjectRequest.builder() .bucket(bucket) - .key(request.fileName()) + .key(request.key()) .build()) .map(s3AsyncClient::deleteObject) .flatMap(Mono::fromFuture) diff --git a/src/main/java/com/example/daemawiki/infra/s3/service/S3UploadObject.java b/src/main/java/com/example/daemawiki/infra/s3/service/S3UploadObject.java index 07717636..6286868c 100644 --- a/src/main/java/com/example/daemawiki/infra/s3/service/S3UploadObject.java +++ b/src/main/java/com/example/daemawiki/infra/s3/service/S3UploadObject.java @@ -1,8 +1,9 @@ package com.example.daemawiki.infra.s3.service; +import com.example.daemawiki.domain.file.model.File; import com.example.daemawiki.domain.file.model.FileDetail; -import com.example.daemawiki.domain.file.model.FileResponse; import com.example.daemawiki.domain.file.model.type.FileType; +import com.example.daemawiki.domain.file.repository.FileRepository; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.buffer.DataBufferUtils; import org.springframework.http.MediaType; @@ -23,22 +24,25 @@ @Service public class S3UploadObject { private final S3AsyncClient s3AsyncClient; + private final FileRepository fileRepository; - public S3UploadObject(S3AsyncClient s3AsyncClient) { + public S3UploadObject(S3AsyncClient s3AsyncClient, FileRepository fileRepository) { this.s3AsyncClient = s3AsyncClient; + this.fileRepository = fileRepository; } @Value("${cloud.aws.s3.bucket}") private String bucket; - public Mono uploadObject(FilePart filePart, String fileType) { + public Mono uploadObject(FilePart filePart, String fileType) { String filename = filePart.filename(); - UUID uuid = UUID.randomUUID(); + UUID key = UUID.randomUUID(); + String keyString = key.toString(); Map metadata = Map.of("filename", filename); MediaType type = filePart.headers().getContentType(); CreateMultipartUploadRequest createRequest = CreateMultipartUploadRequest.builder() .bucket(bucket) - .key(filename) + .key(keyString) .metadata(metadata) .build(); @@ -55,7 +59,7 @@ public Mono uploadObject(FilePart filePart, String fileType) { return Mono.fromCompletionStage(s3AsyncClient.uploadPart(UploadPartRequest.builder() .bucket(bucket) - .key(filename) + .key(keyString) .partNumber(partNumber) .uploadId(uploadId) .build(), AsyncRequestBody.fromBytes(fileContent))) @@ -67,7 +71,7 @@ public Mono uploadObject(FilePart filePart, String fileType) { CompleteMultipartUploadRequest completeRequest = CompleteMultipartUploadRequest.builder() .bucket(bucket) - .key(filename) + .key(keyString) .uploadId(uploadId) .multipartUpload(completedMultipartUpload -> completedMultipartUpload.parts(Collections.singletonList(part))) .build(); @@ -77,11 +81,12 @@ public Mono uploadObject(FilePart filePart, String fileType) { .onErrorResume(Mono::error); }); }) - .flatMap(response -> createFileResponse(filename, type, fileType)); + .flatMap(response -> createFile(key, filename, type, fileType)); } - private Mono createFileResponse(String fileName, MediaType mediaType, String filetype) { - return Mono.just(FileResponse.builder() + private Mono createFile(UUID key, String fileName, MediaType mediaType, String filetype) { + return Mono.just(File.builder() + .id(key) .fileName(fileName) .fileType(mediaType.toString()) .detail(FileDetail.builder() @@ -90,9 +95,10 @@ private Mono createFileResponse(String fileName, MediaType mediaTy case "profile" -> FileType.PROFILE; case null, default -> FileType.OTHER; }) - .url("https://" + bucket + ".s3.amazonaws.com/" + fileName) + .url("https://" + bucket + ".s3.amazonaws.com/" + key) .build()) - .build()); + .build()) + .flatMap(fileRepository::save); } } \ No newline at end of file