From 337b8805be9df26dce22071c04f098db9816d867 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 15 Jun 2020 21:16:03 +0300 Subject: [PATCH 01/13] RCJ-93 for switch --- .../platform/core/entity/UserProfile.java | 6 +++++ .../receipt/fnssdk/excepion/FnsException.kt | 12 ++++++++++ .../fnssdk/webclient/FnsReceiptWebClient.kt | 23 ++++++++++++++----- .../rest/controller/UserController.java | 13 +++++++++++ 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/space/shefer/receipt/platform/core/entity/UserProfile.java b/core/src/main/java/space/shefer/receipt/platform/core/entity/UserProfile.java index 6d066cf..f4f953b 100644 --- a/core/src/main/java/space/shefer/receipt/platform/core/entity/UserProfile.java +++ b/core/src/main/java/space/shefer/receipt/platform/core/entity/UserProfile.java @@ -26,6 +26,12 @@ public class UserProfile extends BaseUuidIdEntity { @Column(name = "access_token") private String accessToken; + @Column(name = "name") + private String name; + + @Column(name = "email") + private String email; + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt index aa30dab..984b527 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt @@ -11,3 +11,15 @@ class ReceiptNotFoundException(val fn: String, val fd: String, val fp: String) @ResponseStatus(code = HttpStatus.FORBIDDEN) class AuthorizationFailedException(login: String, cause: Throwable? = null) : FnsException("Login with phone $login failed", cause) + +@ResponseStatus(code = HttpStatus.CONFLICT) +class UserWasExistException(userName: String, cause: Throwable? = null) + : FnsException("This user $userName exists", cause) + +@ResponseStatus(code = HttpStatus.BAD_REQUEST) +class IncorrectEmailException(email: String, cause: Throwable? = null) + : FnsException("Object didn't pass validation for format email: $email", cause) + +@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR) +class IncorrectPhoneException(phone: String, cause: Throwable? = null) + : FnsException("Phone $phone is incorrect", cause) diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt index 6a0ced2..4e7a105 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt @@ -10,6 +10,9 @@ import org.springframework.web.client.HttpClientErrorException import org.springframework.web.client.HttpServerErrorException import org.springframework.web.client.RestTemplate import space.shefer.receipt.fnssdk.excepion.AuthorizationFailedException +import space.shefer.receipt.fnssdk.excepion.IncorrectEmailException +import space.shefer.receipt.fnssdk.excepion.IncorrectPhoneException +import space.shefer.receipt.fnssdk.excepion.UserWasExistException import java.net.URI import java.util.* @@ -84,12 +87,20 @@ class FnsReceiptWebClient { fun signUp(email: String, name: String, phone: String) { val headers = HttpHeaders() headers.add("Content-Type", "application/json; charset=UTF-8") - RestTemplate().exchange( - URI("$HOST/v1/mobile/users/signup"), - HttpMethod.POST, - HttpEntity("""{"email":"$email","name":"$name","phone":"$phone"}""", headers), - String::class.java - ) + try { + RestTemplate().exchange( + URI("$HOST/v1/mobile/users/signup"), + HttpMethod.POST, + HttpEntity("""{"email":"$email","name":"$name","phone":"$phone"}""", headers), + String::class.java + ) + } catch (e: HttpClientErrorException.Conflict) { + throw UserWasExistException(name, e) + } catch (c: HttpClientErrorException.BadRequest) { + throw IncorrectEmailException(email, c) + } catch (d: HttpServerErrorException.InternalServerError) { + throw IncorrectPhoneException(phone, d) + } } fun login(login: String, password: String) { diff --git a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java index a27f447..c10b810 100644 --- a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java +++ b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java @@ -2,17 +2,25 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; +import org.springframework.lang.Nullable; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import space.shefer.receipt.fnssdk.webclient.FnsReceiptWebClient; +import space.shefer.receipt.platform.core.entity.Receipt; import space.shefer.receipt.platform.core.entity.UserProfile; import space.shefer.receipt.platform.core.service.UserProfileService; +import space.shefer.receipt.rest.converters.ReceiptMetaConverter; +import space.shefer.receipt.rest.dto.ReceiptCreateDto; +import space.shefer.receipt.rest.dto.ReceiptMetaDto; import space.shefer.receipt.rest.dto.UserLoginDto; import space.shefer.receipt.rest.dto.UserPasswordRestoreDto; import space.shefer.receipt.rest.dto.UserSignUpDto; +import javax.validation.Valid; + @RestController public class UserController { @@ -38,6 +46,11 @@ public void signUp(@RequestBody UserSignUpDto userSignUpDto) { fnsReceiptWebClient.signUp(userSignUpDto.getEmail(), userSignUpDto.getName(), userSignUpDto.getPhone()); } + @RequestMapping(value = "/users/me", method = RequestMethod.GET) + public ReceiptMetaDto getInfoFromToken(@Nullable @RequestHeader("Authorization") String authHeader) { + return new ReceiptMetaDto(); + } + @RequestMapping(value = "/passwordRestore", method = RequestMethod.POST) public void passwordRestore(@RequestBody UserPasswordRestoreDto userPasswordRestoreDto) { fnsReceiptWebClient.passwordRestore(userPasswordRestoreDto.getPhone()); From 161ddd07b4935cfcc56586c3356b4aca370dc7e5 Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 15 Jun 2020 22:23:45 +0300 Subject: [PATCH 02/13] RCJ-93 Get user by token and improve logic in singIn method from FnsWebClient --- .../fnssdk/webclient/FnsReceiptWebClient.kt | 4 +- .../rest/controller/UserController.java | 20 ++++----- .../rest/service/OperationUserService.java | 45 +++++++++++++++++++ 3 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 rest-api/src/main/java/space/shefer/receipt/rest/service/OperationUserService.java diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt index 4e7a105..7055536 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt @@ -49,7 +49,6 @@ class FnsReceiptWebClient { return null } - fun getReceiptExists(fn: String, fd: String, fp: String, time: String, money: Float): Boolean { val moneyForUrl: Int = (money * 100).toInt() val uri = "$HOST/v1/ofds/*/inns/*/fss/$fn/operations/1/tickets/$fd?fiscalSign=$fp&date=$time&sum=$moneyForUrl" @@ -84,7 +83,7 @@ class FnsReceiptWebClient { ) } - fun signUp(email: String, name: String, phone: String) { + fun signUp(email: String, name: String, phone: String): Boolean { val headers = HttpHeaders() headers.add("Content-Type", "application/json; charset=UTF-8") try { @@ -94,6 +93,7 @@ class FnsReceiptWebClient { HttpEntity("""{"email":"$email","name":"$name","phone":"$phone"}""", headers), String::class.java ) + return true } catch (e: HttpClientErrorException.Conflict) { throw UserWasExistException(name, e) } catch (c: HttpClientErrorException.BadRequest) { diff --git a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java index c10b810..c996825 100644 --- a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java +++ b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java @@ -9,17 +9,12 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import space.shefer.receipt.fnssdk.webclient.FnsReceiptWebClient; -import space.shefer.receipt.platform.core.entity.Receipt; import space.shefer.receipt.platform.core.entity.UserProfile; import space.shefer.receipt.platform.core.service.UserProfileService; -import space.shefer.receipt.rest.converters.ReceiptMetaConverter; -import space.shefer.receipt.rest.dto.ReceiptCreateDto; -import space.shefer.receipt.rest.dto.ReceiptMetaDto; import space.shefer.receipt.rest.dto.UserLoginDto; import space.shefer.receipt.rest.dto.UserPasswordRestoreDto; import space.shefer.receipt.rest.dto.UserSignUpDto; - -import javax.validation.Valid; +import space.shefer.receipt.rest.service.OperationUserService; @RestController @@ -27,11 +22,13 @@ public class UserController { private final FnsReceiptWebClient fnsReceiptWebClient; private final UserProfileService userProfileService; + private final OperationUserService operationUserService; @Autowired - public UserController(FnsReceiptWebClient fnsReceiptWebClient, UserProfileService userProfileService) { + public UserController(FnsReceiptWebClient fnsReceiptWebClient, UserProfileService userProfileService, OperationUserService operationUserService) { this.fnsReceiptWebClient = fnsReceiptWebClient; this.userProfileService = userProfileService; + this.operationUserService = operationUserService; } @RequestMapping(value = "/login", method = RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE) @@ -43,12 +40,15 @@ public String login(@RequestBody UserLoginDto userLoginDto) { @RequestMapping(value = "/signUp", method = RequestMethod.POST) public void signUp(@RequestBody UserSignUpDto userSignUpDto) { - fnsReceiptWebClient.signUp(userSignUpDto.getEmail(), userSignUpDto.getName(), userSignUpDto.getPhone()); + operationUserService.signUp(userSignUpDto); } @RequestMapping(value = "/users/me", method = RequestMethod.GET) - public ReceiptMetaDto getInfoFromToken(@Nullable @RequestHeader("Authorization") String authHeader) { - return new ReceiptMetaDto(); + public UserSignUpDto getInfoFromToken(@Nullable @RequestHeader("Authorization") String authHeader) { + if (authHeader != null) { + return operationUserService.getUserByToken(authHeader.substring(authHeader.indexOf(" ") + 1)); + } + return null; } @RequestMapping(value = "/passwordRestore", method = RequestMethod.POST) diff --git a/rest-api/src/main/java/space/shefer/receipt/rest/service/OperationUserService.java b/rest-api/src/main/java/space/shefer/receipt/rest/service/OperationUserService.java new file mode 100644 index 0000000..06995e7 --- /dev/null +++ b/rest-api/src/main/java/space/shefer/receipt/rest/service/OperationUserService.java @@ -0,0 +1,45 @@ +package space.shefer.receipt.rest.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import space.shefer.receipt.fnssdk.webclient.FnsReceiptWebClient; +import space.shefer.receipt.platform.core.entity.UserProfile; +import space.shefer.receipt.platform.core.repository.UserProfileRepository; +import space.shefer.receipt.rest.dto.UserSignUpDto; + +@Service +public class OperationUserService { + + private final UserProfileRepository userProfileRepository; + private final FnsReceiptWebClient fnsReceiptWebClient; + + @Autowired + public OperationUserService(UserProfileRepository userProfileRepository, FnsReceiptWebClient fnsReceiptWebClient) { + this.userProfileRepository = userProfileRepository; + this.fnsReceiptWebClient = fnsReceiptWebClient; + } + + public void signUp(UserSignUpDto userSignUpDto) { + UserProfile userProfile = userProfileRepository.getByPhone(userSignUpDto.getPhone()); + if (fnsReceiptWebClient.signUp(userSignUpDto.getName(), userSignUpDto.getName(), userSignUpDto.getPhone())) { + userProfile.setPhone(userSignUpDto.getPhone()); + userProfile.setEmail(userSignUpDto.getEmail()); + userProfile.setName(userSignUpDto.getName()); + userProfileRepository.save(userProfile); + } + + } + + public UserSignUpDto getUserByToken(String authHeader) { + UserProfile userProfile = userProfileRepository.getByAccessToken(authHeader); + if (userProfile == null) { + return null; + } + UserSignUpDto userSignUpDto = new UserSignUpDto(); + userSignUpDto.setEmail(userProfile.getEmail()); + userSignUpDto.setName(userProfile.getName()); + userSignUpDto.setPhone(userProfile.getPhone()); + return userSignUpDto; + } + +} From 271368d831786b03efe08a25ea57f896fb1ddfdd Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 15 Jun 2020 22:25:54 +0300 Subject: [PATCH 03/13] RCJ-93 rename --- .../space/shefer/receipt/rest/controller/UserController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java index c996825..d78e588 100644 --- a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java +++ b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java @@ -44,7 +44,7 @@ public void signUp(@RequestBody UserSignUpDto userSignUpDto) { } @RequestMapping(value = "/users/me", method = RequestMethod.GET) - public UserSignUpDto getInfoFromToken(@Nullable @RequestHeader("Authorization") String authHeader) { + public UserSignUpDto getInfoByToken(@Nullable @RequestHeader("Authorization") String authHeader) { if (authHeader != null) { return operationUserService.getUserByToken(authHeader.substring(authHeader.indexOf(" ") + 1)); } From a9e936af7dc028e011846e253413bc9df75cd55b Mon Sep 17 00:00:00 2001 From: Vlad Date: Tue, 16 Jun 2020 00:54:34 +0300 Subject: [PATCH 04/13] RCJ-93 add email and name in first login, also add email and name when you signUp --- .../fnssdk/dto/UserResponseLoginFnsDto.kt | 9 +++++++++ .../fnssdk/webclient/FnsReceiptWebClient.kt | 8 +++++--- .../receipt/rest/controller/UserController.java | 2 +- .../rest/service/OperationUserService.java | 17 +++++++++++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/dto/UserResponseLoginFnsDto.kt diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/dto/UserResponseLoginFnsDto.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/dto/UserResponseLoginFnsDto.kt new file mode 100644 index 0000000..3bca9dd --- /dev/null +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/dto/UserResponseLoginFnsDto.kt @@ -0,0 +1,9 @@ +package space.shefer.receipt.fnssdk.dto + + +class UserResponseLoginFnsDto { + + lateinit var email: String + lateinit var name: String + +} diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt index 7055536..bd3dc72 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt @@ -5,10 +5,12 @@ import org.springframework.http.HttpEntity import org.springframework.http.HttpHeaders import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus +import org.springframework.http.ResponseEntity import org.springframework.stereotype.Component import org.springframework.web.client.HttpClientErrorException import org.springframework.web.client.HttpServerErrorException import org.springframework.web.client.RestTemplate +import space.shefer.receipt.fnssdk.dto.UserResponseLoginFnsDto import space.shefer.receipt.fnssdk.excepion.AuthorizationFailedException import space.shefer.receipt.fnssdk.excepion.IncorrectEmailException import space.shefer.receipt.fnssdk.excepion.IncorrectPhoneException @@ -103,16 +105,16 @@ class FnsReceiptWebClient { } } - fun login(login: String, password: String) { + fun login(phone: String, password: String): ResponseEntity? { val headers = HttpHeaders() headers.add("Content-Type", "application/json; charset=UTF-8") headers.add("Authorization", getAuthHeader(login, password)) try { - RestTemplate().exchange( + return RestTemplate().exchange( URI("$HOST/v1/mobile/users/login"), HttpMethod.GET, HttpEntity(headers), - String::class.java + UserResponseLoginFnsDto::class.java ) } catch (e: HttpClientErrorException.Forbidden) { throw AuthorizationFailedException(login, e) diff --git a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java index d78e588..a0210eb 100644 --- a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java +++ b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java @@ -33,7 +33,7 @@ public UserController(FnsReceiptWebClient fnsReceiptWebClient, UserProfileServic @RequestMapping(value = "/login", method = RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE) public String login(@RequestBody UserLoginDto userLoginDto) { - fnsReceiptWebClient.login(userLoginDto.getPhone(), userLoginDto.getPassword()); + operationUserService.login(userLoginDto); UserProfile userProfile = userProfileService.createOrUpdate(userLoginDto.getPhone(), userLoginDto.getPassword()); return userProfile.getAccessToken(); } diff --git a/rest-api/src/main/java/space/shefer/receipt/rest/service/OperationUserService.java b/rest-api/src/main/java/space/shefer/receipt/rest/service/OperationUserService.java index 06995e7..0e46433 100644 --- a/rest-api/src/main/java/space/shefer/receipt/rest/service/OperationUserService.java +++ b/rest-api/src/main/java/space/shefer/receipt/rest/service/OperationUserService.java @@ -1,12 +1,17 @@ package space.shefer.receipt.rest.service; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import space.shefer.receipt.fnssdk.dto.UserResponseLoginFnsDto; import space.shefer.receipt.fnssdk.webclient.FnsReceiptWebClient; import space.shefer.receipt.platform.core.entity.UserProfile; import space.shefer.receipt.platform.core.repository.UserProfileRepository; +import space.shefer.receipt.rest.dto.UserLoginDto; import space.shefer.receipt.rest.dto.UserSignUpDto; +import java.util.Objects; + @Service public class OperationUserService { @@ -42,4 +47,16 @@ public UserSignUpDto getUserByToken(String authHeader) { return userSignUpDto; } + public void login(UserLoginDto userLoginDto) { + ResponseEntity responseEntity = fnsReceiptWebClient.login(userLoginDto.getPhone(), userLoginDto.getPassword()); + if (responseEntity != null) { + UserProfile userProfile = userProfileRepository.getByPhone(userLoginDto.getPhone()); + if (userProfile != null && userProfile.getUpdatedAt() == null) { + userProfile.setName(Objects.requireNonNull(responseEntity.getBody()).name); + userProfile.setEmail(Objects.requireNonNull(responseEntity.getBody()).email); + userProfileRepository.save(userProfile); + } + } + } + } From f27234042613024069e47b5b6b2874d93e409407 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sat, 20 Jun 2020 19:00:32 +0300 Subject: [PATCH 05/13] RCJ-93 add new Exception Handler and finish logic with searching by token --- .../receipt/fnssdk/excepion/FnsException.kt | 14 +++---- .../fnssdk/service/ResponseErrorHandleFNS.kt | 31 ++++++++++++++++ .../fnssdk/webclient/FnsReceiptWebClient.kt | 37 ++++++++++--------- .../rest/controller/UserController.java | 14 +++---- ...onUserService.java => FnsUserService.java} | 13 ++----- 5 files changed, 68 insertions(+), 41 deletions(-) create mode 100644 fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt rename rest-api/src/main/java/space/shefer/receipt/rest/service/{OperationUserService.java => FnsUserService.java} (77%) diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt index 984b527..a0ac26b 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt @@ -13,13 +13,13 @@ class AuthorizationFailedException(login: String, cause: Throwable? = null) : FnsException("Login with phone $login failed", cause) @ResponseStatus(code = HttpStatus.CONFLICT) -class UserWasExistException(userName: String, cause: Throwable? = null) - : FnsException("This user $userName exists", cause) +class UserAlreadyExistsException(userName: String) + : FnsException("This user $userName exists") @ResponseStatus(code = HttpStatus.BAD_REQUEST) -class IncorrectEmailException(email: String, cause: Throwable? = null) - : FnsException("Object didn't pass validation for format email: $email", cause) +class IncorrectEmailException(email: String) + : FnsException("Object didn't pass validation for format email: $email") -@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR) -class IncorrectPhoneException(phone: String, cause: Throwable? = null) - : FnsException("Phone $phone is incorrect", cause) +@ResponseStatus(code = HttpStatus.BAD_REQUEST) +class IncorrectPhoneException(phone: String) + : FnsException("Phone $phone is incorrect") diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt new file mode 100644 index 0000000..eb68a35 --- /dev/null +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt @@ -0,0 +1,31 @@ +package space.shefer.receipt.fnssdk.service + +import org.springframework.http.HttpStatus +import org.springframework.http.client.ClientHttpResponse +import org.springframework.web.client.ResponseErrorHandler +import java.io.IOException + +class ResponseErrorHandleFNS : ResponseErrorHandler { + + @Throws(IOException::class) + override fun handleError(httpResponse: ClientHttpResponse) { + when { + httpResponse.statusCode + .series() == HttpStatus.Series.SERVER_ERROR -> { + + } + httpResponse.statusCode + .series() == HttpStatus.Series.CLIENT_ERROR -> { + + } + httpResponse.statusCode == HttpStatus.NOT_FOUND -> { + + } + } + } + + override fun hasError(response: ClientHttpResponse): Boolean { + return false + } + +} diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt index bd3dc72..7cbc5a4 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt @@ -14,7 +14,8 @@ import space.shefer.receipt.fnssdk.dto.UserResponseLoginFnsDto import space.shefer.receipt.fnssdk.excepion.AuthorizationFailedException import space.shefer.receipt.fnssdk.excepion.IncorrectEmailException import space.shefer.receipt.fnssdk.excepion.IncorrectPhoneException -import space.shefer.receipt.fnssdk.excepion.UserWasExistException +import space.shefer.receipt.fnssdk.excepion.UserAlreadyExistsException +import space.shefer.receipt.fnssdk.service.ResponseErrorHandleFNS import java.net.URI import java.util.* @@ -70,7 +71,6 @@ class FnsReceiptWebClient { throw e } - return responseEntity.statusCode == HttpStatus.NO_CONTENT } @@ -85,23 +85,26 @@ class FnsReceiptWebClient { ) } - fun signUp(email: String, name: String, phone: String): Boolean { + fun signUp(email: String, name: String, phone: String) { val headers = HttpHeaders() headers.add("Content-Type", "application/json; charset=UTF-8") - try { - RestTemplate().exchange( - URI("$HOST/v1/mobile/users/signup"), - HttpMethod.POST, - HttpEntity("""{"email":"$email","name":"$name","phone":"$phone"}""", headers), - String::class.java - ) - return true - } catch (e: HttpClientErrorException.Conflict) { - throw UserWasExistException(name, e) - } catch (c: HttpClientErrorException.BadRequest) { - throw IncorrectEmailException(email, c) - } catch (d: HttpServerErrorException.InternalServerError) { - throw IncorrectPhoneException(phone, d) + val restTemplate = RestTemplate() + restTemplate.errorHandler = ResponseErrorHandleFNS() + + val responseEntity = restTemplate.exchange( + URI("$HOST/v1/mobile/users/signup"), + HttpMethod.POST, + HttpEntity("""{"email":"$email","name":"$name","phone":"$phone"}""", headers), + String::class.java + ) + if (responseEntity.statusCode == HttpStatus.CONFLICT && responseEntity.body == "user exists") { + throw UserAlreadyExistsException(name); + } else if (responseEntity.statusCode == HttpStatus.BAD_REQUEST + && responseEntity.body.toString().contains("Object didn't pass validation for format email: $email")) { + throw IncorrectEmailException(email); + } else if (responseEntity.statusCode == HttpStatus.INTERNAL_SERVER_ERROR + && responseEntity.body == "failed with code 20101") { + throw IncorrectPhoneException(phone) } } diff --git a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java index a0210eb..f12f4fe 100644 --- a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java +++ b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java @@ -14,7 +14,7 @@ import space.shefer.receipt.rest.dto.UserLoginDto; import space.shefer.receipt.rest.dto.UserPasswordRestoreDto; import space.shefer.receipt.rest.dto.UserSignUpDto; -import space.shefer.receipt.rest.service.OperationUserService; +import space.shefer.receipt.rest.service.FnsUserService; @RestController @@ -22,31 +22,31 @@ public class UserController { private final FnsReceiptWebClient fnsReceiptWebClient; private final UserProfileService userProfileService; - private final OperationUserService operationUserService; + private final FnsUserService fnsUserService; @Autowired - public UserController(FnsReceiptWebClient fnsReceiptWebClient, UserProfileService userProfileService, OperationUserService operationUserService) { + public UserController(FnsReceiptWebClient fnsReceiptWebClient, UserProfileService userProfileService, FnsUserService fnsUserService) { this.fnsReceiptWebClient = fnsReceiptWebClient; this.userProfileService = userProfileService; - this.operationUserService = operationUserService; + this.fnsUserService = fnsUserService; } @RequestMapping(value = "/login", method = RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE) public String login(@RequestBody UserLoginDto userLoginDto) { - operationUserService.login(userLoginDto); + fnsUserService.login(userLoginDto); UserProfile userProfile = userProfileService.createOrUpdate(userLoginDto.getPhone(), userLoginDto.getPassword()); return userProfile.getAccessToken(); } @RequestMapping(value = "/signUp", method = RequestMethod.POST) public void signUp(@RequestBody UserSignUpDto userSignUpDto) { - operationUserService.signUp(userSignUpDto); + fnsUserService.signUp(userSignUpDto); } @RequestMapping(value = "/users/me", method = RequestMethod.GET) public UserSignUpDto getInfoByToken(@Nullable @RequestHeader("Authorization") String authHeader) { if (authHeader != null) { - return operationUserService.getUserByToken(authHeader.substring(authHeader.indexOf(" ") + 1)); + return fnsUserService.getUserByToken(authHeader.substring(authHeader.indexOf(" ") + 1)); } return null; } diff --git a/rest-api/src/main/java/space/shefer/receipt/rest/service/OperationUserService.java b/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java similarity index 77% rename from rest-api/src/main/java/space/shefer/receipt/rest/service/OperationUserService.java rename to rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java index 0e46433..e218917 100644 --- a/rest-api/src/main/java/space/shefer/receipt/rest/service/OperationUserService.java +++ b/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java @@ -13,26 +13,19 @@ import java.util.Objects; @Service -public class OperationUserService { +public class FnsUserService { private final UserProfileRepository userProfileRepository; private final FnsReceiptWebClient fnsReceiptWebClient; @Autowired - public OperationUserService(UserProfileRepository userProfileRepository, FnsReceiptWebClient fnsReceiptWebClient) { + public FnsUserService(UserProfileRepository userProfileRepository, FnsReceiptWebClient fnsReceiptWebClient) { this.userProfileRepository = userProfileRepository; this.fnsReceiptWebClient = fnsReceiptWebClient; } public void signUp(UserSignUpDto userSignUpDto) { - UserProfile userProfile = userProfileRepository.getByPhone(userSignUpDto.getPhone()); - if (fnsReceiptWebClient.signUp(userSignUpDto.getName(), userSignUpDto.getName(), userSignUpDto.getPhone())) { - userProfile.setPhone(userSignUpDto.getPhone()); - userProfile.setEmail(userSignUpDto.getEmail()); - userProfile.setName(userSignUpDto.getName()); - userProfileRepository.save(userProfile); - } - + fnsReceiptWebClient.signUp(userSignUpDto.getEmail(), userSignUpDto.getName(), userSignUpDto.getPhone()); } public UserSignUpDto getUserByToken(String authHeader) { From 5cc777373981e470bc3e7f7bfecfe7a09f80e39e Mon Sep 17 00:00:00 2001 From: Vlad Date: Mon, 22 Jun 2020 14:28:10 +0300 Subject: [PATCH 06/13] RCJ-93 rewrite ResponseErrorHandleFNS.kt --- .../fnssdk/service/ResponseErrorHandleFNS.kt | 23 +++++++++++-------- .../fnssdk/webclient/FnsReceiptWebClient.kt | 12 ++++------ .../receipt/rest/service/FnsUserService.java | 6 ++--- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt index eb68a35..b385fc8 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt @@ -4,24 +4,29 @@ import org.springframework.http.HttpStatus import org.springframework.http.client.ClientHttpResponse import org.springframework.web.client.ResponseErrorHandler import java.io.IOException +import java.lang.UnsupportedOperationException class ResponseErrorHandleFNS : ResponseErrorHandler { @Throws(IOException::class) override fun handleError(httpResponse: ClientHttpResponse) { - when { - httpResponse.statusCode - .series() == HttpStatus.Series.SERVER_ERROR -> { - } - httpResponse.statusCode - .series() == HttpStatus.Series.CLIENT_ERROR -> { + if ((httpResponse.statusCode != HttpStatus.CONFLICT) + && (httpResponse.statusCode != HttpStatus.BAD_REQUEST) + && (httpResponse.statusCode != HttpStatus.INTERNAL_SERVER_ERROR)) { + throw UnsupportedOperationException("Unexpected error") + } - } - httpResponse.statusCode == HttpStatus.NOT_FOUND -> { - } + if (httpResponse.statusCode == HttpStatus.CONFLICT && httpResponse.body.toString() != "user exists") { + throw UnsupportedOperationException("Unexpected error"); + } else if (httpResponse.statusCode == HttpStatus.BAD_REQUEST && !httpResponse.body.toString().contains("Object didn't pass validation for format email")) { + throw UnsupportedOperationException("Unexpected error") + } else if (httpResponse.statusCode == HttpStatus.INTERNAL_SERVER_ERROR + && httpResponse.body.toString() != "failed with code 20101") { + throw UnsupportedOperationException("Unexpected error") } + } override fun hasError(response: ClientHttpResponse): Boolean { diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt index 7cbc5a4..335b3e1 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt @@ -97,18 +97,16 @@ class FnsReceiptWebClient { HttpEntity("""{"email":"$email","name":"$name","phone":"$phone"}""", headers), String::class.java ) - if (responseEntity.statusCode == HttpStatus.CONFLICT && responseEntity.body == "user exists") { + if (responseEntity.statusCode == HttpStatus.CONFLICT) { throw UserAlreadyExistsException(name); - } else if (responseEntity.statusCode == HttpStatus.BAD_REQUEST - && responseEntity.body.toString().contains("Object didn't pass validation for format email: $email")) { + } else if (responseEntity.statusCode == HttpStatus.BAD_REQUEST) { throw IncorrectEmailException(email); - } else if (responseEntity.statusCode == HttpStatus.INTERNAL_SERVER_ERROR - && responseEntity.body == "failed with code 20101") { + } else if (responseEntity.statusCode == HttpStatus.INTERNAL_SERVER_ERROR) { throw IncorrectPhoneException(phone) } } - fun login(phone: String, password: String): ResponseEntity? { + fun login(phone: String, password: String): UserResponseLoginFnsDto? { val headers = HttpHeaders() headers.add("Content-Type", "application/json; charset=UTF-8") headers.add("Authorization", getAuthHeader(login, password)) @@ -118,7 +116,7 @@ class FnsReceiptWebClient { HttpMethod.GET, HttpEntity(headers), UserResponseLoginFnsDto::class.java - ) + ).body } catch (e: HttpClientErrorException.Forbidden) { throw AuthorizationFailedException(login, e) } diff --git a/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java b/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java index e218917..5fbca6b 100644 --- a/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java +++ b/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java @@ -41,12 +41,12 @@ public UserSignUpDto getUserByToken(String authHeader) { } public void login(UserLoginDto userLoginDto) { - ResponseEntity responseEntity = fnsReceiptWebClient.login(userLoginDto.getPhone(), userLoginDto.getPassword()); + UserResponseLoginFnsDto responseEntity = fnsReceiptWebClient.login(userLoginDto.getPhone(), userLoginDto.getPassword()); if (responseEntity != null) { UserProfile userProfile = userProfileRepository.getByPhone(userLoginDto.getPhone()); if (userProfile != null && userProfile.getUpdatedAt() == null) { - userProfile.setName(Objects.requireNonNull(responseEntity.getBody()).name); - userProfile.setEmail(Objects.requireNonNull(responseEntity.getBody()).email); + userProfile.setName(responseEntity.getName()); + userProfile.setEmail(responseEntity.getEmail()); userProfileRepository.save(userProfile); } } From 8ec34805f6f54416a4d72981cd6239ab1d937e90 Mon Sep 17 00:00:00 2001 From: Vlad Date: Tue, 23 Jun 2020 20:56:59 +0300 Subject: [PATCH 07/13] RCJ-93 add check on HttpStatus.NO_CONTENT --- .../shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt index b385fc8..647978b 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt @@ -10,6 +10,9 @@ class ResponseErrorHandleFNS : ResponseErrorHandler { @Throws(IOException::class) override fun handleError(httpResponse: ClientHttpResponse) { + if (httpResponse.statusCode == HttpStatus.NO_CONTENT) { + return; + } if ((httpResponse.statusCode != HttpStatus.CONFLICT) && (httpResponse.statusCode != HttpStatus.BAD_REQUEST) From f85e365207de0a194544545cb9a2c48630cde0f2 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 24 Jun 2020 11:05:21 +0300 Subject: [PATCH 08/13] RCJ-93 rebuild exception handler, rename dto, and add try cuth to signUp --- ...onseLoginFnsDto.kt => FnsLoginResponse.kt} | 2 +- .../receipt/fnssdk/excepion/FnsException.kt | 4 ++ .../fnssdk/service/ResponseErrorHandleFNS.kt | 5 ++- .../fnssdk/webclient/FnsReceiptWebClient.kt | 42 +++++++++---------- .../receipt/rest/service/FnsUserService.java | 7 +--- 5 files changed, 31 insertions(+), 29 deletions(-) rename fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/dto/{UserResponseLoginFnsDto.kt => FnsLoginResponse.kt} (76%) diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/dto/UserResponseLoginFnsDto.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/dto/FnsLoginResponse.kt similarity index 76% rename from fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/dto/UserResponseLoginFnsDto.kt rename to fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/dto/FnsLoginResponse.kt index 3bca9dd..af647e9 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/dto/UserResponseLoginFnsDto.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/dto/FnsLoginResponse.kt @@ -1,7 +1,7 @@ package space.shefer.receipt.fnssdk.dto -class UserResponseLoginFnsDto { +class FnsLoginResponse { lateinit var email: String lateinit var name: String diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt index a0ac26b..a670bc9 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt @@ -23,3 +23,7 @@ class IncorrectEmailException(email: String) @ResponseStatus(code = HttpStatus.BAD_REQUEST) class IncorrectPhoneException(phone: String) : FnsException("Phone $phone is incorrect") + +@ResponseStatus(code = HttpStatus.FORBIDDEN) +class UnexpectedHttpException() + : FnsException("Unexpected error") diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt index 647978b..235c731 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt @@ -33,7 +33,8 @@ class ResponseErrorHandleFNS : ResponseErrorHandler { } override fun hasError(response: ClientHttpResponse): Boolean { - return false + return ( + response.statusCode.series() == HttpStatus.Series.CLIENT_ERROR + || response.statusCode.series() == HttpStatus.Series.SERVER_ERROR); } - } diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt index 335b3e1..24ef189 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt @@ -5,17 +5,14 @@ import org.springframework.http.HttpEntity import org.springframework.http.HttpHeaders import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus -import org.springframework.http.ResponseEntity import org.springframework.stereotype.Component import org.springframework.web.client.HttpClientErrorException import org.springframework.web.client.HttpServerErrorException import org.springframework.web.client.RestTemplate -import space.shefer.receipt.fnssdk.dto.UserResponseLoginFnsDto -import space.shefer.receipt.fnssdk.excepion.AuthorizationFailedException -import space.shefer.receipt.fnssdk.excepion.IncorrectEmailException -import space.shefer.receipt.fnssdk.excepion.IncorrectPhoneException -import space.shefer.receipt.fnssdk.excepion.UserAlreadyExistsException +import space.shefer.receipt.fnssdk.dto.FnsLoginResponse +import space.shefer.receipt.fnssdk.excepion.* import space.shefer.receipt.fnssdk.service.ResponseErrorHandleFNS +import java.lang.Exception import java.net.URI import java.util.* @@ -90,23 +87,26 @@ class FnsReceiptWebClient { headers.add("Content-Type", "application/json; charset=UTF-8") val restTemplate = RestTemplate() restTemplate.errorHandler = ResponseErrorHandleFNS() - - val responseEntity = restTemplate.exchange( - URI("$HOST/v1/mobile/users/signup"), - HttpMethod.POST, - HttpEntity("""{"email":"$email","name":"$name","phone":"$phone"}""", headers), - String::class.java - ) - if (responseEntity.statusCode == HttpStatus.CONFLICT) { - throw UserAlreadyExistsException(name); - } else if (responseEntity.statusCode == HttpStatus.BAD_REQUEST) { - throw IncorrectEmailException(email); - } else if (responseEntity.statusCode == HttpStatus.INTERNAL_SERVER_ERROR) { - throw IncorrectPhoneException(phone) + try { + val responseEntity = restTemplate.exchange( + URI("$HOST/v1/mobile/users/signup"), + HttpMethod.POST, + HttpEntity("""{"email":"$email","name":"$name","phone":"$phone"}""", headers), + String::class.java + ) + if (responseEntity.statusCode == HttpStatus.CONFLICT) { + throw UserAlreadyExistsException(name); + } else if (responseEntity.statusCode == HttpStatus.BAD_REQUEST) { + throw IncorrectEmailException(email); + } else if (responseEntity.statusCode == HttpStatus.INTERNAL_SERVER_ERROR) { + throw IncorrectPhoneException(phone) + } + } catch (e: Exception) { + throw UnexpectedHttpException(); } } - fun login(phone: String, password: String): UserResponseLoginFnsDto? { + fun login(phone: String, password: String): FnsLoginResponse? { val headers = HttpHeaders() headers.add("Content-Type", "application/json; charset=UTF-8") headers.add("Authorization", getAuthHeader(login, password)) @@ -115,7 +115,7 @@ class FnsReceiptWebClient { URI("$HOST/v1/mobile/users/login"), HttpMethod.GET, HttpEntity(headers), - UserResponseLoginFnsDto::class.java + FnsLoginResponse::class.java ).body } catch (e: HttpClientErrorException.Forbidden) { throw AuthorizationFailedException(login, e) diff --git a/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java b/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java index 5fbca6b..a03afb0 100644 --- a/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java +++ b/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java @@ -1,17 +1,14 @@ package space.shefer.receipt.rest.service; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; -import space.shefer.receipt.fnssdk.dto.UserResponseLoginFnsDto; +import space.shefer.receipt.fnssdk.dto.FnsLoginResponse; import space.shefer.receipt.fnssdk.webclient.FnsReceiptWebClient; import space.shefer.receipt.platform.core.entity.UserProfile; import space.shefer.receipt.platform.core.repository.UserProfileRepository; import space.shefer.receipt.rest.dto.UserLoginDto; import space.shefer.receipt.rest.dto.UserSignUpDto; -import java.util.Objects; - @Service public class FnsUserService { @@ -41,7 +38,7 @@ public UserSignUpDto getUserByToken(String authHeader) { } public void login(UserLoginDto userLoginDto) { - UserResponseLoginFnsDto responseEntity = fnsReceiptWebClient.login(userLoginDto.getPhone(), userLoginDto.getPassword()); + FnsLoginResponse responseEntity = fnsReceiptWebClient.login(userLoginDto.getPhone(), userLoginDto.getPassword()); if (responseEntity != null) { UserProfile userProfile = userProfileRepository.getByPhone(userLoginDto.getPhone()); if (userProfile != null && userProfile.getUpdatedAt() == null) { From a9ccaa6ca1c597d265319f5ae3a86a367a1dbf56 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 24 Jun 2020 13:41:13 +0300 Subject: [PATCH 09/13] RCJ-93 change http status for exception --- .../space/shefer/receipt/fnssdk/excepion/FnsException.kt | 2 +- .../shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt index a670bc9..2fd5ccb 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt @@ -24,6 +24,6 @@ class IncorrectEmailException(email: String) class IncorrectPhoneException(phone: String) : FnsException("Phone $phone is incorrect") -@ResponseStatus(code = HttpStatus.FORBIDDEN) +@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR) class UnexpectedHttpException() : FnsException("Unexpected error") diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt index 24ef189..9ea8c38 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt @@ -13,6 +13,7 @@ import space.shefer.receipt.fnssdk.dto.FnsLoginResponse import space.shefer.receipt.fnssdk.excepion.* import space.shefer.receipt.fnssdk.service.ResponseErrorHandleFNS import java.lang.Exception +import java.lang.UnsupportedOperationException import java.net.URI import java.util.* @@ -101,7 +102,7 @@ class FnsReceiptWebClient { } else if (responseEntity.statusCode == HttpStatus.INTERNAL_SERVER_ERROR) { throw IncorrectPhoneException(phone) } - } catch (e: Exception) { + } catch (e: UnsupportedOperationException) { throw UnexpectedHttpException(); } } From c2e09fa9d2696187944c12273e8306d27dc543d8 Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 24 Jun 2020 14:17:34 +0300 Subject: [PATCH 10/13] RCJ-93 removed exception --- .../fnssdk/service/ResponseErrorHandleFNS.kt | 9 +++--- .../fnssdk/webclient/FnsReceiptWebClient.kt | 29 +++++++++---------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt index 235c731..c1bebe5 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt @@ -3,6 +3,7 @@ package space.shefer.receipt.fnssdk.service import org.springframework.http.HttpStatus import org.springframework.http.client.ClientHttpResponse import org.springframework.web.client.ResponseErrorHandler +import space.shefer.receipt.fnssdk.excepion.UnexpectedHttpException import java.io.IOException import java.lang.UnsupportedOperationException @@ -17,17 +18,17 @@ class ResponseErrorHandleFNS : ResponseErrorHandler { if ((httpResponse.statusCode != HttpStatus.CONFLICT) && (httpResponse.statusCode != HttpStatus.BAD_REQUEST) && (httpResponse.statusCode != HttpStatus.INTERNAL_SERVER_ERROR)) { - throw UnsupportedOperationException("Unexpected error") + throw UnexpectedHttpException() } if (httpResponse.statusCode == HttpStatus.CONFLICT && httpResponse.body.toString() != "user exists") { - throw UnsupportedOperationException("Unexpected error"); + throw UnexpectedHttpException() } else if (httpResponse.statusCode == HttpStatus.BAD_REQUEST && !httpResponse.body.toString().contains("Object didn't pass validation for format email")) { - throw UnsupportedOperationException("Unexpected error") + throw UnexpectedHttpException() } else if (httpResponse.statusCode == HttpStatus.INTERNAL_SERVER_ERROR && httpResponse.body.toString() != "failed with code 20101") { - throw UnsupportedOperationException("Unexpected error") + throw UnexpectedHttpException() } } diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt index 9ea8c38..3256adc 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt @@ -88,23 +88,20 @@ class FnsReceiptWebClient { headers.add("Content-Type", "application/json; charset=UTF-8") val restTemplate = RestTemplate() restTemplate.errorHandler = ResponseErrorHandleFNS() - try { - val responseEntity = restTemplate.exchange( - URI("$HOST/v1/mobile/users/signup"), - HttpMethod.POST, - HttpEntity("""{"email":"$email","name":"$name","phone":"$phone"}""", headers), - String::class.java - ) - if (responseEntity.statusCode == HttpStatus.CONFLICT) { - throw UserAlreadyExistsException(name); - } else if (responseEntity.statusCode == HttpStatus.BAD_REQUEST) { - throw IncorrectEmailException(email); - } else if (responseEntity.statusCode == HttpStatus.INTERNAL_SERVER_ERROR) { - throw IncorrectPhoneException(phone) - } - } catch (e: UnsupportedOperationException) { - throw UnexpectedHttpException(); + val responseEntity = restTemplate.exchange( + URI("$HOST/v1/mobile/users/signup"), + HttpMethod.POST, + HttpEntity("""{"email":"$email","name":"$name","phone":"$phone"}""", headers), + String::class.java + ) + if (responseEntity.statusCode == HttpStatus.CONFLICT) { + throw UserAlreadyExistsException(name); + } else if (responseEntity.statusCode == HttpStatus.BAD_REQUEST) { + throw IncorrectEmailException(email); + } else if (responseEntity.statusCode == HttpStatus.INTERNAL_SERVER_ERROR) { + throw IncorrectPhoneException(phone) } + } fun login(phone: String, password: String): FnsLoginResponse? { From 5187e14cd6d152ff263f943737ff06c12d20b4d7 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sat, 11 Jul 2020 00:31:32 +0300 Subject: [PATCH 11/13] RCJ-93 move logic from ErrorHandler to FnsReceiptWebClient.kt --- .../fnssdk/service/ResponseErrorHandleFNS.kt | 26 +------------------ .../fnssdk/webclient/FnsReceiptWebClient.kt | 15 +++++++---- .../rest/controller/UserController.java | 10 ++++++- 3 files changed, 20 insertions(+), 31 deletions(-) diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt index c1bebe5..8d0f01b 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/service/ResponseErrorHandleFNS.kt @@ -1,41 +1,17 @@ package space.shefer.receipt.fnssdk.service -import org.springframework.http.HttpStatus import org.springframework.http.client.ClientHttpResponse import org.springframework.web.client.ResponseErrorHandler -import space.shefer.receipt.fnssdk.excepion.UnexpectedHttpException import java.io.IOException -import java.lang.UnsupportedOperationException class ResponseErrorHandleFNS : ResponseErrorHandler { @Throws(IOException::class) override fun handleError(httpResponse: ClientHttpResponse) { - if (httpResponse.statusCode == HttpStatus.NO_CONTENT) { - return; - } - - if ((httpResponse.statusCode != HttpStatus.CONFLICT) - && (httpResponse.statusCode != HttpStatus.BAD_REQUEST) - && (httpResponse.statusCode != HttpStatus.INTERNAL_SERVER_ERROR)) { - throw UnexpectedHttpException() - } - - - if (httpResponse.statusCode == HttpStatus.CONFLICT && httpResponse.body.toString() != "user exists") { - throw UnexpectedHttpException() - } else if (httpResponse.statusCode == HttpStatus.BAD_REQUEST && !httpResponse.body.toString().contains("Object didn't pass validation for format email")) { - throw UnexpectedHttpException() - } else if (httpResponse.statusCode == HttpStatus.INTERNAL_SERVER_ERROR - && httpResponse.body.toString() != "failed with code 20101") { - throw UnexpectedHttpException() - } } override fun hasError(response: ClientHttpResponse): Boolean { - return ( - response.statusCode.series() == HttpStatus.Series.CLIENT_ERROR - || response.statusCode.series() == HttpStatus.Series.SERVER_ERROR); + return false } } diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt index 3256adc..420fe8e 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/webclient/FnsReceiptWebClient.kt @@ -12,8 +12,6 @@ import org.springframework.web.client.RestTemplate import space.shefer.receipt.fnssdk.dto.FnsLoginResponse import space.shefer.receipt.fnssdk.excepion.* import space.shefer.receipt.fnssdk.service.ResponseErrorHandleFNS -import java.lang.Exception -import java.lang.UnsupportedOperationException import java.net.URI import java.util.* @@ -94,12 +92,19 @@ class FnsReceiptWebClient { HttpEntity("""{"email":"$email","name":"$name","phone":"$phone"}""", headers), String::class.java ) - if (responseEntity.statusCode == HttpStatus.CONFLICT) { + if (responseEntity.statusCode == HttpStatus.NO_CONTENT) { + return + } + if (responseEntity.statusCode == HttpStatus.CONFLICT && responseEntity.body.toString() == "user exists") { throw UserAlreadyExistsException(name); - } else if (responseEntity.statusCode == HttpStatus.BAD_REQUEST) { + } else if (responseEntity.statusCode == HttpStatus.BAD_REQUEST + && responseEntity.body.toString().contains("Object didn't pass validation for format email")) { throw IncorrectEmailException(email); - } else if (responseEntity.statusCode == HttpStatus.INTERNAL_SERVER_ERROR) { + } else if (responseEntity.statusCode == HttpStatus.INTERNAL_SERVER_ERROR + && responseEntity.body.toString() == "failed with code 20101") { throw IncorrectPhoneException(phone) + } else { + throw UnexpectedHttpException() } } diff --git a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java index f12f4fe..9725fa5 100644 --- a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java +++ b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java @@ -1,6 +1,7 @@ package space.shefer.receipt.rest.controller; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.lang.Nullable; import org.springframework.web.bind.annotation.RequestBody; @@ -8,6 +9,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.HttpClientErrorException; import space.shefer.receipt.fnssdk.webclient.FnsReceiptWebClient; import space.shefer.receipt.platform.core.entity.UserProfile; import space.shefer.receipt.platform.core.service.UserProfileService; @@ -15,6 +17,9 @@ import space.shefer.receipt.rest.dto.UserPasswordRestoreDto; import space.shefer.receipt.rest.dto.UserSignUpDto; import space.shefer.receipt.rest.service.FnsUserService; +import org.springframework.web.client.HttpClientErrorException; + +import static org.springframework.http.HttpStatus.BAD_REQUEST; @RestController @@ -46,7 +51,7 @@ public void signUp(@RequestBody UserSignUpDto userSignUpDto) { @RequestMapping(value = "/users/me", method = RequestMethod.GET) public UserSignUpDto getInfoByToken(@Nullable @RequestHeader("Authorization") String authHeader) { if (authHeader != null) { - return fnsUserService.getUserByToken(authHeader.substring(authHeader.indexOf(" ") + 1)); + return fnsUserService.getUserByToken(getTokenFromAuthHeader(authHeader)); } return null; } @@ -56,5 +61,8 @@ public void passwordRestore(@RequestBody UserPasswordRestoreDto userPasswordRest fnsReceiptWebClient.passwordRestore(userPasswordRestoreDto.getPhone()); } + public String getTokenFromAuthHeader(String authHeader) { + return authHeader.substring(authHeader.indexOf(" ") + 1); + } } From 3fdbe2499363e605f78d85c76de165e1a21a447e Mon Sep 17 00:00:00 2001 From: Vlad Date: Sat, 11 Jul 2020 01:06:59 +0300 Subject: [PATCH 12/13] RCJ-93 rewrite logic for login --- .../receipt/rest/service/FnsUserService.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java b/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java index a03afb0..984781f 100644 --- a/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java +++ b/rest-api/src/main/java/space/shefer/receipt/rest/service/FnsUserService.java @@ -41,10 +41,20 @@ public void login(UserLoginDto userLoginDto) { FnsLoginResponse responseEntity = fnsReceiptWebClient.login(userLoginDto.getPhone(), userLoginDto.getPassword()); if (responseEntity != null) { UserProfile userProfile = userProfileRepository.getByPhone(userLoginDto.getPhone()); - if (userProfile != null && userProfile.getUpdatedAt() == null) { - userProfile.setName(responseEntity.getName()); - userProfile.setEmail(responseEntity.getEmail()); - userProfileRepository.save(userProfile); + if (userProfile != null) { + if (!userProfile.getEmail().equals(responseEntity.email) || (!userProfile.getName().equals(responseEntity.name))) { + userProfile.setName(responseEntity.getName()); + userProfile.setEmail(responseEntity.getEmail()); + userProfileRepository.save(userProfile); + } + } + else { + UserProfile newUserProfile = new UserProfile(); + newUserProfile.setPhone(userLoginDto.getPhone()); + newUserProfile.setEmail(responseEntity.email); + newUserProfile.setName(responseEntity.name); + newUserProfile.setPassword(userLoginDto.getPassword()); + userProfileRepository.save(newUserProfile); } } } From 9d515ed8ec00a02cda5829209099b4036e554798 Mon Sep 17 00:00:00 2001 From: Vlad Date: Sat, 11 Jul 2020 01:12:48 +0300 Subject: [PATCH 13/13] RCJ-93 return 404 if token not found --- .../space/shefer/receipt/fnssdk/excepion/FnsException.kt | 4 ++++ .../space/shefer/receipt/rest/controller/UserController.java | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt index 2fd5ccb..6124a84 100644 --- a/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt +++ b/fns-sdk/src/main/kotlin/space/shefer/receipt/fnssdk/excepion/FnsException.kt @@ -27,3 +27,7 @@ class IncorrectPhoneException(phone: String) @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR) class UnexpectedHttpException() : FnsException("Unexpected error") + +@ResponseStatus(code = HttpStatus.NOT_FOUND) +class ErrorToken() + : FnsException("Token not found") diff --git a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java index 9725fa5..076dc51 100644 --- a/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java +++ b/rest-api/src/main/java/space/shefer/receipt/rest/controller/UserController.java @@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.HttpClientErrorException; +import space.shefer.receipt.fnssdk.excepion.ErrorToken; import space.shefer.receipt.fnssdk.webclient.FnsReceiptWebClient; import space.shefer.receipt.platform.core.entity.UserProfile; import space.shefer.receipt.platform.core.service.UserProfileService; @@ -53,7 +54,7 @@ public UserSignUpDto getInfoByToken(@Nullable @RequestHeader("Authorization") St if (authHeader != null) { return fnsUserService.getUserByToken(getTokenFromAuthHeader(authHeader)); } - return null; + throw new ErrorToken(); } @RequestMapping(value = "/passwordRestore", method = RequestMethod.POST)