Skip to content
This repository has been archived by the owner on Nov 27, 2024. It is now read-only.

Commit

Permalink
File 저장 및 리팩토링
Browse files Browse the repository at this point in the history
  • Loading branch information
ori0o0p committed Feb 15, 2024
1 parent b899478 commit d420f61
Show file tree
Hide file tree
Showing 9 changed files with 73 additions and 33 deletions.
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -22,7 +22,7 @@ public FileController(S3UploadObject s3UploadObject, S3DeleteObject s3DeleteObje
}

@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public Mono<FileResponse> uploadFile(@RequestPart(value = "file", required = true) FilePart filePart, @RequestParam("type") String fileType) {
public Mono<File> uploadFile(@RequestPart(value = "file", required = true) FilePart filePart, @RequestParam("type") String fileType) {
return s3UploadObject.uploadObject(filePart, fileType);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@

public record DeleteFileRequest(
@NotBlank(message = "삭제할 파일의 이름을 작성해주세요.")
String fileName
String key
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
33 changes: 33 additions & 0 deletions src/main/java/com/example/daemawiki/domain/file/model/File.java
Original file line number Diff line number Diff line change
@@ -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;
}

}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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<File, UUID> {
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public S3DeleteObject(S3AsyncClient s3AsyncClient) {
public Mono<Void> deleteObject(DeleteFileRequest request) {
return Mono.just(DeleteObjectRequest.builder()
.bucket(bucket)
.key(request.fileName())
.key(request.key())
.build())
.map(s3AsyncClient::deleteObject)
.flatMap(Mono::fromFuture)
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<FileResponse> uploadObject(FilePart filePart, String fileType) {
public Mono<File> uploadObject(FilePart filePart, String fileType) {
String filename = filePart.filename();
UUID uuid = UUID.randomUUID();
UUID key = UUID.randomUUID();
String keyString = key.toString();
Map<String, String> metadata = Map.of("filename", filename);
MediaType type = filePart.headers().getContentType();

CreateMultipartUploadRequest createRequest = CreateMultipartUploadRequest.builder()
.bucket(bucket)
.key(filename)
.key(keyString)
.metadata(metadata)
.build();

Expand All @@ -55,7 +59,7 @@ public Mono<FileResponse> 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)))
Expand All @@ -67,7 +71,7 @@ public Mono<FileResponse> 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();
Expand All @@ -77,11 +81,12 @@ public Mono<FileResponse> uploadObject(FilePart filePart, String fileType) {
.onErrorResume(Mono::error);
});
})
.flatMap(response -> createFileResponse(filename, type, fileType));
.flatMap(response -> createFile(key, filename, type, fileType));
}

private Mono<FileResponse> createFileResponse(String fileName, MediaType mediaType, String filetype) {
return Mono.just(FileResponse.builder()
private Mono<File> createFile(UUID key, String fileName, MediaType mediaType, String filetype) {
return Mono.just(File.builder()
.id(key)
.fileName(fileName)
.fileType(mediaType.toString())
.detail(FileDetail.builder()
Expand All @@ -90,9 +95,10 @@ private Mono<FileResponse> 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);
}

}

0 comments on commit d420f61

Please sign in to comment.