diff --git a/src/main/java/biz/nynja/account/components/PhoneNumberNormalizer.java b/src/main/java/biz/nynja/account/components/PhoneNumberNormalizer.java index afac39dd5510c26f24319e8bbee08469b70399d7..1ed7fc95598bba6466e6590beb80e3f0594b3c8c 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/components/Validator.java b/src/main/java/biz/nynja/account/components/Validator.java index 0703c1d2198c6614e0aab9d4655d7c17235e1495..2f1e8373b98c6ec5d35cf0424c6c86b00a2bf2e2 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/repositories/AccountRepositoryAdditional.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java index 876f037bb6fb55ca60b9a3236a1470c96da16381..3503b4236be83bffa281342e3d73a454e54f8d73 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 d1051637087dcefe91d2293d757a89a737000952..a108339194edef73bce5455b85683dee83e6b63c 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 261f4f16ad1833e99f13ac85325d238695ba0beb..d57926148f253ae9c4236aa338e429b9ddb81ba2 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,49 @@ 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); + Optional> validationResultEditContactInfo = validator + .validateEditContactInfoRequest(request.getAccountId(), request.getOldContactInfo(), + request.getEditedContactInfo()); + if (validationResultEditContactInfo.isPresent()) { + prepareErrorStatusResponse(responseObserver, validationResultEditContactInfo.get().getKey(), + validationResultEditContactInfo.get().getValue()); + 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()); + prepareErrorStatusResponse(responseObserver, Cause.ERROR_EDITING_CONTACT_INFO, "Error editing contact info"); + return; + } + + if (request.getOldContactInfo().getType() == ContactType.PHONE_CONTACT) { + request = phoneNumberNormalizer.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()); + prepareErrorStatusResponse(responseObserver, Cause.ERROR_EDITING_CONTACT_INFO, "Error editing contact info"); + return; + } + public void prepareErrorStatusResponse(StreamObserver responseObserver, Cause error, String message) { responseObserver.onNext(StatusResponse.newBuilder()