diff --git a/src/main/java/com/yam/app/account/application/AccountFacade.java b/src/main/java/com/yam/app/account/application/AccountFacade.java index 4a0cc22..5e4ff09 100644 --- a/src/main/java/com/yam/app/account/application/AccountFacade.java +++ b/src/main/java/com/yam/app/account/application/AccountFacade.java @@ -1,9 +1,10 @@ package com.yam.app.account.application; +import com.yam.app.account.domain.ConfirmRegisterAccountProcessor; import com.yam.app.account.domain.RegisterAccountEvent; import com.yam.app.account.domain.RegisterAccountProcessor; -import com.yam.app.account.domain.TokenVerifier; import com.yam.app.account.presentation.AccountResponse; +import com.yam.app.account.presentation.ConfirmRegisterAccountRequest; import com.yam.app.account.presentation.RegisterAccountRequest; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; @@ -15,15 +16,15 @@ public class AccountFacade { private final RegisterAccountProcessor processor; private final AccountTranslator translator; private final ApplicationEventPublisher publisher; - private final TokenVerifier tokenVerifier; + private final ConfirmRegisterAccountProcessor confirmRegisterProcessor; public AccountFacade(RegisterAccountProcessor processor, AccountTranslator translator, ApplicationEventPublisher publisher, - TokenVerifier tokenVerifier) { + ConfirmRegisterAccountProcessor confirmRegisterProcessor) { this.processor = processor; this.translator = translator; this.publisher = publisher; - this.tokenVerifier = tokenVerifier; + this.confirmRegisterProcessor = confirmRegisterProcessor; } @Transactional @@ -33,7 +34,7 @@ public class AccountFacade { return translator.toResponse(entity); } - public boolean verify(String token, String email) { - return tokenVerifier.verify(token, email); + public void registerConfirm(ConfirmRegisterAccountRequest request) { + confirmRegisterProcessor.registerConfirm(translator.toCommand(request)); } } diff --git a/src/main/java/com/yam/app/account/application/AccountTranslator.java b/src/main/java/com/yam/app/account/application/AccountTranslator.java index fcce4d8..5807e3b 100644 --- a/src/main/java/com/yam/app/account/application/AccountTranslator.java +++ b/src/main/java/com/yam/app/account/application/AccountTranslator.java @@ -2,6 +2,7 @@ package com.yam.app.account.application; import com.yam.app.account.domain.Account; import com.yam.app.account.presentation.AccountResponse; +import com.yam.app.account.presentation.ConfirmRegisterAccountRequest; import com.yam.app.account.presentation.RegisterAccountRequest; import org.springframework.stereotype.Component; @@ -13,6 +14,10 @@ final class AccountTranslator { request.getPassword()); } + public ConfirmRegisterAccountCommand toCommand(ConfirmRegisterAccountRequest request) { + return new ConfirmRegisterAccountCommand(request.getToken(), request.getEmail()); + } + public AccountResponse toResponse(Account entity) { return new AccountResponse(entity.getId(), entity.getEmail(), entity.getNickname()); diff --git a/src/main/java/com/yam/app/account/application/ConfirmRegisterAccountCommand.java b/src/main/java/com/yam/app/account/application/ConfirmRegisterAccountCommand.java new file mode 100644 index 0000000..12ff29e --- /dev/null +++ b/src/main/java/com/yam/app/account/application/ConfirmRegisterAccountCommand.java @@ -0,0 +1,15 @@ +package com.yam.app.account.application; + +import lombok.Getter; + +@Getter +public class ConfirmRegisterAccountCommand { + + private final String token; + private final String email; + + public ConfirmRegisterAccountCommand(String token, String email) { + this.token = token; + this.email = email; + } +} diff --git a/src/main/java/com/yam/app/account/domain/ConfirmRegisterAccountProcessor.java b/src/main/java/com/yam/app/account/domain/ConfirmRegisterAccountProcessor.java new file mode 100644 index 0000000..69a98a2 --- /dev/null +++ b/src/main/java/com/yam/app/account/domain/ConfirmRegisterAccountProcessor.java @@ -0,0 +1,24 @@ +package com.yam.app.account.domain; + +import com.yam.app.account.application.ConfirmRegisterAccountCommand; + +public final class ConfirmRegisterAccountProcessor { + + private final AccountReader accountReader; + private final AccountRepository accountRepository; + private final TokenVerifier tokenVerifier; + + public ConfirmRegisterAccountProcessor(AccountReader accountReader, + AccountRepository accountRepository, TokenVerifier tokenVerifier) { + this.accountReader = accountReader; + this.accountRepository = accountRepository; + this.tokenVerifier = tokenVerifier; + } + + public void registerConfirm(ConfirmRegisterAccountCommand command) { + tokenVerifier.verify(command.getToken(), command.getEmail()); + Account account = accountReader.findByEmail(command.getEmail()); + account.completeRegister(); + accountRepository.update(account); + } +} diff --git a/src/main/java/com/yam/app/account/domain/TokenVerifier.java b/src/main/java/com/yam/app/account/domain/TokenVerifier.java index 7005a8f..40a2264 100644 --- a/src/main/java/com/yam/app/account/domain/TokenVerifier.java +++ b/src/main/java/com/yam/app/account/domain/TokenVerifier.java @@ -1,23 +1,14 @@ package com.yam.app.account.domain; -import com.yam.app.common.StringUtils; - public final class TokenVerifier { private final AccountReader accountReader; - private final AccountRepository accountRepository; - public TokenVerifier(AccountReader accountReader, - AccountRepository accountRepository) { + public TokenVerifier(AccountReader accountReader) { this.accountReader = accountReader; - this.accountRepository = accountRepository; } - public boolean verify(String token, String email) { - if (StringUtils.isBlank(token) || StringUtils.isBlank(email)) { - throw new IllegalArgumentException(); - } - + public void verify(String token, String email) { var account = accountReader.findByEmail(email); if (account == null) { @@ -28,9 +19,5 @@ public final class TokenVerifier { throw new IllegalStateException(); } - account.completeRegister(); - accountRepository.update(account); - return true; } - } diff --git a/src/main/java/com/yam/app/account/infrastructure/AppConfiguration.java b/src/main/java/com/yam/app/account/infrastructure/AppConfiguration.java index eb0468e..e218f9a 100644 --- a/src/main/java/com/yam/app/account/infrastructure/AppConfiguration.java +++ b/src/main/java/com/yam/app/account/infrastructure/AppConfiguration.java @@ -2,6 +2,7 @@ package com.yam.app.account.infrastructure; import com.yam.app.account.domain.AccountReader; import com.yam.app.account.domain.AccountRepository; +import com.yam.app.account.domain.ConfirmRegisterAccountProcessor; import com.yam.app.account.domain.PasswordEncrypter; import com.yam.app.account.domain.RegisterAccountProcessor; import com.yam.app.account.domain.TokenVerifier; @@ -49,8 +50,14 @@ public class AppConfiguration { } @Bean - public TokenVerifier tokenVerifier(AccountReader accountReader, - AccountRepository accountRepository) { - return new TokenVerifier(accountReader, accountRepository); + public TokenVerifier tokenVerifier(AccountReader accountReader) { + return new TokenVerifier(accountReader); + } + + @Bean + public ConfirmRegisterAccountProcessor confirmRegisterAccountProcessor( + AccountReader accountReader, AccountRepository accountRepository, + TokenVerifier tokenVerifier) { + return new ConfirmRegisterAccountProcessor(accountReader, accountRepository, tokenVerifier); } } diff --git a/src/main/java/com/yam/app/account/presentation/AccountCommandApi.java b/src/main/java/com/yam/app/account/presentation/AccountCommandApi.java index 93e6a37..7d8b5a4 100644 --- a/src/main/java/com/yam/app/account/presentation/AccountCommandApi.java +++ b/src/main/java/com/yam/app/account/presentation/AccountCommandApi.java @@ -8,10 +8,10 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @@ -35,16 +35,18 @@ public final class AccountCommandApi { /** * 회원가입 이메일 검증 컨트롤러 - * 임시로 "http://localhost:3000/login"로 리다이렉트 되도록 설정. + * - 임시로 "http://localhost:3000/login"로 리다이렉트 되도록 설정. + * - 임시로 검증에 실패해서 예외가 발생하면 400 HTTP 을 반환하도록 설정. */ @GetMapping("/api/accounts/authorize") - public ResponseEntity verify( - @RequestParam String token, - @RequestParam String email) throws Exception { - var result = accountFacade.verify(token, email); - if (!result) { + public ResponseEntity registerConfirm( + @ModelAttribute ConfirmRegisterAccountRequest request) throws Exception { + try { + accountFacade.registerConfirm(request); + } catch (Exception e) { return ResponseEntity.badRequest().build(); } + var uri = new URI("http://localhost:3000/login"); var header = new HttpHeaders(); header.setLocation(uri); diff --git a/src/main/java/com/yam/app/account/presentation/ConfirmRegisterAccountRequest.java b/src/main/java/com/yam/app/account/presentation/ConfirmRegisterAccountRequest.java new file mode 100644 index 0000000..6cb1504 --- /dev/null +++ b/src/main/java/com/yam/app/account/presentation/ConfirmRegisterAccountRequest.java @@ -0,0 +1,16 @@ +package com.yam.app.account.presentation; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import lombok.Data; + +@Data +public final class ConfirmRegisterAccountRequest { + + @NotBlank + private String token; + + @Email + @NotBlank + private String email; +} diff --git a/src/main/java/com/yam/app/common/StringUtils.java b/src/main/java/com/yam/app/common/StringUtils.java deleted file mode 100644 index 11ead66..0000000 --- a/src/main/java/com/yam/app/common/StringUtils.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.yam.app.common; - -public final class StringUtils { - - private StringUtils() { - } - - /** - * 입력값이 null 또는 공백이라면 true 반환. - */ - public static boolean isBlank(String value) { - if (value == null || value.isEmpty()) { - return true; - } - return value.trim().isEmpty(); - } -} diff --git a/src/main/resources/mapper/xml/AccountCommandMapper.xml b/src/main/resources/mapper/xml/AccountCommandMapper.xml index a6bb04c..e187f1a 100644 --- a/src/main/resources/mapper/xml/AccountCommandMapper.xml +++ b/src/main/resources/mapper/xml/AccountCommandMapper.xml @@ -12,7 +12,6 @@ password = #{password}, withdraw = #{withdraw} WHERE id = #{id} - LIMIT 1