From b0fe8213fb4111bf880df71f45ffe7037deeb03e Mon Sep 17 00:00:00 2001 From: JiwonDev Date: Sat, 4 Sep 2021 17:17:49 +0900 Subject: [PATCH] =?UTF-8?q?ADD=20AccountRepository=20update=20&=20TokenVer?= =?UTF-8?q?ifier=20HTTP=20API=20-=20MybatisAccountRepository=20update=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20-=20RegisterAccountApi=20->=20AccountComma?= =?UTF-8?q?ndApi=20=EB=B3=80=EA=B2=BD=20-=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=9A=A9=20TestAccountRepositoryStub=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/application/AccountFacade.java | 4 + .../app/account/domain/AccountRepository.java | 3 + .../MybatisAccountRepository.java | 10 + .../presentation/AccountCommandApi.java | 53 +++++ .../presentation/RegisterAccountApi.java | 30 --- .../mapper/xml/AccountCommandMapper.xml | 12 ++ .../account/domain/FakeAccountRepository.java | 45 ++++ .../domain/RegisterAccountProcessorTest.java | 32 +-- .../MybatisAccountRepositoryTest.java | 12 ++ .../presentation/AccountCommandApiTests.java | 200 ++++++++++++++++++ .../presentation/RegisterAccountApiTests.java | 125 ----------- 11 files changed, 340 insertions(+), 186 deletions(-) create mode 100644 src/main/java/com/yam/app/account/presentation/AccountCommandApi.java delete mode 100644 src/main/java/com/yam/app/account/presentation/RegisterAccountApi.java create mode 100644 src/test/java/com/yam/app/account/domain/FakeAccountRepository.java create mode 100644 src/test/java/com/yam/app/account/presentation/AccountCommandApiTests.java delete mode 100644 src/test/java/com/yam/app/account/presentation/RegisterAccountApiTests.java 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 2dd2ab8..d0347f7 100644 --- a/src/main/java/com/yam/app/account/application/AccountFacade.java +++ b/src/main/java/com/yam/app/account/application/AccountFacade.java @@ -29,4 +29,8 @@ public class AccountFacade { publisher.publishEvent(new RegisterAccountEvent(entity)); return translator.toResponse(entity); } + + public boolean verify(String token, String email) { + return false; + } } diff --git a/src/main/java/com/yam/app/account/domain/AccountRepository.java b/src/main/java/com/yam/app/account/domain/AccountRepository.java index 2b24467..30a48b3 100644 --- a/src/main/java/com/yam/app/account/domain/AccountRepository.java +++ b/src/main/java/com/yam/app/account/domain/AccountRepository.java @@ -7,4 +7,7 @@ public interface AccountRepository { boolean existsByNickname(String nickname); Account save(Account entity); + + Account update(Account entity); + } diff --git a/src/main/java/com/yam/app/account/infrastructure/MybatisAccountRepository.java b/src/main/java/com/yam/app/account/infrastructure/MybatisAccountRepository.java index 4b7d09f..8382348 100644 --- a/src/main/java/com/yam/app/account/infrastructure/MybatisAccountRepository.java +++ b/src/main/java/com/yam/app/account/infrastructure/MybatisAccountRepository.java @@ -22,6 +22,16 @@ public final class MybatisAccountRepository implements AccountRepository, Accoun return result != 0; } + @Override + public Account update(Account entity) { + int result = template.update(COMMAND_NAMESPACE + "update", entity); + if (result != 1) { + throw new RuntimeException( + String.format("There was a problem updating the object : %s", entity)); + } + return findByEmail(entity.getEmail()); + } + @Override public boolean existsByNickname(String nickname) { int result = template.selectOne(COMMAND_NAMESPACE + "existsByNickname", nickname); diff --git a/src/main/java/com/yam/app/account/presentation/AccountCommandApi.java b/src/main/java/com/yam/app/account/presentation/AccountCommandApi.java new file mode 100644 index 0000000..93e6a37 --- /dev/null +++ b/src/main/java/com/yam/app/account/presentation/AccountCommandApi.java @@ -0,0 +1,53 @@ +package com.yam.app.account.presentation; + +import com.yam.app.account.application.AccountFacade; +import java.net.URI; +import javax.validation.Valid; +import org.springframework.http.HttpHeaders; +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.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 +@RequestMapping( + produces = MediaType.APPLICATION_JSON_VALUE, + consumes = MediaType.APPLICATION_JSON_VALUE +) +public final class AccountCommandApi { + + private final AccountFacade accountFacade; + + public AccountCommandApi(AccountFacade accountFacade) { + this.accountFacade = accountFacade; + } + + @PostMapping("/api/accounts") + public ResponseEntity register( + @RequestBody @Valid RegisterAccountRequest request) { + return ResponseEntity.ok(accountFacade.register(request)); + } + + /** + * 회원가입 이메일 검증 컨트롤러 + * 임시로 "http://localhost:3000/login"로 리다이렉트 되도록 설정. + */ + @GetMapping("/api/accounts/authorize") + public ResponseEntity verify( + @RequestParam String token, + @RequestParam String email) throws Exception { + var result = accountFacade.verify(token, email); + if (!result) { + return ResponseEntity.badRequest().build(); + } + var uri = new URI("http://localhost:3000/login"); + var header = new HttpHeaders(); + header.setLocation(uri); + return new ResponseEntity<>(header, HttpStatus.SEE_OTHER); + } +} diff --git a/src/main/java/com/yam/app/account/presentation/RegisterAccountApi.java b/src/main/java/com/yam/app/account/presentation/RegisterAccountApi.java deleted file mode 100644 index 2a5468a..0000000 --- a/src/main/java/com/yam/app/account/presentation/RegisterAccountApi.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.yam.app.account.presentation; - -import com.yam.app.account.application.AccountFacade; -import javax.validation.Valid; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -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.RestController; - -@RestController -@RequestMapping( - produces = MediaType.APPLICATION_JSON_VALUE, - consumes = MediaType.APPLICATION_JSON_VALUE -) -public final class RegisterAccountApi { - - private final AccountFacade accountFacade; - - public RegisterAccountApi(AccountFacade accountFacade) { - this.accountFacade = accountFacade; - } - - @PostMapping("/api/accounts") - public ResponseEntity register( - @RequestBody @Valid RegisterAccountRequest request) { - return ResponseEntity.ok(accountFacade.register(request)); - } -} diff --git a/src/main/resources/mapper/xml/AccountCommandMapper.xml b/src/main/resources/mapper/xml/AccountCommandMapper.xml index 6a683f5..a6bb04c 100644 --- a/src/main/resources/mapper/xml/AccountCommandMapper.xml +++ b/src/main/resources/mapper/xml/AccountCommandMapper.xml @@ -2,6 +2,18 @@ + + UPDATE ACCOUNT + SET email = #{email}, + email_check_token = #{emailCheckToken}, + email_check_token_generated_at = #{emailCheckTokenGeneratedAt}, + email_verified = #{emailVerified}, + nickname = #{nickname}, + password = #{password}, + withdraw = #{withdraw} + WHERE id = #{id} + LIMIT 1 +