From d4b9fe81068316f8ef925f158e7df0f490367fd2 Mon Sep 17 00:00:00 2001
From: binchoo <079111w@gmail.com>
Date: Sat, 2 Jul 2022 17:08:04 +0900
Subject: [PATCH] Resolve #13; Deploy 1.0.2

---
 Makefile                                      |  2 ++
 .../redeem/web/RedemptionClientAdapter.java   | 33 ++++++++++---------
 .../redeem/RedeemCodeDeliveryLambda.java      |  4 +--
 .../redeem/RedeemCodeDeliveryLambdaTest.java  |  4 +--
 .../paimonganyu/redeem/UserRedeem.java        |  5 +--
 .../service/redeem/RedeemTaskEstimator.java   |  3 +-
 6 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/Makefile b/Makefile
index 3d957dbb..abe7bd44 100644
--- a/Makefile
+++ b/Makefile
@@ -9,12 +9,14 @@ paimonganyu-skill-prod: build
 
 paimonganyu-prod: build
 	cd sam/paimonganyu; sam deploy --guided \
+        --stack-name paimonganyu \
 		--profile serverless \
 		--region ap-northeast-2 \
 		--parameter-overrides Env=prod
 
 paimonganyu-test: build
 	cd sam/paimonganyu; sam deploy --guided \
+        --stack-name paimonganyu-test
 		--profile serverless \
 		--region ap-northeast-1 \
 		--parameter-overrides Env=test
diff --git a/PaimonGanyu/application/src/main/java/org/binchoo/paimonganyu/infra/redeem/web/RedemptionClientAdapter.java b/PaimonGanyu/application/src/main/java/org/binchoo/paimonganyu/infra/redeem/web/RedemptionClientAdapter.java
index 68424326..f204dea4 100644
--- a/PaimonGanyu/application/src/main/java/org/binchoo/paimonganyu/infra/redeem/web/RedemptionClientAdapter.java
+++ b/PaimonGanyu/application/src/main/java/org/binchoo/paimonganyu/infra/redeem/web/RedemptionClientAdapter.java
@@ -54,6 +54,21 @@ private List<UserRedeem> sendRequest(Collection<RedeemTask> redeemTasks, RedeemR
         return wait(userRedeemList);
     }
 
+    private List<UserRedeem> wait(List<Mono<UserRedeem>> userRedeemMonos) {
+        List<UserRedeem> userRedeems = new ArrayList<>();
+        wait(userRedeemMonos, userRedeems);
+        log.debug("{} user redemption has occurred: {}", userRedeems.size(), userRedeems);
+        return userRedeems;
+    }
+
+    private void wait(List<Mono<UserRedeem>> userRedeemMonos, List<UserRedeem> resultContainer) {
+        for (Mono<UserRedeem> userRedeemMono : userRedeemMonos) {
+            UserRedeem userRedeemObj = userRedeemMono.block();
+            if (resultContainer != null)
+                resultContainer.add(userRedeemObj);
+        }
+    }
+
     /**
      * 리뎀션 API를 호출하여 유저 리뎀션 수행 이력을 Mono 타입 리스트로 얻습니다.
      * @param redeemTask 리딤 태스크 명세
@@ -75,22 +90,8 @@ private Mono<UserRedeem> sendRequest(RedeemTask redeemTask) {
 
     private Mono<UserRedeem> wrap(Mono<HoyoResponse<CodeRedemptionResult>> response, UserRedeem userRedeem) {
         // must apply asychronous mapping: flatMap!
-        return response.flatMap(hoyoResponse-> Mono.just(userRedeem.markDone()))
+        return response.log()
+                .flatMap(hoyoResponse-> Mono.just(userRedeem.markDone()))
                 .onErrorReturn(userRedeem);
     }
-
-    private List<UserRedeem> wait(List<Mono<UserRedeem>> userRedeemMonos) {
-        List<UserRedeem> userRedeems = new ArrayList<>();
-        wait(userRedeemMonos, userRedeems);
-        log.debug("{} user redemption has occurred: {}", userRedeems.size(), userRedeems);
-        return userRedeems;
-    }
-
-    private void wait(List<Mono<UserRedeem>> userRedeemMonos, List<UserRedeem> resultContainer) {
-        for (Mono<UserRedeem> userRedeemMono : userRedeemMonos) {
-            UserRedeem userRedeemObj = userRedeemMono.block();
-            if (resultContainer != null)
-                resultContainer.add(userRedeemObj);
-        }
-    }
 }
diff --git a/PaimonGanyu/application/src/main/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambda.java b/PaimonGanyu/application/src/main/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambda.java
index da6e3eda..e376d43c 100644
--- a/PaimonGanyu/application/src/main/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambda.java
+++ b/PaimonGanyu/application/src/main/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambda.java
@@ -69,8 +69,8 @@ protected List<List<SendMessageBatchRequestEntry>> taskSplit(List<RedeemTask> ta
             int fetch = Math.min(batchSize, taskQueue.size());
             while (fetch-- > 0) {
                 RedeemTask task = taskQueue.removeFirst();
-                SendMessageBatchRequestEntry entry = new SendMessageBatchRequestEntry(
-                        task.getBotUserId(), task.getJson(objectMapper));
+                String uniqueId = UUID.randomUUID().toString();
+                SendMessageBatchRequestEntry entry = new SendMessageBatchRequestEntry(uniqueId, task.getJson(objectMapper));
                 batch.add(entry);
             }
             batches.add(batch);
diff --git a/PaimonGanyu/application/src/test/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambdaTest.java b/PaimonGanyu/application/src/test/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambdaTest.java
index caeedcb1..2456e49b 100644
--- a/PaimonGanyu/application/src/test/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambdaTest.java
+++ b/PaimonGanyu/application/src/test/java/org/binchoo/paimonganyu/lambda/redeem/RedeemCodeDeliveryLambdaTest.java
@@ -23,11 +23,11 @@ void bootstrap() {
 
     @Test
     void taskSplit() {
-        int n = 100, batchSize = 10;
+        int n = 101, batchSize = 10;
         int expectedBatches = (n % batchSize == 0)? n / batchSize : (n / batchSize + 1);
-        var codeDelivery = new RedeemCodeDeliveryLambda();
         var tasks = task(n);
 
+        var codeDelivery = new RedeemCodeDeliveryLambda();
         var batch = codeDelivery.taskSplit(tasks, batchSize);
 
         assertThat(batch).hasSize(expectedBatches);
diff --git a/PaimonGanyu/domain/src/main/java/org/binchoo/paimonganyu/redeem/UserRedeem.java b/PaimonGanyu/domain/src/main/java/org/binchoo/paimonganyu/redeem/UserRedeem.java
index b07ac64d..1e05176f 100644
--- a/PaimonGanyu/domain/src/main/java/org/binchoo/paimonganyu/redeem/UserRedeem.java
+++ b/PaimonGanyu/domain/src/main/java/org/binchoo/paimonganyu/redeem/UserRedeem.java
@@ -8,10 +8,7 @@
  * @author : jbinchoo
  * @since : 2022/04/17
  */
-@Slf4j
-@EqualsAndHashCode
-@ToString
-@Getter
+@Data
 @AllArgsConstructor
 @RequiredArgsConstructor
 public class UserRedeem {
diff --git a/PaimonGanyu/domain/src/main/java/org/binchoo/paimonganyu/service/redeem/RedeemTaskEstimator.java b/PaimonGanyu/domain/src/main/java/org/binchoo/paimonganyu/service/redeem/RedeemTaskEstimator.java
index 1957c1d1..92823860 100644
--- a/PaimonGanyu/domain/src/main/java/org/binchoo/paimonganyu/service/redeem/RedeemTaskEstimator.java
+++ b/PaimonGanyu/domain/src/main/java/org/binchoo/paimonganyu/service/redeem/RedeemTaskEstimator.java
@@ -9,6 +9,7 @@
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.UUID;
 import java.util.stream.Collectors;
 
 /**
@@ -35,6 +36,6 @@ public List<RedeemTask> generateTasks(RedeemTaskEstimationOption estimationOptio
 
     private boolean hasNotRedeemed(RedeemTask redeemTask) {
         return redeemHistoryPort.hasNotRedeemed(redeemTask.getBotUserId(),
-                redeemTask.getUidString(), redeemTask.getRedeemCode());
+                UUID.randomUUID().toString(), redeemTask.getRedeemCode());
     }
 }