From 3e42d5ddd1d8b4f1224b0d9fd7c87d160f676e36 Mon Sep 17 00:00:00 2001 From: hyeonjeongs Date: Wed, 13 Sep 2023 12:51:03 +0900 Subject: [PATCH 1/4] YEL-155 [feat] apple refund --- .../purchase/service/PurchaseManager.java | 1 + .../purchase/service/PurchaseManagerImpl.java | 35 ++++++++++++++++++- .../purchase/service/PurchaseService.java | 14 ++++---- .../yello/server/domain/user/entity/User.java | 7 ++-- .../domain/vote/service/VoteService.java | 2 +- .../global/common/util/ConstantUtil.java | 3 ++ .../domain/purchase/FakePurchaseManager.java | 5 +++ .../server/domain/user/small/UserTest.java | 2 +- 8 files changed, 56 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java index be2ca77f..534ba543 100644 --- a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java +++ b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java @@ -24,4 +24,5 @@ void handleAppleTransactionError(ResponseEntity respons void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO); + void refundAppleInApp(AppleNotificationPayloadVO payloadVO); } diff --git a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java index 307c94f9..7a6e7af7 100644 --- a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java +++ b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java @@ -3,6 +3,9 @@ import static com.yello.server.global.common.ErrorCode.APPLE_TOKEN_SERVER_EXCEPTION; import static com.yello.server.global.common.ErrorCode.GOOGLE_SUBSCRIPTIONS_SUBSCRIPTION_EXCEPTION; import static com.yello.server.global.common.ErrorCode.NOT_FOUND_TRANSACTION_EXCEPTION; +import static com.yello.server.global.common.util.ConstantUtil.REFUND_FIVE_TICKET; +import static com.yello.server.global.common.util.ConstantUtil.REFUND_ONE_TICKET; +import static com.yello.server.global.common.util.ConstantUtil.REFUND_TWO_TICKET; import com.fasterxml.jackson.databind.ObjectMapper; import com.yello.server.domain.purchase.dto.apple.AppleNotificationPayloadVO; @@ -68,7 +71,7 @@ public void handleAppleTransactionError(ResponseEntity @Override public AppleNotificationPayloadVO decodeApplePayload(String signedPayload) { - + Map jsonPayload = DecodeTokenFactory.decodeToken(signedPayload); ObjectMapper objectMapper = new ObjectMapper(); @@ -117,5 +120,35 @@ public void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO) { } } + @Override + public void refundAppleInApp(AppleNotificationPayloadVO payloadVO) { + String transactionId = + decodeAppleNotificationData(payloadVO.data().signedTransactionInfo()); + Purchase purchase = purchaseRepository.findByTransactionId(transactionId) + .orElseThrow(() -> new PurchaseNotFoundException(NOT_FOUND_TRANSACTION_EXCEPTION)); + User user = purchase.getUser(); + + switch (purchase.getProductType()) { + case YELLO_PLUS -> { + user.setSubscribe(Subscribe.NORMAL); + } + case ONE_TICKET -> { + validateTicketCount(REFUND_ONE_TICKET, user); + } + case TWO_TICKET -> { + validateTicketCount(REFUND_TWO_TICKET, user); + } + case FIVE_TICKET -> { + validateTicketCount(REFUND_FIVE_TICKET, user); + } + } + } + + public void validateTicketCount(int ticketCount, User user) { + if (user.getTicketCount() >= ticketCount) { + user.setTicketCount(-Math.abs(ticketCount)); + } + } + } diff --git a/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java b/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java index a7cccfe2..3e49e7eb 100644 --- a/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java +++ b/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java @@ -110,7 +110,7 @@ public void verifyAppleSubscriptionTransaction(Long userId, } purchaseManager.createSubscribe(user, Gateway.APPLE, request.transactionId()); - user.addTicketCount(3); + user.setTicketCount(3); } @Transactional @@ -126,17 +126,17 @@ public void verifyAppleTicketTransaction(Long userId, AppleTransaction request) case ONE_TICKET_ID: purchaseManager.createTicket(user, ProductType.ONE_TICKET, Gateway.APPLE, request.transactionId()); - user.addTicketCount(1); + user.setTicketCount(1); break; case TWO_TICKET_ID: purchaseManager.createTicket(user, ProductType.TWO_TICKET, Gateway.APPLE, request.transactionId()); - user.addTicketCount(2); + user.setTicketCount(2); break; case FIVE_TICKET_ID: purchaseManager.createTicket(user, ProductType.FIVE_TICKET, Gateway.APPLE, request.transactionId()); - user.addTicketCount(5); + user.setTicketCount(5); break; default: throw new PurchaseException(NOT_FOUND_TRANSACTION_EXCEPTION); @@ -206,7 +206,7 @@ public GoogleSubscriptionGetResponse verifyGoogleSubscriptionTransaction(Long us case ConstantUtil.GOOGLE_PURCHASE_SUBSCRIPTION_ACTIVE -> { final Purchase subscribe = purchaseManager.createSubscribe(user, Gateway.GOOGLE, request.orderId()); - user.addTicketCount(3); + user.setTicketCount(3); subscribe.setTransactionId(request.orderId()); } } @@ -259,7 +259,7 @@ public GoogleTicketGetResponse verifyGoogleTicketTransaction(Long userId, Purchase ticket = purchaseManager.createTicket(user, getProductType(request.productId()), Gateway.GOOGLE, request.orderId()); - user.addTicketCount(getTicketAmount(request.productId()) * request.quantity()); + user.setTicketCount(getTicketAmount(request.productId()) * request.quantity()); ticket.setTransactionId(inAppResponse.getBody().orderId()); } else { throw new GoogleBadRequestException(GOOGLE_INAPP_BAD_REQUEST_EXCEPTION); @@ -304,7 +304,7 @@ public void appleNotification(AppleNotificationRequest request) { purchaseManager.changeSubscriptionStatus(payloadVO); break; case APPLE_NOTIFICATION_REFUND: - System.out.println("dd"); + purchaseManager.refundAppleInApp(payloadVO); break; case APPLE_NOTIFICATION_TEST: return; diff --git a/src/main/java/com/yello/server/domain/user/entity/User.java b/src/main/java/com/yello/server/domain/user/entity/User.java index 4bcdf736..d433e453 100644 --- a/src/main/java/com/yello/server/domain/user/entity/User.java +++ b/src/main/java/com/yello/server/domain/user/entity/User.java @@ -122,7 +122,8 @@ public static User of(SignUpRequest signUpRequest, School group) { .group(group) .groupAdmissionYear(signUpRequest.groupAdmissionYear()) .email(signUpRequest.email()) - .deviceToken(Objects.equals(signUpRequest.deviceToken(), "") ? null : signUpRequest.deviceToken()) + .deviceToken(Objects.equals(signUpRequest.deviceToken(), "") ? null + : signUpRequest.deviceToken()) .subscribe(Subscribe.NORMAL) .ticketCount(0) .build(); @@ -167,7 +168,7 @@ public void increaseRecommendPoint() { } public void plusPoint(Integer point) { - if (this.getSubscribe() == Subscribe.NORMAL) { + if (this.getSubscribe()==Subscribe.NORMAL) { this.point += point; return; } @@ -194,7 +195,7 @@ public void setSubscribe(Subscribe subscribe) { this.subscribe = subscribe; } - public void addTicketCount(int ticketCount) { + public void setTicketCount(int ticketCount) { this.ticketCount += ticketCount; } diff --git a/src/main/java/com/yello/server/domain/vote/service/VoteService.java b/src/main/java/com/yello/server/domain/vote/service/VoteService.java index 4e893782..09f79756 100644 --- a/src/main/java/com/yello/server/domain/vote/service/VoteService.java +++ b/src/main/java/com/yello/server/domain/vote/service/VoteService.java @@ -195,7 +195,7 @@ public RevealFullNameResponse revealFullName(Long userId, Long voteId) { } vote.checkNameIndexOf(CHECK_FULL_NAME); - sender.addTicketCount(MINUS_TICKET_COUNT); + sender.setTicketCount(MINUS_TICKET_COUNT); return RevealFullNameResponse.of(vote.getSender()); } diff --git a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java index 0940bdb7..6c330fbd 100644 --- a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java +++ b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java @@ -54,6 +54,9 @@ public class ConstantUtil { public static final String APPLE_NOTIFICATION_TEST = "TEST"; public static final String APPLE_SUBTYPE_AUTO_RENEW_DISABLED = "AUTO_RENEW_DISABLED"; public static final String APPLE_SUBTYPE_VOLUNTARY = "VOLUNTARY"; + public static final int REFUND_ONE_TICKET = 1; + public static final int REFUND_TWO_TICKET = 2; + public static final int REFUND_FIVE_TICKET = 5; private ConstantUtil() { diff --git a/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java b/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java index cd1e7136..382dca89 100644 --- a/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java +++ b/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java @@ -67,4 +67,9 @@ public String decodeAppleNotificationData(String signedTransactionInfo) { public void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO) { } + + @Override + public void refundAppleInApp(AppleNotificationPayloadVO payloadVO) { + + } } diff --git a/src/test/java/com/yello/server/domain/user/small/UserTest.java b/src/test/java/com/yello/server/domain/user/small/UserTest.java index e58eeff1..acc3d969 100644 --- a/src/test/java/com/yello/server/domain/user/small/UserTest.java +++ b/src/test/java/com/yello/server/domain/user/small/UserTest.java @@ -137,7 +137,7 @@ void init() { assertThat(user.getTicketCount()).isZero(); // when - user.addTicketCount(10); + user.setTicketCount(10); // then assertThat(user.getTicketCount()).isEqualTo(10); From 6e6721b054bdbb12f547270be9a8559d7237873b Mon Sep 17 00:00:00 2001 From: hyeonjeongs Date: Wed, 13 Sep 2023 12:57:19 +0900 Subject: [PATCH 2/4] YEL-155 [feat] apple refund --- .../purchase/service/PurchaseManager.java | 1 + .../purchase/service/PurchaseManagerImpl.java | 35 ++++++++++++++++++- .../purchase/service/PurchaseService.java | 14 ++++---- .../yello/server/domain/user/entity/User.java | 10 +++--- .../domain/vote/service/VoteService.java | 2 +- .../global/common/util/ConstantUtil.java | 3 ++ .../domain/purchase/FakePurchaseManager.java | 5 +++ .../server/domain/user/small/UserTest.java | 2 +- 8 files changed, 58 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java index be2ca77f..534ba543 100644 --- a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java +++ b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java @@ -24,4 +24,5 @@ void handleAppleTransactionError(ResponseEntity respons void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO); + void refundAppleInApp(AppleNotificationPayloadVO payloadVO); } diff --git a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java index 307c94f9..7a6e7af7 100644 --- a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java +++ b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java @@ -3,6 +3,9 @@ import static com.yello.server.global.common.ErrorCode.APPLE_TOKEN_SERVER_EXCEPTION; import static com.yello.server.global.common.ErrorCode.GOOGLE_SUBSCRIPTIONS_SUBSCRIPTION_EXCEPTION; import static com.yello.server.global.common.ErrorCode.NOT_FOUND_TRANSACTION_EXCEPTION; +import static com.yello.server.global.common.util.ConstantUtil.REFUND_FIVE_TICKET; +import static com.yello.server.global.common.util.ConstantUtil.REFUND_ONE_TICKET; +import static com.yello.server.global.common.util.ConstantUtil.REFUND_TWO_TICKET; import com.fasterxml.jackson.databind.ObjectMapper; import com.yello.server.domain.purchase.dto.apple.AppleNotificationPayloadVO; @@ -68,7 +71,7 @@ public void handleAppleTransactionError(ResponseEntity @Override public AppleNotificationPayloadVO decodeApplePayload(String signedPayload) { - + Map jsonPayload = DecodeTokenFactory.decodeToken(signedPayload); ObjectMapper objectMapper = new ObjectMapper(); @@ -117,5 +120,35 @@ public void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO) { } } + @Override + public void refundAppleInApp(AppleNotificationPayloadVO payloadVO) { + String transactionId = + decodeAppleNotificationData(payloadVO.data().signedTransactionInfo()); + Purchase purchase = purchaseRepository.findByTransactionId(transactionId) + .orElseThrow(() -> new PurchaseNotFoundException(NOT_FOUND_TRANSACTION_EXCEPTION)); + User user = purchase.getUser(); + + switch (purchase.getProductType()) { + case YELLO_PLUS -> { + user.setSubscribe(Subscribe.NORMAL); + } + case ONE_TICKET -> { + validateTicketCount(REFUND_ONE_TICKET, user); + } + case TWO_TICKET -> { + validateTicketCount(REFUND_TWO_TICKET, user); + } + case FIVE_TICKET -> { + validateTicketCount(REFUND_FIVE_TICKET, user); + } + } + } + + public void validateTicketCount(int ticketCount, User user) { + if (user.getTicketCount() >= ticketCount) { + user.setTicketCount(-Math.abs(ticketCount)); + } + } + } diff --git a/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java b/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java index a7cccfe2..3e49e7eb 100644 --- a/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java +++ b/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java @@ -110,7 +110,7 @@ public void verifyAppleSubscriptionTransaction(Long userId, } purchaseManager.createSubscribe(user, Gateway.APPLE, request.transactionId()); - user.addTicketCount(3); + user.setTicketCount(3); } @Transactional @@ -126,17 +126,17 @@ public void verifyAppleTicketTransaction(Long userId, AppleTransaction request) case ONE_TICKET_ID: purchaseManager.createTicket(user, ProductType.ONE_TICKET, Gateway.APPLE, request.transactionId()); - user.addTicketCount(1); + user.setTicketCount(1); break; case TWO_TICKET_ID: purchaseManager.createTicket(user, ProductType.TWO_TICKET, Gateway.APPLE, request.transactionId()); - user.addTicketCount(2); + user.setTicketCount(2); break; case FIVE_TICKET_ID: purchaseManager.createTicket(user, ProductType.FIVE_TICKET, Gateway.APPLE, request.transactionId()); - user.addTicketCount(5); + user.setTicketCount(5); break; default: throw new PurchaseException(NOT_FOUND_TRANSACTION_EXCEPTION); @@ -206,7 +206,7 @@ public GoogleSubscriptionGetResponse verifyGoogleSubscriptionTransaction(Long us case ConstantUtil.GOOGLE_PURCHASE_SUBSCRIPTION_ACTIVE -> { final Purchase subscribe = purchaseManager.createSubscribe(user, Gateway.GOOGLE, request.orderId()); - user.addTicketCount(3); + user.setTicketCount(3); subscribe.setTransactionId(request.orderId()); } } @@ -259,7 +259,7 @@ public GoogleTicketGetResponse verifyGoogleTicketTransaction(Long userId, Purchase ticket = purchaseManager.createTicket(user, getProductType(request.productId()), Gateway.GOOGLE, request.orderId()); - user.addTicketCount(getTicketAmount(request.productId()) * request.quantity()); + user.setTicketCount(getTicketAmount(request.productId()) * request.quantity()); ticket.setTransactionId(inAppResponse.getBody().orderId()); } else { throw new GoogleBadRequestException(GOOGLE_INAPP_BAD_REQUEST_EXCEPTION); @@ -304,7 +304,7 @@ public void appleNotification(AppleNotificationRequest request) { purchaseManager.changeSubscriptionStatus(payloadVO); break; case APPLE_NOTIFICATION_REFUND: - System.out.println("dd"); + purchaseManager.refundAppleInApp(payloadVO); break; case APPLE_NOTIFICATION_TEST: return; diff --git a/src/main/java/com/yello/server/domain/user/entity/User.java b/src/main/java/com/yello/server/domain/user/entity/User.java index 003a638e..d433e453 100644 --- a/src/main/java/com/yello/server/domain/user/entity/User.java +++ b/src/main/java/com/yello/server/domain/user/entity/User.java @@ -7,6 +7,7 @@ import com.yello.server.domain.group.entity.School; import com.yello.server.global.common.dto.AuditingTimeEntity; import java.time.LocalDateTime; +import java.util.Objects; import javax.persistence.Column; import javax.persistence.Convert; import javax.persistence.Entity; @@ -121,7 +122,8 @@ public static User of(SignUpRequest signUpRequest, School group) { .group(group) .groupAdmissionYear(signUpRequest.groupAdmissionYear()) .email(signUpRequest.email()) - .deviceToken(signUpRequest.deviceToken().isEmpty() ? null : signUpRequest.deviceToken()) + .deviceToken(Objects.equals(signUpRequest.deviceToken(), "") ? null + : signUpRequest.deviceToken()) .subscribe(Subscribe.NORMAL) .ticketCount(0) .build(); @@ -166,7 +168,7 @@ public void increaseRecommendPoint() { } public void plusPoint(Integer point) { - if (this.getSubscribe() == Subscribe.NORMAL) { + if (this.getSubscribe()==Subscribe.NORMAL) { this.point += point; return; } @@ -182,7 +184,7 @@ public String getDeviceToken() { } public void setDeviceToken(String deviceToken) { - if (deviceToken.isEmpty()) { + if (Objects.equals(deviceToken, "")) { this.deviceToken = null; } else { this.deviceToken = deviceToken; @@ -193,7 +195,7 @@ public void setSubscribe(Subscribe subscribe) { this.subscribe = subscribe; } - public void addTicketCount(int ticketCount) { + public void setTicketCount(int ticketCount) { this.ticketCount += ticketCount; } diff --git a/src/main/java/com/yello/server/domain/vote/service/VoteService.java b/src/main/java/com/yello/server/domain/vote/service/VoteService.java index 4e893782..09f79756 100644 --- a/src/main/java/com/yello/server/domain/vote/service/VoteService.java +++ b/src/main/java/com/yello/server/domain/vote/service/VoteService.java @@ -195,7 +195,7 @@ public RevealFullNameResponse revealFullName(Long userId, Long voteId) { } vote.checkNameIndexOf(CHECK_FULL_NAME); - sender.addTicketCount(MINUS_TICKET_COUNT); + sender.setTicketCount(MINUS_TICKET_COUNT); return RevealFullNameResponse.of(vote.getSender()); } diff --git a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java index 0940bdb7..6c330fbd 100644 --- a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java +++ b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java @@ -54,6 +54,9 @@ public class ConstantUtil { public static final String APPLE_NOTIFICATION_TEST = "TEST"; public static final String APPLE_SUBTYPE_AUTO_RENEW_DISABLED = "AUTO_RENEW_DISABLED"; public static final String APPLE_SUBTYPE_VOLUNTARY = "VOLUNTARY"; + public static final int REFUND_ONE_TICKET = 1; + public static final int REFUND_TWO_TICKET = 2; + public static final int REFUND_FIVE_TICKET = 5; private ConstantUtil() { diff --git a/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java b/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java index cd1e7136..382dca89 100644 --- a/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java +++ b/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java @@ -67,4 +67,9 @@ public String decodeAppleNotificationData(String signedTransactionInfo) { public void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO) { } + + @Override + public void refundAppleInApp(AppleNotificationPayloadVO payloadVO) { + + } } diff --git a/src/test/java/com/yello/server/domain/user/small/UserTest.java b/src/test/java/com/yello/server/domain/user/small/UserTest.java index e58eeff1..acc3d969 100644 --- a/src/test/java/com/yello/server/domain/user/small/UserTest.java +++ b/src/test/java/com/yello/server/domain/user/small/UserTest.java @@ -137,7 +137,7 @@ void init() { assertThat(user.getTicketCount()).isZero(); // when - user.addTicketCount(10); + user.setTicketCount(10); // then assertThat(user.getTicketCount()).isEqualTo(10); From 99f2900dec8b8317f11810fb414bbdfc24d8a3b8 Mon Sep 17 00:00:00 2001 From: hyeonjeongs Date: Wed, 13 Sep 2023 13:08:03 +0900 Subject: [PATCH 3/4] =?UTF-8?q?YEL-155=20"Revert=20"YEL-155=20[feat]=20app?= =?UTF-8?q?le=20refund=20=EC=B2=98=EB=A6=AC""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit a49ba4a703d16be910ca05c15e79e53397719979. --- .../purchase/service/PurchaseManager.java | 1 + .../purchase/service/PurchaseManagerImpl.java | 35 ++++++++++++++++++- .../purchase/service/PurchaseService.java | 14 ++++---- .../yello/server/domain/user/entity/User.java | 7 ++-- .../domain/vote/service/VoteService.java | 2 +- .../global/common/util/ConstantUtil.java | 3 ++ .../domain/purchase/FakePurchaseManager.java | 5 +++ .../server/domain/user/small/UserTest.java | 2 +- 8 files changed, 56 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java index be2ca77f..534ba543 100644 --- a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java +++ b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java @@ -24,4 +24,5 @@ void handleAppleTransactionError(ResponseEntity respons void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO); + void refundAppleInApp(AppleNotificationPayloadVO payloadVO); } diff --git a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java index 307c94f9..7a6e7af7 100644 --- a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java +++ b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java @@ -3,6 +3,9 @@ import static com.yello.server.global.common.ErrorCode.APPLE_TOKEN_SERVER_EXCEPTION; import static com.yello.server.global.common.ErrorCode.GOOGLE_SUBSCRIPTIONS_SUBSCRIPTION_EXCEPTION; import static com.yello.server.global.common.ErrorCode.NOT_FOUND_TRANSACTION_EXCEPTION; +import static com.yello.server.global.common.util.ConstantUtil.REFUND_FIVE_TICKET; +import static com.yello.server.global.common.util.ConstantUtil.REFUND_ONE_TICKET; +import static com.yello.server.global.common.util.ConstantUtil.REFUND_TWO_TICKET; import com.fasterxml.jackson.databind.ObjectMapper; import com.yello.server.domain.purchase.dto.apple.AppleNotificationPayloadVO; @@ -68,7 +71,7 @@ public void handleAppleTransactionError(ResponseEntity @Override public AppleNotificationPayloadVO decodeApplePayload(String signedPayload) { - + Map jsonPayload = DecodeTokenFactory.decodeToken(signedPayload); ObjectMapper objectMapper = new ObjectMapper(); @@ -117,5 +120,35 @@ public void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO) { } } + @Override + public void refundAppleInApp(AppleNotificationPayloadVO payloadVO) { + String transactionId = + decodeAppleNotificationData(payloadVO.data().signedTransactionInfo()); + Purchase purchase = purchaseRepository.findByTransactionId(transactionId) + .orElseThrow(() -> new PurchaseNotFoundException(NOT_FOUND_TRANSACTION_EXCEPTION)); + User user = purchase.getUser(); + + switch (purchase.getProductType()) { + case YELLO_PLUS -> { + user.setSubscribe(Subscribe.NORMAL); + } + case ONE_TICKET -> { + validateTicketCount(REFUND_ONE_TICKET, user); + } + case TWO_TICKET -> { + validateTicketCount(REFUND_TWO_TICKET, user); + } + case FIVE_TICKET -> { + validateTicketCount(REFUND_FIVE_TICKET, user); + } + } + } + + public void validateTicketCount(int ticketCount, User user) { + if (user.getTicketCount() >= ticketCount) { + user.setTicketCount(-Math.abs(ticketCount)); + } + } + } diff --git a/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java b/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java index a7cccfe2..3e49e7eb 100644 --- a/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java +++ b/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java @@ -110,7 +110,7 @@ public void verifyAppleSubscriptionTransaction(Long userId, } purchaseManager.createSubscribe(user, Gateway.APPLE, request.transactionId()); - user.addTicketCount(3); + user.setTicketCount(3); } @Transactional @@ -126,17 +126,17 @@ public void verifyAppleTicketTransaction(Long userId, AppleTransaction request) case ONE_TICKET_ID: purchaseManager.createTicket(user, ProductType.ONE_TICKET, Gateway.APPLE, request.transactionId()); - user.addTicketCount(1); + user.setTicketCount(1); break; case TWO_TICKET_ID: purchaseManager.createTicket(user, ProductType.TWO_TICKET, Gateway.APPLE, request.transactionId()); - user.addTicketCount(2); + user.setTicketCount(2); break; case FIVE_TICKET_ID: purchaseManager.createTicket(user, ProductType.FIVE_TICKET, Gateway.APPLE, request.transactionId()); - user.addTicketCount(5); + user.setTicketCount(5); break; default: throw new PurchaseException(NOT_FOUND_TRANSACTION_EXCEPTION); @@ -206,7 +206,7 @@ public GoogleSubscriptionGetResponse verifyGoogleSubscriptionTransaction(Long us case ConstantUtil.GOOGLE_PURCHASE_SUBSCRIPTION_ACTIVE -> { final Purchase subscribe = purchaseManager.createSubscribe(user, Gateway.GOOGLE, request.orderId()); - user.addTicketCount(3); + user.setTicketCount(3); subscribe.setTransactionId(request.orderId()); } } @@ -259,7 +259,7 @@ public GoogleTicketGetResponse verifyGoogleTicketTransaction(Long userId, Purchase ticket = purchaseManager.createTicket(user, getProductType(request.productId()), Gateway.GOOGLE, request.orderId()); - user.addTicketCount(getTicketAmount(request.productId()) * request.quantity()); + user.setTicketCount(getTicketAmount(request.productId()) * request.quantity()); ticket.setTransactionId(inAppResponse.getBody().orderId()); } else { throw new GoogleBadRequestException(GOOGLE_INAPP_BAD_REQUEST_EXCEPTION); @@ -304,7 +304,7 @@ public void appleNotification(AppleNotificationRequest request) { purchaseManager.changeSubscriptionStatus(payloadVO); break; case APPLE_NOTIFICATION_REFUND: - System.out.println("dd"); + purchaseManager.refundAppleInApp(payloadVO); break; case APPLE_NOTIFICATION_TEST: return; diff --git a/src/main/java/com/yello/server/domain/user/entity/User.java b/src/main/java/com/yello/server/domain/user/entity/User.java index 4bcdf736..d433e453 100644 --- a/src/main/java/com/yello/server/domain/user/entity/User.java +++ b/src/main/java/com/yello/server/domain/user/entity/User.java @@ -122,7 +122,8 @@ public static User of(SignUpRequest signUpRequest, School group) { .group(group) .groupAdmissionYear(signUpRequest.groupAdmissionYear()) .email(signUpRequest.email()) - .deviceToken(Objects.equals(signUpRequest.deviceToken(), "") ? null : signUpRequest.deviceToken()) + .deviceToken(Objects.equals(signUpRequest.deviceToken(), "") ? null + : signUpRequest.deviceToken()) .subscribe(Subscribe.NORMAL) .ticketCount(0) .build(); @@ -167,7 +168,7 @@ public void increaseRecommendPoint() { } public void plusPoint(Integer point) { - if (this.getSubscribe() == Subscribe.NORMAL) { + if (this.getSubscribe()==Subscribe.NORMAL) { this.point += point; return; } @@ -194,7 +195,7 @@ public void setSubscribe(Subscribe subscribe) { this.subscribe = subscribe; } - public void addTicketCount(int ticketCount) { + public void setTicketCount(int ticketCount) { this.ticketCount += ticketCount; } diff --git a/src/main/java/com/yello/server/domain/vote/service/VoteService.java b/src/main/java/com/yello/server/domain/vote/service/VoteService.java index 4e893782..09f79756 100644 --- a/src/main/java/com/yello/server/domain/vote/service/VoteService.java +++ b/src/main/java/com/yello/server/domain/vote/service/VoteService.java @@ -195,7 +195,7 @@ public RevealFullNameResponse revealFullName(Long userId, Long voteId) { } vote.checkNameIndexOf(CHECK_FULL_NAME); - sender.addTicketCount(MINUS_TICKET_COUNT); + sender.setTicketCount(MINUS_TICKET_COUNT); return RevealFullNameResponse.of(vote.getSender()); } diff --git a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java index 0940bdb7..6c330fbd 100644 --- a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java +++ b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java @@ -54,6 +54,9 @@ public class ConstantUtil { public static final String APPLE_NOTIFICATION_TEST = "TEST"; public static final String APPLE_SUBTYPE_AUTO_RENEW_DISABLED = "AUTO_RENEW_DISABLED"; public static final String APPLE_SUBTYPE_VOLUNTARY = "VOLUNTARY"; + public static final int REFUND_ONE_TICKET = 1; + public static final int REFUND_TWO_TICKET = 2; + public static final int REFUND_FIVE_TICKET = 5; private ConstantUtil() { diff --git a/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java b/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java index cd1e7136..382dca89 100644 --- a/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java +++ b/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java @@ -67,4 +67,9 @@ public String decodeAppleNotificationData(String signedTransactionInfo) { public void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO) { } + + @Override + public void refundAppleInApp(AppleNotificationPayloadVO payloadVO) { + + } } diff --git a/src/test/java/com/yello/server/domain/user/small/UserTest.java b/src/test/java/com/yello/server/domain/user/small/UserTest.java index e58eeff1..acc3d969 100644 --- a/src/test/java/com/yello/server/domain/user/small/UserTest.java +++ b/src/test/java/com/yello/server/domain/user/small/UserTest.java @@ -137,7 +137,7 @@ void init() { assertThat(user.getTicketCount()).isZero(); // when - user.addTicketCount(10); + user.setTicketCount(10); // then assertThat(user.getTicketCount()).isEqualTo(10); From 012ee7304293a1c5a64fe2088c254523f64aa979 Mon Sep 17 00:00:00 2001 From: hyeonjeongs Date: Wed, 13 Sep 2023 13:16:16 +0900 Subject: [PATCH 4/4] =?UTF-8?q?YEL=3D162=20[revert]=20"Revert=20"YEL-162?= =?UTF-8?q?=20[feat]=20=ED=88=AC=ED=91=9C=20=EC=88=98=EC=A0=95=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B0=98=EC=98=81""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit d102181e5089353282f8934cffde1f2b0f278418. --- .../domain/friend/service/FriendService.java | 19 +--- .../dto/response/VoteAvailableResponse.java | 6 +- .../domain/vote/service/VoteManager.java | 4 + .../domain/vote/service/VoteManagerImpl.java | 32 ++++-- .../domain/vote/service/VoteService.java | 11 +- .../yello/server/global/common/ErrorCode.java | 2 +- .../global/common/util/ConstantUtil.java | 1 + .../friend/small/FriendServiceTest.java | 13 ++- .../server/domain/vote/FakeVoteManager.java | 16 ++- .../vote/medium/VoteControllerTest.java | 102 ++++++++++++------ 10 files changed, 137 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/yello/server/domain/friend/service/FriendService.java b/src/main/java/com/yello/server/domain/friend/service/FriendService.java index 9bcf881a..49e595cb 100644 --- a/src/main/java/com/yello/server/domain/friend/service/FriendService.java +++ b/src/main/java/com/yello/server/domain/friend/service/FriendService.java @@ -1,8 +1,6 @@ package com.yello.server.domain.friend.service; import static com.yello.server.global.common.ErrorCode.EXIST_FRIEND_EXCEPTION; -import static com.yello.server.global.common.ErrorCode.LACK_USER_EXCEPTION; -import static com.yello.server.global.common.util.ConstantUtil.RANDOM_COUNT; import static com.yello.server.global.common.util.ConstantUtil.YELLO_FEMALE; import static com.yello.server.global.common.util.ConstantUtil.YELLO_MALE; @@ -20,6 +18,7 @@ import com.yello.server.domain.user.entity.User; import com.yello.server.domain.user.repository.UserRepository; import com.yello.server.domain.vote.repository.VoteRepository; +import com.yello.server.domain.vote.service.VoteManager; import com.yello.server.global.common.factory.PaginationFactory; import java.lang.Character.UnicodeBlock; import java.util.ArrayList; @@ -43,6 +42,7 @@ public class FriendService { private final FriendRepository friendRepository; private final UserRepository userRepository; private final VoteRepository voteRepository; + private final VoteManager voteManager; public FriendsResponse findAllFriends(Pageable pageable, Long userId) { final Page friendsData = friendRepository.findAllFriendsByUserId(pageable, userId); @@ -77,20 +77,7 @@ public Friend addFriend(Long userId, Long targetId) { public List findShuffledFriend(Long userId) { final User user = userRepository.getById(userId); - final List friends = - new ArrayList<>(friendRepository.findAllByUserId(user.getId())); - List friendList = new ArrayList<>(friends); - - if (friendList.size() < RANDOM_COUNT) { - throw new FriendException(LACK_USER_EXCEPTION); - } - - Collections.shuffle(friendList); - - return friendList.stream() - .map(FriendShuffleResponse::of) - .limit(RANDOM_COUNT) - .toList(); + return voteManager.getShuffledFriends(user); } public RecommendFriendResponse findAllRecommendSchoolFriends(Pageable pageable, Long userId) { diff --git a/src/main/java/com/yello/server/domain/vote/dto/response/VoteAvailableResponse.java b/src/main/java/com/yello/server/domain/vote/dto/response/VoteAvailableResponse.java index 9f7ecaef..440e0f5d 100644 --- a/src/main/java/com/yello/server/domain/vote/dto/response/VoteAvailableResponse.java +++ b/src/main/java/com/yello/server/domain/vote/dto/response/VoteAvailableResponse.java @@ -13,14 +13,16 @@ public record VoteAvailableResponse( Boolean isPossible, Integer point, - String createdAt + String createdAt, + Integer friendStatus ) { - public static VoteAvailableResponse of(User user, Cooldown cooldown) { + public static VoteAvailableResponse of(User user, Cooldown cooldown, Integer friendStatus) { return VoteAvailableResponse.builder() .isPossible(cooldown.isPossible()) .point(user.getPoint()) .createdAt(toDateFormattedString(cooldown.getCreatedAt())) + .friendStatus(friendStatus) .build(); } diff --git a/src/main/java/com/yello/server/domain/vote/service/VoteManager.java b/src/main/java/com/yello/server/domain/vote/service/VoteManager.java index 97566820..39a8a2ef 100644 --- a/src/main/java/com/yello/server/domain/vote/service/VoteManager.java +++ b/src/main/java/com/yello/server/domain/vote/service/VoteManager.java @@ -1,5 +1,6 @@ package com.yello.server.domain.vote.service; +import com.yello.server.domain.friend.dto.response.FriendShuffleResponse; import com.yello.server.domain.keyword.dto.response.KeywordCheckResponse; import com.yello.server.domain.question.dto.response.QuestionForVoteResponse; import com.yello.server.domain.question.entity.Question; @@ -19,4 +20,7 @@ public interface VoteManager { KeywordCheckResponse useKeywordHint(User user, Vote vote); void makeGreetingVote(User user); + + List getShuffledFriends(User user); + } diff --git a/src/main/java/com/yello/server/domain/vote/service/VoteManagerImpl.java b/src/main/java/com/yello/server/domain/vote/service/VoteManagerImpl.java index d524b1a0..ab6c4978 100644 --- a/src/main/java/com/yello/server/domain/vote/service/VoteManagerImpl.java +++ b/src/main/java/com/yello/server/domain/vote/service/VoteManagerImpl.java @@ -3,10 +3,12 @@ import static com.yello.server.global.common.ErrorCode.DUPLICATE_VOTE_EXCEPTION; import static com.yello.server.global.common.ErrorCode.INVALID_VOTE_EXCEPTION; import static com.yello.server.global.common.ErrorCode.LACK_POINT_EXCEPTION; +import static com.yello.server.global.common.ErrorCode.LACK_USER_EXCEPTION; import static com.yello.server.global.common.factory.WeightedRandomFactory.randomPoint; import static com.yello.server.global.common.util.ConstantUtil.KEYWORD_HINT_POINT; import static com.yello.server.global.common.util.ConstantUtil.NAME_HINT_DEFAULT; import static com.yello.server.global.common.util.ConstantUtil.NAME_HINT_POINT; +import static com.yello.server.global.common.util.ConstantUtil.NO_FRIEND_COUNT; import static com.yello.server.global.common.util.ConstantUtil.RANDOM_COUNT; import static com.yello.server.global.common.util.ConstantUtil.VOTE_COUNT; import static com.yello.server.global.common.util.ConstantUtil.YELLO_FEMALE; @@ -14,6 +16,7 @@ import com.yello.server.domain.friend.dto.response.FriendShuffleResponse; import com.yello.server.domain.friend.entity.Friend; +import com.yello.server.domain.friend.exception.FriendException; import com.yello.server.domain.friend.repository.FriendRepository; import com.yello.server.domain.keyword.dto.response.KeywordCheckResponse; import com.yello.server.domain.keyword.entity.Keyword; @@ -107,11 +110,11 @@ public List generateVoteQuestion(User user, List voteAnswers) { - return index > 0 && voteAnswers.get(index - 1).questionId() - .equals(voteAnswers.get(index).questionId()); - } - - private List getShuffledFriends(User user) { + @Override + public List getShuffledFriends(User user) { List uuidList = Arrays.asList(YELLO_FEMALE, YELLO_MALE); final List friends = friendRepository.findAllByUserIdNotIn(user.getId(), uuidList); List friendList = new ArrayList<>(friends); Collections.shuffle(friendList); + if (friends.size()==NO_FRIEND_COUNT) { + throw new FriendException(LACK_USER_EXCEPTION); + } + + if (friends.size() > NO_FRIEND_COUNT && friends.size() < RANDOM_COUNT) { + return friendList.stream() + .map(FriendShuffleResponse::of) + .toList(); + } + return friendList.stream() .map(FriendShuffleResponse::of) .limit(RANDOM_COUNT) .toList(); } + private boolean isDuplicatedVote(int index, List voteAnswers) { + return index > 0 && voteAnswers.get(index - 1).questionId() + .equals(voteAnswers.get(index).questionId()); + } + private List getShuffledKeywords(Question question) { final List keywords = question.getKeywordList(); List keywordList = new ArrayList<>(keywords); diff --git a/src/main/java/com/yello/server/domain/vote/service/VoteService.java b/src/main/java/com/yello/server/domain/vote/service/VoteService.java index 09f79756..8ba3c12c 100644 --- a/src/main/java/com/yello/server/domain/vote/service/VoteService.java +++ b/src/main/java/com/yello/server/domain/vote/service/VoteService.java @@ -9,6 +9,7 @@ import static com.yello.server.global.common.util.ConstantUtil.CHECK_FULL_NAME; import static com.yello.server.global.common.util.ConstantUtil.COOL_DOWN_TIME; import static com.yello.server.global.common.util.ConstantUtil.MINUS_TICKET_COUNT; +import static com.yello.server.global.common.util.ConstantUtil.NO_FRIEND_COUNT; import static com.yello.server.global.common.util.ConstantUtil.RANDOM_COUNT; import com.yello.server.domain.cooldown.entity.Cooldown; @@ -122,7 +123,7 @@ public List findVoteQuestionList(Long userId) { final User user = userRepository.getById(userId); final List friends = friendRepository.findAllByUserId(user.getId()); - if (friends.size() < RANDOM_COUNT) { + if (friends.size()==NO_FRIEND_COUNT) { throw new FriendException(LACK_USER_EXCEPTION); } @@ -144,14 +145,18 @@ public VoteAvailableResponse checkVoteAvailable(Long userId) { final String messageId = UUID.randomUUID().toString(); final List friends = friendRepository.findAllByUserId(user.getId()); - if (friends.size() < RANDOM_COUNT) { + if (friends.size()==NO_FRIEND_COUNT) { throw new FriendException(LACK_USER_EXCEPTION); } final Cooldown cooldown = cooldownRepository.findByUserId(user.getId()) .orElse(Cooldown.of(user, messageId, minusTime(LocalDateTime.now(), COOL_DOWN_TIME))); - return VoteAvailableResponse.of(user, cooldown); + if (friends.size() > NO_FRIEND_COUNT && friends.size() < RANDOM_COUNT) { + return VoteAvailableResponse.of(user, cooldown, 0); + } + + return VoteAvailableResponse.of(user, cooldown, 1); } @Transactional diff --git a/src/main/java/com/yello/server/global/common/ErrorCode.java b/src/main/java/com/yello/server/global/common/ErrorCode.java index de645c5b..f60c887c 100644 --- a/src/main/java/com/yello/server/global/common/ErrorCode.java +++ b/src/main/java/com/yello/server/global/common/ErrorCode.java @@ -22,7 +22,7 @@ public enum ErrorCode { REQUEST_VALIDATION_EXCEPTION(BAD_REQUEST, "잘못된 요청입니다."), YELLOID_REQUIRED_EXCEPTION(BAD_REQUEST, "쿼리 스트링에 yelloId를 포함해야 합니다."), OAUTH_ACCESS_TOKEN_REQUIRED_EXCEPTION(BAD_REQUEST, "소셜 액세스 토큰이 없습니다."), - LACK_USER_EXCEPTION(BAD_REQUEST, "친구가 4명 이하입니다."), + LACK_USER_EXCEPTION(BAD_REQUEST, "친구가 부족합니다."), SIGNIN_FIELD_REQUIRED_EXCEPTION(BAD_REQUEST, "회원가입에 필요한 값이 없습니다."), FIELD_REQUIRED_EXCEPTION(BAD_REQUEST, "필요한 값이 없습니다."), INVALID_VOTE_EXCEPTION(BAD_REQUEST, "이미 공개한 투표입니다"), diff --git a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java index 6c330fbd..f4ca3b48 100644 --- a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java +++ b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java @@ -57,6 +57,7 @@ public class ConstantUtil { public static final int REFUND_ONE_TICKET = 1; public static final int REFUND_TWO_TICKET = 2; public static final int REFUND_FIVE_TICKET = 5; + public static final int NO_FRIEND_COUNT = 0; private ConstantUtil() { diff --git a/src/test/java/com/yello/server/domain/friend/small/FriendServiceTest.java b/src/test/java/com/yello/server/domain/friend/small/FriendServiceTest.java index 3378e964..235e82bd 100644 --- a/src/test/java/com/yello/server/domain/friend/small/FriendServiceTest.java +++ b/src/test/java/com/yello/server/domain/friend/small/FriendServiceTest.java @@ -18,12 +18,16 @@ import com.yello.server.domain.friend.service.FriendService; import com.yello.server.domain.question.FakeQuestionRepository; import com.yello.server.domain.question.repository.QuestionRepository; +import com.yello.server.domain.user.FakeUserManager; import com.yello.server.domain.user.FakeUserRepository; import com.yello.server.domain.user.entity.User; import com.yello.server.domain.user.exception.UserNotFoundException; import com.yello.server.domain.user.repository.UserRepository; +import com.yello.server.domain.user.service.UserManager; +import com.yello.server.domain.vote.FakeVoteManager; import com.yello.server.domain.vote.FakeVoteRepository; import com.yello.server.domain.vote.repository.VoteRepository; +import com.yello.server.domain.vote.service.VoteManager; import com.yello.server.util.TestDataRepositoryUtil; import java.util.List; import java.util.Optional; @@ -42,6 +46,10 @@ class FriendServiceTest { private final FriendRepository friendRepository = new FakeFriendRepository(); private final VoteRepository voteRepository = new FakeVoteRepository(); private final QuestionRepository questionRepository = new FakeQuestionRepository(); + private final UserManager userManager = new FakeUserManager(userRepository); + private final VoteManager voteManager = + new FakeVoteManager(userRepository, questionRepository, voteRepository, friendRepository, + userManager); private final TestDataRepositoryUtil testDataUtil = new TestDataRepositoryUtil( userRepository, voteRepository, @@ -62,6 +70,7 @@ void init() { .userRepository(userRepository) .friendRepository(friendRepository) .voteRepository(voteRepository) + .voteManager(voteManager) .build(); user1 = testDataUtil.generateUser(1L, 1L); @@ -163,13 +172,13 @@ void init() { @Test void 친구_셔플_시_친구_수가_부족한_경우에_FriendException이_발생합니다() { // given - final Long userId = 1L; + final Long userId = 3L; // when // then assertThatThrownBy(() -> friendService.findShuffledFriend(userId)) .isInstanceOf(FriendException.class) - .hasMessageContaining("[FriendException] 친구가 4명 이하입니다."); + .hasMessageContaining("[FriendException] 친구가 부족합니다."); } @Test diff --git a/src/test/java/com/yello/server/domain/vote/FakeVoteManager.java b/src/test/java/com/yello/server/domain/vote/FakeVoteManager.java index deadc264..e57e425c 100644 --- a/src/test/java/com/yello/server/domain/vote/FakeVoteManager.java +++ b/src/test/java/com/yello/server/domain/vote/FakeVoteManager.java @@ -3,15 +3,18 @@ import static com.yello.server.global.common.ErrorCode.DUPLICATE_VOTE_EXCEPTION; import static com.yello.server.global.common.ErrorCode.INVALID_VOTE_EXCEPTION; import static com.yello.server.global.common.ErrorCode.LACK_POINT_EXCEPTION; +import static com.yello.server.global.common.ErrorCode.LACK_USER_EXCEPTION; import static com.yello.server.global.common.factory.WeightedRandomFactory.randomPoint; import static com.yello.server.global.common.util.ConstantUtil.KEYWORD_HINT_POINT; import static com.yello.server.global.common.util.ConstantUtil.NAME_HINT_DEFAULT; import static com.yello.server.global.common.util.ConstantUtil.NAME_HINT_POINT; +import static com.yello.server.global.common.util.ConstantUtil.NO_FRIEND_COUNT; import static com.yello.server.global.common.util.ConstantUtil.RANDOM_COUNT; import static com.yello.server.global.common.util.ConstantUtil.VOTE_COUNT; import com.yello.server.domain.friend.dto.response.FriendShuffleResponse; import com.yello.server.domain.friend.entity.Friend; +import com.yello.server.domain.friend.exception.FriendException; import com.yello.server.domain.friend.repository.FriendRepository; import com.yello.server.domain.keyword.dto.response.KeywordCheckResponse; import com.yello.server.domain.keyword.entity.Keyword; @@ -163,11 +166,22 @@ private boolean isDuplicatedVote(int index, List voteAnswers) { .equals(voteAnswers.get(index).questionId()); } - private List getShuffledFriends(User user) { + @Override + public List getShuffledFriends(User user) { final List friends = friendRepository.findAllByUserId(user.getId()); List friendList = new ArrayList<>(friends); Collections.shuffle(friendList); + if (friends.size()==NO_FRIEND_COUNT) { + throw new FriendException(LACK_USER_EXCEPTION); + } + + if (friends.size() > NO_FRIEND_COUNT && friends.size() < RANDOM_COUNT) { + return friendList.stream() + .map(FriendShuffleResponse::of) + .toList(); + } + return friendList.stream() .map(FriendShuffleResponse::of) .limit(RANDOM_COUNT) diff --git a/src/test/java/com/yello/server/domain/vote/medium/VoteControllerTest.java b/src/test/java/com/yello/server/domain/vote/medium/VoteControllerTest.java index da193725..7d2f2ffb 100644 --- a/src/test/java/com/yello/server/domain/vote/medium/VoteControllerTest.java +++ b/src/test/java/com/yello/server/domain/vote/medium/VoteControllerTest.java @@ -83,8 +83,9 @@ class VoteControllerTest { final String[] excludeRequestHeaders = {"X-CSRF-TOKEN", "Host"}; - final String[] excludeResponseHeaders = {"X-Content-Type-Options", "X-XSS-Protection", "Cache-Control", "Pragma", - "Expires", "X-Frame-Options", "Content-Length"}; + final String[] excludeResponseHeaders = + {"X-Content-Type-Options", "X-XSS-Protection", "Cache-Control", "Pragma", + "Expires", "X-Frame-Options", "Content-Length"}; @Autowired private MockMvc mockMvc; @@ -111,10 +112,12 @@ void init() { @Test void 내_투표_전체_조회에_성공합니다() throws Exception { // given - final Vote vote = testDataUtil.generateVote(1L, user, target, testDataUtil.generateQuestion(1L)); + final Vote vote = + testDataUtil.generateVote(1L, user, target, testDataUtil.generateQuestion(1L)); final VoteResponse voteResponse = VoteResponse.of(vote); final VoteCountVO voteCountVO = VoteCountVO.of(1, 0, 0, 0, 0); - final VoteListResponse voteListResponse = VoteListResponse.of(voteCountVO, Arrays.asList(voteResponse), user); + final VoteListResponse voteListResponse = + VoteListResponse.of(voteCountVO, Arrays.asList(voteResponse), user); given(voteService.findAllVotes(anyLong(), any(Pageable.class))) .willReturn(voteListResponse); @@ -126,8 +129,10 @@ void init() { .param("page", "0")) .andDo(print()) .andDo(document("api/v1/vote/findAllMyVotes", - Preprocessors.preprocessRequest(prettyPrint(), removeHeaders(excludeRequestHeaders)), - Preprocessors.preprocessResponse(prettyPrint(), removeHeaders(excludeResponseHeaders)), + Preprocessors.preprocessRequest(prettyPrint(), + removeHeaders(excludeRequestHeaders)), + Preprocessors.preprocessResponse(prettyPrint(), + removeHeaders(excludeResponseHeaders)), requestParameters(parameterWithName("page").description("페이지네이션 페이지 번호"))) ) .andExpect(MockMvcResultMatchers.status().isOk()); @@ -148,8 +153,10 @@ void init() { ) .andDo(print()) .andDo(document("api/v1/vote/getUnreadVoteCount", - Preprocessors.preprocessRequest(prettyPrint(), removeHeaders(excludeRequestHeaders)), - Preprocessors.preprocessResponse(prettyPrint(), removeHeaders(excludeResponseHeaders))) + Preprocessors.preprocessRequest(prettyPrint(), + removeHeaders(excludeRequestHeaders)), + Preprocessors.preprocessResponse(prettyPrint(), + removeHeaders(excludeResponseHeaders))) ) .andExpect(MockMvcResultMatchers.status().isOk()); } @@ -157,9 +164,11 @@ void init() { @Test void 친구_투표_조회에_성공합니다() throws Exception { // given - final Vote vote = testDataUtil.generateVote(1L, user, target, testDataUtil.generateQuestion(1L)); + final Vote vote = + testDataUtil.generateVote(1L, user, target, testDataUtil.generateQuestion(1L)); final VoteFriendVO voteFriendVO = VoteFriendVO.of(vote); - final VoteFriendResponse voteFriendResponse = VoteFriendResponse.of(1, Arrays.asList(voteFriendVO)); + final VoteFriendResponse voteFriendResponse = + VoteFriendResponse.of(1, Arrays.asList(voteFriendVO)); given(voteService.findAllFriendVotes(anyLong(), any(Pageable.class))) .willReturn(voteFriendResponse); @@ -171,8 +180,10 @@ void init() { .param("page", "0")) .andDo(print()) .andDo(document("api/v1/vote/findAllFriendVotes", - Preprocessors.preprocessRequest(prettyPrint(), removeHeaders(excludeRequestHeaders)), - Preprocessors.preprocessResponse(prettyPrint(), removeHeaders(excludeResponseHeaders)), + Preprocessors.preprocessRequest(prettyPrint(), + removeHeaders(excludeRequestHeaders)), + Preprocessors.preprocessResponse(prettyPrint(), + removeHeaders(excludeResponseHeaders)), requestParameters(parameterWithName("page").description("페이지네이션 페이지 번호"))) ) .andExpect(MockMvcResultMatchers.status().isOk()); @@ -181,7 +192,8 @@ void init() { @Test void 투표_상세_조회에_성공합니다() throws Exception { // given - final Vote vote = testDataUtil.generateVote(1L, user, target, testDataUtil.generateQuestion(1L)); + final Vote vote = + testDataUtil.generateVote(1L, user, target, testDataUtil.generateQuestion(1L)); final VoteDetailResponse voteDetailResponse = VoteDetailResponse.of(vote, user); given(voteService.findVoteById(anyLong(), anyLong())) @@ -194,8 +206,10 @@ void init() { ) .andDo(print()) .andDo(document("api/v1/vote/findVoteById", - Preprocessors.preprocessRequest(prettyPrint(), removeHeaders(excludeRequestHeaders)), - Preprocessors.preprocessResponse(prettyPrint(), removeHeaders(excludeResponseHeaders)), + Preprocessors.preprocessRequest(prettyPrint(), + removeHeaders(excludeRequestHeaders)), + Preprocessors.preprocessResponse(prettyPrint(), + removeHeaders(excludeResponseHeaders)), pathParameters(parameterWithName("voteId").description("투표 아이디 값"))) ) .andExpect(MockMvcResultMatchers.status().isOk()); @@ -204,7 +218,8 @@ void init() { @Test void 키워드_확인에_성공합니다() throws Exception { // given - final Vote vote = testDataUtil.generateVote(1L, user, target, testDataUtil.generateQuestion(1L)); + final Vote vote = + testDataUtil.generateVote(1L, user, target, testDataUtil.generateQuestion(1L)); final KeywordCheckResponse keywordCheckResponse = KeywordCheckResponse.of(vote); given(voteService.checkKeyword(anyLong(), anyLong())) @@ -218,8 +233,10 @@ void init() { ) .andDo(print()) .andDo(document("api/v1/vote/checkKeyword", - Preprocessors.preprocessRequest(prettyPrint(), removeHeaders(excludeRequestHeaders)), - Preprocessors.preprocessResponse(prettyPrint(), removeHeaders(excludeResponseHeaders)), + Preprocessors.preprocessRequest(prettyPrint(), + removeHeaders(excludeRequestHeaders)), + Preprocessors.preprocessResponse(prettyPrint(), + removeHeaders(excludeResponseHeaders)), pathParameters(parameterWithName("voteId").description("투표 아이디 값"))) ) .andExpect(MockMvcResultMatchers.status().isOk()); @@ -229,7 +246,8 @@ void init() { void 투표_8개_조회에_성공합니다() throws Exception { // given final Friend friend = testDataUtil.generateFriend(user, target); - final List friendShuffleResponses = Arrays.asList(FriendShuffleResponse.of(friend)); + final List friendShuffleResponses = + Arrays.asList(FriendShuffleResponse.of(friend)); final List keywordList = Arrays.asList("A", "B", "C", "D"); final QuestionVO questionVO = QuestionVO.of(testDataUtil.generateQuestion(1L)); final QuestionForVoteResponse questionForVoteResponse = QuestionForVoteResponse.builder() @@ -250,8 +268,10 @@ void init() { ) .andDo(print()) .andDo(document("api/v1/vote/findVoteQuestions", - Preprocessors.preprocessRequest(prettyPrint(), removeHeaders(excludeRequestHeaders)), - Preprocessors.preprocessResponse(prettyPrint(), removeHeaders(excludeResponseHeaders))) + Preprocessors.preprocessRequest(prettyPrint(), + removeHeaders(excludeRequestHeaders)), + Preprocessors.preprocessResponse(prettyPrint(), + removeHeaders(excludeResponseHeaders))) ) .andExpect(MockMvcResultMatchers.status().isOk()); } @@ -259,8 +279,10 @@ void init() { @Test void 투표_가능_여부_조회에_성공합니다() throws Exception { // given - final Cooldown cooldown = Cooldown.of(user, UUID.randomUUID().toString(), LocalDateTime.now()); - final VoteAvailableResponse voteAvailableResponse = VoteAvailableResponse.of(user, cooldown); + final Cooldown cooldown = + Cooldown.of(user, UUID.randomUUID().toString(), LocalDateTime.now()); + final VoteAvailableResponse voteAvailableResponse = + VoteAvailableResponse.of(user, cooldown, 1); given(voteService.checkVoteAvailable(anyLong())) .willReturn(voteAvailableResponse); @@ -272,8 +294,10 @@ void init() { ) .andDo(print()) .andDo(document("api/v1/vote/checkVoteAvailable", - Preprocessors.preprocessRequest(prettyPrint(), removeHeaders(excludeRequestHeaders)), - Preprocessors.preprocessResponse(prettyPrint(), removeHeaders(excludeResponseHeaders))) + Preprocessors.preprocessRequest(prettyPrint(), + removeHeaders(excludeRequestHeaders)), + Preprocessors.preprocessResponse(prettyPrint(), + removeHeaders(excludeResponseHeaders))) ) .andExpect(MockMvcResultMatchers.status().isOk()); } @@ -281,7 +305,8 @@ void init() { @Test void 투표_생성에_성공합니다() throws Exception { // given - final Vote vote = testDataUtil.generateVote(1L, user, target, testDataUtil.generateQuestion(1L)); + final Vote vote = + testDataUtil.generateVote(1L, user, target, testDataUtil.generateQuestion(1L)); final VoteCreateVO voteCreateVO = VoteCreateVO.of(10, Arrays.asList(vote)); final VoteCreateResponse voteCreateResponse = VoteCreateResponse.of(10); final VoteAnswer voteAnswer = VoteAnswer.builder() @@ -312,8 +337,10 @@ void init() { .content(objectMapper.writeValueAsString(createVoteRequest))) .andDo(print()) .andDo(document("api/v1/vote/createVote", - Preprocessors.preprocessRequest(prettyPrint(), removeHeaders(excludeRequestHeaders)), - Preprocessors.preprocessResponse(prettyPrint(), removeHeaders(excludeResponseHeaders))) + Preprocessors.preprocessRequest(prettyPrint(), + removeHeaders(excludeRequestHeaders)), + Preprocessors.preprocessResponse(prettyPrint(), + removeHeaders(excludeResponseHeaders))) ) .andExpect(MockMvcResultMatchers.status().isOk()); } @@ -335,8 +362,10 @@ void init() { ) .andDo(print()) .andDo(document("api/v1/vote/revealNameHint", - Preprocessors.preprocessRequest(prettyPrint(), removeHeaders(excludeRequestHeaders)), - Preprocessors.preprocessResponse(prettyPrint(), removeHeaders(excludeResponseHeaders)), + Preprocessors.preprocessRequest(prettyPrint(), + removeHeaders(excludeRequestHeaders)), + Preprocessors.preprocessResponse(prettyPrint(), + removeHeaders(excludeResponseHeaders)), pathParameters(parameterWithName("voteId").description("투표 아이디 값"))) ) .andExpect(MockMvcResultMatchers.status().isOk()); @@ -353,14 +382,17 @@ void init() { // when // then - mockMvc.perform(RestDocumentationRequestBuilders.patch("/api/v1/vote/{voteId}/fullname", voteId) - .header(HttpHeaders.AUTHORIZATION, "Bearer your-access-token") - .with(csrf().asHeader()) + mockMvc.perform( + RestDocumentationRequestBuilders.patch("/api/v1/vote/{voteId}/fullname", voteId) + .header(HttpHeaders.AUTHORIZATION, "Bearer your-access-token") + .with(csrf().asHeader()) ) .andDo(print()) .andDo(document("api/v1/vote/revealFullName", - Preprocessors.preprocessRequest(prettyPrint(), removeHeaders(excludeRequestHeaders)), - Preprocessors.preprocessResponse(prettyPrint(), removeHeaders(excludeResponseHeaders)), + Preprocessors.preprocessRequest(prettyPrint(), + removeHeaders(excludeRequestHeaders)), + Preprocessors.preprocessResponse(prettyPrint(), + removeHeaders(excludeResponseHeaders)), pathParameters(parameterWithName("voteId").description("투표 아이디 값"))) ) .andExpect(MockMvcResultMatchers.status().isOk());