From 4ef6fec30a6bbdaef2de00d8b92acbf30af1c4fa Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Fri, 19 Oct 2018 18:20:11 +0300 Subject: [PATCH 1/5] NY-4398: Endpoint for editing contact info for account Signed-off-by: Stanimir Penkov --- .../AccountRepositoryAdditional.java | 2 + .../AccountRepositoryAdditionalImpl.java | 32 +++++++++ .../account/services/AccountServiceImpl.java | 71 +++++++++++++++++++ 3 files changed, 105 insertions(+) diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java index 876f037..3503b42 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java @@ -42,4 +42,6 @@ public interface AccountRepositoryAdditional { boolean addContactInfo(UUID accountId, ContactInfo contactInfo); boolean deleteContactInfo(UUID accountId, ContactInfo contactInfo); + + boolean editContactInfo(UUID accountId, ContactInfo oldContactInfo, ContactInfo editedContactInfo); } diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java index d105163..a108339 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java @@ -614,4 +614,36 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio } return false; } + + @Override + public boolean editContactInfo(UUID accountId, ContactInfo oldContactInfo, ContactInfo editedContactInfo) { + Account accountToUpdate = accountRepository.findByAccountId(accountId); + if (accountToUpdate == null) { + logger.error("Existing account with the provided id {} was not found.", accountId); + return false; + } + Set contactsInfoSet = accountToUpdate.getContactsInfo(); + if (contactsInfoSet == null) { + logger.error("No existing contact info found for account {}.", accountId); + return false; + } + if (!contactsInfoSet.remove(oldContactInfo)) { + logger.error("Error removing contact info from account {}. Existing contact info: {} was not found.", + accountId, oldContactInfo.toString()); + return false; + } + if (!contactsInfoSet.add(editedContactInfo)) { + logger.error("Error adding contact info to account {}. {} already exists.", accountId, + editedContactInfo.toString()); + return false; + } + accountToUpdate.setContactsInfo(contactsInfoSet); + Long timeUpdated = Instant.now().toEpochMilli(); + accountToUpdate.setLastUpdateTimestamp(timeUpdated); + WriteResult wr = cassandraTemplate.update(accountToUpdate, UpdateOptions.builder().ifExists(true).build()); + if (wr != null && wr.wasApplied()) { + return true; + } + return false; + } } diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index 261f4f1..55bb082 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -41,6 +41,7 @@ import biz.nynja.account.grpc.DeleteAuthenticationProviderRequest; import biz.nynja.account.grpc.DeleteContactInfoRequest; import biz.nynja.account.grpc.StatusResponse; import biz.nynja.account.grpc.DeleteProfileRequest; +import biz.nynja.account.grpc.EditContactInfoRequest; import biz.nynja.account.grpc.ErrorResponse; import biz.nynja.account.grpc.ErrorResponse.Cause; import biz.nynja.account.models.Account; @@ -701,6 +702,76 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas return; } + @Override + public void editContactInfoForAccount(EditContactInfoRequest request, + StreamObserver responseObserver) { + logger.info("Removing contact info from account requested."); + logger.debug("Removing contact info from account requested: {}", request); + Cause causeOldContactInfo = validator.validateContactInfoRequest(request.getAccountId(), + request.getOldContactInfo()); + if (causeOldContactInfo != null) { + responseObserver.onNext(StatusResponse.newBuilder() + .setError(ErrorResponse.newBuilder().setCause(causeOldContactInfo)).build()); + responseObserver.onCompleted(); + return; + } + Cause causeEditedContactInfo = validator.validateContactInfoRequest(request.getAccountId(), + request.getEditedContactInfo()); + if (causeEditedContactInfo != null) { + responseObserver.onNext(StatusResponse.newBuilder() + .setError(ErrorResponse.newBuilder().setCause(causeEditedContactInfo)).build()); + responseObserver.onCompleted(); + return; + } + + if (!request.getOldContactInfo().getType().equals(request.getEditedContactInfo().getType())) { + logger.error("Error editing Contact info for account {}. Different types: {} and {}.", + request.getAccountId(), request.getOldContactInfo().getType().name(), + request.getEditedContactInfo().getType().name()); + responseObserver.onNext(StatusResponse.newBuilder() + .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_EDITING_CONTACT_INFO)).build()); + responseObserver.onCompleted(); + return; + } + + if (request.getOldContactInfo().getType() == ContactType.PHONE_CONTACT) { + request = normalizePhoneNumbers(request); + } + boolean result = accountRepositoryAdditional.editContactInfo(UUID.fromString(request.getAccountId()), + ContactInfo.createContactInfoFromProto(request.getOldContactInfo()), + ContactInfo.createContactInfoFromProto(request.getEditedContactInfo())); + if (result) { + logger.info("Edited Contact Info {}:{} to {}:{} for account {}.", + request.getOldContactInfo().getType().name(), request.getOldContactInfo().getValue(), + request.getEditedContactInfo().getType().name(), request.getEditedContactInfo().getValue(), + request.getAccountId()); + responseObserver.onNext(StatusResponse.newBuilder().setStatus("SUCCESS").build()); + responseObserver.onCompleted(); + return; + } + logger.error("Contact info {}:{} was not edited for account {}.", request.getOldContactInfo().getType().name(), + request.getOldContactInfo().getValue(), request.getAccountId()); + responseObserver.onNext(StatusResponse.newBuilder() + .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_EDITING_CONTACT_INFO)).build()); + responseObserver.onCompleted(); + return; + } + + private EditContactInfoRequest normalizePhoneNumbers(EditContactInfoRequest request) { + // Get the normalized phone number from libphone for the old number + ContactDetails contactDetailsOldNumber = ContactDetails.newBuilder().setType(request.getOldContactInfo().getType()) + .setValue(validator.getNormalizedPhoneNumber(request.getOldContactInfo().getValue())) + .setLabel(request.getOldContactInfo().getLabel()).build(); + // Get the normalized phone number from libphone for the edited number + ContactDetails contactDetailsEditedNumber = ContactDetails.newBuilder().setType(request.getEditedContactInfo().getType()) + .setValue(validator.getNormalizedPhoneNumber(request.getEditedContactInfo().getValue())) + .setLabel(request.getEditedContactInfo().getLabel()).build(); + EditContactInfoRequest newRequest = EditContactInfoRequest.newBuilder().setAccountId(request.getAccountId()) + .setOldContactInfo(contactDetailsOldNumber).setEditedContactInfo(contactDetailsEditedNumber).build(); + request = newRequest; + return request; + } + public void prepareErrorStatusResponse(StreamObserver responseObserver, Cause error, String message) { responseObserver.onNext(StatusResponse.newBuilder() -- GitLab From 08ef7e446b0491ecf4ef4f999f1d9f71a05bfbf4 Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Fri, 19 Oct 2018 18:25:04 +0300 Subject: [PATCH 2/5] NY-4398: Alignment of code Signed-off-by: Stanimir Penkov --- .../java/biz/nynja/account/services/AccountServiceImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index 55bb082..62621fe 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -759,11 +759,13 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas private EditContactInfoRequest normalizePhoneNumbers(EditContactInfoRequest request) { // Get the normalized phone number from libphone for the old number - ContactDetails contactDetailsOldNumber = ContactDetails.newBuilder().setType(request.getOldContactInfo().getType()) + ContactDetails contactDetailsOldNumber = ContactDetails.newBuilder() + .setType(request.getOldContactInfo().getType()) .setValue(validator.getNormalizedPhoneNumber(request.getOldContactInfo().getValue())) .setLabel(request.getOldContactInfo().getLabel()).build(); // Get the normalized phone number from libphone for the edited number - ContactDetails contactDetailsEditedNumber = ContactDetails.newBuilder().setType(request.getEditedContactInfo().getType()) + ContactDetails contactDetailsEditedNumber = ContactDetails.newBuilder() + .setType(request.getEditedContactInfo().getType()) .setValue(validator.getNormalizedPhoneNumber(request.getEditedContactInfo().getValue())) .setLabel(request.getEditedContactInfo().getLabel()).build(); EditContactInfoRequest newRequest = EditContactInfoRequest.newBuilder().setAccountId(request.getAccountId()) -- GitLab From 93b7d25cb10f7616a7a3945b66bc750bb75549d1 Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Tue, 23 Oct 2018 16:01:48 +0300 Subject: [PATCH 3/5] NY-4398: Code improvements - use the changed validation function for contact info; - use the extracted additional method for error response. Signed-off-by: Stanimir Penkov --- .../account/services/AccountServiceImpl.java | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index 62621fe..1e6bef7 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -707,20 +707,18 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas StreamObserver responseObserver) { logger.info("Removing contact info from account requested."); logger.debug("Removing contact info from account requested: {}", request); - Cause causeOldContactInfo = validator.validateContactInfoRequest(request.getAccountId(), - request.getOldContactInfo()); - if (causeOldContactInfo != null) { - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(causeOldContactInfo)).build()); - responseObserver.onCompleted(); + Optional> validationResultOldContactInfo = validator + .validateContactInfoRequest(request.getAccountId(), request.getOldContactInfo()); + if (validationResultOldContactInfo.isPresent()) { + prepareErrorStatusResponse(responseObserver, validationResultOldContactInfo.get().getKey(), + validationResultOldContactInfo.get().getValue()); return; } - Cause causeEditedContactInfo = validator.validateContactInfoRequest(request.getAccountId(), - request.getEditedContactInfo()); - if (causeEditedContactInfo != null) { - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(causeEditedContactInfo)).build()); - responseObserver.onCompleted(); + Optional> validationResultEditedContactInfo = validator + .validateContactInfoRequest(request.getAccountId(), request.getEditedContactInfo()); + if (validationResultEditedContactInfo.isPresent()) { + prepareErrorStatusResponse(responseObserver, validationResultEditedContactInfo.get().getKey(), + validationResultEditedContactInfo.get().getValue()); return; } @@ -728,9 +726,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.error("Error editing Contact info for account {}. Different types: {} and {}.", request.getAccountId(), request.getOldContactInfo().getType().name(), request.getEditedContactInfo().getType().name()); - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_EDITING_CONTACT_INFO)).build()); - responseObserver.onCompleted(); + prepareErrorStatusResponse(responseObserver, Cause.ERROR_EDITING_CONTACT_INFO, "Error editing contact info"); return; } @@ -751,9 +747,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas } logger.error("Contact info {}:{} was not edited for account {}.", request.getOldContactInfo().getType().name(), request.getOldContactInfo().getValue(), request.getAccountId()); - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_EDITING_CONTACT_INFO)).build()); - responseObserver.onCompleted(); + prepareErrorStatusResponse(responseObserver, Cause.ERROR_EDITING_CONTACT_INFO, "Error editing contact info"); return; } -- GitLab From dc9daa4929c967207923b5a0fac08d261f880e10 Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Tue, 23 Oct 2018 18:54:00 +0300 Subject: [PATCH 4/5] NY-4398: Moved method to service layer Signed-off-by: Stanimir Penkov --- .../components/PhoneNumberNormalizer.java | 18 ++++++++++++++++++ .../account/services/AccountServiceImpl.java | 19 +------------------ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/main/java/biz/nynja/account/components/PhoneNumberNormalizer.java b/src/main/java/biz/nynja/account/components/PhoneNumberNormalizer.java index afac39d..1ed7fc9 100644 --- a/src/main/java/biz/nynja/account/components/PhoneNumberNormalizer.java +++ b/src/main/java/biz/nynja/account/components/PhoneNumberNormalizer.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import biz.nynja.account.grpc.AddContactInfoRequest; import biz.nynja.account.grpc.ContactDetails; import biz.nynja.account.grpc.DeleteContactInfoRequest; +import biz.nynja.account.grpc.EditContactInfoRequest; @Service public class PhoneNumberNormalizer { @@ -37,4 +38,21 @@ public class PhoneNumberNormalizer { request = newRequest; return request; } + + public EditContactInfoRequest normalizePhoneNumbers(EditContactInfoRequest request) { + // Get the normalized phone number from libphone for the old number + ContactDetails contactDetailsOldNumber = ContactDetails.newBuilder() + .setType(request.getOldContactInfo().getType()) + .setValue(validator.getNormalizedPhoneNumber(request.getOldContactInfo().getValue())) + .setLabel(request.getOldContactInfo().getLabel()).build(); + // Get the normalized phone number from libphone for the edited number + ContactDetails contactDetailsEditedNumber = ContactDetails.newBuilder() + .setType(request.getEditedContactInfo().getType()) + .setValue(validator.getNormalizedPhoneNumber(request.getEditedContactInfo().getValue())) + .setLabel(request.getEditedContactInfo().getLabel()).build(); + EditContactInfoRequest newRequest = EditContactInfoRequest.newBuilder().setAccountId(request.getAccountId()) + .setOldContactInfo(contactDetailsOldNumber).setEditedContactInfo(contactDetailsEditedNumber).build(); + request = newRequest; + return request; + } } diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index 1e6bef7..b3d1b19 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -731,7 +731,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas } if (request.getOldContactInfo().getType() == ContactType.PHONE_CONTACT) { - request = normalizePhoneNumbers(request); + request = phoneNumberNormalizer.normalizePhoneNumbers(request); } boolean result = accountRepositoryAdditional.editContactInfo(UUID.fromString(request.getAccountId()), ContactInfo.createContactInfoFromProto(request.getOldContactInfo()), @@ -751,23 +751,6 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas return; } - private EditContactInfoRequest normalizePhoneNumbers(EditContactInfoRequest request) { - // Get the normalized phone number from libphone for the old number - ContactDetails contactDetailsOldNumber = ContactDetails.newBuilder() - .setType(request.getOldContactInfo().getType()) - .setValue(validator.getNormalizedPhoneNumber(request.getOldContactInfo().getValue())) - .setLabel(request.getOldContactInfo().getLabel()).build(); - // Get the normalized phone number from libphone for the edited number - ContactDetails contactDetailsEditedNumber = ContactDetails.newBuilder() - .setType(request.getEditedContactInfo().getType()) - .setValue(validator.getNormalizedPhoneNumber(request.getEditedContactInfo().getValue())) - .setLabel(request.getEditedContactInfo().getLabel()).build(); - EditContactInfoRequest newRequest = EditContactInfoRequest.newBuilder().setAccountId(request.getAccountId()) - .setOldContactInfo(contactDetailsOldNumber).setEditedContactInfo(contactDetailsEditedNumber).build(); - request = newRequest; - return request; - } - public void prepareErrorStatusResponse(StreamObserver responseObserver, Cause error, String message) { responseObserver.onNext(StatusResponse.newBuilder() -- GitLab From 7ee2ed9adf240815a6b66db3f5175593849cad5a Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Wed, 24 Oct 2018 14:41:01 +0300 Subject: [PATCH 5/5] NY-4398: Code Review Feedback - extracted additional method. Signed-off-by: Stanimir Penkov --- .../nynja/account/components/Validator.java | 10 ++++++++++ .../account/services/AccountServiceImpl.java | 18 ++++++------------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/biz/nynja/account/components/Validator.java b/src/main/java/biz/nynja/account/components/Validator.java index 0703c1d..2f1e837 100644 --- a/src/main/java/biz/nynja/account/components/Validator.java +++ b/src/main/java/biz/nynja/account/components/Validator.java @@ -344,6 +344,16 @@ public class Validator { request.getAuthenticationProvider().getAuthenticationProvider()); } + public Optional> validateEditContactInfoRequest(String accountId, + ContactDetails oldContactInfoDetails, ContactDetails editedContactInfoDetails) { + Optional> validationResultOldContactInfo = validateContactInfoRequest(accountId, + oldContactInfoDetails); + if (validationResultOldContactInfo.isPresent()) { + return validationResultOldContactInfo; + } + return validateContactInfoRequest(accountId, editedContactInfoDetails); + } + public Optional> validateContactInfoRequest(String accountId, ContactDetails contactDetails) { if ((accountId == null) || (accountId.isEmpty())) { return Optional.of(new ImmutablePair<>(Cause.MISSING_ACCOUNT_ID, "Missing account id")); diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index b3d1b19..d579261 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -707,18 +707,12 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas StreamObserver responseObserver) { logger.info("Removing contact info from account requested."); logger.debug("Removing contact info from account requested: {}", request); - Optional> validationResultOldContactInfo = validator - .validateContactInfoRequest(request.getAccountId(), request.getOldContactInfo()); - if (validationResultOldContactInfo.isPresent()) { - prepareErrorStatusResponse(responseObserver, validationResultOldContactInfo.get().getKey(), - validationResultOldContactInfo.get().getValue()); - return; - } - Optional> validationResultEditedContactInfo = validator - .validateContactInfoRequest(request.getAccountId(), request.getEditedContactInfo()); - if (validationResultEditedContactInfo.isPresent()) { - prepareErrorStatusResponse(responseObserver, validationResultEditedContactInfo.get().getKey(), - validationResultEditedContactInfo.get().getValue()); + Optional> validationResultEditContactInfo = validator + .validateEditContactInfoRequest(request.getAccountId(), request.getOldContactInfo(), + request.getEditedContactInfo()); + if (validationResultEditContactInfo.isPresent()) { + prepareErrorStatusResponse(responseObserver, validationResultEditContactInfo.get().getKey(), + validationResultEditContactInfo.get().getValue()); return; } -- GitLab