Skip to content

Commit c471a49

Browse files
authored
[FEATURE] 이미지 업로드 (프로필, 공통) (#367)
* refactor(user): 오타 수정 * feat(image): 이미지 업로드 전용 컨트롤러 추가 * feat(image): 이미지 업로드 전용 컨트롤러 추가 * Revert "test(notification): 쿼리 서비스 의존성 주입" This reverts commit 2242452. * Revert "test(notification): 알림 쿼리 서비스 세분화" This reverts commit e356b93. * Revert "test(notification): 변경 로직에 따라서 테스트 수정" This reverts commit d8c7421. * Revert "feat(notification): 복수형 정적 팩토리 메서드" This reverts commit 6dfe3fe. * Revert "feat(notification): repository 계층에서 read, unread 구분하지 않기" This reverts commit 5fe6c1f. * Revert "refactor: userId 어노테이션 수정" This reverts commit 42ce01d. * feat(user): 기본 정보 수정 목록의 이미지를 분리 * feat(presignedUrl): 사전 서명 URL 전용 레코드 추가 * refactor(auth): 패키지 이동 * feat(user): 유저 기본 정보 업데이트에서 이미지 분리 * refactor(img): 주석 삭제 * feat: 이미지 업로드 예외 오버로딩 * feat: PresignedUrl 클래스에 맞게 기존 로직 수정 * feat(img): 유저 프로필 이미지 수정을 하나의 엔드포인트로 변경 * refactor(user): 메서드 명 변경 * test(img): 로직 변경에 따른 테스트 코드 수정 * fix: 리베이스 오류 해결 * fix: 리베이스 오류 해결 * fix: 리베이스 오류 해결 * fix: 리베이스 오류 해결 * test(presignedUrl): 테스트 추가 * refactor: 리뷰 반영
1 parent 934cfd1 commit c471a49

35 files changed

+250
-287
lines changed

src/main/java/com/somemore/center/controller/CenterCommandApiController.java

Lines changed: 0 additions & 37 deletions
This file was deleted.

src/main/java/com/somemore/center/service/UpdateCenterProfileImgService.java

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/main/java/com/somemore/center/usecase/UpdateCenterProfileImgUseCase.java

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/main/java/com/somemore/domains/center/controller/CenterProfileCommandApiController.java

Lines changed: 0 additions & 45 deletions
This file was deleted.

src/main/java/com/somemore/global/auth/sign/up/SignUpService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import com.somemore.global.auth.oauth.domain.CommonOAuthInfo;
55
import com.somemore.global.auth.oauth.registrar.OAuthInfoRegistrar;
66
import com.somemore.user.domain.User;
7+
import com.somemore.user.domain.UserAuthInfo;
78
import com.somemore.user.domain.UserRole;
8-
import com.somemore.user.dto.UserAuthInfo;
99
import com.somemore.user.service.RegisterUserService;
1010
import com.somemore.volunteer.usecase.NEWRegisterVolunteerUseCase;
1111
import lombok.RequiredArgsConstructor;

src/main/java/com/somemore/global/exception/ImageUploadException.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,8 @@ public class ImageUploadException extends RuntimeException {
55
public ImageUploadException(String message) {
66
super(message);
77
}
8+
9+
public ImageUploadException(ExceptionMessage message) {
10+
super(message.getMessage());
11+
}
812
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.somemore.global.imageupload.controller;
2+
3+
import com.somemore.global.auth.annotation.UserId;
4+
import com.somemore.global.common.response.ApiResponse;
5+
import com.somemore.global.imageupload.usecase.ImageUploadUseCase;
6+
import com.somemore.user.dto.request.ImgUrlRequestDto;
7+
import io.swagger.v3.oas.annotations.Operation;
8+
import io.swagger.v3.oas.annotations.tags.Tag;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.security.access.annotation.Secured;
11+
import org.springframework.web.bind.annotation.PostMapping;
12+
import org.springframework.web.bind.annotation.RequestBody;
13+
import org.springframework.web.bind.annotation.RequestMapping;
14+
import org.springframework.web.bind.annotation.RestController;
15+
16+
import java.util.UUID;
17+
18+
@Tag(name = "Presigned URL Query API", description = "이미지 업로드 URL 조회 API")
19+
@RestController
20+
@RequiredArgsConstructor
21+
@RequestMapping("/api/image")
22+
public class GetPresignedUrlController {
23+
24+
private final ImageUploadUseCase imageUploadUseCase;
25+
26+
@Secured("ROLE_VOLUNTEER, ROLE_CENTER")
27+
@PostMapping("/upload")
28+
@Operation(summary = "이미지 업로드 URL 조회", description = "이미지 업로드 URL을 조회합니다.")
29+
public ApiResponse<String> getImageUploadUrl(
30+
@UserId UUID userId,
31+
@RequestBody ImgUrlRequestDto dto
32+
) {
33+
return ApiResponse.ok(imageUploadUseCase.getPresignedUrl(dto.fileName()).value(),
34+
"이미지 업로드 URL 발급 성공");
35+
}
36+
}

src/main/java/com/somemore/global/imageupload/service/ImageUploadService.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ public class ImageUploadService implements ImageUploadUseCase {
4242

4343

4444
@Override
45-
public String getPresignedUrl(String filename) {
46-
if(imageUploadValidator.isEmptyFileName(filename)) {
45+
public PresignedUrl getPresignedUrl(String filename) {
46+
if (imageUploadValidator.isEmptyFileName(filename)) {
4747
return null;
4848
}
4949

@@ -56,9 +56,10 @@ public String getPresignedUrl(String filename) {
5656
.key(uniqueFilename))
5757
.build();
5858

59-
return s3Presigner.presignGetObject(getObjectPresignRequest)
60-
.url()
61-
.toString();
59+
return PresignedUrl.from(
60+
s3Presigner.presignGetObject(getObjectPresignRequest)
61+
.url()
62+
.toString());
6263
}
6364

6465
@Override
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.somemore.global.imageupload.service;
2+
3+
import com.somemore.global.exception.ImageUploadException;
4+
import lombok.extern.slf4j.Slf4j;
5+
6+
import static com.somemore.global.exception.ExceptionMessage.UPLOAD_FAILED;
7+
8+
@Slf4j
9+
public record PresignedUrl(
10+
String value
11+
) {
12+
public String removeQueryString() {
13+
int queryIndex = value.indexOf('?');
14+
if (queryIndex == -1) {
15+
log.error("PresignedUrl({})에 쿼리스트링이 없어서 업로드 할 수 없습니다", value);
16+
throw new ImageUploadException(UPLOAD_FAILED);
17+
}
18+
return value.substring(0, queryIndex);
19+
}
20+
21+
public static PresignedUrl from(String url) {
22+
if (url != null && url.contains("?")) {
23+
return new PresignedUrl(url);
24+
}
25+
log.error("PresignedUrl({})이 올바르지 않은 형식입니다.", url);
26+
throw new ImageUploadException(UPLOAD_FAILED);
27+
}
28+
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.somemore.global.imageupload.usecase;
22

33
import com.somemore.global.imageupload.dto.ImageUploadRequestDto;
4+
import com.somemore.global.imageupload.service.PresignedUrl;
45

56
public interface ImageUploadUseCase {
67
String uploadImage(ImageUploadRequestDto requestDto);
7-
String getPresignedUrl(String filename);
8+
9+
PresignedUrl getPresignedUrl(String filename);
810
}

0 commit comments

Comments
 (0)