diff --git a/src/main/java/umc/codeplay/apiPayLoad/code/status/ErrorStatus.java b/src/main/java/umc/codeplay/apiPayLoad/code/status/ErrorStatus.java index 30ebaa6..bd22056 100644 --- a/src/main/java/umc/codeplay/apiPayLoad/code/status/ErrorStatus.java +++ b/src/main/java/umc/codeplay/apiPayLoad/code/status/ErrorStatus.java @@ -30,10 +30,6 @@ public enum ErrorStatus implements BaseErrorCode { INVALID_OAUTH_PROVIDER(HttpStatus.BAD_REQUEST, "AUTH406", "유효하지 않은 OAuth 제공자입니다."), AWS_SERVICE_UNAVAILABLE(HttpStatus.BAD_REQUEST, "AWS400", "AWS S3에 파일을 업로드할 수 없습니다."), - AWS_METHOD_NOT_ALLOWED( - HttpStatus.METHOD_NOT_ALLOWED, - "AWS405", - "AWS S3 presigned url에서 해당 method는 허용되지 않습니다."), MUSIC_NOT_FOUND(HttpStatus.BAD_REQUEST, "MUSIC400", "음원을 찾을 수 없습니다."), diff --git a/src/main/java/umc/codeplay/config/SwaggerConfig.java b/src/main/java/umc/codeplay/config/SwaggerConfig.java index 2c856de..e6a251b 100644 --- a/src/main/java/umc/codeplay/config/SwaggerConfig.java +++ b/src/main/java/umc/codeplay/config/SwaggerConfig.java @@ -19,7 +19,10 @@ public OpenAPI CodePlayAPI() { Info info = new Info() .title("CodePlay Server API") - .description("UMC 7th Code Play Server API 문서") + .description( + "
UMC 7th Code Play Server API 문서.
" + + "
자세한 작동 방식 등은 Front-End 태그가 담긴 discussion 확인 부탁드립니다.
" + + "https://github.com/UMC-CodePlay/CodePlay-BE/discussions") .version("1.0"); String securitySchemeName = "JWT TOKEN"; diff --git a/src/main/java/umc/codeplay/controller/FileController.java b/src/main/java/umc/codeplay/controller/FileController.java index d22fab0..1756614 100644 --- a/src/main/java/umc/codeplay/controller/FileController.java +++ b/src/main/java/umc/codeplay/controller/FileController.java @@ -6,7 +6,6 @@ import lombok.RequiredArgsConstructor; import io.swagger.v3.oas.annotations.Operation; -import software.amazon.awssdk.http.SdkHttpMethod; import umc.codeplay.apiPayLoad.ApiResponse; import umc.codeplay.dto.FileResponseDTO; import umc.codeplay.service.FileService; @@ -25,10 +24,9 @@ public class FileController { description = "다운로드를 위한 Presigned URL 생성 - 유효시간 존재") @GetMapping("/download") public ApiResponse getUrl( - @RequestParam(value = "fileName") String fileName) { - String downloadUrl = fileService.generatePreSignedUrl(fileName, SdkHttpMethod.GET); + @RequestParam(value = "musicId") Long musicId) { + String downloadUrl = fileService.generateGetPresignedUrl(musicId); FileResponseDTO.DownloadFile result = new FileResponseDTO.DownloadFile(downloadUrl); - return ApiResponse.onSuccess(result); } @@ -38,11 +36,13 @@ public ApiResponse getUrl( @PostMapping("/upload") public ApiResponse generateUrl( @RequestParam(value = "fileName") String fileName) { + String username = SecurityContextHolder.getContext().getAuthentication().getName(); String newFileName = buildFilename(fileName); + System.out.println(newFileName); Long musicId = fileService.uploadMusic(newFileName, username); - String uploadUrl = fileService.generatePreSignedUrl(newFileName, SdkHttpMethod.PUT); + String uploadUrl = fileService.generatePutPresignedUrl(newFileName); FileResponseDTO.UploadFile result = new FileResponseDTO.UploadFile(uploadUrl, musicId); return ApiResponse.onSuccess(result); } diff --git a/src/main/java/umc/codeplay/service/FileService.java b/src/main/java/umc/codeplay/service/FileService.java index 06e6cd5..5a438b9 100644 --- a/src/main/java/umc/codeplay/service/FileService.java +++ b/src/main/java/umc/codeplay/service/FileService.java @@ -8,7 +8,6 @@ import lombok.RequiredArgsConstructor; -import software.amazon.awssdk.http.SdkHttpMethod; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.presigner.S3Presigner; @@ -45,47 +44,53 @@ public static String buildFilename(String filename) { // 특수 문자나 공백 등을 정리 private static String sanitizeFileName(String fileName) { String normalizedFileName = Normalizer.normalize(fileName, Normalizer.Form.NFC); - return normalizedFileName.replaceAll("\\s+", "_").replaceAll("[^a-zA-Z0-9.\\-_]", ""); - } - - // 파일 업로드(HTTP PUT) 또는 다운로드(HTTP GET)를 위한 Presigned URL 생성 - public String generatePreSignedUrl(String fileName, SdkHttpMethod method) { - - return switch (method) { - case GET -> generateGetPresignedUrl(fileName); - case PUT -> generatePutPresignedUrl(fileName); - default -> throw new GeneralHandler(ErrorStatus.AWS_SERVICE_UNAVAILABLE); - }; + System.out.println(normalizedFileName); + return normalizedFileName.replaceAll("\\s+", "_").replaceAll("[^가-힣a-zA-Z0-9.\\-_]", "_"); } // S3에서 파일을 다운로드할 수 있는 Presigned URL 생성 - private String generateGetPresignedUrl(String fileName) { - GetObjectRequest getObjectRequest = - GetObjectRequest.builder().bucket(bucketName).key(fileName).build(); - - GetObjectPresignRequest presignRequest = - GetObjectPresignRequest.builder() - .signatureDuration(Duration.ofMinutes(60)) - .getObjectRequest(getObjectRequest) - .build(); - - PresignedGetObjectRequest presignedRequest = s3Presigner.presignGetObject(presignRequest); - return presignedRequest.url().toString(); + public String generateGetPresignedUrl(Long musicId) { + try { + Music music = + musicRepository + .findById(musicId) + .orElseThrow(() -> new GeneralHandler(ErrorStatus.MUSIC_NOT_FOUND)); + + GetObjectRequest getObjectRequest = + GetObjectRequest.builder().bucket(bucketName).key(music.getTitle()).build(); + + GetObjectPresignRequest presignRequest = + GetObjectPresignRequest.builder() + .signatureDuration(Duration.ofMinutes(60)) + .getObjectRequest(getObjectRequest) + .build(); + + PresignedGetObjectRequest presignedRequest = + s3Presigner.presignGetObject(presignRequest); + return presignedRequest.url().toString(); + } catch (Exception e) { + throw new GeneralHandler(ErrorStatus.AWS_SERVICE_UNAVAILABLE); + } } // S3에 파일을 업로드할 수 있는 Presigned URL 생성 - private String generatePutPresignedUrl(String fileName) { - PutObjectRequest putObjectRequest = - PutObjectRequest.builder().bucket(bucketName).key(fileName).build(); - - PutObjectPresignRequest presignRequest = - PutObjectPresignRequest.builder() - .signatureDuration(Duration.ofMinutes(60)) - .putObjectRequest(putObjectRequest) - .build(); - - PresignedPutObjectRequest presignedRequest = s3Presigner.presignPutObject(presignRequest); - return presignedRequest.url().toString(); + public String generatePutPresignedUrl(String fileName) { + try { + PutObjectRequest putObjectRequest = + PutObjectRequest.builder().bucket(bucketName).key(fileName).build(); + + PutObjectPresignRequest presignRequest = + PutObjectPresignRequest.builder() + .signatureDuration(Duration.ofMinutes(60)) + .putObjectRequest(putObjectRequest) + .build(); + + PresignedPutObjectRequest presignedRequest = + s3Presigner.presignPutObject(presignRequest); + return presignedRequest.url().toString(); + } catch (Exception e) { + throw new GeneralHandler(ErrorStatus.AWS_SERVICE_UNAVAILABLE); + } } // music 레포지토리에 업로드