Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/main/java/com/petlog/docs/S3ControllerDocs.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.petlog.docs;

import com.petlog.auth.resolver.Authenticated;
import com.petlog.common.response.ApiResponse;
import com.petlog.s3.controller.dto.request.S3PresignedUrlsRequestDto;
import com.petlog.s3.controller.dto.response.S3PresignedUrlsResponseDto;
Expand All @@ -13,5 +14,5 @@ public interface S3ControllerDocs {

@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "201", description = "S3 presigned URL 생성에 성공하였습니다.")
@Operation(summary = "S3 Presigned URL 발급 API")
ResponseEntity<ApiResponse<S3PresignedUrlsResponseDto>> issueS3PresignedUrls(@RequestBody S3PresignedUrlsRequestDto request);
ResponseEntity<ApiResponse<S3PresignedUrlsResponseDto>> issueS3PresignedUrls(@Authenticated final Long memberId, @RequestBody final S3PresignedUrlsRequestDto request);
}
6 changes: 4 additions & 2 deletions src/main/java/com/petlog/s3/controller/S3Controller.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.petlog.s3.controller;

import com.petlog.auth.resolver.Authenticated;
import com.petlog.common.response.ApiResponse;
import com.petlog.docs.S3ControllerDocs;
import com.petlog.s3.controller.dto.request.S3PresignedUrlsRequestDto;
Expand All @@ -24,9 +25,10 @@ public class S3Controller implements S3ControllerDocs {

@PostMapping("/presigned-urls")
public ResponseEntity<ApiResponse<S3PresignedUrlsResponseDto>> issueS3PresignedUrls(
@RequestBody S3PresignedUrlsRequestDto request
@Authenticated final Long memberId,
@RequestBody final S3PresignedUrlsRequestDto request
) {
final GeneratedS3PresignedUrlDto generatedS3PresignedUrl = s3Service.generateS3PresignedUrl(request.diaryId(), request.fileNames());
final GeneratedS3PresignedUrlDto generatedS3PresignedUrl = s3Service.generateS3PresignedUrl(memberId, request.fileType(), request.fileNames());
final S3PresignedUrlsResponseDto response = S3PresignedUrlsResponseDto.from(generatedS3PresignedUrl);

return ResponseEntity.ok(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.petlog.s3.controller.dto.request;

import com.petlog.s3.service.FileType;

import java.util.List;

public record S3PresignedUrlsRequestDto(

Long diaryId,
FileType fileType,
List<String> fileNames

) {
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/com/petlog/s3/service/FileType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.petlog.s3.service;

public enum FileType {

PROFILE_IMAGE,
DIARY_IMAGE,
;

}
24 changes: 16 additions & 8 deletions src/main/java/com/petlog/s3/service/S3Service.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.petlog.s3.service;

import com.petlog.member.entity.Member;
import com.petlog.member.repository.MemberRepository;
import com.petlog.s3.generator.PresignedUrlGenerator;
import com.petlog.s3.service.dto.GeneratedS3PresignedUrlDto;
import com.petlog.s3.service.dto.S3PresignedUrlItem;
Expand All @@ -13,22 +15,28 @@
@Service
public class S3Service {

private static final String DIARY_IMAGE_ROOT_DIRECTORY = "diary_image";

private final PresignedUrlGenerator presignedUrlGenerator;
private final MemberRepository memberRepository;

public GeneratedS3PresignedUrlDto generateS3PresignedUrl(final Long memberId, final FileType fileType, final List<String> fileNames) {
getMember(memberId);

public GeneratedS3PresignedUrlDto generateS3PresignedUrl(final Long diaryId, final List<String> fileNames) {
final List<String> keys = keys(diaryId, fileNames);
final List<String> keys = keys(memberId, fileType, fileNames);
final List<S3PresignedUrlItem> items = presignedUrlGenerator.generate(keys);

return new GeneratedS3PresignedUrlDto(items);
}

private List<String> keys(final Long diaryId, final List<String> fileNames) {
private Member getMember(final Long memberId) {
return memberRepository.findById(memberId)
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 회원입니다."));
}

private List<String> keys(final Long memberId, final FileType fileType, final List<String> fileNames) {
return fileNames.stream()
.map(fileName -> "%s/%d/%s/%s".formatted(
DIARY_IMAGE_ROOT_DIRECTORY,
diaryId,
.map(fileName -> "%d/%s/%s/%s".formatted(
memberId,
fileType,
UUID.randomUUID(),
fileName
))
Expand Down
Loading