From 94d32c99e2c5d8fd7a0dd00d50d2995a9ce10520 Mon Sep 17 00:00:00 2001 From: Lee ChanMi Date: Mon, 29 Jul 2024 15:51:37 +0900 Subject: [PATCH 1/9] =?UTF-8?q?:truck:=20[STMT-187]=20PresignedUrlResponse?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=EB=A5=BC=20adapter/response?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EC=A0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/file/adapter/in/PresignedUrlGenerateWebAdapter.java | 2 +- .../port => adapter}/in/response/PresignedUrlResponse.java | 2 +- .../file/application/port/in/PresignedUrlGenerateUseCase.java | 2 +- .../file/application/service/PresignedUrlGenerateService.java | 2 +- .../application/service/PresignedUrlGenerateServiceTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename src/main/java/com/stumeet/server/file/{application/port => adapter}/in/response/PresignedUrlResponse.java (60%) diff --git a/src/main/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapter.java b/src/main/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapter.java index 89f62205..926b1011 100644 --- a/src/main/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapter.java +++ b/src/main/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapter.java @@ -5,7 +5,7 @@ import com.stumeet.server.common.response.SuccessCode; import com.stumeet.server.file.application.port.in.PresignedUrlGenerateUseCase; import com.stumeet.server.file.application.port.in.command.PresignedUrlCommand; -import com.stumeet.server.file.application.port.in.response.PresignedUrlResponse; +import com.stumeet.server.file.adapter.in.response.PresignedUrlResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/com/stumeet/server/file/application/port/in/response/PresignedUrlResponse.java b/src/main/java/com/stumeet/server/file/adapter/in/response/PresignedUrlResponse.java similarity index 60% rename from src/main/java/com/stumeet/server/file/application/port/in/response/PresignedUrlResponse.java rename to src/main/java/com/stumeet/server/file/adapter/in/response/PresignedUrlResponse.java index 1116a41d..68d5da07 100644 --- a/src/main/java/com/stumeet/server/file/application/port/in/response/PresignedUrlResponse.java +++ b/src/main/java/com/stumeet/server/file/adapter/in/response/PresignedUrlResponse.java @@ -1,4 +1,4 @@ -package com.stumeet.server.file.application.port.in.response; +package com.stumeet.server.file.adapter.in.response; import lombok.Builder; diff --git a/src/main/java/com/stumeet/server/file/application/port/in/PresignedUrlGenerateUseCase.java b/src/main/java/com/stumeet/server/file/application/port/in/PresignedUrlGenerateUseCase.java index 73789d3e..ed405104 100644 --- a/src/main/java/com/stumeet/server/file/application/port/in/PresignedUrlGenerateUseCase.java +++ b/src/main/java/com/stumeet/server/file/application/port/in/PresignedUrlGenerateUseCase.java @@ -1,7 +1,7 @@ package com.stumeet.server.file.application.port.in; import com.stumeet.server.file.application.port.in.command.PresignedUrlCommand; -import com.stumeet.server.file.application.port.in.response.PresignedUrlResponse; +import com.stumeet.server.file.adapter.in.response.PresignedUrlResponse; public interface PresignedUrlGenerateUseCase { diff --git a/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateService.java b/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateService.java index d2ea0db0..6180da55 100644 --- a/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateService.java +++ b/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateService.java @@ -5,7 +5,7 @@ import com.stumeet.server.file.application.port.dto.FileUrl; import com.stumeet.server.file.application.port.in.PresignedUrlGenerateUseCase; import com.stumeet.server.file.application.port.in.command.PresignedUrlCommand; -import com.stumeet.server.file.application.port.in.response.PresignedUrlResponse; +import com.stumeet.server.file.adapter.in.response.PresignedUrlResponse; import com.stumeet.server.file.application.port.out.PresignedUrlGeneratePort; import lombok.RequiredArgsConstructor; diff --git a/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateServiceTest.java b/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateServiceTest.java index 5388a737..26a0cc39 100644 --- a/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateServiceTest.java +++ b/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateServiceTest.java @@ -2,7 +2,7 @@ import com.stumeet.server.file.application.port.dto.FileUrl; import com.stumeet.server.file.application.port.in.command.PresignedUrlCommand; -import com.stumeet.server.file.application.port.in.response.PresignedUrlResponse; +import com.stumeet.server.file.adapter.in.response.PresignedUrlResponse; import com.stumeet.server.file.application.port.out.PresignedUrlGeneratePort; import com.stumeet.server.file.domain.exception.InvalidFileException; import com.stumeet.server.stub.FileStub; From 619d6876442cf03d8907e68d5297831f7f4debd0 Mon Sep 17 00:00:00 2001 From: Lee ChanMi Date: Tue, 30 Jul 2024 19:17:43 +0900 Subject: [PATCH 2/9] =?UTF-8?q?:sparkles:=20[STMT-187]=20=EB=B9=84?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=EB=A1=9C=20presigned=20URL=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=9A=94=EC=B2=AD=20=ED=9B=84=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../in/PresignedUrlGenerateWebAdapter.java | 14 ++++--- .../in/response/PresignedUrlResponses.java | 8 ++++ .../adapter/out/S3ImageStorageAdapter.java | 7 +++- .../port/in/PresignedUrlGenerateUseCase.java | 7 ++-- .../port/in/command/PresignedUrlCommands.java | 13 +++++++ .../PresignedUrlGenerateAsyncService.java | 33 +++++++++++++++++ .../service/PresignedUrlGenerateService.java | 37 ++++++++++++------- 7 files changed, 94 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/stumeet/server/file/adapter/in/response/PresignedUrlResponses.java create mode 100644 src/main/java/com/stumeet/server/file/application/port/in/command/PresignedUrlCommands.java create mode 100644 src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateAsyncService.java diff --git a/src/main/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapter.java b/src/main/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapter.java index 926b1011..43064707 100644 --- a/src/main/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapter.java +++ b/src/main/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapter.java @@ -3,9 +3,11 @@ import com.stumeet.server.common.annotation.WebAdapter; import com.stumeet.server.common.model.ApiResponse; import com.stumeet.server.common.response.SuccessCode; +import com.stumeet.server.file.adapter.in.response.PresignedUrlResponses; import com.stumeet.server.file.application.port.in.PresignedUrlGenerateUseCase; -import com.stumeet.server.file.application.port.in.command.PresignedUrlCommand; -import com.stumeet.server.file.adapter.in.response.PresignedUrlResponse; +import com.stumeet.server.file.application.port.in.command.PresignedUrlCommands; + +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -14,17 +16,17 @@ import org.springframework.web.bind.annotation.RequestMapping; @WebAdapter -@RequestMapping("/api/v1/presigned-url") +@RequestMapping("/api/v1/presigned-urls") @RequiredArgsConstructor public class PresignedUrlGenerateWebAdapter { private final PresignedUrlGenerateUseCase presignedUrlGenerateUseCase; @PostMapping - public ResponseEntity> generatePresignedUrl( - @RequestBody PresignedUrlCommand request + public ResponseEntity> generatePresignedUrls( + @Valid @RequestBody PresignedUrlCommands request ) { - PresignedUrlResponse response = presignedUrlGenerateUseCase.generatePresignedUrl(request); + PresignedUrlResponses response = presignedUrlGenerateUseCase.generatePresignedUrls(request); return ResponseEntity.status(HttpStatus.OK) .body(ApiResponse.success(SuccessCode.PRESIGNED_URL_SUCCESS, response)); diff --git a/src/main/java/com/stumeet/server/file/adapter/in/response/PresignedUrlResponses.java b/src/main/java/com/stumeet/server/file/adapter/in/response/PresignedUrlResponses.java new file mode 100644 index 00000000..e33097b3 --- /dev/null +++ b/src/main/java/com/stumeet/server/file/adapter/in/response/PresignedUrlResponses.java @@ -0,0 +1,8 @@ +package com.stumeet.server.file.adapter.in.response; + +import java.util.List; + +public record PresignedUrlResponses( + List presignedUrls +) { +} diff --git a/src/main/java/com/stumeet/server/file/adapter/out/S3ImageStorageAdapter.java b/src/main/java/com/stumeet/server/file/adapter/out/S3ImageStorageAdapter.java index 1fad3c6b..cff688e7 100644 --- a/src/main/java/com/stumeet/server/file/adapter/out/S3ImageStorageAdapter.java +++ b/src/main/java/com/stumeet/server/file/adapter/out/S3ImageStorageAdapter.java @@ -10,10 +10,13 @@ import com.stumeet.server.file.application.port.out.FileCommandPort; import com.stumeet.server.file.application.port.out.PresignedUrlGeneratePort; import com.stumeet.server.file.domain.FileManagementPath; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; + import org.springframework.beans.factory.annotation.Value; import org.springframework.web.multipart.MultipartFile; + import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.DeleteObjectsRequest; @@ -107,8 +110,8 @@ private List getObjectIdentifiers(String prefix) { public FileUrl generatePresignedUrl(FileManagementPath path, String fileName) { String key = FileUtil.generateKey(path.getPath(), fileName); - PresignedPutObjectRequest request = s3Presigner.presignPutObject(p -> - p.signatureDuration(Duration.ofSeconds(expiredTime)) + PresignedPutObjectRequest request = s3Presigner.presignPutObject( + p -> p.signatureDuration(Duration.ofSeconds(expiredTime)) .putObjectRequest(pr -> pr.bucket(bucket).key(key)) ); diff --git a/src/main/java/com/stumeet/server/file/application/port/in/PresignedUrlGenerateUseCase.java b/src/main/java/com/stumeet/server/file/application/port/in/PresignedUrlGenerateUseCase.java index ed405104..04fcc01f 100644 --- a/src/main/java/com/stumeet/server/file/application/port/in/PresignedUrlGenerateUseCase.java +++ b/src/main/java/com/stumeet/server/file/application/port/in/PresignedUrlGenerateUseCase.java @@ -1,9 +1,8 @@ package com.stumeet.server.file.application.port.in; -import com.stumeet.server.file.application.port.in.command.PresignedUrlCommand; -import com.stumeet.server.file.adapter.in.response.PresignedUrlResponse; +import com.stumeet.server.file.adapter.in.response.PresignedUrlResponses; +import com.stumeet.server.file.application.port.in.command.PresignedUrlCommands; public interface PresignedUrlGenerateUseCase { - - PresignedUrlResponse generatePresignedUrl(PresignedUrlCommand request); + PresignedUrlResponses generatePresignedUrls(PresignedUrlCommands commands); } diff --git a/src/main/java/com/stumeet/server/file/application/port/in/command/PresignedUrlCommands.java b/src/main/java/com/stumeet/server/file/application/port/in/command/PresignedUrlCommands.java new file mode 100644 index 00000000..a6c58e3e --- /dev/null +++ b/src/main/java/com/stumeet/server/file/application/port/in/command/PresignedUrlCommands.java @@ -0,0 +1,13 @@ +package com.stumeet.server.file.application.port.in.command; + +import java.util.List; + +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +public record PresignedUrlCommands( + @NotNull(message = "Presigned URL을 요청할 이미지 정보를 입력해주세요.") + @Size(min = 1, max = 5, message = "요청 가능한 Presigned URL 개수는 최소 1개, 최대 5개 입니다.") + List commands +) { +} \ No newline at end of file diff --git a/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateAsyncService.java b/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateAsyncService.java new file mode 100644 index 00000000..82e06a5d --- /dev/null +++ b/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateAsyncService.java @@ -0,0 +1,33 @@ +package com.stumeet.server.file.application.service; + +import java.util.concurrent.CompletableFuture; + +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import com.stumeet.server.common.util.FileValidator; +import com.stumeet.server.file.adapter.in.response.PresignedUrlResponse; +import com.stumeet.server.file.application.port.dto.FileUrl; +import com.stumeet.server.file.application.port.in.command.PresignedUrlCommand; +import com.stumeet.server.file.application.port.out.PresignedUrlGeneratePort; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class PresignedUrlGenerateAsyncService { + + private final PresignedUrlGeneratePort presignedUrlGeneratePort; + + @Async + public CompletableFuture generatePresignedUrl(PresignedUrlCommand command) { + FileValidator.validateImageFile(command.fileName()); + + FileUrl fileUrl = presignedUrlGeneratePort.generatePresignedUrl(command.path(), command.fileName()); + + return CompletableFuture.completedFuture( + PresignedUrlResponse.builder() + .url(fileUrl.url()) + .build()); + } +} diff --git a/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateService.java b/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateService.java index 6180da55..7d1c2c36 100644 --- a/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateService.java +++ b/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateService.java @@ -1,29 +1,40 @@ package com.stumeet.server.file.application.service; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + import com.stumeet.server.common.annotation.UseCase; -import com.stumeet.server.common.util.FileValidator; -import com.stumeet.server.file.application.port.dto.FileUrl; +import com.stumeet.server.file.adapter.in.response.PresignedUrlResponses; import com.stumeet.server.file.application.port.in.PresignedUrlGenerateUseCase; -import com.stumeet.server.file.application.port.in.command.PresignedUrlCommand; import com.stumeet.server.file.adapter.in.response.PresignedUrlResponse; -import com.stumeet.server.file.application.port.out.PresignedUrlGeneratePort; +import com.stumeet.server.file.application.port.in.command.PresignedUrlCommand; +import com.stumeet.server.file.application.port.in.command.PresignedUrlCommands; + import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; @UseCase @RequiredArgsConstructor +@Slf4j public class PresignedUrlGenerateService implements PresignedUrlGenerateUseCase { - private final PresignedUrlGeneratePort presignedUrlGeneratePort; - + private final PresignedUrlGenerateAsyncService presignedUrlGenerateAsyncService; @Override - public PresignedUrlResponse generatePresignedUrl(PresignedUrlCommand command) { - FileValidator.validateImageFile(command.fileName()); + public PresignedUrlResponses generatePresignedUrls(PresignedUrlCommands commands) { + List> futures = new ArrayList<>(); + + for (PresignedUrlCommand command : commands.commands()) { + CompletableFuture future = + presignedUrlGenerateAsyncService.generatePresignedUrl(command); + futures.add(future); + } - FileUrl fileUrl = presignedUrlGeneratePort.generatePresignedUrl(command.path(), command.fileName()); + List responses = futures.stream() + .map(CompletableFuture::join) + .toList(); - return PresignedUrlResponse.builder() - .url(fileUrl.url()) - .build(); + return new PresignedUrlResponses(responses); } -} +} \ No newline at end of file From 7cf7f27e267918229b5706a2c1abbf3302fa4cbb Mon Sep 17 00:00:00 2001 From: Lee ChanMi Date: Tue, 30 Jul 2024 19:18:10 +0900 Subject: [PATCH 3/9] =?UTF-8?q?:goal=5Fnet:=20[STMT-187]=20=EB=B9=84?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=20=EC=9E=91=EC=97=85=20=EC=A4=91=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=ED=95=98=EB=8A=94=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/GlobalExceptionHandler.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/com/stumeet/server/common/exception/handler/GlobalExceptionHandler.java b/src/main/java/com/stumeet/server/common/exception/handler/GlobalExceptionHandler.java index e54f15e3..3ba563b2 100644 --- a/src/main/java/com/stumeet/server/common/exception/handler/GlobalExceptionHandler.java +++ b/src/main/java/com/stumeet/server/common/exception/handler/GlobalExceptionHandler.java @@ -1,6 +1,7 @@ package com.stumeet.server.common.exception.handler; import java.util.List; +import java.util.concurrent.CompletionException; import java.util.stream.Collectors; import com.fasterxml.jackson.databind.exc.InvalidFormatException; @@ -60,6 +61,21 @@ protected ResponseEntity handleBusinessException(final BusinessExce .body(response); } + @ExceptionHandler(CompletionException.class) + protected ResponseEntity handleCompletionException(final CompletionException e) { + String message = "비동기 작업 중 에러 발생. 원인: " + e.getCause().getMessage(); + + log.error(ERROR_LOG_MESSAGE, e.getClass().getSimpleName(), e.getMessage()); + log.error(message); + log.debug(e.getMessage(), e); + e.printStackTrace(); + + ApiResponse response = ApiResponse.fail(500, message); + + return ResponseEntity.internalServerError() + .body(response); + } + @ExceptionHandler(Exception.class) protected ResponseEntity handleException(final Exception e) { log.error(ERROR_LOG_MESSAGE, e.getClass().getSimpleName(), e.getMessage()); From ca412dd7c275a781cb8debc3d2958a1f1dc092a2 Mon Sep 17 00:00:00 2001 From: Lee ChanMi Date: Tue, 30 Jul 2024 19:21:56 +0900 Subject: [PATCH 4/9] =?UTF-8?q?:white=5Fcheck=5Fmark:=20[STMT-187]=20presi?= =?UTF-8?q?gned=20URL=20=EC=83=9D=EC=84=B1=EC=97=90=20=EB=8C=80=ED=95=9C?= =?UTF-8?q?=20=EB=8B=A8=EC=9C=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PresignedUrlGenerateAsyncServiceTest.java | 60 +++++++++++++++++++ .../PresignedUrlGenerateServiceTest.java | 55 +++++++---------- .../com/stumeet/server/stub/FileStub.java | 30 ++++++++++ 3 files changed, 113 insertions(+), 32 deletions(-) create mode 100644 src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateAsyncServiceTest.java diff --git a/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateAsyncServiceTest.java b/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateAsyncServiceTest.java new file mode 100644 index 00000000..118994a4 --- /dev/null +++ b/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateAsyncServiceTest.java @@ -0,0 +1,60 @@ +package com.stumeet.server.file.application.service; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.BDDMockito.*; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import com.stumeet.server.file.adapter.in.response.PresignedUrlResponse; +import com.stumeet.server.file.application.port.dto.FileUrl; +import com.stumeet.server.file.application.port.in.command.PresignedUrlCommand; +import com.stumeet.server.file.application.port.out.PresignedUrlGeneratePort; +import com.stumeet.server.file.domain.exception.InvalidFileException; +import com.stumeet.server.stub.FileStub; +import com.stumeet.server.template.UnitTest; + +class PresignedUrlGenerateAsyncServiceTest extends UnitTest { + + @InjectMocks + private PresignedUrlGenerateAsyncService presignedUrlGenerateAsyncService; + + @Mock + private PresignedUrlGeneratePort presignedUrlGeneratePort; + + @Nested + @DisplayName("generatePresignedUrl 메소드는") + class GeneratePresignedUrl { + + @Test + @DisplayName("[성공] Presigned URL을 생성한다.") + void successTest() throws ExecutionException, InterruptedException { + PresignedUrlCommand request = FileStub.getPresignedUrlCommand(); + FileUrl want = FileStub.getPresignedUrl(); + + given(presignedUrlGeneratePort.generatePresignedUrl(request.path(), request.fileName())) + .willReturn(want); + + CompletableFuture got = presignedUrlGenerateAsyncService.generatePresignedUrl(request); + + assertThat(got.get().url()).isEqualTo(want.url()); + } + + @ParameterizedTest + @MethodSource("com.stumeet.server.stub.FileStub#getInvalidFileTestArguments") + @DisplayName("[실패] 파일 이름이 유효하지 않은 경우 예외가 발생합니다.") + void invalidFileTest(String documentPath, PresignedUrlCommand invalidFileRequest, InvalidFileException e) { + assertThatCode(() -> presignedUrlGenerateAsyncService.generatePresignedUrl(invalidFileRequest)) + .isInstanceOf(e.getClass()) + .hasMessage(e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateServiceTest.java b/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateServiceTest.java index 26a0cc39..40c053aa 100644 --- a/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateServiceTest.java +++ b/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateServiceTest.java @@ -1,23 +1,21 @@ package com.stumeet.server.file.application.service; -import com.stumeet.server.file.application.port.dto.FileUrl; -import com.stumeet.server.file.application.port.in.command.PresignedUrlCommand; -import com.stumeet.server.file.adapter.in.response.PresignedUrlResponse; -import com.stumeet.server.file.application.port.out.PresignedUrlGeneratePort; -import com.stumeet.server.file.domain.exception.InvalidFileException; -import com.stumeet.server.stub.FileStub; -import com.stumeet.server.template.UnitTest; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.BDDMockito.*; + +import java.util.concurrent.CompletableFuture; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; import org.mockito.InjectMocks; import org.mockito.Mock; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatCode; -import static org.mockito.BDDMockito.given; +import com.stumeet.server.file.adapter.in.response.PresignedUrlResponse; +import com.stumeet.server.file.adapter.in.response.PresignedUrlResponses; +import com.stumeet.server.file.application.port.in.command.PresignedUrlCommands; +import com.stumeet.server.stub.FileStub; +import com.stumeet.server.template.UnitTest; class PresignedUrlGenerateServiceTest extends UnitTest { @@ -25,33 +23,26 @@ class PresignedUrlGenerateServiceTest extends UnitTest { private PresignedUrlGenerateService presignedUrlGenerateService; @Mock - private PresignedUrlGeneratePort presignedUrlGeneratePort; + private PresignedUrlGenerateAsyncService presignedUrlGenerateAsyncService; @Nested - @DisplayName("generatePresignedUrl 메소드는") - class GeneratePresignedUrl { + @DisplayName("generatePresignedUrls 메소드는") + class GeneratePresignedUrls { @Test - @DisplayName("[성공] PresignedUrl을 생성한다.") - void successTest() { - PresignedUrlCommand request = FileStub.getPresignedUrlCommand(); - FileUrl want = FileStub.getPresignedUrl(); + @DisplayName("[성공] 비동기로 Presigned URL 목록을 생성한다.") + void success() { + PresignedUrlCommands commands = FileStub.getPresignedUrlCommands(); + PresignedUrlResponses want = FileStub.getPresignedUrlResponses(); - given(presignedUrlGeneratePort.generatePresignedUrl(request.path(), request.fileName())) - .willReturn(want); + given(presignedUrlGenerateAsyncService.generatePresignedUrl(any())) + .willReturn( + CompletableFuture.completedFuture( + new PresignedUrlResponse(FileStub.getPresignedUrl().url()))); - PresignedUrlResponse got = presignedUrlGenerateService.generatePresignedUrl(request); - - assertThat(got.url()).isEqualTo(want.url()); - } + PresignedUrlResponses got = presignedUrlGenerateService.generatePresignedUrls(commands); - @ParameterizedTest - @MethodSource("com.stumeet.server.stub.FileStub#getInvalidFileTestArguments") - @DisplayName("[실패] 파일 이름이 유효하지 않은 경우 예외가 발생합니다.") - void invalidFileTest(String documentPath, PresignedUrlCommand invalidFileRequest, InvalidFileException e) { - assertThatCode(() -> presignedUrlGenerateService.generatePresignedUrl(invalidFileRequest)) - .isInstanceOf(e.getClass()) - .hasMessage(e.getMessage()); + assertThat(got).isEqualTo(want); } } } \ No newline at end of file diff --git a/src/test/java/com/stumeet/server/stub/FileStub.java b/src/test/java/com/stumeet/server/stub/FileStub.java index 5a79f280..4b8b58c3 100644 --- a/src/test/java/com/stumeet/server/stub/FileStub.java +++ b/src/test/java/com/stumeet/server/stub/FileStub.java @@ -1,12 +1,16 @@ package com.stumeet.server.stub; import com.stumeet.server.common.response.ErrorCode; +import com.stumeet.server.file.adapter.in.response.PresignedUrlResponse; +import com.stumeet.server.file.adapter.in.response.PresignedUrlResponses; import com.stumeet.server.file.application.port.dto.FileUrl; import com.stumeet.server.file.application.port.in.command.PresignedUrlCommand; +import com.stumeet.server.file.application.port.in.command.PresignedUrlCommands; import com.stumeet.server.file.domain.FileManagementPath; import com.stumeet.server.file.domain.exception.InvalidFileException; import org.junit.jupiter.params.provider.Arguments; +import java.util.List; import java.util.stream.Stream; public class FileStub { @@ -31,6 +35,32 @@ public static PresignedUrlCommand getPresignedUrlCommand() { .build(); } + public static PresignedUrlCommands getPresignedUrlCommands() { + return new PresignedUrlCommands( + List.of( + getPresignedUrlCommand(), + getPresignedUrlCommand(), + getPresignedUrlCommand() + ) + ); + } + + public static PresignedUrlResponse getPresignedUrlResponse() { + return PresignedUrlResponse.builder() + .url(getPresignedUrl().url()) + .build(); + } + + public static PresignedUrlResponses getPresignedUrlResponses() { + return new PresignedUrlResponses( + List.of( + getPresignedUrlResponse(), + getPresignedUrlResponse(), + getPresignedUrlResponse() + ) + ); + } + public static Stream getInvalidFileTestArguments() { return Stream.of( Arguments.of( From 8ea796af60aae3ea4ab93f6aeedf61f8521da25c Mon Sep 17 00:00:00 2001 From: Lee ChanMi Date: Tue, 30 Jul 2024 21:01:26 +0900 Subject: [PATCH 5/9] =?UTF-8?q?:goal=5Fnet:=20[STMT-187]=20error=20code?= =?UTF-8?q?=EC=9D=98=20=EB=A9=94=EC=8B=9C=EC=A7=80=EB=A5=BC=20business=20e?= =?UTF-8?q?xception=EC=9D=98=20=EB=A9=94=EC=8B=9C=EC=A7=80=EB=A1=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/common/exception/model/BusinessException.java | 1 + src/main/java/com/stumeet/server/common/response/ErrorCode.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/main/java/com/stumeet/server/common/exception/model/BusinessException.java b/src/main/java/com/stumeet/server/common/exception/model/BusinessException.java index e4a51a43..32fac8fd 100644 --- a/src/main/java/com/stumeet/server/common/exception/model/BusinessException.java +++ b/src/main/java/com/stumeet/server/common/exception/model/BusinessException.java @@ -7,6 +7,7 @@ public class BusinessException extends RuntimeException { private final ErrorCode errorCode; public BusinessException(ErrorCode errorCode) { + super(errorCode.getMessage()); this.errorCode = errorCode; } diff --git a/src/main/java/com/stumeet/server/common/response/ErrorCode.java b/src/main/java/com/stumeet/server/common/response/ErrorCode.java index f75a88d5..2c8cde66 100644 --- a/src/main/java/com/stumeet/server/common/response/ErrorCode.java +++ b/src/main/java/com/stumeet/server/common/response/ErrorCode.java @@ -73,6 +73,8 @@ public enum ErrorCode { FILE_IO_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "파일 입출력에 실패하였습니다."), UPLOAD_FILE_FAIL_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "파일 업로드에 실패하였습니다."), NOT_IMPLEMENTED_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "구현되지 않은 메서드를 사용했습니다."), + + ASYNC_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "비동기 작업 중 에러가 발생했습니다.") ; private final HttpStatus httpStatus; From 7b8069a620cdc1ded94fd03d994227c1da99f51c Mon Sep 17 00:00:00 2001 From: Lee ChanMi Date: Tue, 30 Jul 2024 21:02:09 +0900 Subject: [PATCH 6/9] =?UTF-8?q?:goal=5Fnet:=20[STMT-187]=20=EB=B9=84?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=20=EC=9E=91=EC=97=85=20=EC=A4=91=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=ED=95=98=EB=8A=94=20=EC=97=90=EB=9F=AC=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/GlobalExceptionHandler.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/stumeet/server/common/exception/handler/GlobalExceptionHandler.java b/src/main/java/com/stumeet/server/common/exception/handler/GlobalExceptionHandler.java index 3ba563b2..240095be 100644 --- a/src/main/java/com/stumeet/server/common/exception/handler/GlobalExceptionHandler.java +++ b/src/main/java/com/stumeet/server/common/exception/handler/GlobalExceptionHandler.java @@ -10,6 +10,7 @@ import com.stumeet.server.common.exception.model.SecurityViolationException; import com.stumeet.server.common.response.ErrorCode; import com.stumeet.server.common.model.ApiResponse; +import com.stumeet.server.file.domain.exception.InvalidFileException; import jakarta.validation.ConstraintViolationException; import lombok.extern.slf4j.Slf4j; @@ -63,19 +64,24 @@ protected ResponseEntity handleBusinessException(final BusinessExce @ExceptionHandler(CompletionException.class) protected ResponseEntity handleCompletionException(final CompletionException e) { - String message = "비동기 작업 중 에러 발생. 원인: " + e.getCause().getMessage(); - log.error(ERROR_LOG_MESSAGE, e.getClass().getSimpleName(), e.getMessage()); - log.error(message); log.debug(e.getMessage(), e); e.printStackTrace(); - ApiResponse response = ApiResponse.fail(500, message); + ApiResponse response = createApiResponse(e); - return ResponseEntity.internalServerError() + return ResponseEntity.status(response.code()) .body(response); } + private ApiResponse createApiResponse(final CompletionException e) { + if (e.getCause() instanceof InvalidFileException invalidFileException) { + return ApiResponse.fail(invalidFileException.getErrorCode()); + } else { + return ApiResponse.fail(ErrorCode.ASYNC_ERROR); + } + } + @ExceptionHandler(Exception.class) protected ResponseEntity handleException(final Exception e) { log.error(ERROR_LOG_MESSAGE, e.getClass().getSimpleName(), e.getMessage()); From fcf83dd049d00d1b9c6f10dcdcf341a0bcccf1e7 Mon Sep 17 00:00:00 2001 From: Lee ChanMi Date: Tue, 30 Jul 2024 21:02:57 +0900 Subject: [PATCH 7/9] =?UTF-8?q?:white=5Fcheck=5Fmark:=20[STMT-187]=20?= =?UTF-8?q?=EB=B3=B5=EC=88=98=20presigned=20url=20=EB=B0=9C=EA=B8=89?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=A8=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=9D=BC=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PresignedUrlGenerateWebAdapterTest.java | 28 ++++++++--------- .../PresignedUrlGenerateAsyncServiceTest.java | 2 +- .../com/stumeet/server/stub/FileStub.java | 31 +++++++++++++++++-- 3 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/test/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapterTest.java b/src/test/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapterTest.java index bd2614e9..73b27f92 100644 --- a/src/test/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapterTest.java +++ b/src/test/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapterTest.java @@ -1,7 +1,7 @@ package com.stumeet.server.file.adapter.in; import com.stumeet.server.common.auth.model.AuthenticationHeader; -import com.stumeet.server.file.application.port.in.command.PresignedUrlCommand; +import com.stumeet.server.file.application.port.in.command.PresignedUrlCommands; import com.stumeet.server.file.domain.exception.InvalidFileException; import com.stumeet.server.helper.WithMockMember; import com.stumeet.server.stub.FileStub; @@ -29,46 +29,46 @@ class PresignedUrlGenerateWebAdapterTest extends ApiTest { @DisplayName("PresignedUrl 생성") class GeneratePresignedUrl { - private static final String PATH = "/api/v1/presigned-url"; + private static final String PATH = "/api/v1/presigned-urls"; @Test @WithMockMember - @DisplayName("[성공] 해당하는 파일에 대한 PresignedUrl을 생성한다.") + @DisplayName("[성공] 해당하는 파일 목록에 대한 PresignedUrl 목록을 생성한다.") void successTest() throws Exception { - PresignedUrlCommand request = FileStub.getPresignedUrlCommand(); + PresignedUrlCommands commands = FileStub.getPresignedUrlCommands(); mockMvc.perform(post(PATH) .header(AuthenticationHeader.ACCESS_TOKEN.getName(), TokenStub.getMockAccessToken()) .contentType(MediaType.APPLICATION_JSON) - .content(toJson(request))) + .content(toJson(commands))) .andExpect(status().isOk()) - .andDo(document("presigned-url-generate/success", + .andDo(document("presigned-urls-generate/success", preprocessRequest(prettyPrint()), preprocessResponse(prettyPrint()), requestHeaders( headerWithName(AuthenticationHeader.ACCESS_TOKEN.getName()).description("서버로부터 전달받은 액세스 토큰") ), requestFields( - fieldWithPath("path").description("해당하는 파일의 도메인"), - fieldWithPath("fileName").description("파일 이름") + fieldWithPath("commands[].path").description("해당하는 파일의 도메인"), + fieldWithPath("commands[].fileName").description("파일 이름") ), responseFields( fieldWithPath("code").description("응답 코드"), fieldWithPath("message").description("응답 메시지"), - fieldWithPath("data.url").description("Presigned url") + fieldWithPath("data.presignedUrls[].url").description("Presigned url") ) )); } @ParameterizedTest - @MethodSource("com.stumeet.server.stub.FileStub#getInvalidFileTestArguments") + @MethodSource("com.stumeet.server.stub.FileStub#getInvalidFilesTestArguments") @WithMockMember @DisplayName("[실패] 파일 이름이 유효하지 않은 경우 예외가 발생합니다.") - void invalidFileTest(String documentPath, PresignedUrlCommand invalidFileRequest, InvalidFileException e) throws Exception { + void invalidFileTest(String documentPath, PresignedUrlCommands invalidFileRequests, InvalidFileException e) throws Exception { mockMvc.perform(post(PATH) .header(AuthenticationHeader.ACCESS_TOKEN.getName(), TokenStub.getMockAccessToken()) .contentType(MediaType.APPLICATION_JSON) - .content(toJson(invalidFileRequest))) + .content(toJson(invalidFileRequests))) .andExpect(status().isBadRequest()) .andExpect(jsonPath("$.code").value(e.getErrorCode().getHttpStatusCode())) .andExpect(jsonPath("$.message").value(e.getErrorCode().getMessage())) @@ -79,8 +79,8 @@ void invalidFileTest(String documentPath, PresignedUrlCommand invalidFileRequest headerWithName(AuthenticationHeader.ACCESS_TOKEN.getName()).description("서버로부터 전달받은 액세스 토큰") ), requestFields( - fieldWithPath("path").description("해당하는 파일의 도메인"), - fieldWithPath("fileName").description("파일 이름") + fieldWithPath("commands[].path").description("해당하는 파일의 도메인"), + fieldWithPath("commands[].fileName").description("파일 이름") ), responseFields( fieldWithPath("code").description("응답 코드"), diff --git a/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateAsyncServiceTest.java b/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateAsyncServiceTest.java index 118994a4..c666d16a 100644 --- a/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateAsyncServiceTest.java +++ b/src/test/java/com/stumeet/server/file/application/service/PresignedUrlGenerateAsyncServiceTest.java @@ -51,7 +51,7 @@ void successTest() throws ExecutionException, InterruptedException { @ParameterizedTest @MethodSource("com.stumeet.server.stub.FileStub#getInvalidFileTestArguments") @DisplayName("[실패] 파일 이름이 유효하지 않은 경우 예외가 발생합니다.") - void invalidFileTest(String documentPath, PresignedUrlCommand invalidFileRequest, InvalidFileException e) { + void invalidFileTest(PresignedUrlCommand invalidFileRequest, InvalidFileException e) { assertThatCode(() -> presignedUrlGenerateAsyncService.generatePresignedUrl(invalidFileRequest)) .isInstanceOf(e.getClass()) .hasMessage(e.getMessage()); diff --git a/src/test/java/com/stumeet/server/stub/FileStub.java b/src/test/java/com/stumeet/server/stub/FileStub.java index 4b8b58c3..e0574bbf 100644 --- a/src/test/java/com/stumeet/server/stub/FileStub.java +++ b/src/test/java/com/stumeet/server/stub/FileStub.java @@ -64,7 +64,6 @@ public static PresignedUrlResponses getPresignedUrlResponses() { public static Stream getInvalidFileTestArguments() { return Stream.of( Arguments.of( - "presigned-url-generate/fail/invalid-file-name", PresignedUrlCommand.builder() .path(FileManagementPath.STUDY_ACTIVITY) .fileName("test") @@ -72,7 +71,6 @@ public static Stream getInvalidFileTestArguments() { new InvalidFileException(ErrorCode.INVALID_FILE_NAME_EXCEPTION) ), Arguments.of( - "presigned-url-generate/fail/invalid-file-extension", PresignedUrlCommand.builder() .path(FileManagementPath.STUDY_ACTIVITY) .fileName("test.pxp") @@ -81,4 +79,33 @@ public static Stream getInvalidFileTestArguments() { ) ); } + + public static Stream getInvalidFilesTestArguments() { + return Stream.of( + Arguments.of( + "presigned-urls-generate/fail/invalid-file-name", + new PresignedUrlCommands( + List.of( + PresignedUrlCommand.builder() + .path(FileManagementPath.STUDY_ACTIVITY) + .fileName("test") + .build() + ) + ), + new InvalidFileException(ErrorCode.INVALID_FILE_NAME_EXCEPTION) + ), + Arguments.of( + "presigned-urls-generate/fail/invalid-file-extension", + new PresignedUrlCommands( + List.of( + PresignedUrlCommand.builder() + .path(FileManagementPath.STUDY_ACTIVITY) + .fileName("test.pxp") + .build() + ) + ), + new InvalidFileException(ErrorCode.INVALID_FILE_EXTENSION_EXCEPTION) + ) + ); + } } From 171847bcf98024ebd41bc1d402f7179b633dea76 Mon Sep 17 00:00:00 2001 From: Lee ChanMi Date: Tue, 30 Jul 2024 21:13:26 +0900 Subject: [PATCH 8/9] =?UTF-8?q?:recycle:=20[STMT-187]=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=20=EC=9D=98=EB=AF=B8=20=EA=B0=95=ED=99=94=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=B4=20request=20body=20=EB=B3=80=EC=88=98=EB=AA=85?= =?UTF-8?q?=EC=9D=84=20commands=EC=97=90=EC=84=9C=20requests=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../port/in/command/PresignedUrlCommands.java | 2 +- .../service/PresignedUrlGenerateService.java | 2 +- .../in/PresignedUrlGenerateWebAdapterTest.java | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/stumeet/server/file/application/port/in/command/PresignedUrlCommands.java b/src/main/java/com/stumeet/server/file/application/port/in/command/PresignedUrlCommands.java index a6c58e3e..bd80c2f7 100644 --- a/src/main/java/com/stumeet/server/file/application/port/in/command/PresignedUrlCommands.java +++ b/src/main/java/com/stumeet/server/file/application/port/in/command/PresignedUrlCommands.java @@ -8,6 +8,6 @@ public record PresignedUrlCommands( @NotNull(message = "Presigned URL을 요청할 이미지 정보를 입력해주세요.") @Size(min = 1, max = 5, message = "요청 가능한 Presigned URL 개수는 최소 1개, 최대 5개 입니다.") - List commands + List requests ) { } \ No newline at end of file diff --git a/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateService.java b/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateService.java index 7d1c2c36..11e9d0ce 100644 --- a/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateService.java +++ b/src/main/java/com/stumeet/server/file/application/service/PresignedUrlGenerateService.java @@ -25,7 +25,7 @@ public class PresignedUrlGenerateService implements PresignedUrlGenerateUseCase public PresignedUrlResponses generatePresignedUrls(PresignedUrlCommands commands) { List> futures = new ArrayList<>(); - for (PresignedUrlCommand command : commands.commands()) { + for (PresignedUrlCommand command : commands.requests()) { CompletableFuture future = presignedUrlGenerateAsyncService.generatePresignedUrl(command); futures.add(future); diff --git a/src/test/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapterTest.java b/src/test/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapterTest.java index 73b27f92..1fc39b2f 100644 --- a/src/test/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapterTest.java +++ b/src/test/java/com/stumeet/server/file/adapter/in/PresignedUrlGenerateWebAdapterTest.java @@ -35,12 +35,12 @@ class GeneratePresignedUrl { @WithMockMember @DisplayName("[성공] 해당하는 파일 목록에 대한 PresignedUrl 목록을 생성한다.") void successTest() throws Exception { - PresignedUrlCommands commands = FileStub.getPresignedUrlCommands(); + PresignedUrlCommands request = FileStub.getPresignedUrlCommands(); mockMvc.perform(post(PATH) .header(AuthenticationHeader.ACCESS_TOKEN.getName(), TokenStub.getMockAccessToken()) .contentType(MediaType.APPLICATION_JSON) - .content(toJson(commands))) + .content(toJson(request))) .andExpect(status().isOk()) .andDo(document("presigned-urls-generate/success", preprocessRequest(prettyPrint()), @@ -49,8 +49,8 @@ void successTest() throws Exception { headerWithName(AuthenticationHeader.ACCESS_TOKEN.getName()).description("서버로부터 전달받은 액세스 토큰") ), requestFields( - fieldWithPath("commands[].path").description("해당하는 파일의 도메인"), - fieldWithPath("commands[].fileName").description("파일 이름") + fieldWithPath("requests[].path").description("해당하는 파일의 도메인"), + fieldWithPath("requests[].fileName").description("파일 이름") ), responseFields( fieldWithPath("code").description("응답 코드"), @@ -79,8 +79,8 @@ void invalidFileTest(String documentPath, PresignedUrlCommands invalidFileReques headerWithName(AuthenticationHeader.ACCESS_TOKEN.getName()).description("서버로부터 전달받은 액세스 토큰") ), requestFields( - fieldWithPath("commands[].path").description("해당하는 파일의 도메인"), - fieldWithPath("commands[].fileName").description("파일 이름") + fieldWithPath("requests[].path").description("해당하는 파일의 도메인"), + fieldWithPath("requests[].fileName").description("파일 이름") ), responseFields( fieldWithPath("code").description("응답 코드"), From ed96ca8eee6669135f1d97e3741dc44513877088 Mon Sep 17 00:00:00 2001 From: Lee ChanMi Date: Tue, 30 Jul 2024 21:14:04 +0900 Subject: [PATCH 9/9] =?UTF-8?q?:memo:=20[STMT-187]=20=EB=B3=B5=EC=88=98=20?= =?UTF-8?q?url=EB=A1=9C=20document=20path=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/asciidoc/index.adoc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index 8ec82867..674027b6 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -425,24 +425,24 @@ include::{snippets}/study-member-join/fail/not-exist-member/response-fields.adoc ===== 요청 -include::{snippets}/presigned-url-generate/success/http-request.adoc[] -include::{snippets}/presigned-url-generate/success/request-headers.adoc[] -include::{snippets}/presigned-url-generate/success/request-fields.adoc[] +include::{snippets}/presigned-urls-generate/success/http-request.adoc[] +include::{snippets}/presigned-urls-generate/success/request-headers.adoc[] +include::{snippets}/presigned-urls-generate/success/request-fields.adoc[] include::file-management-path.adoc[] ===== 응답 성공 (200) -include::{snippets}/presigned-url-generate/success/response-body.adoc[] -include::{snippets}/presigned-url-generate/success/response-fields.adoc[] +include::{snippets}/presigned-urls-generate/success/response-body.adoc[] +include::{snippets}/presigned-urls-generate/success/response-fields.adoc[] ===== 응답 실패 (400) .파일이름이 유효하지 않은 경우 -include::{snippets}/presigned-url-generate/fail/invalid-file-name/response-body.adoc[] -include::{snippets}/presigned-url-generate/fail/invalid-file-name/response-fields.adoc[] +include::{snippets}/presigned-urls-generate/fail/invalid-file-name/response-body.adoc[] +include::{snippets}/presigned-urls-generate/fail/invalid-file-name/response-fields.adoc[] .파일의 확장자가 유효하지 않은 경우 -include::{snippets}/presigned-url-generate/fail/invalid-file-extension/response-body.adoc[] -include::{snippets}/presigned-url-generate/fail/invalid-file-extension/response-fields.adoc[] +include::{snippets}/presigned-urls-generate/fail/invalid-file-extension/response-body.adoc[] +include::{snippets}/presigned-urls-generate/fail/invalid-file-extension/response-fields.adoc[] == 스터디 활동 관리