From 92c63e4be7d3ed2e6e77adf7d5ada820a8fa1105 Mon Sep 17 00:00:00 2001 From: its-sky Date: Wed, 13 Mar 2024 20:27:20 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[Refactor]=20#252=20-=20User=20profileImage?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=EB=AA=85=20imageUrl=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20Flyway=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moonshot/user/dto/response/UserInfoResponse.java | 2 +- .../java/org/moonshot/user/service/UserService.java | 6 +++--- moonshot-api/src/main/resources/application.yml | 2 +- .../src/main/resources/db/migration/V3__DDL.sql | 1 + .../src/main/java/org/moonshot/user/model/User.java | 10 +++++----- .../dto/response/google/GoogleInfoResponse.java | 6 +++--- .../openfeign/dto/response/kakao/KakaoUserProfile.java | 2 +- 7 files changed, 15 insertions(+), 14 deletions(-) create mode 100644 moonshot-api/src/main/resources/db/migration/V3__DDL.sql diff --git a/moonshot-api/src/main/java/org/moonshot/user/dto/response/UserInfoResponse.java b/moonshot-api/src/main/java/org/moonshot/user/dto/response/UserInfoResponse.java index 128cd931..f2a509e0 100644 --- a/moonshot-api/src/main/java/org/moonshot/user/dto/response/UserInfoResponse.java +++ b/moonshot-api/src/main/java/org/moonshot/user/dto/response/UserInfoResponse.java @@ -12,7 +12,7 @@ public record UserInfoResponse( public static UserInfoResponse of(User user) { return new UserInfoResponse( user.getSocialPlatform().getValue(), - user.getProfileImage(), + user.getImageUrl(), user.getNickname(), user.getDescription()); } diff --git a/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java b/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java index c0b28c98..80425b9e 100644 --- a/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java +++ b/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java @@ -92,7 +92,7 @@ public SocialLoginResponse googleLogin(final SocialLoginRequest request) { .socialId(userResponse.sub()) .socialPlatform(request.socialPlatform()) .name(userResponse.name()) - .profileImage(userResponse.picture()) + .imageUrl(userResponse.imageUrl()) .email(userResponse.email()) .build()); user = newUser; @@ -121,7 +121,7 @@ public SocialLoginResponse kakaoLogin(final SocialLoginRequest request) { .socialId(userResponse.id()) .socialPlatform(request.socialPlatform()) .name(userResponse.kakaoAccount().profile().nickname()) - .profileImage(userResponse.kakaoAccount().profile().profileImageUrl()) + .imageUrl(userResponse.kakaoAccount().profile().imageUrl()) .email(null) .build()); user = newUser; @@ -183,7 +183,7 @@ public void publishSignUpEvent(final User user) { user.getEmail() == null ? "" : user.getEmail(), user.getSocialPlatform().toString(), LocalDateTime.now(), - user.getProfileImage() + user.getImageUrl() )); } diff --git a/moonshot-api/src/main/resources/application.yml b/moonshot-api/src/main/resources/application.yml index 1ffc5891..bfcdf025 100644 --- a/moonshot-api/src/main/resources/application.yml +++ b/moonshot-api/src/main/resources/application.yml @@ -28,7 +28,7 @@ spring: flyway: baseline-on-migrate: false - baseline-version: 1 + baseline-version: 2 enabled: false google: diff --git a/moonshot-api/src/main/resources/db/migration/V3__DDL.sql b/moonshot-api/src/main/resources/db/migration/V3__DDL.sql new file mode 100644 index 00000000..ad13e30d --- /dev/null +++ b/moonshot-api/src/main/resources/db/migration/V3__DDL.sql @@ -0,0 +1 @@ +ALTER TABLE user CHANGE profile_image image_url varchar(255); \ No newline at end of file diff --git a/moonshot-domain/src/main/java/org/moonshot/user/model/User.java b/moonshot-domain/src/main/java/org/moonshot/user/model/User.java index 573eb434..1b8ece62 100644 --- a/moonshot-domain/src/main/java/org/moonshot/user/model/User.java +++ b/moonshot-domain/src/main/java/org/moonshot/user/model/User.java @@ -32,7 +32,7 @@ public class User { private String name; @Column(nullable = false) - private String profileImage; + private String imageUrl; private String email; @@ -43,24 +43,24 @@ public class User { private LocalDateTime deleteAt; @Builder - private User(String socialId, SocialPlatform socialPlatform, String name, String profileImage, String email, + private User(String socialId, SocialPlatform socialPlatform, String name, String imageUrl, String email, String nickname, String description) { this.socialId = socialId; this.socialPlatform = socialPlatform; this.name = name; - this.profileImage = profileImage; + this.imageUrl = imageUrl; this.email = email; this.nickname = nickname; this.description = description; } @Builder(builderMethodName = "builderWithSignIn") - public static User of(String socialId, SocialPlatform socialPlatform, String name, String profileImage, String email) { + public static User of(String socialId, SocialPlatform socialPlatform, String name, String imageUrl, String email) { return builder() .socialId(socialId) .socialPlatform(socialPlatform) .name(name) - .profileImage(profileImage) + .imageUrl(imageUrl) .email(email) .build(); } diff --git a/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/google/GoogleInfoResponse.java b/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/google/GoogleInfoResponse.java index 4f170d60..338df9c8 100644 --- a/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/google/GoogleInfoResponse.java +++ b/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/google/GoogleInfoResponse.java @@ -9,12 +9,12 @@ public record GoogleInfoResponse( String name, String givenName, String familyName, - String picture, + String imageUrl, String email, Boolean emailVerified, String locale ) { - public static GoogleInfoResponse of(String sub, String name, String givenName, String familyName, String picture, String email, Boolean emailVerified, String locale) { - return new GoogleInfoResponse(sub, name, givenName, familyName, picture, email, emailVerified, locale); + public static GoogleInfoResponse of(String sub, String name, String givenName, String familyName, String imageUrl, String email, Boolean emailVerified, String locale) { + return new GoogleInfoResponse(sub, name, givenName, familyName, imageUrl, email, emailVerified, locale); } } \ No newline at end of file diff --git a/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/kakao/KakaoUserProfile.java b/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/kakao/KakaoUserProfile.java index 1e8d2db1..d0050c15 100644 --- a/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/kakao/KakaoUserProfile.java +++ b/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/kakao/KakaoUserProfile.java @@ -6,6 +6,6 @@ @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) public record KakaoUserProfile( String nickname, - String profileImageUrl + String imageUrl ) { } \ No newline at end of file From 902260eefdedae80385db6b02ca64a2a9aa90da1 Mon Sep 17 00:00:00 2001 From: its-sky Date: Wed, 13 Mar 2024 20:28:23 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[Feat]=20#252=20-=20S3=20Presigned=20Url=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=93=B1=EB=A1=9D=20=EB=B0=8F=20?= =?UTF-8?q?Notification=EC=9D=84=20=ED=86=B5=ED=95=9C=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/ImageController.java | 26 ++++++------- .../user/service/ImageEventListener.java | 20 ++++++++++ .../moonshot/user/service/UserService.java | 5 +++ .../java/org/moonshot/user/model/User.java | 21 +++++++++-- moonshot-external/build.gradle | 7 +++- .../main/java/org/moonshot/s3/ImageEvent.java | 9 +++++ .../main/java/org/moonshot/s3/ImageType.java | 15 ++++++++ .../org/moonshot/s3/ImageTypeConverter.java | 19 ++++++++++ .../main/java/org/moonshot/s3/S3Service.java | 37 +++++++++++++------ .../NotifyImageSaveSuccessRequestDto.java | 6 ++- 10 files changed, 132 insertions(+), 33 deletions(-) create mode 100644 moonshot-api/src/main/java/org/moonshot/user/service/ImageEventListener.java create mode 100644 moonshot-external/src/main/java/org/moonshot/s3/ImageEvent.java create mode 100644 moonshot-external/src/main/java/org/moonshot/s3/ImageType.java create mode 100644 moonshot-external/src/main/java/org/moonshot/s3/ImageTypeConverter.java diff --git a/moonshot-api/src/main/java/org/moonshot/user/controller/ImageController.java b/moonshot-api/src/main/java/org/moonshot/user/controller/ImageController.java index 729e1b48..ae85041d 100644 --- a/moonshot-api/src/main/java/org/moonshot/user/controller/ImageController.java +++ b/moonshot-api/src/main/java/org/moonshot/user/controller/ImageController.java @@ -1,11 +1,13 @@ package org.moonshot.user.controller; import lombok.RequiredArgsConstructor; +import org.moonshot.model.Logging; import org.moonshot.response.MoonshotResponse; import org.moonshot.response.SuccessType; import org.moonshot.s3.S3Service; import org.moonshot.s3.dto.request.NotifyImageSaveSuccessRequestDto; import org.moonshot.s3.dto.response.PresignedUrlVO; +import org.moonshot.user.model.LoginUser; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -15,27 +17,23 @@ import org.springframework.web.bind.annotation.RestController; @RestController -@RequestMapping("/v1") +@RequestMapping("/v1/image") @RequiredArgsConstructor public class ImageController { private final S3Service s3Service; - //TODO - // 추후 로그인 유저를 확인하여 해당 유저에 대한 데이터로 getUploadPreSignedUrl로 username을 넘기는 로직으로 변경해야 함. - @GetMapping("/image") - public ResponseEntity> getPresignedUrl() { - return ResponseEntity.status(HttpStatus.OK).body( - MoonshotResponse.success( - SuccessType.GET_PRESIGNED_URL_SUCCESS, s3Service.getUploadPreSignedUrl("test", "SMC"))); + @GetMapping + @Logging(item = "Image", action = "Get") + public ResponseEntity> getPresignedUrl(@LoginUser Long userId) { + return ResponseEntity.status(HttpStatus.OK) + .body(MoonshotResponse.success(SuccessType.GET_PRESIGNED_URL_SUCCESS, s3Service.getUploadPreSignedUrl("test", userId))); } - //TODO - // 해당 API도 username을 @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : username") - // 등을 이용하여 Annotation화 하여 바로 username을 넘길 수 있도록 변경해야 함. - @PostMapping("/image") - public ResponseEntity> notifyImageSaveSuccess(@RequestBody final NotifyImageSaveSuccessRequestDto request) { - s3Service.notifyImageSaveSuccess(request); + @PostMapping + @Logging(item = "Image", action = "Post") + public ResponseEntity> notifyImageSaveSuccess(@LoginUser Long userId, @RequestBody final NotifyImageSaveSuccessRequestDto request) { + s3Service.notifyImageSaveSuccess(userId, request); return ResponseEntity.status(HttpStatus.CREATED).body(MoonshotResponse.success(SuccessType.POST_NOTIFY_IMAGE_SAVE_SUCCESS)); } diff --git a/moonshot-api/src/main/java/org/moonshot/user/service/ImageEventListener.java b/moonshot-api/src/main/java/org/moonshot/user/service/ImageEventListener.java new file mode 100644 index 00000000..a29bcb54 --- /dev/null +++ b/moonshot-api/src/main/java/org/moonshot/user/service/ImageEventListener.java @@ -0,0 +1,20 @@ +package org.moonshot.user.service; + +import lombok.RequiredArgsConstructor; +import org.moonshot.s3.ImageEvent; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +@RequiredArgsConstructor +public class ImageEventListener { + + private final UserService userService; + + @TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT) + public void handleImageEvent(ImageEvent imageEvent) { + userService.updateUserProfileImage(imageEvent.userId(), imageEvent.imageUrl()); + } + +} diff --git a/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java b/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java index 80425b9e..8ed1185f 100644 --- a/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java +++ b/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java @@ -176,6 +176,11 @@ public UserInfoResponse getMyProfile(final Long userId) { return UserInfoResponse.of(user); } + public void updateUserProfileImage(final Long userId, final String imageUrl) { + User user = userRepository.findById(userId).orElseThrow(() -> new NotFoundException(NOT_FOUND_USER)); + user.modifyProfileImage(imageUrl); + } + @Transactional(propagation = Propagation.REQUIRES_NEW) public void publishSignUpEvent(final User user) { eventPublisher.publishEvent(SignUpEvent.of( diff --git a/moonshot-domain/src/main/java/org/moonshot/user/model/User.java b/moonshot-domain/src/main/java/org/moonshot/user/model/User.java index 1b8ece62..f35516be 100644 --- a/moonshot-domain/src/main/java/org/moonshot/user/model/User.java +++ b/moonshot-domain/src/main/java/org/moonshot/user/model/User.java @@ -1,10 +1,18 @@ package org.moonshot.user.model; -import jakarta.persistence.*; -import lombok.*; - +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import java.time.LocalDateTime; -import java.util.List; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; @Entity @Getter @@ -69,9 +77,14 @@ public static User of(String socialId, SocialPlatform socialPlatform, String nam public void modifyDescription(String description) { this.description = description; } + public void modifyProfileImage(String imageUrl) { + this.imageUrl = imageUrl; + } + public void resetDeleteAt() { this.deleteAt = null; } + public void setDeleteAt(){ this.deleteAt = LocalDateTime.now().plusDays(USER_RETENTION_PERIOD); } diff --git a/moonshot-external/build.gradle b/moonshot-external/build.gradle index 9bec0460..a99c2d7d 100644 --- a/moonshot-external/build.gradle +++ b/moonshot-external/build.gradle @@ -8,8 +8,13 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' - // JWT + // Transaction Retry + implementation 'org.springframework.retry:spring-retry' + implementation 'org.springframework:spring-aspects' + + // JWT implementation group: "io.jsonwebtoken", name: "jjwt-api", version: "0.11.2" implementation group: "io.jsonwebtoken", name: "jjwt-impl", version: "0.11.2" implementation group: "io.jsonwebtoken", name: "jjwt-jackson", version: "0.11.2" diff --git a/moonshot-external/src/main/java/org/moonshot/s3/ImageEvent.java b/moonshot-external/src/main/java/org/moonshot/s3/ImageEvent.java new file mode 100644 index 00000000..92d77e8f --- /dev/null +++ b/moonshot-external/src/main/java/org/moonshot/s3/ImageEvent.java @@ -0,0 +1,9 @@ +package org.moonshot.s3; + +public record ImageEvent(Long userId, String imageUrl, ImageType imageType) { + + public static ImageEvent of(Long userId, String imageUrl, ImageType imageType) { + return new ImageEvent(userId, imageUrl, imageType); + } + +} diff --git a/moonshot-external/src/main/java/org/moonshot/s3/ImageType.java b/moonshot-external/src/main/java/org/moonshot/s3/ImageType.java new file mode 100644 index 00000000..3a4684dc --- /dev/null +++ b/moonshot-external/src/main/java/org/moonshot/s3/ImageType.java @@ -0,0 +1,15 @@ +package org.moonshot.s3; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public enum ImageType { + + PROFILE("프로필"); + + private final String value; + +} diff --git a/moonshot-external/src/main/java/org/moonshot/s3/ImageTypeConverter.java b/moonshot-external/src/main/java/org/moonshot/s3/ImageTypeConverter.java new file mode 100644 index 00000000..6efc1505 --- /dev/null +++ b/moonshot-external/src/main/java/org/moonshot/s3/ImageTypeConverter.java @@ -0,0 +1,19 @@ +package org.moonshot.s3; + +import org.moonshot.exception.BadRequestException; +import org.moonshot.response.ErrorType; +import org.springframework.core.convert.converter.Converter; + +public class ImageTypeConverter implements Converter { + + @Override + public ImageType convert(String source) { + for (ImageType imageType : ImageType.values()) { + if (imageType.getValue().equals(source)) { + return imageType; + } + } + throw new BadRequestException(ErrorType.INVALID_TYPE); + } + +} diff --git a/moonshot-external/src/main/java/org/moonshot/s3/S3Service.java b/moonshot-external/src/main/java/org/moonshot/s3/S3Service.java index 00147aec..6ccaea85 100644 --- a/moonshot-external/src/main/java/org/moonshot/s3/S3Service.java +++ b/moonshot-external/src/main/java/org/moonshot/s3/S3Service.java @@ -3,12 +3,16 @@ import java.text.SimpleDateFormat; import java.time.Duration; import java.util.Date; -import org.springframework.beans.factory.annotation.Value; import org.moonshot.config.AWSConfig; import org.moonshot.constants.AWSConstants; import org.moonshot.s3.dto.request.NotifyImageSaveSuccessRequestDto; import org.moonshot.s3.dto.response.PresignedUrlVO; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import software.amazon.awssdk.services.s3.presigner.S3Presigner; import software.amazon.awssdk.services.s3.presigner.model.PutObjectPresignRequest; @@ -18,16 +22,18 @@ public class S3Service { private final String bucketName; private final AWSConfig awsConfig; + private final ApplicationEventPublisher eventPublisher; private final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSSS"); public S3Service(@Value("${aws.s3-bucket-name}") final String bucketName, - AWSConfig awsConfig) { + AWSConfig awsConfig, ApplicationEventPublisher eventPublisher) { this.bucketName = bucketName; this.awsConfig = awsConfig; + this.eventPublisher = eventPublisher; } - public PresignedUrlVO getUploadPreSignedUrl(String prefix, String username) { - final String fileName = generateFileName(username); + public PresignedUrlVO getUploadPreSignedUrl(final String prefix, final Long userId) { + final String fileName = generateFileName(userId); final String key = prefix + "/" + fileName; S3Presigner preSigner = awsConfig.getS3Presigner(); @@ -47,16 +53,23 @@ public PresignedUrlVO getUploadPreSignedUrl(String prefix, String username) { return PresignedUrlVO.of(key, url); } - public void notifyImageSaveSuccess(final NotifyImageSaveSuccessRequestDto request) { - //TODO - // 추후 User 엔티티 개발 후 - // username 아이디를 가진 User 정보에 profile image를 bucketName + key로 삽입하면 됨. - // 이는 UserService로 위임하여 데이터 처리하도록 하면 됨. - // 또한 기존의 S3에 저장되어 있던 이미지를 삭제해야 함. + @Transactional + @Retryable(maxAttempts = 3, backoff = @Backoff(2000)) + public void notifyImageSaveSuccess(final Long userId, final NotifyImageSaveSuccessRequestDto request) { + String imageUrl = getImageUrl(request.fileName()); + publishImageEvent(userId, imageUrl, request.imageType()); + } + + private String generateFileName(final Long userId) { + return userId + "-" + simpleDateFormat.format(new Date()); + } + + private String getImageUrl(final String fileName) { + return "https://" + bucketName + ".s3.ap-northeast-2.amazonaws.com/" + fileName; } - private String generateFileName(String username) { - return username + "-" + simpleDateFormat.format(new Date()); + private void publishImageEvent(final Long userId, final String imageUrl, final ImageType imageType) { + eventPublisher.publishEvent(ImageEvent.of(userId, imageUrl, imageType)); } } diff --git a/moonshot-external/src/main/java/org/moonshot/s3/dto/request/NotifyImageSaveSuccessRequestDto.java b/moonshot-external/src/main/java/org/moonshot/s3/dto/request/NotifyImageSaveSuccessRequestDto.java index f7b787c1..086e0f5e 100644 --- a/moonshot-external/src/main/java/org/moonshot/s3/dto/request/NotifyImageSaveSuccessRequestDto.java +++ b/moonshot-external/src/main/java/org/moonshot/s3/dto/request/NotifyImageSaveSuccessRequestDto.java @@ -1,7 +1,9 @@ package org.moonshot.s3.dto.request; +import org.moonshot.s3.ImageType; + public record NotifyImageSaveSuccessRequestDto( - String key, - String username + String fileName, + ImageType imageType ) { } From b307540ee50c8694611ea6274cf9af744755ace8 Mon Sep 17 00:00:00 2001 From: its-sky Date: Thu, 14 Mar 2024 01:10:37 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[Fix]=20#252=20-=20Google,=20Kakao=20API=20?= =?UTF-8?q?DTO=20=EC=8A=A4=ED=8E=99=20=EB=A1=A4=EB=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../openfeign/dto/response/google/GoogleInfoResponse.java | 6 +++--- .../openfeign/dto/response/kakao/KakaoUserProfile.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/google/GoogleInfoResponse.java b/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/google/GoogleInfoResponse.java index 338df9c8..4f170d60 100644 --- a/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/google/GoogleInfoResponse.java +++ b/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/google/GoogleInfoResponse.java @@ -9,12 +9,12 @@ public record GoogleInfoResponse( String name, String givenName, String familyName, - String imageUrl, + String picture, String email, Boolean emailVerified, String locale ) { - public static GoogleInfoResponse of(String sub, String name, String givenName, String familyName, String imageUrl, String email, Boolean emailVerified, String locale) { - return new GoogleInfoResponse(sub, name, givenName, familyName, imageUrl, email, emailVerified, locale); + public static GoogleInfoResponse of(String sub, String name, String givenName, String familyName, String picture, String email, Boolean emailVerified, String locale) { + return new GoogleInfoResponse(sub, name, givenName, familyName, picture, email, emailVerified, locale); } } \ No newline at end of file diff --git a/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/kakao/KakaoUserProfile.java b/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/kakao/KakaoUserProfile.java index d0050c15..1e8d2db1 100644 --- a/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/kakao/KakaoUserProfile.java +++ b/moonshot-external/src/main/java/org/moonshot/openfeign/dto/response/kakao/KakaoUserProfile.java @@ -6,6 +6,6 @@ @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) public record KakaoUserProfile( String nickname, - String imageUrl + String profileImageUrl ) { } \ No newline at end of file From db1b9b181aa13ad65225b73d2f25915e69b3822f Mon Sep 17 00:00:00 2001 From: its-sky Date: Thu, 14 Mar 2024 01:33:20 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[Fix]=20#252=20-=20JsonCreator=20Exception?= =?UTF-8?q?=20BadRequest=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/moonshot/keyresult/model/KRState.java | 4 ++-- .../src/main/java/org/moonshot/objective/model/Category.java | 4 ++-- .../src/main/java/org/moonshot/objective/model/Criteria.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/moonshot-domain/src/main/java/org/moonshot/keyresult/model/KRState.java b/moonshot-domain/src/main/java/org/moonshot/keyresult/model/KRState.java index f8c8357b..40660797 100644 --- a/moonshot-domain/src/main/java/org/moonshot/keyresult/model/KRState.java +++ b/moonshot-domain/src/main/java/org/moonshot/keyresult/model/KRState.java @@ -5,7 +5,7 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; -import org.moonshot.exception.MoonshotException; +import org.moonshot.exception.BadRequestException; import org.moonshot.response.ErrorType; @Getter @@ -31,7 +31,7 @@ public static KRState fromValue(String value) { return krState; } } - throw new MoonshotException(ErrorType.INVALID_TYPE); + throw new BadRequestException(ErrorType.INVALID_TYPE); } } diff --git a/moonshot-domain/src/main/java/org/moonshot/objective/model/Category.java b/moonshot-domain/src/main/java/org/moonshot/objective/model/Category.java index 822ce8a5..c477a49f 100644 --- a/moonshot-domain/src/main/java/org/moonshot/objective/model/Category.java +++ b/moonshot-domain/src/main/java/org/moonshot/objective/model/Category.java @@ -5,7 +5,7 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; -import org.moonshot.exception.MoonshotException; +import org.moonshot.exception.BadRequestException; import org.moonshot.response.ErrorType; @Getter @@ -33,7 +33,7 @@ public static Category fromValue(String value) { return category; } } - throw new MoonshotException(ErrorType.INVALID_TYPE); + throw new BadRequestException(ErrorType.INVALID_TYPE); } } diff --git a/moonshot-domain/src/main/java/org/moonshot/objective/model/Criteria.java b/moonshot-domain/src/main/java/org/moonshot/objective/model/Criteria.java index ac2d7740..6c04e1d3 100644 --- a/moonshot-domain/src/main/java/org/moonshot/objective/model/Criteria.java +++ b/moonshot-domain/src/main/java/org/moonshot/objective/model/Criteria.java @@ -5,7 +5,7 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; -import org.moonshot.exception.MoonshotException; +import org.moonshot.exception.BadRequestException; import org.moonshot.response.ErrorType; @Getter @@ -30,7 +30,7 @@ public static Criteria fromValue(String value) { return criteria; } } - throw new MoonshotException(ErrorType.INVALID_TYPE); + throw new BadRequestException(ErrorType.INVALID_TYPE); } } From 10e91465a56c092ef561cc3b3238bf3b46094e82 Mon Sep 17 00:00:00 2001 From: its-sky Date: Thu, 14 Mar 2024 01:34:35 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[Fix]=20#252=20-=20Presigned=20Url=20?= =?UTF-8?q?=ED=9A=8D=EB=93=9D=20=EC=8B=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20body=EC=97=90=20=EB=B0=9B=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/ImageController.java | 5 +++-- .../main/java/org/moonshot/s3/ImageType.java | 13 +++++++++++++ .../org/moonshot/s3/ImageTypeConverter.java | 19 ------------------- .../main/java/org/moonshot/s3/S3Service.java | 5 +++-- .../request/GetPresignedUrlRequestDto.java | 6 ++++++ 5 files changed, 25 insertions(+), 23 deletions(-) delete mode 100644 moonshot-external/src/main/java/org/moonshot/s3/ImageTypeConverter.java create mode 100644 moonshot-external/src/main/java/org/moonshot/s3/dto/request/GetPresignedUrlRequestDto.java diff --git a/moonshot-api/src/main/java/org/moonshot/user/controller/ImageController.java b/moonshot-api/src/main/java/org/moonshot/user/controller/ImageController.java index ae85041d..b672966e 100644 --- a/moonshot-api/src/main/java/org/moonshot/user/controller/ImageController.java +++ b/moonshot-api/src/main/java/org/moonshot/user/controller/ImageController.java @@ -5,6 +5,7 @@ import org.moonshot.response.MoonshotResponse; import org.moonshot.response.SuccessType; import org.moonshot.s3.S3Service; +import org.moonshot.s3.dto.request.GetPresignedUrlRequestDto; import org.moonshot.s3.dto.request.NotifyImageSaveSuccessRequestDto; import org.moonshot.s3.dto.response.PresignedUrlVO; import org.moonshot.user.model.LoginUser; @@ -25,9 +26,9 @@ public class ImageController { @GetMapping @Logging(item = "Image", action = "Get") - public ResponseEntity> getPresignedUrl(@LoginUser Long userId) { + public ResponseEntity> getPresignedUrl(@LoginUser Long userId, @RequestBody GetPresignedUrlRequestDto request) { return ResponseEntity.status(HttpStatus.OK) - .body(MoonshotResponse.success(SuccessType.GET_PRESIGNED_URL_SUCCESS, s3Service.getUploadPreSignedUrl("test", userId))); + .body(MoonshotResponse.success(SuccessType.GET_PRESIGNED_URL_SUCCESS, s3Service.getUploadPreSignedUrl(request, userId))); } @PostMapping diff --git a/moonshot-external/src/main/java/org/moonshot/s3/ImageType.java b/moonshot-external/src/main/java/org/moonshot/s3/ImageType.java index 3a4684dc..62dcfa04 100644 --- a/moonshot-external/src/main/java/org/moonshot/s3/ImageType.java +++ b/moonshot-external/src/main/java/org/moonshot/s3/ImageType.java @@ -1,8 +1,11 @@ package org.moonshot.s3; +import com.fasterxml.jackson.annotation.JsonCreator; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; +import org.moonshot.exception.BadRequestException; +import org.moonshot.response.ErrorType; @Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) @@ -12,4 +15,14 @@ public enum ImageType { private final String value; + @JsonCreator + public static ImageType fromValue(String value) { + for (ImageType imageType : ImageType.values()) { + if (imageType.getValue().equals(value)) { + return imageType; + } + } + throw new BadRequestException(ErrorType.INVALID_TYPE); + } + } diff --git a/moonshot-external/src/main/java/org/moonshot/s3/ImageTypeConverter.java b/moonshot-external/src/main/java/org/moonshot/s3/ImageTypeConverter.java deleted file mode 100644 index 6efc1505..00000000 --- a/moonshot-external/src/main/java/org/moonshot/s3/ImageTypeConverter.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.moonshot.s3; - -import org.moonshot.exception.BadRequestException; -import org.moonshot.response.ErrorType; -import org.springframework.core.convert.converter.Converter; - -public class ImageTypeConverter implements Converter { - - @Override - public ImageType convert(String source) { - for (ImageType imageType : ImageType.values()) { - if (imageType.getValue().equals(source)) { - return imageType; - } - } - throw new BadRequestException(ErrorType.INVALID_TYPE); - } - -} diff --git a/moonshot-external/src/main/java/org/moonshot/s3/S3Service.java b/moonshot-external/src/main/java/org/moonshot/s3/S3Service.java index 6ccaea85..13a5a5c4 100644 --- a/moonshot-external/src/main/java/org/moonshot/s3/S3Service.java +++ b/moonshot-external/src/main/java/org/moonshot/s3/S3Service.java @@ -5,6 +5,7 @@ import java.util.Date; import org.moonshot.config.AWSConfig; import org.moonshot.constants.AWSConstants; +import org.moonshot.s3.dto.request.GetPresignedUrlRequestDto; import org.moonshot.s3.dto.request.NotifyImageSaveSuccessRequestDto; import org.moonshot.s3.dto.response.PresignedUrlVO; import org.springframework.beans.factory.annotation.Value; @@ -32,9 +33,9 @@ public S3Service(@Value("${aws.s3-bucket-name}") final String bucketName, this.eventPublisher = eventPublisher; } - public PresignedUrlVO getUploadPreSignedUrl(final String prefix, final Long userId) { + public PresignedUrlVO getUploadPreSignedUrl(final GetPresignedUrlRequestDto request, final Long userId) { final String fileName = generateFileName(userId); - final String key = prefix + "/" + fileName; + final String key = request.imageType().toString() + "/" + fileName; S3Presigner preSigner = awsConfig.getS3Presigner(); diff --git a/moonshot-external/src/main/java/org/moonshot/s3/dto/request/GetPresignedUrlRequestDto.java b/moonshot-external/src/main/java/org/moonshot/s3/dto/request/GetPresignedUrlRequestDto.java new file mode 100644 index 00000000..b426ef32 --- /dev/null +++ b/moonshot-external/src/main/java/org/moonshot/s3/dto/request/GetPresignedUrlRequestDto.java @@ -0,0 +1,6 @@ +package org.moonshot.s3.dto.request; + +import org.moonshot.s3.ImageType; + +public record GetPresignedUrlRequestDto(ImageType imageType) { +} From fc841a5e18432dc689ca071906dbf1e629c3e38a Mon Sep 17 00:00:00 2001 From: its-sky Date: Thu, 14 Mar 2024 01:35:01 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[Fix]=20#252=20-=20Google,=20Kakao=20API=20?= =?UTF-8?q?DTO=20=EC=8A=A4=ED=8E=99=20=EB=A1=A4=EB=B0=B1=20=ED=9B=84=20Use?= =?UTF-8?q?rService=20=EC=BA=90=EC=8A=A4=ED=8C=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/moonshot/user/service/UserService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java b/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java index 8ed1185f..6aa18eda 100644 --- a/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java +++ b/moonshot-api/src/main/java/org/moonshot/user/service/UserService.java @@ -92,7 +92,7 @@ public SocialLoginResponse googleLogin(final SocialLoginRequest request) { .socialId(userResponse.sub()) .socialPlatform(request.socialPlatform()) .name(userResponse.name()) - .imageUrl(userResponse.imageUrl()) + .imageUrl(userResponse.picture()) .email(userResponse.email()) .build()); user = newUser; @@ -121,7 +121,7 @@ public SocialLoginResponse kakaoLogin(final SocialLoginRequest request) { .socialId(userResponse.id()) .socialPlatform(request.socialPlatform()) .name(userResponse.kakaoAccount().profile().nickname()) - .imageUrl(userResponse.kakaoAccount().profile().imageUrl()) + .imageUrl(userResponse.kakaoAccount().profile().profileImageUrl()) .email(null) .build()); user = newUser;