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 534ba543..c236c4eb 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 @@ -6,6 +6,7 @@ import com.yello.server.domain.purchase.entity.ProductType; import com.yello.server.domain.purchase.entity.Purchase; import com.yello.server.domain.user.entity.User; +import com.yello.server.infrastructure.slack.dto.response.SlackAppleNotificationResponse; import org.springframework.http.ResponseEntity; public interface PurchaseManager { @@ -20,9 +21,11 @@ void handleAppleTransactionError(ResponseEntity respons AppleNotificationPayloadVO decodeApplePayload(String signedPayload); - String decodeAppleNotificationData(String signedTransactionInfo); + Purchase decodeAppleNotificationData(String signedTransactionInfo); void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO); void refundAppleInApp(AppleNotificationPayloadVO payloadVO); + + SlackAppleNotificationResponse checkPurchaseDataByAppleSignedPayload(String payload); } 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 67353feb..2dba851c 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 @@ -24,6 +24,7 @@ import com.yello.server.global.common.factory.DecodeTokenFactory; import com.yello.server.global.common.factory.TokenFactory; import com.yello.server.global.common.util.ConstantUtil; +import com.yello.server.infrastructure.slack.dto.response.SlackAppleNotificationResponse; import java.util.Map; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -91,7 +92,7 @@ public AppleNotificationPayloadVO decodeApplePayload(String signedPayload) { } @Override - public String decodeAppleNotificationData(String signedTransactionInfo) { + public Purchase decodeAppleNotificationData(String signedTransactionInfo) { Map decodeToken = DecodeTokenFactory.decodeToken(signedTransactionInfo); String decodeTransactionId = decodeToken.get("transactionId").toString(); @@ -99,14 +100,15 @@ public String decodeAppleNotificationData(String signedTransactionInfo) { Purchase purchase = purchaseRepository.findByTransactionId(decodeTransactionId) .orElseThrow(() -> new PurchaseConflictException(NOT_FOUND_TRANSACTION_EXCEPTION)); - return purchase.getTransactionId(); + return purchase; } @Override public void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO) { String transactionId = - decodeAppleNotificationData(payloadVO.data().signedTransactionInfo()); + decodeAppleNotificationData( + payloadVO.data().signedTransactionInfo()).getTransactionId(); Purchase purchase = purchaseRepository.findByTransactionId(transactionId) .orElseThrow(() -> new PurchaseNotFoundException(NOT_FOUND_TRANSACTION_EXCEPTION)); @@ -121,7 +123,8 @@ public void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO) { @Override public void refundAppleInApp(AppleNotificationPayloadVO payloadVO) { String transactionId = - decodeAppleNotificationData(payloadVO.data().signedTransactionInfo()); + decodeAppleNotificationData( + payloadVO.data().signedTransactionInfo()).getTransactionId(); Purchase purchase = purchaseRepository.findByTransactionId(transactionId) .orElseThrow(() -> new PurchaseNotFoundException(NOT_FOUND_TRANSACTION_EXCEPTION)); User user = purchase.getUser(); @@ -142,6 +145,14 @@ public void refundAppleInApp(AppleNotificationPayloadVO payloadVO) { } } + @Override + public SlackAppleNotificationResponse checkPurchaseDataByAppleSignedPayload(String payload) { + AppleNotificationPayloadVO payloadVO = decodeApplePayload(payload); + Purchase purchase = decodeAppleNotificationData(payloadVO.data().signedTransactionInfo()); + + return SlackAppleNotificationResponse.of(payloadVO, purchase); + } + public void validateTicketCount(int ticketCount, User user) { if (user.getTicketCount() >= ticketCount) { user.addTicketCount(-Math.abs(ticketCount)); diff --git a/src/main/java/com/yello/server/infrastructure/slack/dto/response/SlackAppleNotificationResponse.java b/src/main/java/com/yello/server/infrastructure/slack/dto/response/SlackAppleNotificationResponse.java new file mode 100644 index 00000000..1c42f0fb --- /dev/null +++ b/src/main/java/com/yello/server/infrastructure/slack/dto/response/SlackAppleNotificationResponse.java @@ -0,0 +1,30 @@ +package com.yello.server.infrastructure.slack.dto.response; + +import com.yello.server.domain.purchase.dto.apple.AppleNotificationPayloadVO; +import com.yello.server.domain.purchase.entity.Purchase; +import lombok.Builder; + +@Builder +public record SlackAppleNotificationResponse( + String notificationType, + String subtype, + String transactionId, + Long userId, + String userName, + String yelloId + +) { + + public static SlackAppleNotificationResponse of(AppleNotificationPayloadVO payloadVO, + Purchase purchase) { + return SlackAppleNotificationResponse.builder() + .notificationType(payloadVO.notificationType()) + .subtype(payloadVO.subtype()) + .transactionId(purchase.getTransactionId()) + .userId(purchase.getUser().getId()) + .userName(purchase.getUser().getName()) + .yelloId(purchase.getUser().getYelloId()) + .build(); + } + +} diff --git a/src/main/java/com/yello/server/infrastructure/slack/factory/SlackWebhookMessageFactory.java b/src/main/java/com/yello/server/infrastructure/slack/factory/SlackWebhookMessageFactory.java index 155cb1a0..8d164f94 100644 --- a/src/main/java/com/yello/server/infrastructure/slack/factory/SlackWebhookMessageFactory.java +++ b/src/main/java/com/yello/server/infrastructure/slack/factory/SlackWebhookMessageFactory.java @@ -3,11 +3,11 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.yello.server.domain.authorization.service.TokenProvider; -import com.yello.server.domain.purchase.dto.apple.AppleNotificationPayloadVO; import com.yello.server.domain.purchase.service.PurchaseManager; import com.yello.server.domain.user.entity.User; import com.yello.server.domain.user.repository.UserRepository; import com.yello.server.global.common.factory.TimeFactory; +import com.yello.server.infrastructure.slack.dto.response.SlackAppleNotificationResponse; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -241,8 +241,10 @@ private String generateSlackAppleNotificationRequestField( } catch (Exception e) { e.printStackTrace(); } - AppleNotificationPayloadVO payloadVO = purchaseManager.decodeApplePayload(payload[0]); - return payloadVO.toString(); + SlackAppleNotificationResponse response = + purchaseManager.checkPurchaseDataByAppleSignedPayload(payload[0]); + + return response.toString(); } } 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 382dca89..fc372194 100644 --- a/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java +++ b/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java @@ -14,6 +14,7 @@ import com.yello.server.domain.purchase.service.PurchaseManager; import com.yello.server.domain.user.entity.Subscribe; import com.yello.server.domain.user.entity.User; +import com.yello.server.infrastructure.slack.dto.response.SlackAppleNotificationResponse; import org.springframework.http.ResponseEntity; public class FakePurchaseManager implements PurchaseManager { @@ -59,7 +60,7 @@ public AppleNotificationPayloadVO decodeApplePayload(String signedPayload) { } @Override - public String decodeAppleNotificationData(String signedTransactionInfo) { + public Purchase decodeAppleNotificationData(String signedTransactionInfo) { return null; } @@ -72,4 +73,9 @@ public void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO) { public void refundAppleInApp(AppleNotificationPayloadVO payloadVO) { } + + @Override + public SlackAppleNotificationResponse checkPurchaseDataByAppleSignedPayload(String payload) { + return null; + } }