From 61e9f7c004dba996befd9d7dc5aabff226abc7d7 Mon Sep 17 00:00:00 2001 From: Gyoungmin Kim Date: Sat, 20 Jul 2024 17:06:05 +0900 Subject: [PATCH 01/22] feat : add getMyFourCutFiles base codes (#43) * feat : add MY_FOUR_CUT in BrandType enum --- .../src/main/java/kr/mafoo/photo/domain/BrandType.java | 1 + .../src/main/java/kr/mafoo/photo/service/QrService.java | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java b/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java index 141e04e..d78c789 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java +++ b/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java @@ -7,6 +7,7 @@ public enum BrandType { PHOTOISM(Pattern.compile("https://qr\\.seobuk\\.kr/.*")), HARU_FILM(Pattern.compile("http://haru\\d+\\.mx\\d+\\.co\\.kr/.*")), DONT_LOOK_UP(Pattern.compile("https://x\\.dontlxxkup\\.kr/.*")), + MY_FOUR_CUT(Pattern.compile("https://firebasestorage\\.googleapis\\.com:443/v0/b/my4ccu\\.appspot\\.com/.*")), ; private final Pattern urlPattern; diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java index 5140f51..30baaae 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java @@ -33,6 +33,7 @@ public Mono getFileFromQrUrl(String qrUrl) { case PHOTOISM -> createFileDto(brandType, getPhotoismFiles(qrUrl)); case HARU_FILM -> createFileDto(brandType, getHaruFilmFiles(qrUrl)); case DONT_LOOK_UP -> createFileDto(brandType, getDontLookUpFiles(qrUrl)); + case MY_FOUR_CUT -> createFileDto(brandType, getMyFourCutFiles(qrUrl)); }; } @@ -118,6 +119,10 @@ private Mono getDontLookUpFiles(String qrUrl) { ); } + private Mono getMyFourCutFiles(String qrUrl) { + return getFileAsByte(qrUrl); + } + private Mono getRedirectUri(String url) { return externalWebClient .get() From 6883c7109ab9c40e39727dac9ac3b54a9178c0fc Mon Sep 17 00:00:00 2001 From: ChuYong Date: Sat, 20 Jul 2024 19:36:37 +0900 Subject: [PATCH 02/22] feat: update uribuilderfactory --- .../src/main/java/kr/mafoo/photo/config/WebFluxConfig.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/photo-service/src/main/java/kr/mafoo/photo/config/WebFluxConfig.java b/photo-service/src/main/java/kr/mafoo/photo/config/WebFluxConfig.java index fd49fbe..1be8590 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/config/WebFluxConfig.java +++ b/photo-service/src/main/java/kr/mafoo/photo/config/WebFluxConfig.java @@ -6,6 +6,7 @@ import org.springframework.web.reactive.config.WebFluxConfigurer; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.result.method.annotation.ArgumentResolverConfigurer; +import org.springframework.web.util.DefaultUriBuilderFactory; @EnableWebFlux @Configuration @@ -17,7 +18,10 @@ public void configureArgumentResolvers(ArgumentResolverConfigurer configurer) { @Bean("externalWebClient") public WebClient externalServiceWebClient() { + DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(); + factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.NONE); return WebClient.builder() + .uriBuilderFactory(factory) .codecs(clientCodecConfigurer -> { clientCodecConfigurer .defaultCodecs() From c7eac81aab7b5165c66d2a3d66e59dc66072a500 Mon Sep 17 00:00:00 2001 From: ChuYong Date: Mon, 22 Jul 2024 10:47:04 +0900 Subject: [PATCH 03/22] feat: add filter predicate for v1/photos --- api-gateway/src/main/resources/application.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/api-gateway/src/main/resources/application.yaml b/api-gateway/src/main/resources/application.yaml index e3ee983..b095877 100644 --- a/api-gateway/src/main/resources/application.yaml +++ b/api-gateway/src/main/resources/application.yaml @@ -39,6 +39,13 @@ spring: filters: - JWTAuthenticationFilter - RewritePath=/user/(?/?.*), /$\{segment} + - id: photo-service-add-photo + uri: http://photo-service + predicates: + - Path=/photo/v1/photos + - Method=POST + filters: + - RewritePath=/photo/(?/?.*), /$\{segment} - id: photo-service uri: http://photo-service predicates: From ec8e601c78d210a2df5ebd7d513171890e91b858 Mon Sep 17 00:00:00 2001 From: ChuYong Date: Mon, 22 Jul 2024 10:48:02 +0900 Subject: [PATCH 04/22] chore: disable zipkin for default --- api-gateway/src/main/resources/application.yaml | 1 + photo-service/src/main/resources/application.yaml | 1 + user-service/src/main/resources/application.yaml | 1 + 3 files changed, 3 insertions(+) diff --git a/api-gateway/src/main/resources/application.yaml b/api-gateway/src/main/resources/application.yaml index b095877..3eb0c25 100644 --- a/api-gateway/src/main/resources/application.yaml +++ b/api-gateway/src/main/resources/application.yaml @@ -71,6 +71,7 @@ management: tracing: sampling: probability: 1.0 + enabled: false zipkin: tracing: endpoint: http://zipkin/api/v2/spans diff --git a/photo-service/src/main/resources/application.yaml b/photo-service/src/main/resources/application.yaml index dc14e9c..6845a49 100644 --- a/photo-service/src/main/resources/application.yaml +++ b/photo-service/src/main/resources/application.yaml @@ -37,6 +37,7 @@ management: tracing: sampling: probability: 1.0 + enabled: false zipkin: tracing: endpoint: http://zipkin/api/v2/spans diff --git a/user-service/src/main/resources/application.yaml b/user-service/src/main/resources/application.yaml index c627c58..951efb5 100644 --- a/user-service/src/main/resources/application.yaml +++ b/user-service/src/main/resources/application.yaml @@ -39,6 +39,7 @@ management: tracing: sampling: probability: 1.0 + enabled: false zipkin: tracing: endpoint: http://zipkin/api/v2/spans From 66c81e0a7ac3d5c39d8268cb76cc01d28031ac79 Mon Sep 17 00:00:00 2001 From: ChuYong Date: Mon, 22 Jul 2024 10:49:24 +0900 Subject: [PATCH 05/22] chore: add production application.yaml --- api-gateway/src/main/resources/application-prod.yaml | 3 +++ photo-service/src/main/resources/application-prod.yaml | 3 +++ user-service/src/main/resources/application-prod.yaml | 3 +++ 3 files changed, 9 insertions(+) create mode 100644 api-gateway/src/main/resources/application-prod.yaml create mode 100644 photo-service/src/main/resources/application-prod.yaml create mode 100644 user-service/src/main/resources/application-prod.yaml diff --git a/api-gateway/src/main/resources/application-prod.yaml b/api-gateway/src/main/resources/application-prod.yaml new file mode 100644 index 0000000..fe046db --- /dev/null +++ b/api-gateway/src/main/resources/application-prod.yaml @@ -0,0 +1,3 @@ +management: + tracing: + enabled: true diff --git a/photo-service/src/main/resources/application-prod.yaml b/photo-service/src/main/resources/application-prod.yaml new file mode 100644 index 0000000..fe046db --- /dev/null +++ b/photo-service/src/main/resources/application-prod.yaml @@ -0,0 +1,3 @@ +management: + tracing: + enabled: true diff --git a/user-service/src/main/resources/application-prod.yaml b/user-service/src/main/resources/application-prod.yaml new file mode 100644 index 0000000..fe046db --- /dev/null +++ b/user-service/src/main/resources/application-prod.yaml @@ -0,0 +1,3 @@ +management: + tracing: + enabled: true From 5a14063bff9682cca1ab469afa23884c297a8c4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=98=81=EB=AF=BC?= Date: Wed, 24 Jul 2024 14:04:14 +0900 Subject: [PATCH 06/22] feat: change kakao auth code to access token --- .../main/java/kr/mafoo/user/controller/AuthController.java | 2 +- .../mafoo/user/controller/dto/request/KakaoLoginRequest.java | 4 ++-- .../src/main/java/kr/mafoo/user/service/AuthService.java | 5 ++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/user-service/src/main/java/kr/mafoo/user/controller/AuthController.java b/user-service/src/main/java/kr/mafoo/user/controller/AuthController.java index b274df3..3c144a7 100644 --- a/user-service/src/main/java/kr/mafoo/user/controller/AuthController.java +++ b/user-service/src/main/java/kr/mafoo/user/controller/AuthController.java @@ -18,7 +18,7 @@ public class AuthController implements AuthApi { @Override public Mono loginWithKakao(KakaoLoginRequest request) { return authService - .loginWithKakao(request.code()) + .loginWithKakao(request.accessToken()) .map(authToken -> new LoginResponse(authToken.accessToken(), authToken.refreshToken())); } diff --git a/user-service/src/main/java/kr/mafoo/user/controller/dto/request/KakaoLoginRequest.java b/user-service/src/main/java/kr/mafoo/user/controller/dto/request/KakaoLoginRequest.java index e03d20b..bbed68d 100644 --- a/user-service/src/main/java/kr/mafoo/user/controller/dto/request/KakaoLoginRequest.java +++ b/user-service/src/main/java/kr/mafoo/user/controller/dto/request/KakaoLoginRequest.java @@ -4,7 +4,7 @@ @Schema(description = "카카오 로그인 요청") public record KakaoLoginRequest( - @Schema(description = "인가 코드", example = "test") - String code + @Schema(description = "카카오 엑세스 토큰", example = "test") + String accessToken ) { } diff --git a/user-service/src/main/java/kr/mafoo/user/service/AuthService.java b/user-service/src/main/java/kr/mafoo/user/service/AuthService.java index 4ace3f6..4efa510 100644 --- a/user-service/src/main/java/kr/mafoo/user/service/AuthService.java +++ b/user-service/src/main/java/kr/mafoo/user/service/AuthService.java @@ -41,9 +41,8 @@ public class AuthService { private final ObjectMapper objectMapper; - public Mono loginWithKakao(String code) { - return getKakaoTokenWithCode(code) - .flatMap(this::getUserInfoWithKakaoToken) + public Mono loginWithKakao(String kakaoAccessToken) { + return getUserInfoWithKakaoToken(kakaoAccessToken) .flatMap(kakaoLoginInfo -> getOrCreateMember( IdentityProvider.KAKAO, kakaoLoginInfo.id(), From 820fd84452557aedc9e7235b95e47e809773eecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=98=81=EB=AF=BC?= Date: Wed, 24 Jul 2024 14:32:10 +0900 Subject: [PATCH 07/22] feat: add transactional to member --- .../src/main/java/kr/mafoo/user/service/AuthService.java | 4 ++++ .../src/main/java/kr/mafoo/user/service/MemberService.java | 2 ++ 2 files changed, 6 insertions(+) diff --git a/user-service/src/main/java/kr/mafoo/user/service/AuthService.java b/user-service/src/main/java/kr/mafoo/user/service/AuthService.java index 4ace3f6..9a2ce2f 100644 --- a/user-service/src/main/java/kr/mafoo/user/service/AuthService.java +++ b/user-service/src/main/java/kr/mafoo/user/service/AuthService.java @@ -20,6 +20,7 @@ import kr.mafoo.user.util.NicknameGenerator; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @@ -41,6 +42,7 @@ public class AuthService { private final ObjectMapper objectMapper; + @Transactional public Mono loginWithKakao(String code) { return getKakaoTokenWithCode(code) .flatMap(this::getUserInfoWithKakaoToken) @@ -52,6 +54,7 @@ public Mono loginWithKakao(String code) { )); } + @Transactional public Mono loginWithApple(String identityToken) { return getApplePublicKeys() .flatMap(keyObj -> getUserInfoWithAppleAccessToken(keyObj.keys(), identityToken)) @@ -63,6 +66,7 @@ public Mono loginWithApple(String identityToken) { )); } + @Transactional public Mono loginWithRefreshToken(String refreshToken){ return Mono .fromCallable(() -> jwtTokenService.extractUserIdFromRefreshToken(refreshToken)) diff --git a/user-service/src/main/java/kr/mafoo/user/service/MemberService.java b/user-service/src/main/java/kr/mafoo/user/service/MemberService.java index 9db3bd7..c157994 100644 --- a/user-service/src/main/java/kr/mafoo/user/service/MemberService.java +++ b/user-service/src/main/java/kr/mafoo/user/service/MemberService.java @@ -6,6 +6,7 @@ import kr.mafoo.user.util.IdGenerator; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import reactor.core.publisher.Mono; @RequiredArgsConstructor @@ -23,6 +24,7 @@ public Mono getMemberByMemberId(String memberId) { .switchIfEmpty(Mono.error(new MemberNotFoundException())); } + @Transactional public Mono createNewMember(String username, String profileImageUrl) { MemberEntity memberEntity = MemberEntity.newMember(IdGenerator.generate(), username, profileImageUrl); return memberRepository.save(memberEntity); From af85ae593d86c6be1d26a608620e7dce180d99a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=98=81=EB=AF=BC?= Date: Wed, 24 Jul 2024 14:32:59 +0900 Subject: [PATCH 08/22] feat: add transactional to photo --- .../src/main/java/kr/mafoo/photo/service/AlbumService.java | 7 +++++++ .../src/main/java/kr/mafoo/photo/service/PhotoService.java | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/AlbumService.java b/photo-service/src/main/java/kr/mafoo/photo/service/AlbumService.java index a681ab1..87fb4cc 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/AlbumService.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/AlbumService.java @@ -7,6 +7,7 @@ import kr.mafoo.photo.util.IdGenerator; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -15,6 +16,7 @@ public class AlbumService { private final AlbumRepository albumRepository; + @Transactional public Mono createNewAlbum(String ownerMemberId, String albumName, AlbumType albumType) { AlbumEntity albumEntity = AlbumEntity.newAlbum(IdGenerator.generate(), albumName, albumType, ownerMemberId); return albumRepository.save(albumEntity); @@ -38,6 +40,7 @@ public Mono findByAlbumId(String albumId, String requestMemberId) { }); } + @Transactional public Mono deleteAlbumById(String albumId, String requestMemberId) { return albumRepository .findById(albumId) @@ -52,6 +55,7 @@ public Mono deleteAlbumById(String albumId, String requestMemberId) { }); } + @Transactional public Mono updateAlbumName(String albumId, String albumName, String requestMemberId) { return albumRepository .findById(albumId) @@ -66,6 +70,7 @@ public Mono updateAlbumName(String albumId, String albumName, Strin }); } + @Transactional public Mono updateAlbumType(String albumId, AlbumType albumType, String requestMemberId) { return albumRepository .findById(albumId) @@ -80,6 +85,7 @@ public Mono updateAlbumType(String albumId, AlbumType albumType, St }); } + @Transactional public Mono increaseAlbumPhotoCount(String albumId, String requestMemberId) { return albumRepository .findById(albumId) @@ -94,6 +100,7 @@ public Mono increaseAlbumPhotoCount(String albumId, String requestMemberId }); } + @Transactional public Mono decreaseAlbumPhotoCount(String albumId, String requestMemberId) { if (albumId == null) { diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java b/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java index 39fcdb0..efb2c5a 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java @@ -8,6 +8,7 @@ import kr.mafoo.photo.util.IdGenerator; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -21,6 +22,7 @@ public class PhotoService { private final QrService qrService; private final ObjectStorageService objectStorageService; + @Transactional public Mono createNewPhoto(String qrUrl, String requestMemberId) { return qrService .getFileFromQrUrl(qrUrl) @@ -46,6 +48,7 @@ public Flux findAllByAlbumId(String albumId, String requestMemberId }); } + @Transactional public Mono deletePhotoById(String photoId, String requestMemberId) { return photoRepository .findById(photoId) @@ -61,6 +64,7 @@ public Mono deletePhotoById(String photoId, String requestMemberId) { }); } + @Transactional public Mono updatePhotoAlbumId(String photoId, String albumId, String requestMemberId) { return photoRepository .findById(photoId) From d575dae98a183104cb30b206c554836d23eba82d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=98=81=EB=AF=BC?= Date: Wed, 24 Jul 2024 14:41:46 +0900 Subject: [PATCH 09/22] feat: add photogray brand --- photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java b/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java index d78c789..d441945 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java +++ b/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java @@ -8,6 +8,7 @@ public enum BrandType { HARU_FILM(Pattern.compile("http://haru\\d+\\.mx\\d+\\.co\\.kr/.*")), DONT_LOOK_UP(Pattern.compile("https://x\\.dontlxxkup\\.kr/.*")), MY_FOUR_CUT(Pattern.compile("https://firebasestorage\\.googleapis\\.com:443/v0/b/my4ccu\\.appspot\\.com/.*")), + PHOTOGRAY(Pattern.compile("https://pgshort\\.aprd\\.io/.*")), ; private final Pattern urlPattern; From d0612f2f899063697d78365a3ebb68ce37601c35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=98=81=EB=AF=BC?= Date: Wed, 24 Jul 2024 15:07:41 +0900 Subject: [PATCH 10/22] feat: implement photogray brand --- .../kr/mafoo/photo/service/QrService.java | 18 ++++--- .../service/vendors/PhotoGrayQrVendor.java | 48 +++++++++++++++++++ .../mafoo/photo/service/vendors/QrVendor.java | 7 +++ .../kr/mafoo/photo/util/WebClientUtil.java | 35 ++++++++++++++ 4 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoGrayQrVendor.java create mode 100644 photo-service/src/main/java/kr/mafoo/photo/service/vendors/QrVendor.java create mode 100644 photo-service/src/main/java/kr/mafoo/photo/util/WebClientUtil.java diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java index 30baaae..16721f0 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java @@ -5,6 +5,7 @@ import kr.mafoo.photo.exception.PhotoQrUrlExpiredException; import kr.mafoo.photo.exception.RedirectUriNotFoundException; import kr.mafoo.photo.service.dto.FileDto; +import kr.mafoo.photo.service.vendors.PhotoGrayQrVendor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; @@ -24,17 +25,22 @@ public class QrService { private final WebClient externalWebClient; + private final PhotoGrayQrVendor photoGrayQrVendor; + public Mono getFileFromQrUrl(String qrUrl) { BrandType brandType = Optional.ofNullable(BrandType.matchBrandType(qrUrl)) .orElseThrow(PhotoBrandNotExistsException::new); - return switch (brandType) { - case LIFE_FOUR_CUTS -> createFileDto(brandType, getLifeFourCutsFiles(qrUrl)); - case PHOTOISM -> createFileDto(brandType, getPhotoismFiles(qrUrl)); - case HARU_FILM -> createFileDto(brandType, getHaruFilmFiles(qrUrl)); - case DONT_LOOK_UP -> createFileDto(brandType, getDontLookUpFiles(qrUrl)); - case MY_FOUR_CUT -> createFileDto(brandType, getMyFourCutFiles(qrUrl)); + Mono imagePublisher = switch (brandType) { + case LIFE_FOUR_CUTS -> getLifeFourCutsFiles(qrUrl); + case PHOTOISM -> getPhotoismFiles(qrUrl); + case HARU_FILM -> getHaruFilmFiles(qrUrl); + case DONT_LOOK_UP -> getDontLookUpFiles(qrUrl); + case MY_FOUR_CUT -> getMyFourCutFiles(qrUrl); + case PHOTOGRAY -> photoGrayQrVendor.extractImageFromQrUrl(qrUrl); }; + + return createFileDto(brandType, imagePublisher); } private Mono createFileDto(BrandType brandType, Mono fileMono) { diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoGrayQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoGrayQrVendor.java new file mode 100644 index 0000000..a2fbb67 --- /dev/null +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoGrayQrVendor.java @@ -0,0 +1,48 @@ +package kr.mafoo.photo.service.vendors; + +import kr.mafoo.photo.util.WebClientUtil; +import lombok.RequiredArgsConstructor; +import org.apache.http.client.utils.URLEncodedUtils; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.UriComponentsBuilder; +import reactor.core.publisher.Mono; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +@RequiredArgsConstructor +@Component +public class PhotoGrayQrVendor implements QrVendor { + private final WebClient webClient; + + @Override + public Mono extractImageFromQrUrl(String qrUrl) { + return WebClientUtil // https://pgshort.aprd.io/{qr} + .getRedirectUri(webClient, qrUrl) //https://photogray-download.aprd.io?id={base64} + .flatMap((currentUrl) -> { + String encodedStr = extractIdFromUrl(currentUrl); + String decodedStr = new String(Base64.getDecoder().decode(encodedStr)); + String sessionId = extractSessionIdFromQueryString(decodedStr); + String imageUrl = String.format("https://pg-qr-resource.aprd.io/%s/image.jpg", sessionId); + return WebClientUtil.getBlob(webClient, imageUrl); + }); //https://pg-qr-resource.aprd.io/{sessionId}/image.jpg + } + + private String extractIdFromUrl(String url) { + return UriComponentsBuilder + .fromUriString(url) + .build() + .getQueryParams() + .getFirst("id"); + } + + private String extractSessionIdFromQueryString(String queryString) { + return URLEncodedUtils.parse(queryString, StandardCharsets.UTF_8) + .stream() + .filter(e -> e.getName().equals("sessionId")) + .findFirst() + .orElseThrow() + .getValue(); + } +} diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/QrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/QrVendor.java new file mode 100644 index 0000000..451bc14 --- /dev/null +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/QrVendor.java @@ -0,0 +1,7 @@ +package kr.mafoo.photo.service.vendors; + +import reactor.core.publisher.Mono; + +public interface QrVendor { + Mono extractImageFromQrUrl(String qrUrl); +} diff --git a/photo-service/src/main/java/kr/mafoo/photo/util/WebClientUtil.java b/photo-service/src/main/java/kr/mafoo/photo/util/WebClientUtil.java new file mode 100644 index 0000000..69ed12b --- /dev/null +++ b/photo-service/src/main/java/kr/mafoo/photo/util/WebClientUtil.java @@ -0,0 +1,35 @@ +package kr.mafoo.photo.util; + +import kr.mafoo.photo.exception.RedirectUriNotFoundException; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.net.URI; + +public class WebClientUtil { + public static Mono getRedirectUri(WebClient client, String url) { + return client + .get() + .uri(url) + .retrieve() + .toBodilessEntity() + .flatMap(response -> { + URI redirectUri = response.getHeaders().getLocation(); + if (redirectUri == null) { + return Mono.error(new RedirectUriNotFoundException()); + } else { + return Mono.just(redirectUri.toString()); + } + }); + } + + public static Mono getBlob(WebClient client, String url) { + return client + .get() + .uri(url) + .accept(MediaType.APPLICATION_OCTET_STREAM) + .retrieve() + .bodyToMono(byte[].class); + } +} From 8df0aee8b3dc0ea4c031ebf149e9a548909b47f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=98=81=EB=AF=BC?= Date: Wed, 24 Jul 2024 15:17:12 +0900 Subject: [PATCH 11/22] refactor: move vendor logics to seperate classes --- .../kr/mafoo/photo/service/QrService.java | 147 ++---------------- .../service/vendors/DontLookUpQrVendor.java | 39 +++++ .../service/vendors/HaruFilmQrVendor.java | 29 ++++ .../service/vendors/LifeFourCutsQrVendor.java | 28 ++++ .../service/vendors/MyFourCutQrVendor.java | 18 +++ .../service/vendors/PhotoismQrVendor.java | 46 ++++++ 6 files changed, 175 insertions(+), 132 deletions(-) create mode 100644 photo-service/src/main/java/kr/mafoo/photo/service/vendors/DontLookUpQrVendor.java create mode 100644 photo-service/src/main/java/kr/mafoo/photo/service/vendors/HaruFilmQrVendor.java create mode 100644 photo-service/src/main/java/kr/mafoo/photo/service/vendors/LifeFourCutsQrVendor.java create mode 100644 photo-service/src/main/java/kr/mafoo/photo/service/vendors/MyFourCutQrVendor.java create mode 100644 photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoismQrVendor.java diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java index 16721f0..2e22074 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java @@ -2,20 +2,12 @@ import kr.mafoo.photo.domain.BrandType; import kr.mafoo.photo.exception.PhotoBrandNotExistsException; -import kr.mafoo.photo.exception.PhotoQrUrlExpiredException; -import kr.mafoo.photo.exception.RedirectUriNotFoundException; import kr.mafoo.photo.service.dto.FileDto; -import kr.mafoo.photo.service.vendors.PhotoGrayQrVendor; +import kr.mafoo.photo.service.vendors.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.http.MediaType; import org.springframework.stereotype.Service; -import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; - -import java.net.URI; -import java.util.LinkedHashMap; -import java.util.Map; import java.util.Optional; @Slf4j @@ -23,140 +15,31 @@ @Service public class QrService { - private final WebClient externalWebClient; - + private final LifeFourCutsQrVendor lifeFourCutsQrVendor; + private final PhotoismQrVendor photoismQrVendor; + private final DontLookUpQrVendor dontLookUpQrVendor; + private final HaruFilmQrVendor haruFilmQrVendor; + private final MyFourCutQrVendor myFourCutQrVendor; private final PhotoGrayQrVendor photoGrayQrVendor; + public Mono getFileFromQrUrl(String qrUrl) { BrandType brandType = Optional.ofNullable(BrandType.matchBrandType(qrUrl)) .orElseThrow(PhotoBrandNotExistsException::new); - Mono imagePublisher = switch (brandType) { - case LIFE_FOUR_CUTS -> getLifeFourCutsFiles(qrUrl); - case PHOTOISM -> getPhotoismFiles(qrUrl); - case HARU_FILM -> getHaruFilmFiles(qrUrl); - case DONT_LOOK_UP -> getDontLookUpFiles(qrUrl); - case MY_FOUR_CUT -> getMyFourCutFiles(qrUrl); - case PHOTOGRAY -> photoGrayQrVendor.extractImageFromQrUrl(qrUrl); + QrVendor qrVendor = switch (brandType) { + case LIFE_FOUR_CUTS -> lifeFourCutsQrVendor; + case PHOTOISM -> photoismQrVendor; + case HARU_FILM -> haruFilmQrVendor; + case DONT_LOOK_UP -> dontLookUpQrVendor; + case MY_FOUR_CUT -> myFourCutQrVendor; + case PHOTOGRAY -> photoGrayQrVendor; }; - return createFileDto(brandType, imagePublisher); + return createFileDto(brandType, qrVendor.extractImageFromQrUrl(qrUrl)); } private Mono createFileDto(BrandType brandType, Mono fileMono) { return fileMono.map(file -> new FileDto(brandType, file)); } - - private Mono getLifeFourCutsFiles(String qrUrl) { - - return getRedirectUri(qrUrl) - .flatMap(redirectUri -> { - String imageUrl = extractValueFromUrl(redirectUri, "path=")[1].replace("index.html", "image.jpg"); - - // TODO : 추후 비디오 URL 추가 예정 - // String videoUrl = redirectUri.toString().replace("index.html", "video.mp4"); - - return getFileAsByte(imageUrl); - }) - .onErrorMap(e -> new PhotoQrUrlExpiredException()); - } - - private Mono getPhotoismFiles(String qrUrl) { - return getRedirectUri(qrUrl) - .flatMap(redirectUri -> { - String uid = extractValueFromUrl(redirectUri, "u=")[1]; - - return externalWebClient - .post() - .uri("https://cmsapi.seobuk.kr/v1/etc/seq/resource") - .contentType(MediaType.APPLICATION_JSON) - .bodyValue(Map.of("uid", uid)) - .retrieve() - .bodyToMono(LinkedHashMap.class) - .flatMap(responseBody -> { - LinkedHashMap content = (LinkedHashMap) responseBody.get("content"); - LinkedHashMap fileInfo = (LinkedHashMap) content.get("fileInfo"); - LinkedHashMap picFile = (LinkedHashMap) fileInfo.get("picFile"); - String imageUrl = (String) picFile.get("path"); - - return getFileAsByte(imageUrl); - }); - }) - .onErrorMap(e -> { - e.printStackTrace(); - return new PhotoQrUrlExpiredException(); - }); - } - - private Mono getHaruFilmFiles(String qrUrl) { - String[] urlValueList = extractValueFromUrl(qrUrl, "/@"); - String albumCode = urlValueList[1]; - - String baseUrl = urlValueList[0] + "/base_api?command=albumdn&albumCode="; - String imageUrl = baseUrl + albumCode + "&type=photo&file_name=output.jpg&max=10&limit=+24 hours"; - - // TODO : 추후 비디오 URL 추가 예정 - // String videoUrl = baseUrl + albumCode + "&type=video&max=10&limit=+24 hours"; - - return getFileAsByte(imageUrl) - .onErrorMap(e -> new PhotoQrUrlExpiredException()); - } - - private Mono getDontLookUpFiles(String qrUrl) { - String imageName = extractValueFromUrl(qrUrl, ".kr/image/")[1]; - - String baseUrl = "https://x.dontlxxkup.kr/uploads/"; - String imageUrl = baseUrl + imageName; - - // TODO : 추후 비디오 URL 추가 예정 - // String videoName = imageName.replace("image", "video").replace(".jpg", ".mp4"); - // String videoUrl = baseUrl + videoName; - - return getRedirectUri(qrUrl) - .flatMap(redirectUri -> { - if (redirectUri.endsWith("/delete")) { - return Mono.error(new PhotoQrUrlExpiredException()); - } else { - return getFileAsByte(imageUrl); - } - }) - .onErrorResume( - RedirectUriNotFoundException.class, e -> getFileAsByte(imageUrl) - ); - } - - private Mono getMyFourCutFiles(String qrUrl) { - return getFileAsByte(qrUrl); - } - - private Mono getRedirectUri(String url) { - return externalWebClient - .get() - .uri(url) - .retrieve() - .toBodilessEntity() - .flatMap(response -> { - URI redirectUri = response.getHeaders().getLocation(); - if (redirectUri == null) { - return Mono.error(new RedirectUriNotFoundException()); - } else { - return Mono.just(redirectUri.toString()); - } - }); - } - - private String[] extractValueFromUrl(String url, String delimiter) { - return url.split(delimiter); - } - - private Mono getFileAsByte(String url) { - return externalWebClient - .get() - .uri(url) - .accept(MediaType.APPLICATION_OCTET_STREAM) - .retrieve() - .bodyToMono(byte[].class); - } - - } diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/DontLookUpQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/DontLookUpQrVendor.java new file mode 100644 index 0000000..db3a31f --- /dev/null +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/DontLookUpQrVendor.java @@ -0,0 +1,39 @@ +package kr.mafoo.photo.service.vendors; + +import kr.mafoo.photo.exception.PhotoQrUrlExpiredException; +import kr.mafoo.photo.exception.RedirectUriNotFoundException; +import kr.mafoo.photo.util.WebClientUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Component +public class DontLookUpQrVendor implements QrVendor { + private final WebClient webClient; + + @Override + public Mono extractImageFromQrUrl(String qrUrl) { + String imageName = qrUrl.split(".kr/image/")[1]; + + String baseUrl = "https://x.dontlxxkup.kr/uploads/"; + String imageUrl = baseUrl + imageName; + + // TODO : 추후 비디오 URL 추가 예정 + // String videoName = imageName.replace("image", "video").replace(".jpg", ".mp4"); + // String videoUrl = baseUrl + videoName; + + return WebClientUtil.getRedirectUri(webClient, qrUrl) + .flatMap(redirectUri -> { + if (redirectUri.endsWith("/delete")) { + return Mono.error(new PhotoQrUrlExpiredException()); + } else { + return WebClientUtil.getBlob(webClient, imageUrl); + } + }) + .onErrorResume( + RedirectUriNotFoundException.class, e -> WebClientUtil.getBlob(webClient, imageUrl) + ); + } +} diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/HaruFilmQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/HaruFilmQrVendor.java new file mode 100644 index 0000000..242f524 --- /dev/null +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/HaruFilmQrVendor.java @@ -0,0 +1,29 @@ +package kr.mafoo.photo.service.vendors; + +import kr.mafoo.photo.exception.PhotoQrUrlExpiredException; +import kr.mafoo.photo.util.WebClientUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Component +public class HaruFilmQrVendor implements QrVendor { + private final WebClient webClient; + + @Override + public Mono extractImageFromQrUrl(String qrUrl) { + String[] urlValueList = qrUrl.split("/@"); + String albumCode = urlValueList[1]; + + String baseUrl = urlValueList[0] + "/base_api?command=albumdn&albumCode="; + String imageUrl = baseUrl + albumCode + "&type=photo&file_name=output.jpg&max=10&limit=+24 hours"; + + // TODO : 추후 비디오 URL 추가 예정 + // String videoUrl = baseUrl + albumCode + "&type=video&max=10&limit=+24 hours"; + + return WebClientUtil.getBlob(webClient, imageUrl) + .onErrorMap(e -> new PhotoQrUrlExpiredException()); + } +} diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/LifeFourCutsQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/LifeFourCutsQrVendor.java new file mode 100644 index 0000000..c5c52a8 --- /dev/null +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/LifeFourCutsQrVendor.java @@ -0,0 +1,28 @@ +package kr.mafoo.photo.service.vendors; + +import kr.mafoo.photo.exception.PhotoQrUrlExpiredException; +import kr.mafoo.photo.util.WebClientUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Component +public class LifeFourCutsQrVendor implements QrVendor { + private final WebClient webClient; + + @Override + public Mono extractImageFromQrUrl(String qrUrl) { + return WebClientUtil.getRedirectUri(webClient, qrUrl) + .flatMap(redirectUri -> { + String imageUrl = redirectUri.split("path=")[1].replace("index.html", "image.jpg"); + + // TODO : 추후 비디오 URL 추가 예정 + // String videoUrl = redirectUri.toString().replace("index.html", "video.mp4"); + + return WebClientUtil.getBlob(webClient, imageUrl); + }) + .onErrorMap(e -> new PhotoQrUrlExpiredException()); + } +} diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MyFourCutQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MyFourCutQrVendor.java new file mode 100644 index 0000000..882e895 --- /dev/null +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MyFourCutQrVendor.java @@ -0,0 +1,18 @@ +package kr.mafoo.photo.service.vendors; + +import kr.mafoo.photo.util.WebClientUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Component +public class MyFourCutQrVendor implements QrVendor { + private final WebClient webClient; + + @Override + public Mono extractImageFromQrUrl(String qrUrl) { + return WebClientUtil.getBlob(webClient, qrUrl); //just image url + } +} diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoismQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoismQrVendor.java new file mode 100644 index 0000000..c909aff --- /dev/null +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoismQrVendor.java @@ -0,0 +1,46 @@ +package kr.mafoo.photo.service.vendors; + +import kr.mafoo.photo.exception.PhotoQrUrlExpiredException; +import kr.mafoo.photo.util.WebClientUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.LinkedHashMap; +import java.util.Map; + +@RequiredArgsConstructor +@Component +public class PhotoismQrVendor implements QrVendor { + private final WebClient webClient; + + @Override + public Mono extractImageFromQrUrl(String qrUrl) { + return WebClientUtil.getRedirectUri(webClient, qrUrl) + .flatMap(redirectUri -> { + String uid = redirectUri.split("u=")[1]; + + return webClient + .post() + .uri("https://cmsapi.seobuk.kr/v1/etc/seq/resource") + .contentType(MediaType.APPLICATION_JSON) + .bodyValue(Map.of("uid", uid)) + .retrieve() + .bodyToMono(LinkedHashMap.class) + .flatMap(responseBody -> { + LinkedHashMap content = (LinkedHashMap) responseBody.get("content"); + LinkedHashMap fileInfo = (LinkedHashMap) content.get("fileInfo"); + LinkedHashMap picFile = (LinkedHashMap) fileInfo.get("picFile"); + String imageUrl = (String) picFile.get("path"); + + return WebClientUtil.getBlob(webClient, imageUrl); + }); + }) + .onErrorMap(e -> { + e.printStackTrace(); + return new PhotoQrUrlExpiredException(); + }); + } +} From 55134f4bcfeda516b66318f11891a0e3baabf043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=98=81=EB=AF=BC?= Date: Wed, 24 Jul 2024 15:24:03 +0900 Subject: [PATCH 12/22] feat: add error handling --- .../kr/mafoo/photo/service/vendors/MyFourCutQrVendor.java | 5 ++++- .../kr/mafoo/photo/service/vendors/PhotoGrayQrVendor.java | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MyFourCutQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MyFourCutQrVendor.java index 882e895..7b6a651 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MyFourCutQrVendor.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MyFourCutQrVendor.java @@ -1,5 +1,6 @@ package kr.mafoo.photo.service.vendors; +import kr.mafoo.photo.exception.PhotoQrUrlExpiredException; import kr.mafoo.photo.util.WebClientUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -13,6 +14,8 @@ public class MyFourCutQrVendor implements QrVendor { @Override public Mono extractImageFromQrUrl(String qrUrl) { - return WebClientUtil.getBlob(webClient, qrUrl); //just image url + return WebClientUtil + .getBlob(webClient, qrUrl) //just image url + .onErrorMap(e -> new PhotoQrUrlExpiredException()); } } diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoGrayQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoGrayQrVendor.java index a2fbb67..af87e6b 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoGrayQrVendor.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoGrayQrVendor.java @@ -1,5 +1,6 @@ package kr.mafoo.photo.service.vendors; +import kr.mafoo.photo.exception.PhotoQrUrlExpiredException; import kr.mafoo.photo.util.WebClientUtil; import lombok.RequiredArgsConstructor; import org.apache.http.client.utils.URLEncodedUtils; @@ -26,7 +27,8 @@ public Mono extractImageFromQrUrl(String qrUrl) { String sessionId = extractSessionIdFromQueryString(decodedStr); String imageUrl = String.format("https://pg-qr-resource.aprd.io/%s/image.jpg", sessionId); return WebClientUtil.getBlob(webClient, imageUrl); - }); //https://pg-qr-resource.aprd.io/{sessionId}/image.jpg + }) //https://pg-qr-resource.aprd.io/{sessionId}/image.jpg + .onErrorMap(e -> new PhotoQrUrlExpiredException()); } private String extractIdFromUrl(String url) { From 0891ae3659daff8b7209a71faba0de42a695facf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=98=81=EB=AF=BC?= Date: Thu, 25 Jul 2024 20:05:22 +0900 Subject: [PATCH 13/22] feat: add MonoMansion vendor --- .../java/kr/mafoo/photo/domain/BrandType.java | 1 + .../kr/mafoo/photo/service/QrService.java | 2 ++ .../service/vendors/MonoMansionQrVendor.java | 32 +++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 photo-service/src/main/java/kr/mafoo/photo/service/vendors/MonoMansionQrVendor.java diff --git a/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java b/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java index d441945..0196fdb 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java +++ b/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java @@ -9,6 +9,7 @@ public enum BrandType { DONT_LOOK_UP(Pattern.compile("https://x\\.dontlxxkup\\.kr/.*")), MY_FOUR_CUT(Pattern.compile("https://firebasestorage\\.googleapis\\.com:443/v0/b/my4ccu\\.appspot\\.com/.*")), PHOTOGRAY(Pattern.compile("https://pgshort\\.aprd\\.io/.*")), + MONOMANSION(Pattern.compile("https://monomansion\\.net/.*")) ; private final Pattern urlPattern; diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java index 2e22074..4f1aea4 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java @@ -21,6 +21,7 @@ public class QrService { private final HaruFilmQrVendor haruFilmQrVendor; private final MyFourCutQrVendor myFourCutQrVendor; private final PhotoGrayQrVendor photoGrayQrVendor; + private final MonoMansionQrVendor monoMansionQrVendor; public Mono getFileFromQrUrl(String qrUrl) { @@ -34,6 +35,7 @@ public Mono getFileFromQrUrl(String qrUrl) { case DONT_LOOK_UP -> dontLookUpQrVendor; case MY_FOUR_CUT -> myFourCutQrVendor; case PHOTOGRAY -> photoGrayQrVendor; + case MONOMANSION -> monoMansionQrVendor; }; return createFileDto(brandType, qrVendor.extractImageFromQrUrl(qrUrl)); diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MonoMansionQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MonoMansionQrVendor.java new file mode 100644 index 0000000..2e28f7f --- /dev/null +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MonoMansionQrVendor.java @@ -0,0 +1,32 @@ +package kr.mafoo.photo.service.vendors; + +import kr.mafoo.photo.exception.PhotoQrUrlExpiredException; +import kr.mafoo.photo.util.WebClientUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.UriComponentsBuilder; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Component +public class MonoMansionQrVendor implements QrVendor { + private final WebClient webClient; + + @Override + public Mono extractImageFromQrUrl(String qrUrl) { + String qrCode = extractQrCodeFromUrl(qrUrl); + String imageUrl = String.format("https://monomansion.net/api/download.php?qrcode=%s&type=P", qrCode); + return WebClientUtil + .getBlob(webClient, imageUrl) + .onErrorMap(e -> new PhotoQrUrlExpiredException()); + } + + private String extractQrCodeFromUrl(String url) { + return UriComponentsBuilder + .fromUriString(url) + .build() + .getQueryParams() + .getFirst("qrcode"); + } +} From b4ee0d42a53a2e53721c2e044d7e8252108a5e46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=98=81=EB=AF=BC?= Date: Thu, 25 Jul 2024 20:12:20 +0900 Subject: [PATCH 14/22] feat: add PhotoSignature vendor --- .../java/kr/mafoo/photo/domain/BrandType.java | 3 ++- .../kr/mafoo/photo/service/QrService.java | 2 ++ .../vendors/PhotoSignatureQrVendor.java | 22 +++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoSignatureQrVendor.java diff --git a/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java b/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java index 0196fdb..933d6b6 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java +++ b/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java @@ -9,7 +9,8 @@ public enum BrandType { DONT_LOOK_UP(Pattern.compile("https://x\\.dontlxxkup\\.kr/.*")), MY_FOUR_CUT(Pattern.compile("https://firebasestorage\\.googleapis\\.com:443/v0/b/my4ccu\\.appspot\\.com/.*")), PHOTOGRAY(Pattern.compile("https://pgshort\\.aprd\\.io/.*")), - MONOMANSION(Pattern.compile("https://monomansion\\.net/.*")) + MONOMANSION(Pattern.compile("https://monomansion\\.net/.*")), + PHOTO_SIGNATURE(Pattern.compile("http://photoqr3\\.kr/.*")) ; private final Pattern urlPattern; diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java index 4f1aea4..573791d 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java @@ -22,6 +22,7 @@ public class QrService { private final MyFourCutQrVendor myFourCutQrVendor; private final PhotoGrayQrVendor photoGrayQrVendor; private final MonoMansionQrVendor monoMansionQrVendor; + private final PhotoSignatureQrVendor photoSignatureQrVendor; public Mono getFileFromQrUrl(String qrUrl) { @@ -36,6 +37,7 @@ public Mono getFileFromQrUrl(String qrUrl) { case MY_FOUR_CUT -> myFourCutQrVendor; case PHOTOGRAY -> photoGrayQrVendor; case MONOMANSION -> monoMansionQrVendor; + case PHOTO_SIGNATURE -> photoSignatureQrVendor; }; return createFileDto(brandType, qrVendor.extractImageFromQrUrl(qrUrl)); diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoSignatureQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoSignatureQrVendor.java new file mode 100644 index 0000000..09216f1 --- /dev/null +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoSignatureQrVendor.java @@ -0,0 +1,22 @@ +package kr.mafoo.photo.service.vendors; + +import kr.mafoo.photo.exception.PhotoQrUrlExpiredException; +import kr.mafoo.photo.util.WebClientUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Component +public class PhotoSignatureQrVendor implements QrVendor { + private final WebClient webClient; + + @Override + public Mono extractImageFromQrUrl(String qrUrl) { + String imageUrl = qrUrl.replace("index.html", "a.jpg"); + return WebClientUtil + .getBlob(webClient, imageUrl) + .onErrorMap(e -> new PhotoQrUrlExpiredException()); + } +} From 3632075033e68a0ca5772d1b83db32def76492e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=98=81=EB=AF=BC?= Date: Thu, 25 Jul 2024 20:18:46 +0900 Subject: [PATCH 15/22] feat: accept any header --- .../photo/service/vendors/PhotoSignatureQrVendor.java | 2 +- .../src/main/java/kr/mafoo/photo/util/WebClientUtil.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoSignatureQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoSignatureQrVendor.java index 09216f1..4abe690 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoSignatureQrVendor.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PhotoSignatureQrVendor.java @@ -16,7 +16,7 @@ public class PhotoSignatureQrVendor implements QrVendor { public Mono extractImageFromQrUrl(String qrUrl) { String imageUrl = qrUrl.replace("index.html", "a.jpg"); return WebClientUtil - .getBlob(webClient, imageUrl) + .getBlobByAnyMediaType(webClient, imageUrl) .onErrorMap(e -> new PhotoQrUrlExpiredException()); } } diff --git a/photo-service/src/main/java/kr/mafoo/photo/util/WebClientUtil.java b/photo-service/src/main/java/kr/mafoo/photo/util/WebClientUtil.java index 69ed12b..b468765 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/util/WebClientUtil.java +++ b/photo-service/src/main/java/kr/mafoo/photo/util/WebClientUtil.java @@ -32,4 +32,12 @@ public static Mono getBlob(WebClient client, String url) { .retrieve() .bodyToMono(byte[].class); } + + public static Mono getBlobByAnyMediaType(WebClient client, String url) { + return client + .get() + .uri(url) + .retrieve() + .bodyToMono(byte[].class); + } } From 4a465087b0678225fb25f61e976582d815993a72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=98=81=EB=AF=BC?= Date: Thu, 25 Jul 2024 20:21:53 +0900 Subject: [PATCH 16/22] feat: add PicDot qr Vendor --- .../java/kr/mafoo/photo/domain/BrandType.java | 3 +- .../kr/mafoo/photo/service/QrService.java | 2 ++ .../photo/service/vendors/PicDotQrVendor.java | 32 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 photo-service/src/main/java/kr/mafoo/photo/service/vendors/PicDotQrVendor.java diff --git a/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java b/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java index 933d6b6..62c6cfa 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java +++ b/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java @@ -10,7 +10,8 @@ public enum BrandType { MY_FOUR_CUT(Pattern.compile("https://firebasestorage\\.googleapis\\.com:443/v0/b/my4ccu\\.appspot\\.com/.*")), PHOTOGRAY(Pattern.compile("https://pgshort\\.aprd\\.io/.*")), MONOMANSION(Pattern.compile("https://monomansion\\.net/.*")), - PHOTO_SIGNATURE(Pattern.compile("http://photoqr3\\.kr/.*")) + PHOTO_SIGNATURE(Pattern.compile("http://photoqr3\\.kr/.*")), + PICDOT(Pattern.compile("https://picdot\\.kr/.*")) ; private final Pattern urlPattern; diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java index 573791d..565e006 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java @@ -23,6 +23,7 @@ public class QrService { private final PhotoGrayQrVendor photoGrayQrVendor; private final MonoMansionQrVendor monoMansionQrVendor; private final PhotoSignatureQrVendor photoSignatureQrVendor; + private final PicDotQrVendor picDotQrVendor; public Mono getFileFromQrUrl(String qrUrl) { @@ -38,6 +39,7 @@ public Mono getFileFromQrUrl(String qrUrl) { case PHOTOGRAY -> photoGrayQrVendor; case MONOMANSION -> monoMansionQrVendor; case PHOTO_SIGNATURE -> photoSignatureQrVendor; + case PICDOT -> picDotQrVendor; }; return createFileDto(brandType, qrVendor.extractImageFromQrUrl(qrUrl)); diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PicDotQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PicDotQrVendor.java new file mode 100644 index 0000000..e04b03b --- /dev/null +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/PicDotQrVendor.java @@ -0,0 +1,32 @@ +package kr.mafoo.photo.service.vendors; + +import kr.mafoo.photo.exception.PhotoQrUrlExpiredException; +import kr.mafoo.photo.util.WebClientUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.UriComponentsBuilder; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Component +public class PicDotQrVendor implements QrVendor { + private final WebClient webClient; + + @Override + public Mono extractImageFromQrUrl(String qrUrl) { + String qrCode = extractQrCodeFromUrl(qrUrl); + String imageUrl = String.format("https://picdot.kr/api/download.php?qrcode=%s&type=P", qrCode); + return WebClientUtil + .getBlob(webClient, imageUrl) + .onErrorMap(e -> new PhotoQrUrlExpiredException()); + } + + private String extractQrCodeFromUrl(String url) { + return UriComponentsBuilder + .fromUriString(url) + .build() + .getQueryParams() + .getFirst("qrcode"); + } +} From 4b20ec0b0926f1d510c201f5fb8defadfa059578 Mon Sep 17 00:00:00 2001 From: Gyoungmin Kim Date: Sat, 27 Jul 2024 12:14:46 +0900 Subject: [PATCH 17/22] feat : create updateOwnerMemberId for photo entity --- .../src/main/java/kr/mafoo/photo/domain/PhotoEntity.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/photo-service/src/main/java/kr/mafoo/photo/domain/PhotoEntity.java b/photo-service/src/main/java/kr/mafoo/photo/domain/PhotoEntity.java index 35db5ef..dd908ce 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/domain/PhotoEntity.java +++ b/photo-service/src/main/java/kr/mafoo/photo/domain/PhotoEntity.java @@ -62,6 +62,11 @@ public String getId() { return photoId; } + public PhotoEntity updateOwnerMemberId(String ownerMemberId) { + this.ownerMemberId = ownerMemberId; + return this; + } + public PhotoEntity updateAlbumId(String albumId) { this.albumId = albumId; return this; From a222963f3802af954ab7e3ad26a60aeac155f273 Mon Sep 17 00:00:00 2001 From: Gyoungmin Kim Date: Sat, 27 Jul 2024 12:15:36 +0900 Subject: [PATCH 18/22] feat : add photo entity ownerMemberId checkout and setting logic if null --- .../java/kr/mafoo/photo/service/PhotoService.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java b/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java index 39fcdb0..be3d734 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java @@ -37,7 +37,7 @@ public Flux findAllByAlbumId(String albumId, String requestMemberId .findById(albumId) .switchIfEmpty(Mono.error(new AlbumNotFoundException())) .flatMapMany(albumEntity -> { - if(!albumEntity.getOwnerMemberId().equals(requestMemberId)) { + if (!albumEntity.getOwnerMemberId().equals(requestMemberId)) { // 내 앨범이 아니면 그냥 없는 앨범 처리 return Mono.error(new AlbumNotFoundException()); } else { @@ -51,7 +51,7 @@ public Mono deletePhotoById(String photoId, String requestMemberId) { .findById(photoId) .switchIfEmpty(Mono.error(new PhotoNotFoundException())) .flatMap(photoEntity -> { - if(!photoEntity.getOwnerMemberId().equals(requestMemberId)) { + if (!photoEntity.getOwnerMemberId().equals(requestMemberId)) { // 내 사진이 아니면 그냥 없는 사진 처리 return Mono.error(new PhotoNotFoundException()); } else { @@ -66,7 +66,11 @@ public Mono updatePhotoAlbumId(String photoId, String albumId, Stri .findById(photoId) .switchIfEmpty(Mono.error(new PhotoNotFoundException())) .flatMap(photoEntity -> { - if(!photoEntity.getOwnerMemberId().equals(requestMemberId)) { + if (photoEntity.getOwnerMemberId() == null) { + photoRepository.save(photoEntity.updateOwnerMemberId(requestMemberId)); + } + + if (!photoEntity.getOwnerMemberId().equals(requestMemberId)) { // 내 사진이 아니면 그냥 없는 사진 처리 return Mono.error(new PhotoNotFoundException()); } else { @@ -74,7 +78,7 @@ public Mono updatePhotoAlbumId(String photoId, String albumId, Stri .findById(albumId) .switchIfEmpty(Mono.error(new AlbumNotFoundException())) .flatMap(albumEntity -> { - if(!albumEntity.getOwnerMemberId().equals(requestMemberId)) { + if (!albumEntity.getOwnerMemberId().equals(requestMemberId)) { // 내 앨범이 아니면 그냥 없는 앨범 처리 return Mono.error(new AlbumNotFoundException()); } else { From b54b3f4c86ddfea9f209770397b3cf08623a31a1 Mon Sep 17 00:00:00 2001 From: Gyoungmin Kim Date: Sat, 27 Jul 2024 15:09:08 +0900 Subject: [PATCH 19/22] refactor: add hasOwnerMemberId in photo service --- .../main/java/kr/mafoo/photo/service/PhotoService.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java b/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java index be3d734..1fe2f14 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java @@ -7,10 +7,12 @@ import kr.mafoo.photo.repository.PhotoRepository; import kr.mafoo.photo.util.IdGenerator; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +@Slf4j @RequiredArgsConstructor @Service public class PhotoService { @@ -66,7 +68,8 @@ public Mono updatePhotoAlbumId(String photoId, String albumId, Stri .findById(photoId) .switchIfEmpty(Mono.error(new PhotoNotFoundException())) .flatMap(photoEntity -> { - if (photoEntity.getOwnerMemberId() == null) { + + if (!hasOwnerId(photoEntity)) { photoRepository.save(photoEntity.updateOwnerMemberId(requestMemberId)); } @@ -91,4 +94,8 @@ public Mono updatePhotoAlbumId(String photoId, String albumId, Stri }); } + private Boolean hasOwnerId(PhotoEntity photoEntity) { + return photoEntity.getOwnerMemberId() != null; + } + } From 9f6833b1aa36283eec92e7cd7d1de2aca1305ec4 Mon Sep 17 00:00:00 2001 From: Gyoungmin Kim Date: Sun, 28 Jul 2024 14:16:04 +0900 Subject: [PATCH 20/22] refactor: add hasOwnerMemberId in photo entity --- .../src/main/java/kr/mafoo/photo/domain/PhotoEntity.java | 4 ++++ .../src/main/java/kr/mafoo/photo/service/PhotoService.java | 6 +----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/photo-service/src/main/java/kr/mafoo/photo/domain/PhotoEntity.java b/photo-service/src/main/java/kr/mafoo/photo/domain/PhotoEntity.java index dd908ce..6785e82 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/domain/PhotoEntity.java +++ b/photo-service/src/main/java/kr/mafoo/photo/domain/PhotoEntity.java @@ -62,6 +62,10 @@ public String getId() { return photoId; } + public Boolean hasOwnerMemberId() { + return this.getOwnerMemberId() != null; + } + public PhotoEntity updateOwnerMemberId(String ownerMemberId) { this.ownerMemberId = ownerMemberId; return this; diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java b/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java index 1fe2f14..aa20342 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/PhotoService.java @@ -69,7 +69,7 @@ public Mono updatePhotoAlbumId(String photoId, String albumId, Stri .switchIfEmpty(Mono.error(new PhotoNotFoundException())) .flatMap(photoEntity -> { - if (!hasOwnerId(photoEntity)) { + if (!photoEntity.hasOwnerMemberId()) { photoRepository.save(photoEntity.updateOwnerMemberId(requestMemberId)); } @@ -94,8 +94,4 @@ public Mono updatePhotoAlbumId(String photoId, String albumId, Stri }); } - private Boolean hasOwnerId(PhotoEntity photoEntity) { - return photoEntity.getOwnerMemberId() != null; - } - } From 22ee73421dbc71477e3b33674ee33c19d62c574b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=98=81=EB=AF=BC?= Date: Mon, 29 Jul 2024 19:29:42 +0900 Subject: [PATCH 21/22] feat: add mafoo qr vendor --- .../photo/controller/PhotoController.java | 6 ----- .../java/kr/mafoo/photo/domain/BrandType.java | 3 ++- .../kr/mafoo/photo/service/QrService.java | 2 ++ .../photo/service/vendors/MafooQrVendor.java | 23 +++++++++++++++++++ 4 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 photo-service/src/main/java/kr/mafoo/photo/service/vendors/MafooQrVendor.java diff --git a/photo-service/src/main/java/kr/mafoo/photo/controller/PhotoController.java b/photo-service/src/main/java/kr/mafoo/photo/controller/PhotoController.java index 0f846e1..a4f0efe 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/controller/PhotoController.java +++ b/photo-service/src/main/java/kr/mafoo/photo/controller/PhotoController.java @@ -33,12 +33,6 @@ public Mono createPhoto( String memberId, PhotoCreateRequest request ){ - - // HACK : 프엔 응급 요청으로 더미 응답 추가했습니다. - 추후 삭제 예정 - if (request.qrUrl().equals("https://mafoo.kr/")) { - return Mono.just(new PhotoResponse("id", "https://kr.object.ncloudstorage.com/mafoo//24c576bc-60b0-4e43-af9a-0c3311b97f35", LIFE_FOUR_CUTS, null)); - } - return photoService .createNewPhoto(request.qrUrl(), memberId) .map(PhotoResponse::fromEntity); diff --git a/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java b/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java index 62c6cfa..d3f2e73 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java +++ b/photo-service/src/main/java/kr/mafoo/photo/domain/BrandType.java @@ -11,7 +11,8 @@ public enum BrandType { PHOTOGRAY(Pattern.compile("https://pgshort\\.aprd\\.io/.*")), MONOMANSION(Pattern.compile("https://monomansion\\.net/.*")), PHOTO_SIGNATURE(Pattern.compile("http://photoqr3\\.kr/.*")), - PICDOT(Pattern.compile("https://picdot\\.kr/.*")) + PICDOT(Pattern.compile("https://picdot\\.kr/.*")), + MAFOO(Pattern.compile("https://mafoo\\.kr/.*")) ; private final Pattern urlPattern; diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java index 565e006..129a3cb 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/QrService.java @@ -24,6 +24,7 @@ public class QrService { private final MonoMansionQrVendor monoMansionQrVendor; private final PhotoSignatureQrVendor photoSignatureQrVendor; private final PicDotQrVendor picDotQrVendor; + private final MafooQrVendor mafooQrVendor; public Mono getFileFromQrUrl(String qrUrl) { @@ -40,6 +41,7 @@ public Mono getFileFromQrUrl(String qrUrl) { case MONOMANSION -> monoMansionQrVendor; case PHOTO_SIGNATURE -> photoSignatureQrVendor; case PICDOT -> picDotQrVendor; + case MAFOO -> mafooQrVendor; }; return createFileDto(brandType, qrVendor.extractImageFromQrUrl(qrUrl)); diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MafooQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MafooQrVendor.java new file mode 100644 index 0000000..64c1ca4 --- /dev/null +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MafooQrVendor.java @@ -0,0 +1,23 @@ +package kr.mafoo.photo.service.vendors; + +import kr.mafoo.photo.exception.PhotoQrUrlExpiredException; +import kr.mafoo.photo.util.WebClientUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Component +public class MafooQrVendor implements QrVendor { + private final WebClient webClient; + private final static String sampleImageUrl + = "https://kr.object.ncloudstorage.com/mafoo//c8dbdc0d-65d6-490b-ac68-c37d99d494bf"; + + @Override + public Mono extractImageFromQrUrl(String qrUrl) { + return WebClientUtil + .getBlob(webClient, qrUrl) //just image url + .onErrorMap(e -> new PhotoQrUrlExpiredException()); + } +} From 00bd6e7252103864ef8e949191775f8e48308e45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=A1=EC=98=81=EB=AF=BC?= Date: Mon, 29 Jul 2024 19:33:19 +0900 Subject: [PATCH 22/22] feat: update image url --- .../java/kr/mafoo/photo/service/vendors/MafooQrVendor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MafooQrVendor.java b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MafooQrVendor.java index 64c1ca4..10bb1f0 100644 --- a/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MafooQrVendor.java +++ b/photo-service/src/main/java/kr/mafoo/photo/service/vendors/MafooQrVendor.java @@ -12,12 +12,12 @@ public class MafooQrVendor implements QrVendor { private final WebClient webClient; private final static String sampleImageUrl - = "https://kr.object.ncloudstorage.com/mafoo//c8dbdc0d-65d6-490b-ac68-c37d99d494bf"; + = "https://i.ibb.co/VY7s8m1/c8dbdc0d-65d6-490b-ac68-c37d99d494bf.jpg"; @Override public Mono extractImageFromQrUrl(String qrUrl) { return WebClientUtil - .getBlob(webClient, qrUrl) //just image url + .getBlobByAnyMediaType(webClient, sampleImageUrl) //just image url .onErrorMap(e -> new PhotoQrUrlExpiredException()); } }