From 25178e55d13e5a327b26d49922590a8ddf79f044 Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Thu, 13 Dec 2018 11:52:18 +0200 Subject: [PATCH 1/2] NY-5655: Add searchable option - Updated code to support searchable option. Signed-off-by: Stanimir Penkov --- .../account/components/StatementsPool.java | 6 +- .../nynja/account/grid/ag/AgGridService.java | 3 +- .../models/AuthenticationProvider.java | 10 +-- .../ProfileByAuthenticationProvider.java | 2 - .../account/phone/PhoneNumberNormalizer.java | 10 ++- .../AccountRepositoryAdditional.java | 2 + .../AccountRepositoryAdditionalImpl.java | 75 +++++++++++++++---- .../account/services/AccountServiceImpl.java | 24 ++++-- .../decomposition/AccountCreator.java | 6 +- .../decomposition/AccountProvider.java | 14 ++-- .../account/services/AccountServiceTests.java | 8 +- .../java/biz/nynja/account/utils/Util.java | 3 +- 12 files changed, 111 insertions(+), 52 deletions(-) diff --git a/src/main/java/biz/nynja/account/components/StatementsPool.java b/src/main/java/biz/nynja/account/components/StatementsPool.java index 9a2f438..28dfaca 100644 --- a/src/main/java/biz/nynja/account/components/StatementsPool.java +++ b/src/main/java/biz/nynja/account/components/StatementsPool.java @@ -44,10 +44,10 @@ public class StatementsPool { } public BoundStatement insertProfileByAuthenticationProvider(UUID profileId, String authPovider, - String authProviderType) { - String cql = "INSERT INTO profilebyauthenticationprovider (authenticationprovider, authenticationprovidertype, profileid) VALUES (?, ?, ?) ;"; + String authProviderType, boolean searchable) { + String cql = "INSERT INTO profilebyauthenticationprovider (authenticationprovider, authenticationprovidertype, profileid, searchable) VALUES (?, ?, ?, ?) ;"; BoundStatement bound = preparedStatementsCache.getPreparedStatement(cql).bind(authPovider, authProviderType, - profileId); + profileId, searchable); return bound; } diff --git a/src/main/java/biz/nynja/account/grid/ag/AgGridService.java b/src/main/java/biz/nynja/account/grid/ag/AgGridService.java index 3ffa009..4d70652 100644 --- a/src/main/java/biz/nynja/account/grid/ag/AgGridService.java +++ b/src/main/java/biz/nynja/account/grid/ag/AgGridService.java @@ -364,7 +364,8 @@ public class AgGridService { */ private AccountsHelper retrieveLoginOptionFilteredResults(FilterModel filterModel, String authType) { AuthenticationProvider authenticationProvider = AuthenticationProvider - .createAuthenticationProviderFromStrings(authType, filterModel.getFilterValue()); + .createAuthenticationProviderFromStringsWithDefaultSearchableOption(authType, + filterModel.getFilterValue()); if (!FilterType.EQUALS.equals(filterModel.getFilterType())) { // ONLY EQUALS is supported at the moment logger.error(ERROR_ONLY_EQUALS_SUPPORTED, filterModel); diff --git a/src/main/java/biz/nynja/account/models/AuthenticationProvider.java b/src/main/java/biz/nynja/account/models/AuthenticationProvider.java index 1112202..7e62eb5 100644 --- a/src/main/java/biz/nynja/account/models/AuthenticationProvider.java +++ b/src/main/java/biz/nynja/account/models/AuthenticationProvider.java @@ -6,8 +6,6 @@ package biz.nynja.account.models; import java.util.Optional; import java.util.Set; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.data.cassandra.core.mapping.UserDefinedType; import biz.nynja.account.grpc.AuthProviderDetails; @@ -41,8 +39,6 @@ public class AuthenticationProvider { public Boolean getSearchable() { // if current value is null, return the default value: true if (searchable == null) { - logger.warn("The searchable option can not be null for {}:{}. Default option will be used instead.", - getType(), getValue()); return Boolean.TRUE; } return searchable; @@ -51,8 +47,6 @@ public class AuthenticationProvider { public void setSearchable(Boolean searchable) { // if searchable is null, set the default value: true if (searchable == null) { - logger.warn("The searchable option can not be null for {}:{}. Default option will be used instead.", - getType(), getValue()); this.searchable = Boolean.TRUE; } else { this.searchable = searchable; @@ -107,10 +101,12 @@ public class AuthenticationProvider { AuthenticationProvider authenticationProvider = new AuthenticationProvider(); authenticationProvider.setType(authProviderDetails.getAuthenticationType().toString()); authenticationProvider.setValue(authProviderDetails.getAuthenticationProvider()); + authenticationProvider.setSearchable(isSearchDisabled(authProviderDetails.getSearchOption())); return authenticationProvider; } - public static AuthenticationProvider createAuthenticationProviderFromStrings(String type, String value) { + public static AuthenticationProvider createAuthenticationProviderFromStringsWithDefaultSearchableOption(String type, + String value) { AuthenticationProvider authenticationProvider = new AuthenticationProvider(); authenticationProvider.setType(type); authenticationProvider.setValue(value); diff --git a/src/main/java/biz/nynja/account/models/ProfileByAuthenticationProvider.java b/src/main/java/biz/nynja/account/models/ProfileByAuthenticationProvider.java index bf4f277..1c91c78 100644 --- a/src/main/java/biz/nynja/account/models/ProfileByAuthenticationProvider.java +++ b/src/main/java/biz/nynja/account/models/ProfileByAuthenticationProvider.java @@ -53,8 +53,6 @@ public class ProfileByAuthenticationProvider { public void setSearchable(Boolean searchable) { // if searchable is null, set the default value: true if (searchable == null) { - logger.warn("The searchable option can not be null for {}:{}. Default option will be used instead.", - getAuthenticationProviderType(), getAuthenticationProvider()); this.searchable = Boolean.TRUE; } else { this.searchable = searchable; diff --git a/src/main/java/biz/nynja/account/phone/PhoneNumberNormalizer.java b/src/main/java/biz/nynja/account/phone/PhoneNumberNormalizer.java index 806362f..6f728a4 100644 --- a/src/main/java/biz/nynja/account/phone/PhoneNumberNormalizer.java +++ b/src/main/java/biz/nynja/account/phone/PhoneNumberNormalizer.java @@ -75,16 +75,18 @@ public class PhoneNumberNormalizer { // Get the normalized phone number from libphone for the old number normalizedOldNumber = AuthProviderDetails.newBuilder() .setAuthenticationType(request.getOldAuthProvider().getAuthenticationType()) - .setAuthenticationProvider(getNormalizedPhoneNumber(request.getOldAuthProvider().getAuthenticationProvider())) - .build(); + .setAuthenticationProvider( + getNormalizedPhoneNumber(request.getOldAuthProvider().getAuthenticationProvider())) + .setSearchOption(request.getOldAuthProvider().getSearchOption()).build(); } if (request.getUpdatedAuthProvider().getAuthenticationTypeValue() == AuthenticationType.PHONE_VALUE) { updatedIsPhone = true; // Get the normalized phone number from libphone for the updated number normalizedUpdatedNumber = AuthProviderDetails.newBuilder() .setAuthenticationType(request.getUpdatedAuthProvider().getAuthenticationType()) - .setAuthenticationProvider(getNormalizedPhoneNumber(request.getUpdatedAuthProvider().getAuthenticationProvider())) - .build(); + .setAuthenticationProvider( + getNormalizedPhoneNumber(request.getUpdatedAuthProvider().getAuthenticationProvider())) + .setSearchOption(request.getUpdatedAuthProvider().getSearchOption()).build(); } if (oldIsPhone && updatedIsPhone) { diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java index 8254fa4..c6f039d 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditional.java @@ -55,5 +55,7 @@ public interface AccountRepositoryAdditional { Optional getAccountByLoginOption(AuthenticationProvider loginOption) throws IncorrectAccountCountException; + Optional searchAccountByLoginOption(AuthenticationProvider loginOption) throws IncorrectAccountCountException; + void removeNullsForSearchableOption(); } diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java index e53acce..0fb97ba 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java @@ -112,8 +112,9 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio return null; } - if (authenticationProviderAlreadyUsedInProfile(AuthenticationProvider.createAuthenticationProviderFromStrings( - pendingAccount.getAuthenticationProviderType(), pendingAccount.getAuthenticationProvider()))) { + if (authenticationProviderAlreadyUsedInProfile( + AuthenticationProvider.createAuthenticationProviderFromStringsWithDefaultSearchableOption( + pendingAccount.getAuthenticationProviderType(), pendingAccount.getAuthenticationProvider()))) { logger.error("The requested auth provider {}:{} is already used.", pendingAccount.getAuthenticationProviderType(), pendingAccount.getAuthenticationProvider()); return null; @@ -150,8 +151,10 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio Profile newProfile = new Profile(); newProfile.setProfileId(pendingAccount.getProfileId()); Set authenticationProvidersSet = new HashSet(); - authenticationProvidersSet.add(AuthenticationProvider.createAuthenticationProviderFromStrings( - pendingAccount.getAuthenticationProviderType(), pendingAccount.getAuthenticationProvider())); + // Authentication provider (login option) is searchable by default + authenticationProvidersSet.add(AuthenticationProvider.createAuthenticationProviderWithSearchableOption( + pendingAccount.getAuthenticationProviderType(), pendingAccount.getAuthenticationProvider(), + Boolean.TRUE)); newProfile.setAuthenticationProviders(authenticationProvidersSet); newProfile.setCreationTimestamp(creationTimestamp); batchOps.insert(newProfile); @@ -165,6 +168,8 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio newProfileByAuthenticationProvider .setAuthenticationProviderType(pendingAccount.getAuthenticationProviderType()); newProfileByAuthenticationProvider.setProfileId(pendingAccount.getProfileId()); + // Authentication provider (login option) is searchable by default + newProfileByAuthenticationProvider.setSearchable(Boolean.TRUE); batchOps.insert(newProfileByAuthenticationProvider); } @@ -221,7 +226,7 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio try { deleteAccountData(batchOperations, existingAccount); deleteProfileByAuthenticationProvider(batchOperations, existingAccount.getProfileId(), - AuthenticationProvider.createAuthenticationProviderFromStrings( + AuthenticationProvider.createAuthenticationProviderFromStringsWithDefaultSearchableOption( existingAccount.getAuthenticationProviderType(), existingAccount.getAuthenticationProvider())); if (alsoDeleteProfile) { @@ -263,9 +268,16 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio if (existingProfile.getAuthenticationProviders() != null) { Set existingAuthenticationProvidersSet = new HashSet( existingProfile.getAuthenticationProviders()); - boolean removedAuthProvider = existingAuthenticationProvidersSet.remove(AuthenticationProvider - .createAuthenticationProviderFromStrings(existingAccount.getAuthenticationProviderType(), - existingAccount.getAuthenticationProvider())); + Optional existingCreationProviderToDelete = AuthenticationProvider + .foundExistingAuthenticationProviderByTypeAndValue(existingAccount.getAuthenticationProviderType(), + existingAccount.getAuthenticationProvider(), existingAuthenticationProvidersSet); + if (!existingCreationProviderToDelete.isPresent()) { + logger.error("Error removing creation provider from account {}.", existingAccount.getAccountId()); + return false; + } + + boolean removedAuthProvider = existingAuthenticationProvidersSet + .remove(existingCreationProviderToDelete.get()); if (removedAuthProvider) { // at least one authentication provider should exist in the profile if (existingAuthenticationProvidersSet.size() > 0) { @@ -426,7 +438,7 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio Account existingAccount = accountRepository.findByAccountId(accountByProfileId.getAccountId()); deleteAccountData(batchOperations, existingAccount); deleteProfileByAuthenticationProvider(batchOperations, profileId, - AuthenticationProvider.createAuthenticationProviderFromStrings( + AuthenticationProvider.createAuthenticationProviderFromStringsWithDefaultSearchableOption( existingAccount.getAuthenticationProviderType(), existingAccount.getAuthenticationProvider())); } @@ -451,8 +463,9 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio authProvider); batch.add(updateAuthProvidersInProfile); - BoundStatement insertInProfileByAuthProvider = statementsPool - .insertProfileByAuthenticationProvider(profileId, authProvider.getValue(), authProvider.getType()); + BoundStatement insertInProfileByAuthProvider = statementsPool.insertProfileByAuthenticationProvider( + profileId, authProvider.getValue(), authProvider.getType(), + authProvider.getSearchable().booleanValue()); batch.add(insertInProfileByAuthProvider); wr = session.execute(batch); @@ -491,12 +504,21 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio logger.error("No existing authentication providers found for profile with id {}", profileId); return false; } - if (!authProvidersSet.remove(oldAuthProvider)) { + + Optional existingAuthProviderToDelete = AuthenticationProvider + .foundExistingAuthenticationProviderByTypeAndValue(oldAuthProvider.getType(), + oldAuthProvider.getValue(), authProvidersSet); + if (!existingAuthProviderToDelete.isPresent()) { logger.error( "Error removing authentication provider from profile {}. Existing authentication provider: {} was not found.", profileId, oldAuthProvider.toString()); return false; } + if (!authProvidersSet.remove(existingAuthProviderToDelete.get())) { + logger.error("Error removing authentication provider {} from profile {}.", + existingAuthProviderToDelete.get().toString(), profileId); + return false; + } if (!authProvidersSet.add(updatedAuthProvider)) { logger.error("Error adding authentication provider to profile {}. {} already exists.", profileId, updatedAuthProvider.toString()); @@ -523,7 +545,8 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio batch.add(updateAuthProvidersInProfile); BoundStatement insertInProfileByAuthProvider = statementsPool.insertProfileByAuthenticationProvider( - profileId, updatedAuthProvider.getValue(), updatedAuthProvider.getType()); + profileId, updatedAuthProvider.getValue(), updatedAuthProvider.getType(), + updatedAuthProvider.getSearchable().booleanValue()); batch.add(insertInProfileByAuthProvider); BoundStatement deleteProfileByAuthProviderStatement = statementsPool @@ -749,6 +772,32 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio } } + @Override + public Optional searchAccountByLoginOption(AuthenticationProvider loginOption) + throws IncorrectAccountCountException { + ProfileByAuthenticationProvider profileByAuthProvider = profileByAuthenticationProviderRepository + .findByAuthenticationProviderAndAuthenticationProviderType(loginOption.getValue(), + loginOption.getType()); + if (profileByAuthProvider == null || !profileByAuthProvider.getSearchable().booleanValue()) { + return Optional.empty(); + } + + List listAccountsByProfileId = accountByProfileIdRepository + .findAllByProfileId(profileByAuthProvider.getProfileId()); + if (listAccountsByProfileId.size() == 0) { + throw new IncorrectAccountCountException("No existing account found for the corresponding profileId: " + + profileByAuthProvider.getProfileId()); + } + + // The expected number of accounts in case of a single account is one + if (listAccountsByProfileId.size() == 1) { + return Optional.of(listAccountsByProfileId.get(0)); + } else { + throw new IncorrectAccountCountException("It was expected to find one account for profile with id: " + + profileByAuthProvider.getProfileId() + " but found " + listAccountsByProfileId.size() + "."); + } + } + @Override public boolean editContactInfo(UUID accountId, ContactInfo oldContactInfo, ContactInfo editedContactInfo) { if (oldContactInfo == null || editedContactInfo == null) { diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index 3c0666b..636d301 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -173,7 +173,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Optional account = Optional.empty(); try { - account = accountProvider.getAccountByLoginOption(AuthenticationType.EMAIL, request.getEmail()); + account = accountProvider.searchAccountByLoginOption(AuthenticationType.EMAIL, request.getEmail()); } catch (IncorrectAccountCountException e) { logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), "Error while searching for e-mail: ", request.getEmail(), Cause.INTERNAL_SERVER_ERROR, ""); @@ -215,7 +215,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Optional account = Optional.empty(); try { - account = accountProvider.getAccountByLoginOption(AuthenticationType.PHONE, request.getPhoneNumber()); + account = accountProvider.searchAccountByLoginOption(AuthenticationType.PHONE, request.getPhoneNumber()); } catch (IncorrectAccountCountException e) { logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), "Error while searching for phone: ", request.getPhoneNumber(), Cause.INTERNAL_SERVER_ERROR, ""); @@ -630,7 +630,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas .setAuthenticationType(request.getAuthenticationProvider().getAuthenticationType()) .setAuthenticationProvider(phoneNumberNormalizer .getNormalizedPhoneNumber(request.getAuthenticationProvider().getAuthenticationProvider())) - .build(); + .setSearchOption(request.getAuthenticationProvider().getSearchOption()).build(); AddAuthenticationProviderRequest newRequest = AddAuthenticationProviderRequest.newBuilder() .setProfileId(request.getProfileId()).setAuthenticationProvider(newAuthProviderDetails).build(); request = newRequest; @@ -827,14 +827,24 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas .getNormalizedPhoneNumber(request.getAuthenticationProvider().getAuthenticationProvider())); } - boolean removedFromObject = profile.removeAuthenticationProvider(authenticationProviderToDelete); - if (!removedFromObject) { + Optional existingAuthProviderToDelete = AuthenticationProvider + .foundExistingAuthenticationProviderByTypeAndValue(authenticationProviderToDelete.getType(), + authenticationProviderToDelete.getValue(), profile.getAuthenticationProviders()); + if (!existingAuthProviderToDelete.isPresent()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Authentication provider {} is not used by this profile.", authenticationProviderToDelete.toString(), Cause.AUTH_PROVIDER_NOT_FOUND); return; } + boolean removedFromObject = profile.removeAuthenticationProvider(existingAuthProviderToDelete.get()); + if (!removedFromObject) { + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), + "Error removing authentication provider {}.", + existingAuthProviderToDelete.get().toString(), Cause.INTERNAL_SERVER_ERROR); + return; + } + if (profile.getAuthenticationProviders().size() < MIN_NUMBER_OF_AUTH_PROVIDERS_IN_PROFILE) { logger.error( "Error deleting authentication provider {} from profile with id {}. Check the number of authentication providers.", @@ -846,7 +856,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas } boolean result = accountRepositoryAdditional.deleteAuthenticationProvider(profile, - authenticationProviderToDelete); + existingAuthProviderToDelete.get()); if (result) { logger.info("Authentication provider {}:{} successfuly deleted from profile id {}.", @@ -1148,7 +1158,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Optional account = Optional.empty(); try { - account = accountProvider.getAccountByLoginOption(request.getAuthenticationType(), + account = accountProvider.searchAccountByLoginOption(request.getAuthenticationType(), request.getAuthenticationIdentifier()); } catch (IncorrectAccountCountException e) { logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), diff --git a/src/main/java/biz/nynja/account/services/decomposition/AccountCreator.java b/src/main/java/biz/nynja/account/services/decomposition/AccountCreator.java index 06c7661..d4d507d 100644 --- a/src/main/java/biz/nynja/account/services/decomposition/AccountCreator.java +++ b/src/main/java/biz/nynja/account/services/decomposition/AccountCreator.java @@ -100,7 +100,7 @@ public class AccountCreator { private CreatePendingAccountResponse updateAndValidatePendingAccountCreation(CreatePendingAccountRequest request) { PendingAccountByAuthenticationProvider foundExistingPendingAccount = accountRepositoryAdditional .findSameAuthenticationProviderInPendingAccount( - AuthenticationProvider.createAuthenticationProviderFromStrings( + AuthenticationProvider.createAuthenticationProviderFromStringsWithDefaultSearchableOption( request.getAuthenticationType().name(), request.getAuthenticationProvider())); PendingAccount updatedPendingAccount = new PendingAccount(); @@ -119,8 +119,8 @@ public class AccountCreator { } if (accountRepositoryAdditional.authenticationProviderAlreadyUsedInProfile( - AuthenticationProvider.createAuthenticationProviderFromStrings(request.getAuthenticationType().name(), - request.getAuthenticationProvider()))) { + AuthenticationProvider.createAuthenticationProviderFromStringsWithDefaultSearchableOption( + request.getAuthenticationType().name(), request.getAuthenticationProvider()))) { return logAndBuildGrpcPendingAccountResponse(CreatePendingAccountResponse.newBuilder(), "Error creating pending account. Authentication provider: {} already used.", request.getAuthenticationProvider(), Cause.AUTH_PROVIDER_ALREADY_USED); diff --git a/src/main/java/biz/nynja/account/services/decomposition/AccountProvider.java b/src/main/java/biz/nynja/account/services/decomposition/AccountProvider.java index 89e802d..e912b9c 100644 --- a/src/main/java/biz/nynja/account/services/decomposition/AccountProvider.java +++ b/src/main/java/biz/nynja/account/services/decomposition/AccountProvider.java @@ -104,9 +104,9 @@ public class AccountProvider { authenticationIdentifier = phoneNumberNormalizer.getNormalizedPhoneNumber(authenticationIdentifier); } - Optional accountByProfileId = accountRepositoryAdditional - .getAccountByLoginOption(AuthenticationProvider.createAuthenticationProviderFromStrings(type.toString(), - authenticationIdentifier)); + Optional accountByProfileId = accountRepositoryAdditional.getAccountByLoginOption( + AuthenticationProvider.createAuthenticationProviderFromStringsWithDefaultSearchableOption( + type.toString(), authenticationIdentifier)); if (!accountByProfileId.isPresent()) { logger.debug("No matching account found for login option {}: {}", type, authenticationIdentifier); return Optional.empty(); @@ -120,15 +120,15 @@ public class AccountProvider { return Optional.of(response); } - public Optional getAccountByLoginOption(AuthenticationType type, String authenticationIdentifier) + public Optional searchAccountByLoginOption(AuthenticationType type, String authenticationIdentifier) throws IncorrectAccountCountException { if (type == AuthenticationType.PHONE) { authenticationIdentifier = phoneNumberNormalizer.getNormalizedPhoneNumber(authenticationIdentifier); } - Optional accountByProfileId = accountRepositoryAdditional - .getAccountByLoginOption(AuthenticationProvider.createAuthenticationProviderFromStrings(type.toString(), - authenticationIdentifier)); + Optional accountByProfileId = accountRepositoryAdditional.searchAccountByLoginOption( + AuthenticationProvider.createAuthenticationProviderFromStringsWithDefaultSearchableOption( + type.toString(), authenticationIdentifier)); if (!accountByProfileId.isPresent()) { return Optional.empty(); } diff --git a/src/test/java/biz/nynja/account/services/AccountServiceTests.java b/src/test/java/biz/nynja/account/services/AccountServiceTests.java index 6644db0..8c06861 100644 --- a/src/test/java/biz/nynja/account/services/AccountServiceTests.java +++ b/src/test/java/biz/nynja/account/services/AccountServiceTests.java @@ -411,8 +411,8 @@ public class AccountServiceTests extends GrpcServerTestBase { final CreatePendingAccountRequest request = CreatePendingAccountRequest.newBuilder() .setAuthenticationType(AuthenticationType.EMAIL).setAuthenticationProvider(Util.EMAIL).build(); given(accountRepositoryAdditional.findSameAuthenticationProviderInPendingAccount( - AuthenticationProvider.createAuthenticationProviderFromStrings(request.getAuthenticationType().name(), - request.getAuthenticationProvider()))) + AuthenticationProvider.createAuthenticationProviderFromStringsWithDefaultSearchableOption( + request.getAuthenticationType().name(), request.getAuthenticationProvider()))) .willReturn(existingPendingAccountByAuthenticationProvider); given(accountRepositoryAdditional.savePendingAccount(Mockito.any(PendingAccount.class))) .willReturn(existingPendingAccount); @@ -1468,7 +1468,7 @@ public class AccountServiceTests extends GrpcServerTestBase { Optional response = Optional.of(savedAccount); - given(accountProvider.getAccountByLoginOption(AuthenticationType.PHONE, request.getPhoneNumber())) + given(accountProvider.searchAccountByLoginOption(AuthenticationType.PHONE, request.getPhoneNumber())) .willReturn(response); final SearchResponse reply = searchServiceBlockingStub.searchByPhoneNumber(request); @@ -1524,7 +1524,7 @@ public class AccountServiceTests extends GrpcServerTestBase { Optional response = Optional.of(savedAccount); - given(accountProvider.getAccountByLoginOption(AuthenticationType.EMAIL, request.getEmail())) + given(accountProvider.searchAccountByLoginOption(AuthenticationType.EMAIL, request.getEmail())) .willReturn(response); final SearchResponse reply = searchServiceBlockingStub.searchByEmail(request); diff --git a/src/test/java/biz/nynja/account/utils/Util.java b/src/test/java/biz/nynja/account/utils/Util.java index 4eb5e2c..7e0bf5b 100644 --- a/src/test/java/biz/nynja/account/utils/Util.java +++ b/src/test/java/biz/nynja/account/utils/Util.java @@ -238,7 +238,8 @@ public class Util { Profile profile = new Profile(); profile.setProfileId(PROFILE_ID); Set authProviders = new HashSet(); - authProviders.add(AuthenticationProvider.createAuthenticationProviderFromStrings(PHONE_TYPE, PHONE_NUMBER)); + authProviders.add(AuthenticationProvider + .createAuthenticationProviderFromStringsWithDefaultSearchableOption(PHONE_TYPE, PHONE_NUMBER)); profile.setAuthenticationProviders(authProviders); return profile; } -- GitLab From 5cf862e313f9e298c92a3fea31155b6b71ca1a3c Mon Sep 17 00:00:00 2001 From: Stanimir Penkov Date: Tue, 18 Dec 2018 15:59:25 +0200 Subject: [PATCH 2/2] NY-5655: Add logging for null values Signed-off-by: Stanimir Penkov --- .../biz/nynja/account/models/AuthenticationProvider.java | 6 ++++++ .../account/models/ProfileByAuthenticationProvider.java | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/src/main/java/biz/nynja/account/models/AuthenticationProvider.java b/src/main/java/biz/nynja/account/models/AuthenticationProvider.java index 7e62eb5..bbf3605 100644 --- a/src/main/java/biz/nynja/account/models/AuthenticationProvider.java +++ b/src/main/java/biz/nynja/account/models/AuthenticationProvider.java @@ -6,6 +6,8 @@ package biz.nynja.account.models; import java.util.Optional; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.data.cassandra.core.mapping.UserDefinedType; import biz.nynja.account.grpc.AuthProviderDetails; @@ -39,6 +41,8 @@ public class AuthenticationProvider { public Boolean getSearchable() { // if current value is null, return the default value: true if (searchable == null) { + logger.warn("The searchable option can not be null for {}:{}. Default option will be used instead.", + getType(), getValue()); return Boolean.TRUE; } return searchable; @@ -47,6 +51,8 @@ public class AuthenticationProvider { public void setSearchable(Boolean searchable) { // if searchable is null, set the default value: true if (searchable == null) { + logger.warn("The searchable option can not be null for {}:{}. Default option will be used instead.", + getType(), getValue()); this.searchable = Boolean.TRUE; } else { this.searchable = searchable; diff --git a/src/main/java/biz/nynja/account/models/ProfileByAuthenticationProvider.java b/src/main/java/biz/nynja/account/models/ProfileByAuthenticationProvider.java index 1c91c78..5961109 100644 --- a/src/main/java/biz/nynja/account/models/ProfileByAuthenticationProvider.java +++ b/src/main/java/biz/nynja/account/models/ProfileByAuthenticationProvider.java @@ -47,12 +47,20 @@ public class ProfileByAuthenticationProvider { } public Boolean getSearchable() { + // if current value is null, return the default value: true + if (searchable == null) { + logger.warn("The searchable option can not be null for {}:{}. Default option will be used instead.", + getAuthenticationProviderType(), getAuthenticationProvider()); + return Boolean.TRUE; + } return searchable; } public void setSearchable(Boolean searchable) { // if searchable is null, set the default value: true if (searchable == null) { + logger.warn("The searchable option can not be null for {}:{}. Default option will be used instead.", + getAuthenticationProviderType(), getAuthenticationProvider()); this.searchable = Boolean.TRUE; } else { this.searchable = searchable; -- GitLab