From 28331750f660fb0ca183ec7e524da720072b60db Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Mon, 3 Sep 2018 15:18:00 +0300 Subject: [PATCH 01/10] NY-2652: Implementation for updating account Signed-off-by: Stanimir Penkov --- .../AccountRepositoryAdditional.java | 3 + .../AccountRepositoryAdditionalImpl.java | 148 ++++++++++++++++++ .../account/services/AccountServiceImpl.java | 31 ++++ 3 files changed, 182 insertions(+) diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java index 4bd8252..b11e1d7 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Repository; import biz.nynja.account.grpc.CompletePendingAccountCreationRequest; import biz.nynja.account.grpc.CreateAccountRequest; import biz.nynja.account.grpc.CreatePendingAccountRequest; +import biz.nynja.account.grpc.UpdateAccountRequest; import biz.nynja.account.models.Account; import biz.nynja.account.models.PendingAccount; @@ -16,4 +17,6 @@ public interface AccountRepositoryAdditional { public Account completePendingAccountCreation(CompletePendingAccountCreationRequest request); + public Account updateAccount(UpdateAccountRequest request); + } diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java index b9f5422..f252cf9 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java @@ -16,8 +16,11 @@ import org.springframework.data.cassandra.core.CassandraTemplate; import org.springframework.data.cassandra.core.WriteResult; import org.springframework.stereotype.Service; +import biz.nynja.account.grpc.AuthProviderDetails; import biz.nynja.account.grpc.CompletePendingAccountCreationRequest; +import biz.nynja.account.grpc.UpdateAccountRequest; import biz.nynja.account.models.Account; +import biz.nynja.account.models.AccountByCommunicationProvider; import biz.nynja.account.models.AuthenticationProvider; import biz.nynja.account.models.PendingAccount; import biz.nynja.account.models.Profile; @@ -128,4 +131,149 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio batchOps.insert(newProfileByAuthenticationProvider); } + @Override + public Account updateAccount(UpdateAccountRequest request) { + CassandraBatchOperations batchOperations = cassandraTemplate.batchOps(); + Account existingAccount = accountRepository.findByAccountId(UUID.fromString(request.getAccountId())); + if (existingAccount == null) { + logger.info("Existing account with the provided id was not found."); + logger.debug("Existing account with the provided id {} was not found.", request.getAccountId()); + return null; + } else { + Long timeUpdated = new Date().getTime(); + Set existingCommunicationProvidersSet = new HashSet(); + if (existingAccount.getCommunicationProviders() != null) { + existingCommunicationProvidersSet = new HashSet( + existingAccount.getCommunicationProviders()); + } + Set requestedCommunicationProvidersSet = new HashSet(); + Set sameCommunicationProvidersSet = new HashSet(); + Set oldCommunicationProvidersSet = new HashSet(); + Set newCommunicationProvidersSet = new HashSet(); + + if (request.getCommunicationProvidersList() != null) { + for (AuthProviderDetails authProviderDetails : request.getCommunicationProvidersList()) { + requestedCommunicationProvidersSet + .add(AuthenticationProvider.createAuthenticationProviderFromProto(authProviderDetails)); + } + } + + try { + sameCommunicationProvidersSet = new HashSet(requestedCommunicationProvidersSet); + oldCommunicationProvidersSet = new HashSet(existingCommunicationProvidersSet); + newCommunicationProvidersSet = new HashSet(requestedCommunicationProvidersSet); + + sameCommunicationProvidersSet.retainAll(existingCommunicationProvidersSet); + oldCommunicationProvidersSet.removeAll(sameCommunicationProvidersSet); + newCommunicationProvidersSet.removeAll(sameCommunicationProvidersSet); + } catch (Exception e) { + logger.info("Exception while setting communication providers."); + logger.debug("Exception while setting communication providers: {} ...", e.getMessage()); + return null; + } + + WriteResult wr = null; + try { + updateAccountData(batchOperations, request, existingAccount, timeUpdated); + insertNewCommunicationProvidersToAccount(batchOperations, request, newCommunicationProvidersSet); + deleteOldCommunicationProvidersFromAccount(batchOperations, existingAccount, + oldCommunicationProvidersSet); + updateSameCommunicationProvidersFromAccount(batchOperations, request, sameCommunicationProvidersSet); + wr = batchOperations.execute(); + } catch (IllegalArgumentException | IllegalStateException e) { + logger.info("Exception while completing pending account creation."); + logger.debug("Exception while completing pending account creation: {} ...", e.getMessage()); + return null; + } + + if (wr != null) { + boolean applied = wr.wasApplied(); + if (applied) { + Account updatedAccount = accountRepository + .findByAccountId(UUID.fromString(request.getAccountId())); + return updatedAccount; + } + } + return null; + } + } + + private void updateAccountData(CassandraBatchOperations batchOps, UpdateAccountRequest request, + Account existingAccount, Long lastUpdateTimestamp) { + Account updatedAccount = existingAccount; + updatedAccount.setAvatar(request.getAvatar().asReadOnlyByteBuffer()); + updatedAccount.setAccountMark(request.getAccountMark()); + updatedAccount.setAccountName(request.getAccountName()); + updatedAccount.setFirstName(request.getFirstName()); + updatedAccount.setLastName(request.getLastName()); + updatedAccount.setUsername(request.getUsername()); + updatedAccount.setAccountStatus(request.getAccountStatus()); + Set communicationProvidersSet = new HashSet(); + if (request.getCommunicationProvidersList() != null) { + for (AuthProviderDetails authProviderDetails : request.getCommunicationProvidersList()) { + communicationProvidersSet + .add(AuthenticationProvider.createAuthenticationProviderFromProto(authProviderDetails)); + } + updatedAccount.setCommunicationProviders(communicationProvidersSet); + } + updatedAccount.setLastUpdateTimestamp(lastUpdateTimestamp); + batchOps.update(updatedAccount); + } + + private void insertNewCommunicationProvidersToAccount(CassandraBatchOperations batchOps, + UpdateAccountRequest request, Set newCommunicationProvidersSet) { + for (AuthenticationProvider commProvider : newCommunicationProvidersSet) { + insertNewAccountByCommunicationProvider(batchOps, request, commProvider); + } + } + + private void deleteOldCommunicationProvidersFromAccount(CassandraBatchOperations batchOps, Account existingAccount, + Set oldCommunicationProvidersSet) { + for (AuthenticationProvider commProvider : oldCommunicationProvidersSet) { + deleteOldAccountByCommunicationProvider(batchOps, existingAccount, commProvider); + } + } + + private void updateSameCommunicationProvidersFromAccount(CassandraBatchOperations batchOps, + UpdateAccountRequest request, Set sameCommunicationProvidersSet) { + for (AuthenticationProvider commProvider : sameCommunicationProvidersSet) { + updateSameAccountByCommunicationProvider(batchOps, request, commProvider); + } + } + + private void insertNewAccountByCommunicationProvider(CassandraBatchOperations batchOps, + UpdateAccountRequest request, AuthenticationProvider authProvider) { + AccountByCommunicationProvider newAccountByCommunicationProvider = new AccountByCommunicationProvider(); + newAccountByCommunicationProvider.setCommunicationProvider(authProvider.getValue()); + newAccountByCommunicationProvider.setCommunicationProviderType(authProvider.getType()); + newAccountByCommunicationProvider.setAccountId(UUID.fromString(request.getAccountId())); + newAccountByCommunicationProvider.setAccountName(request.getAccountName()); + newAccountByCommunicationProvider.setFirstName(request.getFirstName()); + newAccountByCommunicationProvider.setAvatar(request.getAvatar().asReadOnlyByteBuffer()); + batchOps.insert(newAccountByCommunicationProvider); + } + + private void deleteOldAccountByCommunicationProvider(CassandraBatchOperations batchOps, Account existingAccount, + AuthenticationProvider authProvider) { + AccountByCommunicationProvider oldAccountByCommunicationProvider = new AccountByCommunicationProvider(); + oldAccountByCommunicationProvider.setCommunicationProvider(authProvider.getValue()); + oldAccountByCommunicationProvider.setCommunicationProviderType(authProvider.getType()); + oldAccountByCommunicationProvider.setAccountId(existingAccount.getAccountId()); + oldAccountByCommunicationProvider.setAccountName(existingAccount.getAccountName()); + oldAccountByCommunicationProvider.setFirstName(existingAccount.getFirstName()); + oldAccountByCommunicationProvider.setAvatar(existingAccount.getAvatar()); + batchOps.delete(oldAccountByCommunicationProvider); + } + + private void updateSameAccountByCommunicationProvider(CassandraBatchOperations batchOps, + UpdateAccountRequest request, AuthenticationProvider authProvider) { + AccountByCommunicationProvider oldAccountByCommunicationProvider = new AccountByCommunicationProvider(); + oldAccountByCommunicationProvider.setCommunicationProvider(authProvider.getValue()); + oldAccountByCommunicationProvider.setCommunicationProviderType(authProvider.getType()); + oldAccountByCommunicationProvider.setAccountId(UUID.fromString(request.getAccountId())); + oldAccountByCommunicationProvider.setAccountName(request.getAccountName()); + oldAccountByCommunicationProvider.setFirstName(request.getFirstName()); + oldAccountByCommunicationProvider.setAvatar(request.getAvatar().asReadOnlyByteBuffer()); + batchOps.update(oldAccountByCommunicationProvider); + } } diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index 8738c2c..c24102a 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -37,6 +37,9 @@ import biz.nynja.account.repositories.AccountByProfileIdRepository; import biz.nynja.account.repositories.AccountRepository; import biz.nynja.account.repositories.AccountRepositoryAdditional; import biz.nynja.account.repositories.PendingAccountRepository; +import biz.nynja.account.grpc.GetAccountsResponse; +import biz.nynja.account.grpc.UpdateAccountRequest; +import biz.nynja.account.grpc.UpdateAccountResponse; import io.grpc.stub.StreamObserver; /** @@ -249,4 +252,32 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas return; } } + + @Override + public void updateAccount(UpdateAccountRequest request, StreamObserver responseObserver) { + logger.info("Updating account..."); + logger.debug("Updating account...: {}", request); + + Account updatedAccount = accountRepositoryAdditional.updateAccount(request); + + if (updatedAccount == null) { + responseObserver.onNext(UpdateAccountResponse.newBuilder() + .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_UPDATING_ACCOUNT)).build()); + responseObserver.onCompleted(); + return; + } else { + logger.debug("Account \"{}\" updated in the DB", updatedAccount.toString()); + try { + logger.debug("Account: \"{}\" updated successfully.", updatedAccount); + UpdateAccountResponse response = UpdateAccountResponse.newBuilder() + .setAccountDetails(updatedAccount.toProto()).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + } catch (NullPointerException e) { + logger.info("Exception while sending response."); + return; + } + return; + } + } } \ No newline at end of file -- GitLab From 2f0b56bca22086cfd254c11afe7af72079d0c2e1 Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Tue, 4 Sep 2018 19:17:41 +0300 Subject: [PATCH 02/10] NY-2652: Implementation for updating profile Signed-off-by: Stanimir Penkov --- .../biz/nynja/account/models/Profile.java | 20 +++ .../AccountRepositoryAdditional.java | 2 + .../AccountRepositoryAdditionalImpl.java | 129 ++++++++++++++++++ .../account/services/AccountServiceImpl.java | 42 ++++++ 4 files changed, 193 insertions(+) diff --git a/src/main/java/biz/nynja/account/models/Profile.java b/src/main/java/biz/nynja/account/models/Profile.java index d29d961..f741705 100644 --- a/src/main/java/biz/nynja/account/models/Profile.java +++ b/src/main/java/biz/nynja/account/models/Profile.java @@ -9,6 +9,9 @@ import java.util.UUID; import org.springframework.data.cassandra.core.mapping.PrimaryKey; import org.springframework.data.cassandra.core.mapping.Table; +import biz.nynja.account.grpc.ProfileResponse; +import biz.nynja.account.grpc.ProfileResponse.Builder; + @Table public class Profile { @@ -148,4 +151,21 @@ public class Profile { .append(backupAuthenticationProvider).append("]").toString(); } + public ProfileResponse toProto() { + Builder builder = ProfileResponse.newBuilder().setProfileId(getProfileId().toString()) + .setPasscode(getPasscode()); + if (defaultAccount != null) { + builder.setDefaultAccountId(defaultAccount.toString()); + } + if (backupAuthenticationProvider != null) { + builder.setBackupAuthProvider(backupAuthenticationProvider.toProto()); + } + if (authenticationProviders != null) { + for (AuthenticationProvider authenticationProvider : authenticationProviders) { + builder.addAuthProviders(authenticationProvider.toProto()); + } + } + return builder.build(); + } + } diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java index b11e1d7..bdba49e 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java @@ -19,4 +19,6 @@ public interface AccountRepositoryAdditional { public Account updateAccount(UpdateAccountRequest request); + public Profile updateProfile(UpdateProfileRequest request); + } diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java index f252cf9..8fb1392 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java @@ -19,6 +19,7 @@ import org.springframework.stereotype.Service; import biz.nynja.account.grpc.AuthProviderDetails; import biz.nynja.account.grpc.CompletePendingAccountCreationRequest; import biz.nynja.account.grpc.UpdateAccountRequest; +import biz.nynja.account.grpc.UpdateProfileRequest; import biz.nynja.account.models.Account; import biz.nynja.account.models.AccountByCommunicationProvider; import biz.nynja.account.models.AuthenticationProvider; @@ -37,6 +38,9 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio @Autowired private AccountRepository accountRepository; + @Autowired + private ProfileRepository profileRepository; + @Autowired private PendingAccountRepository pendingAccountRepository; @@ -131,6 +135,75 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio batchOps.insert(newProfileByAuthenticationProvider); } + @Override + public Profile updateProfile(UpdateProfileRequest request) { + + CassandraBatchOperations batchOperations = cassandraTemplate.batchOps(); + Profile existingProfile = profileRepository.findByProfileId(UUID.fromString(request.getProfileId())); + if (existingProfile == null) { + logger.info("Existing profile with the provided id was not found."); + logger.debug("Existing profile with the provided id {} was not found.", request.getProfileId()); + return null; + } else { + Long timeUpdated = new Date().getTime(); + Set existingAuthenticationProvidersSet = new HashSet(); + if (existingProfile.getAuthenticationProviders() != null) { + existingAuthenticationProvidersSet = new HashSet( + existingProfile.getAuthenticationProviders()); + } + Set requestedAuthenticationProvidersSet = new HashSet(); + Set sameAuthenticationProvidersSet = new HashSet(); + Set oldAuthenticationProvidersSet = new HashSet(); + Set newAuthenticationProvidersSet = new HashSet(); + + if (request.getAuthProvidersList() != null) { + for (AuthProviderDetails authProviderDetails : request.getAuthProvidersList()) { + requestedAuthenticationProvidersSet + .add(AuthenticationProvider.createAuthenticationProviderFromProto(authProviderDetails)); + } + } + + try { + sameAuthenticationProvidersSet = new HashSet( + requestedAuthenticationProvidersSet); + oldAuthenticationProvidersSet = new HashSet(existingAuthenticationProvidersSet); + newAuthenticationProvidersSet = new HashSet( + requestedAuthenticationProvidersSet); + + sameAuthenticationProvidersSet.retainAll(existingAuthenticationProvidersSet); + oldAuthenticationProvidersSet.removeAll(sameAuthenticationProvidersSet); + newAuthenticationProvidersSet.removeAll(sameAuthenticationProvidersSet); + } catch (Exception e) { + logger.info("Exception while setting authentication providers."); + logger.debug("Exception while setting authentication providers: {} ...", e.getMessage()); + return null; + } + + WriteResult wr = null; + try { + updateProfileData(batchOperations, request, existingProfile, timeUpdated); + insertNewAuthenticationProvidersToProfile(batchOperations, existingProfile.getProfileId(), + newAuthenticationProvidersSet); + deleteOldAuthenticationProvidersFromProfile(batchOperations, existingProfile.getProfileId(), + oldAuthenticationProvidersSet); + wr = batchOperations.execute(); + } catch (IllegalArgumentException | IllegalStateException e) { + logger.info("Exception while updating profile."); + logger.debug("Exception while updating profile: {} ...", e.getMessage()); + return null; + } + + if (wr != null) { + boolean applied = wr.wasApplied(); + if (applied) { + Profile updatedProfile = profileRepository.findByProfileId(UUID.fromString(request.getProfileId())); + return updatedProfile; + } + } + return null; + } + } + @Override public Account updateAccount(UpdateAccountRequest request) { CassandraBatchOperations batchOperations = cassandraTemplate.batchOps(); @@ -220,6 +293,30 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio batchOps.update(updatedAccount); } + private void updateProfileData(CassandraBatchOperations batchOps, UpdateProfileRequest request, + Profile existingProfile, Long lastUpdateTimestamp) { + Profile updatedProfile = existingProfile; + Set authProvidersSet = new HashSet(); + if (request.getAuthProvidersList() != null) { + for (AuthProviderDetails authProviderDetails : request.getAuthProvidersList()) { + authProvidersSet.add(AuthenticationProvider.createAuthenticationProviderFromProto(authProviderDetails)); + } + updatedProfile.setAuthenticationProviders(authProvidersSet); + } + if (!request.getBackupAuthProvider().getAuthenticationProvider().trim().isEmpty()) { + updatedProfile.setBackupAuthenticationProvider( + AuthenticationProvider.createAuthenticationProviderFromProto(request.getBackupAuthProvider())); + } else { + updatedProfile.setBackupAuthenticationProvider(null); + } + updatedProfile.setPasscode(request.getPasscode()); + if (!request.getDefaultAccountId().trim().isEmpty()) { + updatedProfile.setDefaultAccount(UUID.fromString(request.getDefaultAccountId())); + } + updatedProfile.setLastUpdateTimestamp(lastUpdateTimestamp); + batchOps.update(updatedProfile); + } + private void insertNewCommunicationProvidersToAccount(CassandraBatchOperations batchOps, UpdateAccountRequest request, Set newCommunicationProvidersSet) { for (AuthenticationProvider commProvider : newCommunicationProvidersSet) { @@ -241,6 +338,38 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio } } + private void insertNewAuthenticationProvidersToProfile(CassandraBatchOperations batchOps, UUID profileId, + Set newAuthenticationProvidersSet) { + for (AuthenticationProvider authProvider : newAuthenticationProvidersSet) { + insertNewProfileByAuthenticationProvider(batchOps, profileId, authProvider); + } + } + + private void insertNewProfileByAuthenticationProvider(CassandraBatchOperations batchOps, UUID profileId, + AuthenticationProvider authProvider) { + ProfileByAuthenticationProvider newProfileByAuthenticationProvider = new ProfileByAuthenticationProvider(); + newProfileByAuthenticationProvider.setAuthenticationProvider(authProvider.getValue()); + newProfileByAuthenticationProvider.setAuthenticationProviderType(authProvider.getType()); + newProfileByAuthenticationProvider.setProfileId(profileId); + batchOps.insert(newProfileByAuthenticationProvider); + } + + private void deleteOldAuthenticationProvidersFromProfile(CassandraBatchOperations batchOps, UUID profileId, + Set oldAuthenticationProvidersSet) { + for (AuthenticationProvider authProvider : oldAuthenticationProvidersSet) { + deleteOldProfileByAuthenticationProvider(batchOps, profileId, authProvider); + } + } + + private void deleteOldProfileByAuthenticationProvider(CassandraBatchOperations batchOps, UUID profileId, + AuthenticationProvider authProvider) { + ProfileByAuthenticationProvider oldProfileByAuthenticationProvider = new ProfileByAuthenticationProvider(); + oldProfileByAuthenticationProvider.setAuthenticationProvider(authProvider.getValue()); + oldProfileByAuthenticationProvider.setAuthenticationProviderType(authProvider.getType()); + oldProfileByAuthenticationProvider.setProfileId(profileId); + batchOps.delete(oldProfileByAuthenticationProvider); + } + private void insertNewAccountByCommunicationProvider(CassandraBatchOperations batchOps, UpdateAccountRequest request, AuthenticationProvider authProvider) { AccountByCommunicationProvider newAccountByCommunicationProvider = new AccountByCommunicationProvider(); diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index c24102a..659d632 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -33,6 +33,7 @@ import biz.nynja.account.models.AccountByAuthenticationProvider; import biz.nynja.account.models.AccountByProfileId; import biz.nynja.account.models.PendingAccount; import biz.nynja.account.repositories.AccountByAuthenticationProviderRepository; +import biz.nynja.account.models.Profile; import biz.nynja.account.repositories.AccountByProfileIdRepository; import biz.nynja.account.repositories.AccountRepository; import biz.nynja.account.repositories.AccountRepositoryAdditional; @@ -40,6 +41,8 @@ import biz.nynja.account.repositories.PendingAccountRepository; import biz.nynja.account.grpc.GetAccountsResponse; import biz.nynja.account.grpc.UpdateAccountRequest; import biz.nynja.account.grpc.UpdateAccountResponse; +import biz.nynja.account.grpc.UpdateProfileRequest; +import biz.nynja.account.grpc.UpdateProfileResponse; import io.grpc.stub.StreamObserver; /** @@ -253,6 +256,45 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas } } + @Override + public void updateProfile(UpdateProfileRequest request, StreamObserver responseObserver) { + + logger.info("Updating profile..."); + logger.debug("Updating profile...: {}", request); + + if (request.getAuthProvidersList().size() < 1) { + logger.info("Error updating profile. At least one authentication provider should be added."); + logger.debug("Error updating profile. At least one authentication provider should be added: {}", request); + responseObserver.onNext(UpdateProfileResponse.newBuilder() + .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_UPDATING_PROFILE)).build()); + responseObserver.onCompleted(); + return; + } + + Profile updatedProfile = accountRepositoryAdditional.updateProfile(request); + + if (updatedProfile == null) { + responseObserver.onNext(UpdateProfileResponse.newBuilder() + .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_UPDATING_ACCOUNT)).build()); + responseObserver.onCompleted(); + return; + } else { + logger.debug("Profile \"{}\" updated in the DB", updatedProfile.toString()); + try { + logger.debug("Profile: \"{}\" updated successfully.", updatedProfile); + UpdateProfileResponse response = UpdateProfileResponse.newBuilder() + .setProfileResponse(updatedProfile.toProto()).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + } catch (NullPointerException e) { + logger.info("Exception while sending response for updated profile."); + return; + } + logger.info("Profile updated successfully."); + return; + } + } + @Override public void updateAccount(UpdateAccountRequest request, StreamObserver responseObserver) { logger.info("Updating account..."); -- GitLab From 16824935d59bcc7a1727e29647fc32de4b9f1836 Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Wed, 5 Sep 2018 09:58:16 +0300 Subject: [PATCH 03/10] NY-2652: Code improvements -removed unused imports; -changed access modifiers; -changed message for updating account; -additional checks added. Signed-off-by: Stanimir Penkov --- .../nynja/account/repositories/AccountRepository.java | 2 +- .../repositories/AccountRepositoryAdditional.java | 11 +++++------ .../repositories/AccountRepositoryAdditionalImpl.java | 6 +++--- .../repositories/PendingAccountRepository.java | 2 +- .../nynja/account/repositories/ProfileRepository.java | 2 +- .../nynja/account/services/AccountServiceImpl.java | 3 ++- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepository.java b/src/main/java/biz/nynja/account/repositories/AccountRepository.java index 783be8f..6dd8054 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepository.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepository.java @@ -13,6 +13,6 @@ import biz.nynja.account.models.Account; @Repository public interface AccountRepository extends CassandraRepository { - public Account findByAccountId(UUID accountId); + Account findByAccountId(UUID accountId); } diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java index bdba49e..1b7b143 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java @@ -6,19 +6,18 @@ package biz.nynja.account.repositories; import org.springframework.stereotype.Repository; import biz.nynja.account.grpc.CompletePendingAccountCreationRequest; -import biz.nynja.account.grpc.CreateAccountRequest; -import biz.nynja.account.grpc.CreatePendingAccountRequest; import biz.nynja.account.grpc.UpdateAccountRequest; +import biz.nynja.account.grpc.UpdateProfileRequest; import biz.nynja.account.models.Account; -import biz.nynja.account.models.PendingAccount; +import biz.nynja.account.models.Profile; @Repository public interface AccountRepositoryAdditional { - public Account completePendingAccountCreation(CompletePendingAccountCreationRequest request); + Account completePendingAccountCreation(CompletePendingAccountCreationRequest request); - public Account updateAccount(UpdateAccountRequest request); + Account updateAccount(UpdateAccountRequest request); - public Profile updateProfile(UpdateProfileRequest request); + Profile updateProfile(UpdateProfileRequest request); } diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java index 8fb1392..3f34e19 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java @@ -102,7 +102,7 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio newAccount.setCreationTimestamp(creationTimestamp); Set communicationProvidersSet = new HashSet(); newAccount.setCommunicationProviders(communicationProvidersSet); - if (request.getCommunicationProvidersList() != null) { + if ((request.getCommunicationProvidersList() != null) && (request.getCommunicationProvidersList().size() > 0)) { for (int i = 0; i < request.getCommunicationProvidersList().size(); i++) { communicationProvidersSet.add(AuthenticationProvider .createAuthenticationProviderFromProto(request.getCommunicationProviders(i))); @@ -254,8 +254,8 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio updateSameCommunicationProvidersFromAccount(batchOperations, request, sameCommunicationProvidersSet); wr = batchOperations.execute(); } catch (IllegalArgumentException | IllegalStateException e) { - logger.info("Exception while completing pending account creation."); - logger.debug("Exception while completing pending account creation: {} ...", e.getMessage()); + logger.info("Exception while updating account."); + logger.debug("Exception while updating account: {} ...", e.getMessage()); return null; } diff --git a/src/main/java/biz/nynja/account/repositories/PendingAccountRepository.java b/src/main/java/biz/nynja/account/repositories/PendingAccountRepository.java index bb89aee..4d3c6f1 100644 --- a/src/main/java/biz/nynja/account/repositories/PendingAccountRepository.java +++ b/src/main/java/biz/nynja/account/repositories/PendingAccountRepository.java @@ -14,6 +14,6 @@ import biz.nynja.account.models.PendingAccount; @Repository public interface PendingAccountRepository extends CassandraRepository { - public PendingAccount findByAccountId(UUID accountId); + PendingAccount findByAccountId(UUID accountId); } diff --git a/src/main/java/biz/nynja/account/repositories/ProfileRepository.java b/src/main/java/biz/nynja/account/repositories/ProfileRepository.java index 9f1dcf2..94b350f 100644 --- a/src/main/java/biz/nynja/account/repositories/ProfileRepository.java +++ b/src/main/java/biz/nynja/account/repositories/ProfileRepository.java @@ -13,6 +13,6 @@ import biz.nynja.account.models.Profile; @Repository public interface ProfileRepository extends CassandraRepository { - public Profile findByProfileId(UUID profileId); + Profile findByProfileId(UUID profileId); } diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index 659d632..782ca68 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -316,9 +316,10 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas responseObserver.onNext(response); responseObserver.onCompleted(); } catch (NullPointerException e) { - logger.info("Exception while sending response."); + logger.info("Exception while sending response for updated account."); return; } + logger.info("Account updated successfully."); return; } } -- GitLab From 7ffa7f3901dc9f52e6186dbe61f80d4b9d01ab62 Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Wed, 5 Sep 2018 15:48:59 +0300 Subject: [PATCH 04/10] NY-2652: Check for existing username and validations added Signed-off-by: Stanimir Penkov --- .../nynja/account/StartupScriptsListener.java | 6 +- .../nynja/account/components/Validator.java | 30 ++ .../account/models/AccountByUsername.java | 273 ++++++++++++++++++ .../AccountByUsernameRepository.java | 16 + .../AccountRepositoryAdditional.java | 4 + .../AccountRepositoryAdditionalImpl.java | 19 +- .../account/services/AccountServiceImpl.java | 8 + 7 files changed, 352 insertions(+), 4 deletions(-) create mode 100644 src/main/java/biz/nynja/account/models/AccountByUsername.java create mode 100644 src/main/java/biz/nynja/account/repositories/AccountByUsernameRepository.java diff --git a/src/main/java/biz/nynja/account/StartupScriptsListener.java b/src/main/java/biz/nynja/account/StartupScriptsListener.java index 90c66ea..d008aa1 100644 --- a/src/main/java/biz/nynja/account/StartupScriptsListener.java +++ b/src/main/java/biz/nynja/account/StartupScriptsListener.java @@ -48,7 +48,11 @@ public class StartupScriptsListener { + ".accountbyaccountname AS SELECT * FROM account " + "WHERE accountname IS NOT NULL " + "PRIMARY KEY (accountname, accountid);"; + String scriptAccountViewByUsername = "CREATE MATERIALIZED VIEW IF NOT EXISTS " + keyspace + + ".accountbyusername AS SELECT * FROM account " + "WHERE username IS NOT NULL " + + "PRIMARY KEY (username, accountid);"; + return Arrays.asList(scriptAccountViewByProfileId, scriptAccountViewByAuthProvider, - scriptAccountViewByАccountName); + scriptAccountViewByАccountName, scriptAccountViewByUsername); } } \ No newline at end of file diff --git a/src/main/java/biz/nynja/account/components/Validator.java b/src/main/java/biz/nynja/account/components/Validator.java index d8fdc75..d20ee10 100644 --- a/src/main/java/biz/nynja/account/components/Validator.java +++ b/src/main/java/biz/nynja/account/components/Validator.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; +import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -22,7 +23,9 @@ import org.springframework.stereotype.Component; import biz.nynja.account.grpc.CreateAccountRequest; import biz.nynja.account.grpc.ErrorResponse.Cause; +import biz.nynja.account.grpc.UpdateAccountRequest; import biz.nynja.account.models.CountryInfo; +import biz.nynja.account.repositories.AccountRepositoryAdditional; /** * Component which contains all validation methods. @@ -35,6 +38,9 @@ public class Validator { private HashMap countryInfoMap; + @Autowired + private AccountRepositoryAdditional accountRepositoryAdditional; + @PostConstruct public void loadPhonesBook() { @@ -197,4 +203,28 @@ public class Validator { // return null; // } + public Cause validateUpdateAccountRequest(UpdateAccountRequest request) { + + if (request.getUsername() != null && !request.getUsername().trim().isEmpty() + && !isUsernameValid(request.getUsername())) { + return Cause.USERNAME_INVALID; + } else if (request.getUsername() != null && !request.getUsername().trim().isEmpty() + && accountRepositoryAdditional.foundExistingNotOwnUsername(UUID.fromString(request.getAccountId()), request.getUsername())) { + return Cause.USERNAME_ALREADY_USED; + } + + if (request.getFirstName() != null && request.getFirstName().trim().isEmpty()) { + return Cause.MISSING_FIRST_NAME; + } else if (!isFirstNameValid(request.getFirstName())) { + return Cause.INVALID_FIRST_NAME; + } + + if (request.getLastName() != null && !request.getLastName().trim().isEmpty() + && !isLastNameValid(request.getLastName())) { + return Cause.INVALID_LAST_NAME; + } + + return null; + } + } diff --git a/src/main/java/biz/nynja/account/models/AccountByUsername.java b/src/main/java/biz/nynja/account/models/AccountByUsername.java new file mode 100644 index 0000000..c25bf94 --- /dev/null +++ b/src/main/java/biz/nynja/account/models/AccountByUsername.java @@ -0,0 +1,273 @@ +/** + * Copyright (C) 2018 Nynja Inc. All rights reserved. + */ +package biz.nynja.account.models; + +import java.nio.ByteBuffer; +import java.util.Set; +import java.util.UUID; + +import biz.nynja.account.grpc.AccountDetails; +import biz.nynja.account.grpc.AccountDetails.Builder; + +public class AccountByUsername { + + private UUID profileId; + private UUID accountId; + private String accountMark; + private String authenticationProvider; + private String authenticationProviderType; + private String firstName; + private String lastName; + private ByteBuffer avatar; + private String accountName; + private String username; + private String accountStatus; + private Long creationTimestamp; + private Long lastUpdateTimestamp; + private Set communicationProviders; + private String qrCode; + + public UUID getProfileId() { + return profileId; + } + + public void setProfileId(UUID profileId) { + this.profileId = profileId; + } + + public UUID getAccountId() { + return accountId; + } + + public void setAccountId(UUID accountId) { + this.accountId = accountId; + } + + public String getAccountMark() { + return accountMark; + } + + public void setAccountMark(String accountMark) { + this.accountMark = accountMark; + } + + public String getAuthenticationProvider() { + return authenticationProvider; + } + + public void setAuthenticationProvider(String authenticationProvider) { + this.authenticationProvider = authenticationProvider; + } + + public String getAuthenticationProviderType() { + return authenticationProviderType; + } + + public void setAuthenticationProviderType(String authenticationProviderType) { + this.authenticationProviderType = authenticationProviderType; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public ByteBuffer getAvatar() { + return avatar; + } + + public void setAvatar(ByteBuffer avatar) { + this.avatar = avatar; + } + + public String getAccountName() { + return accountName; + } + + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getAccountStatus() { + return accountStatus; + } + + public void setAccountStatus(String accountStatus) { + this.accountStatus = accountStatus; + } + + public Long getCreationTimestamp() { + return creationTimestamp; + } + + public void setCreationTimestamp(Long creationTimestamp) { + this.creationTimestamp = creationTimestamp; + } + + public Long getLastUpdateTimestamp() { + return lastUpdateTimestamp; + } + + public void setLastUpdateTimestamp(Long lastUpdateTimestamp) { + this.lastUpdateTimestamp = lastUpdateTimestamp; + } + + public Set getCommunicationProviders() { + return communicationProviders; + } + + public void setCommunicationProviders(Set communicationProviders) { + this.communicationProviders = communicationProviders; + } + + public String getQrCode() { + return qrCode; + } + + public void setQrCode(String qrCode) { + this.qrCode = qrCode; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((accountId == null) ? 0 : accountId.hashCode()); + result = prime * result + ((accountMark == null) ? 0 : accountMark.hashCode()); + result = prime * result + ((accountName == null) ? 0 : accountName.hashCode()); + result = prime * result + ((accountStatus == null) ? 0 : accountStatus.hashCode()); + result = prime * result + ((authenticationProvider == null) ? 0 : authenticationProvider.hashCode()); + result = prime * result + ((authenticationProviderType == null) ? 0 : authenticationProviderType.hashCode()); + result = prime * result + ((avatar == null) ? 0 : avatar.hashCode()); + result = prime * result + ((communicationProviders == null) ? 0 : communicationProviders.hashCode()); + result = prime * result + ((creationTimestamp == null) ? 0 : creationTimestamp.hashCode()); + result = prime * result + ((firstName == null) ? 0 : firstName.hashCode()); + result = prime * result + ((lastName == null) ? 0 : lastName.hashCode()); + result = prime * result + ((lastUpdateTimestamp == null) ? 0 : lastUpdateTimestamp.hashCode()); + result = prime * result + ((profileId == null) ? 0 : profileId.hashCode()); + result = prime * result + ((qrCode == null) ? 0 : qrCode.hashCode()); + result = prime * result + ((username == null) ? 0 : username.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + AccountByUsername other = (AccountByUsername) obj; + if (accountId == null) { + if (other.accountId != null) + return false; + } else if (!accountId.equals(other.accountId)) + return false; + if (accountMark == null) { + if (other.accountMark != null) + return false; + } else if (!accountMark.equals(other.accountMark)) + return false; + if (accountName == null) { + if (other.accountName != null) + return false; + } else if (!accountName.equals(other.accountName)) + return false; + if (accountStatus == null) { + if (other.accountStatus != null) + return false; + } else if (!accountStatus.equals(other.accountStatus)) + return false; + if (authenticationProvider == null) { + if (other.authenticationProvider != null) + return false; + } else if (!authenticationProvider.equals(other.authenticationProvider)) + return false; + if (authenticationProviderType == null) { + if (other.authenticationProviderType != null) + return false; + } else if (!authenticationProviderType.equals(other.authenticationProviderType)) + return false; + if (avatar == null) { + if (other.avatar != null) + return false; + } else if (!avatar.equals(other.avatar)) + return false; + if (communicationProviders == null) { + if (other.communicationProviders != null) + return false; + } else if (!communicationProviders.equals(other.communicationProviders)) + return false; + if (creationTimestamp == null) { + if (other.creationTimestamp != null) + return false; + } else if (!creationTimestamp.equals(other.creationTimestamp)) + return false; + if (firstName == null) { + if (other.firstName != null) + return false; + } else if (!firstName.equals(other.firstName)) + return false; + if (lastName == null) { + if (other.lastName != null) + return false; + } else if (!lastName.equals(other.lastName)) + return false; + if (lastUpdateTimestamp == null) { + if (other.lastUpdateTimestamp != null) + return false; + } else if (!lastUpdateTimestamp.equals(other.lastUpdateTimestamp)) + return false; + if (profileId == null) { + if (other.profileId != null) + return false; + } else if (!profileId.equals(other.profileId)) + return false; + if (qrCode == null) { + if (other.qrCode != null) + return false; + } else if (!qrCode.equals(other.qrCode)) + return false; + if (username == null) { + if (other.username != null) + return false; + } else if (!username.equals(other.username)) + return false; + return true; + } + + @Override + public String toString() { + return new StringBuilder("Account [accountId=").append(accountId).append(", profileId=").append(profileId) + .append(", accountMark=").append(accountMark).append(", authenticationProvider=") + .append(authenticationProvider).append(", authenticationProviderType=") + .append(authenticationProviderType).append(", firstName=").append(firstName).append(", lastName=") + .append(lastName).append(", avatar=").append(avatar).append(", accountName=").append(accountName) + .append(", username=").append(username).append(", accountStatus=").append(accountStatus) + .append(", creationTimestamp=").append(creationTimestamp).append(", lastUpdateTimestamp=") + .append(lastUpdateTimestamp).append(", communicationProviders=").append(communicationProviders) + .append("]").toString(); + } + +} diff --git a/src/main/java/biz/nynja/account/repositories/AccountByUsernameRepository.java b/src/main/java/biz/nynja/account/repositories/AccountByUsernameRepository.java new file mode 100644 index 0000000..647a918 --- /dev/null +++ b/src/main/java/biz/nynja/account/repositories/AccountByUsernameRepository.java @@ -0,0 +1,16 @@ +/** + * Copyright (C) 2018 Nynja Inc. All rights reserved. + */ +package biz.nynja.account.repositories; + +import org.springframework.data.cassandra.repository.CassandraRepository; +import org.springframework.stereotype.Repository; + +import biz.nynja.account.models.AccountByUsername; + +@Repository +public interface AccountByUsernameRepository extends CassandraRepository { + + AccountByUsername findByUsername(String username); + +} diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java index 1b7b143..0998508 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java @@ -3,6 +3,8 @@ */ package biz.nynja.account.repositories; +import java.util.UUID; + import org.springframework.stereotype.Repository; import biz.nynja.account.grpc.CompletePendingAccountCreationRequest; @@ -20,4 +22,6 @@ public interface AccountRepositoryAdditional { Profile updateProfile(UpdateProfileRequest request); + boolean foundExistingNotOwnUsername(UUID accountId, String username); + } diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java index 3f34e19..0bff51d 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java @@ -22,6 +22,7 @@ import biz.nynja.account.grpc.UpdateAccountRequest; import biz.nynja.account.grpc.UpdateProfileRequest; import biz.nynja.account.models.Account; import biz.nynja.account.models.AccountByCommunicationProvider; +import biz.nynja.account.models.AccountByUsername; import biz.nynja.account.models.AuthenticationProvider; import biz.nynja.account.models.PendingAccount; import biz.nynja.account.models.Profile; @@ -41,10 +42,12 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio @Autowired private ProfileRepository profileRepository; + @Autowired + AccountByUsernameRepository accountByUsernameRepository; + @Autowired private PendingAccountRepository pendingAccountRepository; - @Override public Account completePendingAccountCreation(CompletePendingAccountCreationRequest request) { CassandraBatchOperations batchOperations = cassandraTemplate.batchOps(); PendingAccount pendingAccount = pendingAccountRepository @@ -135,7 +138,6 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio batchOps.insert(newProfileByAuthenticationProvider); } - @Override public Profile updateProfile(UpdateProfileRequest request) { CassandraBatchOperations batchOperations = cassandraTemplate.batchOps(); @@ -204,7 +206,6 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio } } - @Override public Account updateAccount(UpdateAccountRequest request) { CassandraBatchOperations batchOperations = cassandraTemplate.batchOps(); Account existingAccount = accountRepository.findByAccountId(UUID.fromString(request.getAccountId())); @@ -405,4 +406,16 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio oldAccountByCommunicationProvider.setAvatar(request.getAvatar().asReadOnlyByteBuffer()); batchOps.update(oldAccountByCommunicationProvider); } + + public boolean foundExistingNotOwnUsername(UUID accountId, String username) { + AccountByUsername foundAccountByUsername = accountByUsernameRepository.findByUsername(username); + if (foundAccountByUsername == null) { + return false; + } else if (!foundAccountByUsername.getAccountId().equals(accountId)) { + return true; + } else { + 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 782ca68..1cf47f0 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -300,6 +300,14 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Updating account..."); logger.debug("Updating account...: {}", request); + Cause validationCause = validator.validateUpdateAccountRequest(request); + if (validationCause != null) { + responseObserver.onNext(UpdateAccountResponse.newBuilder() + .setError(ErrorResponse.newBuilder().setCause(validationCause)).build()); + responseObserver.onCompleted(); + return; + } + Account updatedAccount = accountRepositoryAdditional.updateAccount(request); if (updatedAccount == null) { -- GitLab From 9bb62cd86c7dafee4b6fc0bf9e6d47f8bcd571f0 Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Wed, 5 Sep 2018 18:04:18 +0300 Subject: [PATCH 05/10] NY-2652: Renamed responses to match the last changes in .proto Signed-off-by: Stanimir Penkov --- .../nynja/account/services/AccountServiceImpl.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index 1cf47f0..ab9db7c 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -38,9 +38,8 @@ import biz.nynja.account.repositories.AccountByProfileIdRepository; import biz.nynja.account.repositories.AccountRepository; import biz.nynja.account.repositories.AccountRepositoryAdditional; import biz.nynja.account.repositories.PendingAccountRepository; -import biz.nynja.account.grpc.GetAccountsResponse; +import biz.nynja.account.grpc.AccountsResponse; import biz.nynja.account.grpc.UpdateAccountRequest; -import biz.nynja.account.grpc.UpdateAccountResponse; import biz.nynja.account.grpc.UpdateProfileRequest; import biz.nynja.account.grpc.UpdateProfileResponse; import io.grpc.stub.StreamObserver; @@ -296,13 +295,13 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas } @Override - public void updateAccount(UpdateAccountRequest request, StreamObserver responseObserver) { + public void updateAccount(UpdateAccountRequest request, StreamObserver responseObserver) { logger.info("Updating account..."); logger.debug("Updating account...: {}", request); Cause validationCause = validator.validateUpdateAccountRequest(request); if (validationCause != null) { - responseObserver.onNext(UpdateAccountResponse.newBuilder() + responseObserver.onNext(AccountResponse.newBuilder() .setError(ErrorResponse.newBuilder().setCause(validationCause)).build()); responseObserver.onCompleted(); return; @@ -311,7 +310,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Account updatedAccount = accountRepositoryAdditional.updateAccount(request); if (updatedAccount == null) { - responseObserver.onNext(UpdateAccountResponse.newBuilder() + responseObserver.onNext(AccountResponse.newBuilder() .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_UPDATING_ACCOUNT)).build()); responseObserver.onCompleted(); return; @@ -319,7 +318,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.debug("Account \"{}\" updated in the DB", updatedAccount.toString()); try { logger.debug("Account: \"{}\" updated successfully.", updatedAccount); - UpdateAccountResponse response = UpdateAccountResponse.newBuilder() + AccountResponse response = AccountResponse.newBuilder() .setAccountDetails(updatedAccount.toProto()).build(); responseObserver.onNext(response); responseObserver.onCompleted(); -- GitLab From 75c1dffa94cd8b097a9af6d03fbedf6ff32b778c Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Wed, 5 Sep 2018 18:53:00 +0300 Subject: [PATCH 06/10] NY-2652: Additional case for not set default account id Signed-off-by: Stanimir Penkov --- .../account/repositories/AccountRepositoryAdditionalImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java index 0bff51d..97cd42a 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java @@ -313,6 +313,8 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio updatedProfile.setPasscode(request.getPasscode()); if (!request.getDefaultAccountId().trim().isEmpty()) { updatedProfile.setDefaultAccount(UUID.fromString(request.getDefaultAccountId())); + } else { + updatedProfile.setDefaultAccount(null); } updatedProfile.setLastUpdateTimestamp(lastUpdateTimestamp); batchOps.update(updatedProfile); -- GitLab From c47ed702002b6e682dec1e61589987b8ae610421 Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Tue, 11 Sep 2018 15:50:54 +0300 Subject: [PATCH 07/10] NY-2652: Code Review Feedback Signed-off-by: Stanimir Penkov --- .../biz/nynja/account/models/Profile.java | 19 +- .../AccountRepositoryAdditionalImpl.java | 253 +++++++++--------- .../account/services/AccountServiceImpl.java | 38 +-- 3 files changed, 147 insertions(+), 163 deletions(-) diff --git a/src/main/java/biz/nynja/account/models/Profile.java b/src/main/java/biz/nynja/account/models/Profile.java index f741705..86071a3 100644 --- a/src/main/java/biz/nynja/account/models/Profile.java +++ b/src/main/java/biz/nynja/account/models/Profile.java @@ -152,15 +152,20 @@ public class Profile { } public ProfileResponse toProto() { - Builder builder = ProfileResponse.newBuilder().setProfileId(getProfileId().toString()) - .setPasscode(getPasscode()); - if (defaultAccount != null) { - builder.setDefaultAccountId(defaultAccount.toString()); + Builder builder = ProfileResponse.newBuilder(); + if (getProfileId() != null) { + builder.setProfileId(getProfileId().toString()); } - if (backupAuthenticationProvider != null) { - builder.setBackupAuthProvider(backupAuthenticationProvider.toProto()); + if (getPasscode() != null) { + builder.setPasscode(getPasscode()); } - if (authenticationProviders != null) { + if (getDefaultAccount() != null) { + builder.setDefaultAccountId(getDefaultAccount().toString()); + } + if (getBackupAuthenticationProvider() != null) { + builder.setBackupAuthProvider(getBackupAuthenticationProvider().toProto()); + } + if (getAuthenticationProviders() != null) { for (AuthenticationProvider authenticationProvider : authenticationProviders) { builder.addAuthProviders(authenticationProvider.toProto()); } diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java index 97cd42a..17438cc 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java @@ -56,36 +56,33 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio logger.info("Existing pending account with the provided id was not found."); logger.debug("Existing pending account with the provided id {} was not found.", request.getAccountId()); return null; - } else { - Long timeCreated = new Date().getTime(); - Long checkMinutes = timeCreated - pendingAccount.getCreationTimestamp(); - if (checkMinutes > 30 * 60 * 1000) { - logger.info("Account creation timeout expired."); - return null; - } else { - WriteResult wr = null; - try { - newAccountInsert(batchOperations, request, pendingAccount, timeCreated); - newProfileInsert(batchOperations, request, pendingAccount, timeCreated); - newProfileByAuthenticationProviderInsert(batchOperations, pendingAccount); - wr = batchOperations.execute(); - } catch (IllegalArgumentException | IllegalStateException e) { - logger.info("Exception while completing pending account creation."); - logger.debug("Exception while completing pending account creation: {} ...", e.getMessage()); - return null; - } - if (wr != null) { - boolean applied = wr.wasApplied(); - if (applied) { - pendingAccountRepository.deleteById(UUID.fromString(request.getAccountId())); - Account createdAccount = accountRepository - .findByAccountId(UUID.fromString(request.getAccountId())); - return createdAccount; - } - } - return null; + } + Long timeCreated = new Date().getTime(); + Long checkMinutes = timeCreated - pendingAccount.getCreationTimestamp(); + if (checkMinutes > 30 * 60 * 1000) { + logger.info("Account creation timeout expired."); + return null; + } + WriteResult wr = null; + try { + newAccountInsert(batchOperations, request, pendingAccount, timeCreated); + newProfileInsert(batchOperations, request, pendingAccount, timeCreated); + newProfileByAuthenticationProviderInsert(batchOperations, pendingAccount); + wr = batchOperations.execute(); + } catch (IllegalArgumentException | IllegalStateException e) { + logger.info("Exception while completing pending account creation."); + logger.debug("Exception while completing pending account creation: {} ...", e.getMessage()); + return null; + } + if (wr != null) { + boolean applied = wr.wasApplied(); + if (applied) { + pendingAccountRepository.deleteById(UUID.fromString(request.getAccountId())); + Account createdAccount = accountRepository.findByAccountId(UUID.fromString(request.getAccountId())); + return createdAccount; } } + return null; } private void newAccountInsert(CassandraBatchOperations batchOps, CompletePendingAccountCreationRequest request, @@ -146,64 +143,61 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio logger.info("Existing profile with the provided id was not found."); logger.debug("Existing profile with the provided id {} was not found.", request.getProfileId()); return null; - } else { - Long timeUpdated = new Date().getTime(); - Set existingAuthenticationProvidersSet = new HashSet(); - if (existingProfile.getAuthenticationProviders() != null) { - existingAuthenticationProvidersSet = new HashSet( - existingProfile.getAuthenticationProviders()); - } - Set requestedAuthenticationProvidersSet = new HashSet(); - Set sameAuthenticationProvidersSet = new HashSet(); - Set oldAuthenticationProvidersSet = new HashSet(); - Set newAuthenticationProvidersSet = new HashSet(); - - if (request.getAuthProvidersList() != null) { - for (AuthProviderDetails authProviderDetails : request.getAuthProvidersList()) { - requestedAuthenticationProvidersSet - .add(AuthenticationProvider.createAuthenticationProviderFromProto(authProviderDetails)); - } - } + } + Long timeUpdated = new Date().getTime(); + Set existingAuthenticationProvidersSet = new HashSet(); + if (existingProfile.getAuthenticationProviders() != null) { + existingAuthenticationProvidersSet = new HashSet( + existingProfile.getAuthenticationProviders()); + } + Set requestedAuthenticationProvidersSet = new HashSet(); + Set sameAuthenticationProvidersSet = new HashSet(); + Set oldAuthenticationProvidersSet = new HashSet(); + Set newAuthenticationProvidersSet = new HashSet(); - try { - sameAuthenticationProvidersSet = new HashSet( - requestedAuthenticationProvidersSet); - oldAuthenticationProvidersSet = new HashSet(existingAuthenticationProvidersSet); - newAuthenticationProvidersSet = new HashSet( - requestedAuthenticationProvidersSet); - - sameAuthenticationProvidersSet.retainAll(existingAuthenticationProvidersSet); - oldAuthenticationProvidersSet.removeAll(sameAuthenticationProvidersSet); - newAuthenticationProvidersSet.removeAll(sameAuthenticationProvidersSet); - } catch (Exception e) { - logger.info("Exception while setting authentication providers."); - logger.debug("Exception while setting authentication providers: {} ...", e.getMessage()); - return null; + if (request.getAuthProvidersList() != null) { + for (AuthProviderDetails authProviderDetails : request.getAuthProvidersList()) { + requestedAuthenticationProvidersSet + .add(AuthenticationProvider.createAuthenticationProviderFromProto(authProviderDetails)); } + } - WriteResult wr = null; - try { - updateProfileData(batchOperations, request, existingProfile, timeUpdated); - insertNewAuthenticationProvidersToProfile(batchOperations, existingProfile.getProfileId(), - newAuthenticationProvidersSet); - deleteOldAuthenticationProvidersFromProfile(batchOperations, existingProfile.getProfileId(), - oldAuthenticationProvidersSet); - wr = batchOperations.execute(); - } catch (IllegalArgumentException | IllegalStateException e) { - logger.info("Exception while updating profile."); - logger.debug("Exception while updating profile: {} ...", e.getMessage()); - return null; - } + try { + sameAuthenticationProvidersSet = new HashSet(requestedAuthenticationProvidersSet); + oldAuthenticationProvidersSet = new HashSet(existingAuthenticationProvidersSet); + newAuthenticationProvidersSet = new HashSet(requestedAuthenticationProvidersSet); + + sameAuthenticationProvidersSet.retainAll(existingAuthenticationProvidersSet); + oldAuthenticationProvidersSet.removeAll(sameAuthenticationProvidersSet); + newAuthenticationProvidersSet.removeAll(sameAuthenticationProvidersSet); + } catch (Exception e) { + logger.info("Exception while setting authentication providers."); + logger.debug("Exception while setting authentication providers: {} ...", e.getMessage()); + return null; + } - if (wr != null) { - boolean applied = wr.wasApplied(); - if (applied) { - Profile updatedProfile = profileRepository.findByProfileId(UUID.fromString(request.getProfileId())); - return updatedProfile; - } - } + WriteResult wr = null; + try { + updateProfileData(batchOperations, request, existingProfile, timeUpdated); + insertNewAuthenticationProvidersToProfile(batchOperations, existingProfile.getProfileId(), + newAuthenticationProvidersSet); + deleteOldAuthenticationProvidersFromProfile(batchOperations, existingProfile.getProfileId(), + oldAuthenticationProvidersSet); + wr = batchOperations.execute(); + } catch (IllegalArgumentException | IllegalStateException e) { + logger.info("Exception while updating profile."); + logger.debug("Exception while updating profile: {} ...", e.getMessage()); return null; } + + if (wr != null) { + boolean applied = wr.wasApplied(); + if (applied) { + Profile updatedProfile = profileRepository.findByProfileId(UUID.fromString(request.getProfileId())); + return updatedProfile; + } + } + return null; } public Account updateAccount(UpdateAccountRequest request) { @@ -213,63 +207,60 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio logger.info("Existing account with the provided id was not found."); logger.debug("Existing account with the provided id {} was not found.", request.getAccountId()); return null; - } else { - Long timeUpdated = new Date().getTime(); - Set existingCommunicationProvidersSet = new HashSet(); - if (existingAccount.getCommunicationProviders() != null) { - existingCommunicationProvidersSet = new HashSet( - existingAccount.getCommunicationProviders()); - } - Set requestedCommunicationProvidersSet = new HashSet(); - Set sameCommunicationProvidersSet = new HashSet(); - Set oldCommunicationProvidersSet = new HashSet(); - Set newCommunicationProvidersSet = new HashSet(); - - if (request.getCommunicationProvidersList() != null) { - for (AuthProviderDetails authProviderDetails : request.getCommunicationProvidersList()) { - requestedCommunicationProvidersSet - .add(AuthenticationProvider.createAuthenticationProviderFromProto(authProviderDetails)); - } - } + } + Long timeUpdated = new Date().getTime(); + Set existingCommunicationProvidersSet = new HashSet(); + if (existingAccount.getCommunicationProviders() != null) { + existingCommunicationProvidersSet = new HashSet( + existingAccount.getCommunicationProviders()); + } + Set requestedCommunicationProvidersSet = new HashSet(); + Set sameCommunicationProvidersSet = new HashSet(); + Set oldCommunicationProvidersSet = new HashSet(); + Set newCommunicationProvidersSet = new HashSet(); - try { - sameCommunicationProvidersSet = new HashSet(requestedCommunicationProvidersSet); - oldCommunicationProvidersSet = new HashSet(existingCommunicationProvidersSet); - newCommunicationProvidersSet = new HashSet(requestedCommunicationProvidersSet); - - sameCommunicationProvidersSet.retainAll(existingCommunicationProvidersSet); - oldCommunicationProvidersSet.removeAll(sameCommunicationProvidersSet); - newCommunicationProvidersSet.removeAll(sameCommunicationProvidersSet); - } catch (Exception e) { - logger.info("Exception while setting communication providers."); - logger.debug("Exception while setting communication providers: {} ...", e.getMessage()); - return null; + if (request.getCommunicationProvidersList() != null) { + for (AuthProviderDetails authProviderDetails : request.getCommunicationProvidersList()) { + requestedCommunicationProvidersSet + .add(AuthenticationProvider.createAuthenticationProviderFromProto(authProviderDetails)); } + } - WriteResult wr = null; - try { - updateAccountData(batchOperations, request, existingAccount, timeUpdated); - insertNewCommunicationProvidersToAccount(batchOperations, request, newCommunicationProvidersSet); - deleteOldCommunicationProvidersFromAccount(batchOperations, existingAccount, - oldCommunicationProvidersSet); - updateSameCommunicationProvidersFromAccount(batchOperations, request, sameCommunicationProvidersSet); - wr = batchOperations.execute(); - } catch (IllegalArgumentException | IllegalStateException e) { - logger.info("Exception while updating account."); - logger.debug("Exception while updating account: {} ...", e.getMessage()); - return null; - } + try { + sameCommunicationProvidersSet = new HashSet(requestedCommunicationProvidersSet); + oldCommunicationProvidersSet = new HashSet(existingCommunicationProvidersSet); + newCommunicationProvidersSet = new HashSet(requestedCommunicationProvidersSet); + + sameCommunicationProvidersSet.retainAll(existingCommunicationProvidersSet); + oldCommunicationProvidersSet.removeAll(sameCommunicationProvidersSet); + newCommunicationProvidersSet.removeAll(sameCommunicationProvidersSet); + } catch (Exception e) { + logger.info("Exception while setting communication providers."); + logger.debug("Exception while setting communication providers: {} ...", e.getMessage()); + return null; + } - if (wr != null) { - boolean applied = wr.wasApplied(); - if (applied) { - Account updatedAccount = accountRepository - .findByAccountId(UUID.fromString(request.getAccountId())); - return updatedAccount; - } - } + WriteResult wr = null; + try { + updateAccountData(batchOperations, request, existingAccount, timeUpdated); + insertNewCommunicationProvidersToAccount(batchOperations, request, newCommunicationProvidersSet); + deleteOldCommunicationProvidersFromAccount(batchOperations, existingAccount, oldCommunicationProvidersSet); + updateSameCommunicationProvidersFromAccount(batchOperations, request, sameCommunicationProvidersSet); + wr = batchOperations.execute(); + } catch (IllegalArgumentException | IllegalStateException e) { + logger.info("Exception while updating account."); + logger.debug("Exception while updating account: {} ...", e.getMessage()); return null; } + + if (wr != null) { + boolean applied = wr.wasApplied(); + if (applied) { + Account updatedAccount = accountRepository.findByAccountId(UUID.fromString(request.getAccountId())); + return updatedAccount; + } + } + return null; } private void updateAccountData(CassandraBatchOperations batchOps, UpdateAccountRequest request, diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index ab9db7c..8848620 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -274,21 +274,16 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (updatedProfile == null) { responseObserver.onNext(UpdateProfileResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_UPDATING_ACCOUNT)).build()); + .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_UPDATING_PROFILE)).build()); responseObserver.onCompleted(); return; } else { logger.debug("Profile \"{}\" updated in the DB", updatedProfile.toString()); - try { - logger.debug("Profile: \"{}\" updated successfully.", updatedProfile); - UpdateProfileResponse response = UpdateProfileResponse.newBuilder() - .setProfileResponse(updatedProfile.toProto()).build(); - responseObserver.onNext(response); - responseObserver.onCompleted(); - } catch (NullPointerException e) { - logger.info("Exception while sending response for updated profile."); - return; - } + logger.debug("Profile: \"{}\" updated successfully.", updatedProfile); + UpdateProfileResponse response = UpdateProfileResponse.newBuilder() + .setProfileResponse(updatedProfile.toProto()).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); logger.info("Profile updated successfully."); return; } @@ -314,20 +309,13 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_UPDATING_ACCOUNT)).build()); responseObserver.onCompleted(); return; - } else { - logger.debug("Account \"{}\" updated in the DB", updatedAccount.toString()); - try { - logger.debug("Account: \"{}\" updated successfully.", updatedAccount); - AccountResponse response = AccountResponse.newBuilder() - .setAccountDetails(updatedAccount.toProto()).build(); - responseObserver.onNext(response); - responseObserver.onCompleted(); - } catch (NullPointerException e) { - logger.info("Exception while sending response for updated account."); - return; - } - logger.info("Account updated successfully."); - return; } + logger.debug("Account \"{}\" updated in the DB", updatedAccount.toString()); + logger.debug("Account: \"{}\" updated successfully.", updatedAccount); + AccountResponse response = AccountResponse.newBuilder().setAccountDetails(updatedAccount.toProto()).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + logger.info("Account updated successfully."); + return; } } \ No newline at end of file -- GitLab From 8031513e5a8bd3a5d7c42e2defba1d9f1f4367f2 Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Tue, 11 Sep 2018 15:56:28 +0300 Subject: [PATCH 08/10] NY-2652: Code Review Feedback Signed-off-by: Stanimir Penkov --- .../account/services/AccountServiceImpl.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index 8848620..1a8bf05 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -277,16 +277,15 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_UPDATING_PROFILE)).build()); responseObserver.onCompleted(); return; - } else { - logger.debug("Profile \"{}\" updated in the DB", updatedProfile.toString()); - logger.debug("Profile: \"{}\" updated successfully.", updatedProfile); - UpdateProfileResponse response = UpdateProfileResponse.newBuilder() - .setProfileResponse(updatedProfile.toProto()).build(); - responseObserver.onNext(response); - responseObserver.onCompleted(); - logger.info("Profile updated successfully."); - return; } + logger.debug("Profile \"{}\" updated in the DB", updatedProfile.toString()); + logger.debug("Profile: \"{}\" updated successfully.", updatedProfile); + UpdateProfileResponse response = UpdateProfileResponse.newBuilder().setProfileResponse(updatedProfile.toProto()) + .build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + logger.info("Profile updated successfully."); + return; } @Override -- GitLab From a787ccfff8b6b99672f9387b3f88dc1b598241b7 Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Tue, 11 Sep 2018 16:43:21 +0300 Subject: [PATCH 09/10] NY-2652: Code Review Feedback Signed-off-by: Stanimir Penkov --- .../account/repositories/AccountRepositoryAdditionalImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java index 17438cc..f6c0761 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java @@ -32,6 +32,7 @@ import biz.nynja.account.models.ProfileByAuthenticationProvider; public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditional { private static final Logger logger = LoggerFactory.getLogger(AccountRepositoryAdditionalImpl.class); + private static final int COMPLETE_PENDING_ACCOUNT_TIMEOUT = 30 * 60 * 1000; @Autowired private CassandraTemplate cassandraTemplate; @@ -59,7 +60,7 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio } Long timeCreated = new Date().getTime(); Long checkMinutes = timeCreated - pendingAccount.getCreationTimestamp(); - if (checkMinutes > 30 * 60 * 1000) { + if (checkMinutes > COMPLETE_PENDING_ACCOUNT_TIMEOUT) { logger.info("Account creation timeout expired."); return null; } -- GitLab From f5546626580133f747f0324c81147f209d29d4f6 Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Tue, 11 Sep 2018 16:57:15 +0300 Subject: [PATCH 10/10] NY-2652: Code Review Feedback Signed-off-by: Stanimir Penkov --- .../biz/nynja/account/services/AccountServiceImpl.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index 1a8bf05..511cf5d 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -53,6 +53,8 @@ import io.grpc.stub.StreamObserver; public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBase { private static final Logger logger = LoggerFactory.getLogger(AccountServiceImpl.class); + private static final byte MIN_NUMBER_OF_AUTH_PROVIDERS_IN_PROFILE = 1; + @Autowired private AccountRepository accountRepository; @@ -261,9 +263,9 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Updating profile..."); logger.debug("Updating profile...: {}", request); - if (request.getAuthProvidersList().size() < 1) { - logger.info("Error updating profile. At least one authentication provider should be added."); - logger.debug("Error updating profile. At least one authentication provider should be added: {}", request); + if (request.getAuthProvidersList().size() < MIN_NUMBER_OF_AUTH_PROVIDERS_IN_PROFILE) { + logger.info("Error updating profile. Check the number of authentication providers."); + logger.debug("Error updating profile. Check the number of authentication providers: {}", request); responseObserver.onNext(UpdateProfileResponse.newBuilder() .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_UPDATING_PROFILE)).build()); responseObserver.onCompleted(); -- GitLab