Skip to content

Commit a3abdb4

Browse files
authored
Merge pull request #293 from maeil-mail/292
인증 번호 정합성 문제를 개선한다.
2 parents 2211c4c + 486c8fe commit a3abdb4

File tree

3 files changed

+65
-7
lines changed

3 files changed

+65
-7
lines changed

mail-core/src/main/java/maeilmail/subscribe/command/application/TemporalSubscribeManager.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package maeilmail.subscribe.command.application;
22

3+
import java.util.List;
34
import lombok.RequiredArgsConstructor;
45
import lombok.extern.slf4j.Slf4j;
56
import maeilmail.subscribe.command.domain.TemporalSubscribe;
@@ -16,20 +17,37 @@ public class TemporalSubscribeManager {
1617
private final TemporalSubscribeRepository temporalSubscribeRepository;
1718

1819
public void add(String email, String verifyCode) {
19-
temporalSubscribeRepository.findByEmail(email).ifPresent(temporalSubscribeRepository::delete);
20+
List<TemporalSubscribe> temporalSubscribes = temporalSubscribeRepository.findAllByEmail(email);
21+
removeDataIfPresent(temporalSubscribes);
22+
2023
TemporalSubscribe temporalSubscribe = new TemporalSubscribe(email, verifyCode);
2124
temporalSubscribeRepository.save(temporalSubscribe);
2225
}
2326

27+
private void removeDataIfPresent(List<TemporalSubscribe> temporalSubscribes) {
28+
if (!temporalSubscribes.isEmpty()) {
29+
List<Long> ids = temporalSubscribes.stream()
30+
.map(TemporalSubscribe::getId)
31+
.toList();
32+
33+
temporalSubscribeRepository.removeAllByIdIn(ids);
34+
}
35+
}
36+
2437
public void verify(String email, String verifyCode) {
25-
TemporalSubscribe temporalSubscribe = temporalSubscribeRepository.findByEmail(email)
38+
List<TemporalSubscribe> temporalSubscribes = temporalSubscribeRepository.findAllByEmail(email);
39+
temporalSubscribes.stream()
40+
.filter(it -> isVerifiable(verifyCode, it))
41+
.findFirst()
2642
.orElseThrow(() -> new IllegalArgumentException(INVALID_EMAIL_MESSAGE));
43+
}
2744

45+
private boolean isVerifiable(String verifyCode, TemporalSubscribe temporalSubscribe) {
2846
try {
2947
temporalSubscribe.verify(verifyCode);
48+
return true;
3049
} catch (Exception e) {
31-
log.info("메일 인증 실패 email = {} message = {}", email, e.getMessage());
32-
throw new IllegalArgumentException(INVALID_EMAIL_MESSAGE, e);
50+
return false;
3351
}
3452
}
3553
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package maeilmail.subscribe.command.domain;
22

3-
import java.util.Optional;
3+
import java.util.List;
44
import org.springframework.data.jpa.repository.JpaRepository;
55

66
public interface TemporalSubscribeRepository extends JpaRepository<TemporalSubscribe, Long> {
77

8-
Optional<TemporalSubscribe> findByEmail(String email);
8+
List<TemporalSubscribe> findAllByEmail(String email);
9+
10+
void removeAllByIdIn(List<Long> ids);
911
}

mail-core/src/test/java/maeilmail/subscribe/command/application/TemporalSubscribeManagerTest.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import static org.assertj.core.api.Assertions.assertThatCode;
44
import static org.assertj.core.api.Assertions.assertThatThrownBy;
55

6+
import maeilmail.subscribe.command.domain.TemporalSubscribe;
7+
import maeilmail.subscribe.command.domain.TemporalSubscribeRepository;
68
import maeilmail.support.IntegrationTestSupport;
79
import org.junit.jupiter.api.DisplayName;
810
import org.junit.jupiter.api.Test;
@@ -13,6 +15,9 @@ class TemporalSubscribeManagerTest extends IntegrationTestSupport {
1315
@Autowired
1416
private TemporalSubscribeManager temporalSubscribeManager;
1517

18+
@Autowired
19+
private TemporalSubscribeRepository temporalSubscribeRepository;
20+
1621
@Test
1722
@DisplayName("이메일이 인증되지 않으면 검증에 실패한다.")
1823
void cantVerify() {
@@ -33,13 +38,25 @@ void cantVerify2() {
3338

3439
@Test
3540
@DisplayName("이메일 인증 코드가 같으면 검증에 성공한다.")
36-
void cantVerify3() {
41+
void canVerify() {
3742
temporalSubscribeManager.add("test3@naver.com", "3212");
3843

3944
assertThatCode(() -> temporalSubscribeManager.verify("test3@naver.com", "3212"))
4045
.doesNotThrowAnyException();
4146
}
4247

48+
@Test
49+
@DisplayName("기존에 저장된 인증 코드가 N개인 경우, 하나의 인증 코드만 있어도 검증에 성공한다.")
50+
void canVerify2() {
51+
createTemporalSubscribe("test4@naver.com", "3212");
52+
createTemporalSubscribe("test4@naver.com", "2111");
53+
createTemporalSubscribe("test4@naver.com", "3222");
54+
createTemporalSubscribe("test4@naver.com", "3221");
55+
56+
assertThatCode(() -> temporalSubscribeManager.verify("test4@naver.com", "3222"))
57+
.doesNotThrowAnyException();
58+
}
59+
4360
@Test
4461
@DisplayName("이미 인증 코드를 받은 적이 있다면, 기존 인증 코드를 제거한다.")
4562
void deleteBefore() {
@@ -51,4 +68,25 @@ void deleteBefore() {
5168
assertThatCode(() -> temporalSubscribeManager.verify("test4@naver.com", "1234"))
5269
.doesNotThrowAnyException();
5370
}
71+
72+
@Test
73+
@DisplayName("기존에 저장된 인증 코드가 N개인 경우, 모든 인증 코드를 제거할 수 있다.")
74+
void deleteAllBefore() {
75+
createTemporalSubscribe("test4@naver.com", "3212");
76+
createTemporalSubscribe("test4@naver.com", "2111");
77+
createTemporalSubscribe("test4@naver.com", "3222");
78+
createTemporalSubscribe("test4@naver.com", "3221");
79+
80+
temporalSubscribeManager.add("test4@naver.com", "1234");
81+
82+
assertThatCode(() -> temporalSubscribeManager.verify("test4@naver.com", "1234"))
83+
.doesNotThrowAnyException();
84+
}
85+
86+
87+
private void createTemporalSubscribe(String email, String verifyCode) {
88+
TemporalSubscribe temporalSubscribe = new TemporalSubscribe(email, verifyCode);
89+
90+
temporalSubscribeRepository.save(temporalSubscribe);
91+
}
5492
}

0 commit comments

Comments
 (0)