diff --git a/src/main/java/biz/nynja/account/components/Validator.java b/src/main/java/biz/nynja/account/components/Validator.java index 9f7adf6964c1b422463f62d25b6c13f839375e95..4dedb948271aa495b8fed295a88f1dacb5046c95 100644 --- a/src/main/java/biz/nynja/account/components/Validator.java +++ b/src/main/java/biz/nynja/account/components/Validator.java @@ -71,7 +71,6 @@ public class Validator { } - public boolean isUsernameValid(String username) { logger.debug("Checking username: {}", username); @@ -170,9 +169,10 @@ public class Validator { return null; } - public Optional> validateContactInfo(ContactType type, String contactInfoValue) { + public Optional> validateContactInfo(ContactType type, String contactInfoValue) { if (contactInfoValue == null || contactInfoValue.trim().isEmpty()) { - return Optional.of(new ImmutablePair<>(Cause.MISSING_CONTACT_INFO_IDENTIFIER, "Missing contact info identifier")); + return Optional + .of(new ImmutablePair<>(Cause.MISSING_CONTACT_INFO_IDENTIFIER, "Missing contact info identifier")); } switch (type) { case MISSING_CONTACT_TYPE: @@ -295,7 +295,8 @@ public class Validator { return validateContactInfoRequest(accountId, editedContactInfoDetails); } - public Optional> validateContactInfoRequest(String accountId, ContactDetails contactDetails) { + public Optional> validateContactInfoRequest(String accountId, + ContactDetails contactDetails) { if ((accountId == null) || (accountId.isEmpty())) { return Optional.of(new ImmutablePair<>(Cause.MISSING_ACCOUNT_ID, "Missing account id")); } @@ -304,7 +305,8 @@ public class Validator { } if (contactDetails.getValue() == null || contactDetails.getValue().isEmpty()) { - return Optional.of(new ImmutablePair<>(Cause.MISSING_CONTACT_INFO_IDENTIFIER, "Missing contact info identifier")); + return Optional + .of(new ImmutablePair<>(Cause.MISSING_CONTACT_INFO_IDENTIFIER, "Missing contact info identifier")); } if (!isValidUuid(accountId)) { return Optional.of(new ImmutablePair<>(Cause.INVALID_ACCOUNT_ID, "Invalid account id")); diff --git a/src/main/java/biz/nynja/account/phone/PhoneNumberValidator.java b/src/main/java/biz/nynja/account/phone/PhoneNumberValidator.java index 125928aee3544fa1156f573f2213989f5dd3c46a..61b077679646697223db601a8ab85934e2b6d159 100644 --- a/src/main/java/biz/nynja/account/phone/PhoneNumberValidator.java +++ b/src/main/java/biz/nynja/account/phone/PhoneNumberValidator.java @@ -76,6 +76,8 @@ public class PhoneNumberValidator { public boolean isPhoneNumberValid(String phoneNumber, String countryCode) { + final int NATIONAL_NUMBER_MAX_LENGTH = 15; + logger.debug("Checking phoneNumber: {} for country: {}", phoneNumber, countryCode); CountryInfo countryInfo = countryInfoMap.get(countryCode); if (countryInfo == null) { @@ -94,7 +96,7 @@ public class PhoneNumberValidator { if (countryInfo.getPhoneFormat() != null) { phoneLength = "{" + countryInfo.getPhoneFormat().replaceAll("\\s", "").length() + "}"; } else { - phoneLength = "+"; + phoneLength = "{0," + NATIONAL_NUMBER_MAX_LENGTH + "}"; } final String PHONE_PATTERN = "((?:\\+?([0][0])?" + codePattern + ")?||([0][0]" + codePattern + ")?)(\\d" @@ -110,8 +112,6 @@ public class PhoneNumberValidator { return isValid; } - - /** * * @param rawPhoneNumber diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index 9f6ea47620cb94131a29f348b97fe2aad380f59d..f2edad9b45f167ff58107f5f1bc4d5517fc658f5 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -13,7 +13,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import biz.nynja.account.components.Validator; - import biz.nynja.account.grpc.*; import biz.nynja.account.grpc.ErrorResponse.Cause; import biz.nynja.account.models.Account; @@ -94,19 +93,22 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Getting account by authentication provider: {}", request); if (request.getAuthenticationTypeValue() == 0) { - sendErrorMessageForAccountResponse(responseObserver, Cause.MISSING_AUTH_PROVIDER_TYPE); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), + "Missing authentication provider", "", Cause.MISSING_AUTH_PROVIDER_TYPE); return; } if (request.getAuthenticationIdentifier() == null || request.getAuthenticationIdentifier().isEmpty()) { - sendErrorMessageForAccountResponse(responseObserver, Cause.MISSING_AUTH_PROVIDER_IDENTIFIER); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), + "Missing authentication provider identifier", "", Cause.MISSING_AUTH_PROVIDER_IDENTIFIER); return; } Optional account = accountsProvider.getAccountResponseByAuthenticationProvider( request.getAuthenticationType(), request.getAuthenticationIdentifier()); if (!account.isPresent()) { - sendErrorMessageForAccountResponse(responseObserver, Cause.ACCOUNT_NOT_FOUND); - return; + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), + "Account not found for identifier: {}", request.getAuthenticationIdentifier(), + Cause.ACCOUNT_NOT_FOUND); } else { responseObserver.onNext(account.get()); responseObserver.onCompleted(); @@ -119,11 +121,11 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas public void searchByEmail(GetByEmailRequest request, StreamObserver responseObserver) { logger.info("Search account by e-mail: {}", request.getEmail()); if ((request.getEmail() == null) || request.getEmail().isEmpty()) { - logAndBuildGrpcResponse(responseObserver, new ValidationError("Missing e-mail.", Cause.MISSING_EMAIL)); + logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), "Missing e-mail.", "", Cause.MISSING_EMAIL); return; } if (!validator.isEmailValid(request.getEmail())) { - logAndBuildGrpcResponse(responseObserver, new ValidationError("Invalid e-mail!. Value : " + request.getEmail(), Cause.EMAIL_INVALID)); + logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), "Invalid e-mail!. Value : ", request.getEmail(), Cause.EMAIL_INVALID); return; } @@ -131,8 +133,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas request.getEmail()); if (!account.isPresent()) { - logAndBuildGrpcResponse(responseObserver, new ValidationError("No matching accounts found for e-mail: " + request.getEmail(), - Cause.EMAIL_NOT_FOUND)); + logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), "No matching accounts found for e-mail: ", request.getEmail(), Cause.EMAIL_NOT_FOUND); return; } else { SearchResultDetails searchResultDetails = buildSearchResultDetails(account.get().getAccountId().toString(), @@ -151,12 +152,12 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Search account by phone: {}", request.getPhoneNumber()); if ((request.getPhoneNumber() == null) || request.getPhoneNumber().isEmpty()) { - logAndBuildGrpcResponse(responseObserver, new ValidationError("Missing phone number.", Cause.MISSING_PHONENUMBER)); + logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), "Missing phone number.", "", Cause.MISSING_PHONENUMBER); return; } if (!phoneNumberValidator.isPhoneNumberValid(request.getPhoneNumber())) { - logAndBuildGrpcResponse(responseObserver, new ValidationError("Invalid phone number.", Cause.INVALID_PHONENUMBER)); + logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), "Invalid phone number. Value : ", request.getPhoneNumber(), Cause.INVALID_PHONENUMBER); return; } @@ -164,8 +165,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas request.getPhoneNumber()); if (!account.isPresent()) { - logAndBuildGrpcResponse(responseObserver, new ValidationError( - "No matching accounts found for phone:" + request.getPhoneNumber(), Cause.PHONENUMBER_NOT_FOUND)); + logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), "No matching accounts found for phone: ", request.getPhoneNumber(), Cause.PHONENUMBER_NOT_FOUND); return; } else { SearchResultDetails searchResultDetails = buildSearchResultDetails(account.get().getAccountId().toString(), @@ -184,19 +184,14 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Getting account by username: {}", request.getUsername()); Validation validation = validateGetByUsernameRequest(request); if(validation.hasErrors()) { - logger.debug(validation.getErrorMessage()); - responseObserver.onNext(AccountResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setMessage(validation.getErrorMessage()) - .setCause(validation.getCause().get())).build()); - responseObserver.onCompleted(); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), validation.getErrorMessage(), "", validation.getCause().get()); return; } - Optional accountResonse = - accountsProvider.getAccountResponseByUsername(request.getUsername()); + Optional accountResonse = accountsProvider.getAccountResponseByUsername(request.getUsername()); if (!accountResonse.isPresent()) { - sendErrorMessageForAccountResponse(responseObserver, Cause.ACCOUNT_NOT_FOUND); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Account not found", "", Cause.ACCOUNT_NOT_FOUND); return; } else { responseObserver.onNext(accountResonse.get()); @@ -210,14 +205,13 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Searching account by username: {}", request.getUsername()); Validation validation = validateGetByUsernameRequest(request); if(validation.hasErrors()) { - logAndBuildGrpcResponse(responseObserver, validation); + logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), validation.getErrorMessage(), "", validation.getCause().get()); return; } AccountByUsername account = accountByUsernameRepository.findByUsername(request.getUsername()); if (account == null) { - logAndBuildGrpcResponse(responseObserver, new ValidationError("No matching accounts found for username: "+ - request.getUsername(), Cause.USERNAME_NOT_FOUND)); + logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), "No matching accounts found for username: ", request.getUsername(), Cause.USERNAME_NOT_FOUND); return; } @@ -250,19 +244,14 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas public void getAccountByQrCode(GetByQrCodeRequest request, StreamObserver responseObserver) { logger.info("Search account by QR code: {}", request.getQrCode()); if ((request.getQrCode() == null) || request.getQrCode().isEmpty()) { - logger.debug("Missing QR code."); - responseObserver.onNext(AccountResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setMessage("Missing QR code.") - .setCause(Cause.MISSING_QR_CODE)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Missing QR code.", "", Cause.MISSING_QR_CODE); return; } - Optional accountResonse = - accountsProvider.getAccountResponseByQrCode(request.getQrCode()); + Optional accountResonse = accountsProvider.getAccountResponseByQrCode(request.getQrCode()); if (!accountResonse.isPresent()) { - sendErrorMessageForAccountResponse(responseObserver, Cause.ACCOUNT_NOT_FOUND); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Account not found", "", Cause.ACCOUNT_NOT_FOUND); return; } else { responseObserver.onNext(accountResonse.get()); @@ -276,14 +265,13 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas public void searchByQrCode(GetByQrCodeRequest request, StreamObserver responseObserver) { logger.info("Search account by QR code: {}", request.getQrCode()); if ((request.getQrCode() == null) || request.getQrCode().isEmpty()) { - logAndBuildGrpcResponse(responseObserver, new ValidationError("Missing QR code.", Cause.MISSING_QR_CODE)); + logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), "Missing QR code.", "", Cause.MISSING_QR_CODE); return; } AccountByQrCode account = accountByQrCodeRepository.findByQrCode(request.getQrCode()); if (account == null) { - logAndBuildGrpcResponse(responseObserver, new ValidationError("No matching accounts found for QR code! Value: " + request.getQrCode(), - Cause.QR_CODE_NOT_FOUND)); + logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), "No matching accounts found for QR code! Value: ", request.getQrCode(), Cause.QR_CODE_NOT_FOUND); return; } @@ -305,17 +293,20 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Getting accounts by profile id: {}", request.getProfileId()); if ((request.getProfileId() == null) || (request.getProfileId().isEmpty())) { - sendErrorMessageForAccountsResponse(responseObserver, Cause.MISSING_PROFILE_ID); + logAndBuildGrpcAccountsResponse(responseObserver, AccountsResponse.newBuilder(), "Missing profile id", "", + Cause.MISSING_PROFILE_ID); return; } if (!validator.isValidUuid(request.getProfileId())) { - sendErrorMessageForAccountsResponse(responseObserver, Cause.INVALID_PROFILE_ID); + logAndBuildGrpcAccountsResponse(responseObserver, AccountsResponse.newBuilder(), "Invalid profile id: {}", + request.getProfileId(), Cause.INVALID_PROFILE_ID); return; } Optional accounts = accountsProvider.getAllAccountsByProfileId(request); if (!accounts.isPresent()) { - sendErrorMessageForAccountsResponse(responseObserver, Cause.ACCOUNT_NOT_FOUND); + logAndBuildGrpcAccountsResponse(responseObserver, AccountsResponse.newBuilder(), + "Account not found for profile id: {}", request.getProfileId(), Cause.ACCOUNT_NOT_FOUND); } else { responseObserver.onNext(accounts.get()); responseObserver.onCompleted(); @@ -330,20 +321,22 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Getting accounts by account id: {}", request.getAccountId()); if ((request.getAccountId() == null) || (request.getAccountId().isEmpty())) { - sendErrorMessageForAccountResponse(responseObserver, Cause.MISSING_ACCOUNT_ID); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Missing account id", "", + Cause.MISSING_ACCOUNT_ID); return; } if (!validator.isValidUuid(request.getAccountId())) { - sendErrorMessageForAccountResponse(responseObserver, Cause.INVALID_ACCOUNT_ID); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Invalid account id: {}", + request.getAccountId(), Cause.INVALID_ACCOUNT_ID); return; } Optional account = accountsProvider.getAccountByAccountId(request); if (!account.isPresent()) { - sendErrorMessageForAccountResponse(responseObserver, Cause.ACCOUNT_NOT_FOUND); - return; + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Account id not found: {}", + request.getAccountId(), Cause.ACCOUNT_NOT_FOUND); } else { responseObserver.onNext(account.get()); responseObserver.onCompleted(); @@ -360,9 +353,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Cause cause = validator.validateCreatePendingAccountRequest(request); if (cause != null) { - responseObserver.onNext(CreatePendingAccountResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(cause)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcPendingAccountResponse(responseObserver, CreatePendingAccountResponse.newBuilder(), "Validation failed", "", cause); return; } @@ -393,6 +384,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas PendingAccount updatePendingAccount = pendingAccountRepository.save(updatedPendingAccount); CreatePendingAccountResponse response = CreatePendingAccountResponse.newBuilder() .setPendingAccountDetails(updatePendingAccount.toProto()).build(); + logger.info("Pending account created."); responseObserver.onNext(response); responseObserver.onCompleted(); return; @@ -401,9 +393,8 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (accountRepositoryAdditional.authenticationProviderAlreadyUsedInAccount( AuthenticationProvider.createAuthenticationProviderFromStrings(request.getAuthenticationType().name(), request.getAuthenticationProvider()))) { - responseObserver.onNext(CreatePendingAccountResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.ACCOUNT_ALREADY_CREATED)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcPendingAccountResponse(responseObserver, CreatePendingAccountResponse.newBuilder(), + "Account already created", "", Cause.ACCOUNT_ALREADY_CREATED); return; } @@ -435,17 +426,15 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Cause cause = validator.validateCompletePendingAccountCreationRequest(request); if (cause != null) { - responseObserver - .onNext(AccountResponse.newBuilder().setError(ErrorResponse.newBuilder().setCause(cause)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Validation failed", "", + cause); return; } if (request.getUsername() != null && !request.getUsername().trim().isEmpty() && accountRepositoryAdditional .foundExistingNotOwnUsername(UUID.fromString(request.getAccountId()), request.getUsername())) { - responseObserver.onNext(AccountResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.USERNAME_ALREADY_USED)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), + "User name already in use: {}", request.getUsername(), Cause.USERNAME_ALREADY_USED); return; } @@ -456,9 +445,8 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Account createdAccount = accountRepositoryAdditional.completePendingAccountCreation(request); if (createdAccount == null) { - responseObserver.onNext(AccountResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_CREATING_ACCOUNT)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), + "Error creating account with useraname: {}", request.getUsername(), Cause.ERROR_CREATING_ACCOUNT); return; } else { logger.debug("Account \"{}\" saved into the DB", createdAccount.toString()); @@ -478,26 +466,23 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.debug("Updating profile...: {}", request); if ((request.getProfileId() == null) || (request.getProfileId().isEmpty())) { - responseObserver.onNext(ProfileResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.MISSING_PROFILE_ID)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcProfileResponse(responseObserver, ProfileResponse.newBuilder(), "Missing profile id", "", + Cause.MISSING_PROFILE_ID); return; } Cause cause = validator.validateUpdateProfileRequest(request); if (cause != null) { - responseObserver.onNext(ProfileResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(cause)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcProfileResponse(responseObserver, ProfileResponse.newBuilder(), "Validation failed", "", + cause); return; } Profile updatedProfile = accountRepositoryAdditional.updateProfile(request); if (updatedProfile == null) { - responseObserver.onNext(ProfileResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_UPDATING_PROFILE)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcProfileResponse(responseObserver, ProfileResponse.newBuilder(), "Error updating profile", "", + Cause.ERROR_UPDATING_PROFILE); return; } logger.debug("Profile \"{}\" updated in the DB", updatedProfile.toString()); @@ -515,33 +500,29 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.debug("Updating account...: {}", request); if ((request.getAccountId() == null) || (request.getAccountId().isEmpty())) { - responseObserver.onNext(AccountResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.MISSING_ACCOUNT_ID)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Missing account id", "", + Cause.MISSING_ACCOUNT_ID); return; } - Cause validationCause = validator.validateUpdateAccountRequest(request); - if (validationCause != null) { - responseObserver.onNext(AccountResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(validationCause)).build()); - responseObserver.onCompleted(); + Cause cause = validator.validateUpdateAccountRequest(request); + if (cause != null) { + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Validation failed", "", + cause); return; } if (request.getUsername() != null && !request.getUsername().trim().isEmpty() && accountRepositoryAdditional .foundExistingNotOwnUsername(UUID.fromString(request.getAccountId()), request.getUsername())) { - responseObserver.onNext(AccountResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.USERNAME_ALREADY_USED)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), + "User name already in use: {}", request.getUsername(), Cause.USERNAME_ALREADY_USED); return; } Account updatedAccount = accountRepositoryAdditional.updateAccount(request); if (updatedAccount == null) { - responseObserver.onNext(AccountResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_UPDATING_ACCOUNT)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Error updating account.", + "", Cause.ERROR_UPDATING_ACCOUNT); return; } logger.debug("Account \"{}\" updated in the DB", updatedAccount.toString()); @@ -558,22 +539,21 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.debug("Deleting account...: {}", request); if ((request.getAccountId() == null) || (request.getAccountId().isEmpty())) { - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.MISSING_ACCOUNT_ID)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing account id", "", + Cause.MISSING_ACCOUNT_ID); return; } boolean wasAccountDeleted = accountRepositoryAdditional.deleteAccount(UUID.fromString(request.getAccountId())); if (wasAccountDeleted) { + logger.info("Account successfully deleted: {}", request.getAccountId()); responseObserver.onNext(StatusResponse.newBuilder().setStatus("SUCCESS").build()); responseObserver.onCompleted(); return; } - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_DELETING_ACCOUNT)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Error deleting account with id", + request.getAccountId(), Cause.ERROR_DELETING_ACCOUNT); return; } @@ -581,9 +561,8 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas public void deleteProfile(DeleteProfileRequest request, StreamObserver responseObserver) { logger.debug("Deleting profile: {}", request); if ((request.getProfileId() == null) || (request.getProfileId().isEmpty())) { - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.MISSING_PROFILE_ID)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing profile id", "", + Cause.MISSING_PROFILE_ID); return; } @@ -595,10 +574,8 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas return; } - logger.info("Error deleting profile."); - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.ERROR_DELETING_PROFILE)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Error deleting profile.", "", + Cause.ERROR_DELETING_PROFILE); return; } @@ -607,30 +584,26 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas StreamObserver responseObserver) { logger.info("Adding authentication provider to profile requested."); logger.debug("Adding authentication provider to profile requested: {}", request); - if ((request.getProfileId() == null) || (request.getProfileId().isEmpty())) { - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.MISSING_PROFILE_ID)).build()); - responseObserver.onCompleted(); + if ((request.getProfileId() == null) || (request.getProfileId().isEmpty())) { + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing profile id", "", + Cause.MISSING_PROFILE_ID); return; } if (request.getAuthenticationProvider().getAuthenticationTypeValue() == 0) { - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.MISSING_AUTH_PROVIDER_TYPE)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing auth provider type", + "", Cause.MISSING_AUTH_PROVIDER_TYPE); return; } if (request.getAuthenticationProvider().getAuthenticationProvider() == null || request.getAuthenticationProvider().getAuthenticationProvider().isEmpty()) { - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.MISSING_AUTH_PROVIDER_IDENTIFIER)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), + "Missing auth provider identifier", "", Cause.MISSING_AUTH_PROVIDER_IDENTIFIER); return; } Cause cause = validator.validateAddAuthenticationProviderRequest(request); if (cause != null) { - responseObserver - .onNext(StatusResponse.newBuilder().setError(ErrorResponse.newBuilder().setCause(cause)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Validation failed", "", + cause); return; } @@ -649,10 +622,8 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas // Make sure that the requested profile id for update exists in DB. Profile profile = profileRepository.findByProfileId(UUID.fromString(request.getProfileId())); if (profile == null) { - logger.error("Profile id {} missing in DB.", request.getProfileId()); - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.PROFILE_NOT_FOUND)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), + "Profile id {} misnot found in DB.", request.getProfileId(), Cause.PROFILE_NOT_FOUND); return; } // Make sure that the requested authentication provider is not already used in the system. @@ -661,12 +632,9 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas request.getAuthenticationProvider().getAuthenticationProvider(), request.getAuthenticationProvider().getAuthenticationType().name()); if (profileByAuthProvider != null) { - logger.error("Authentication provider {}:{} already used.", - request.getAuthenticationProvider().getAuthenticationType().name(), - request.getAuthenticationProvider().getAuthenticationProvider()); - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.AUTH_PROVIDER_ALREADY_USED)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), + "Authentication provider: {} already used.", request.getAuthenticationProvider().toString(), + Cause.AUTH_PROVIDER_ALREADY_USED); return; } boolean result = accountRepositoryAdditional.addAuthenticationProvider(UUID.fromString(request.getProfileId()), @@ -679,12 +647,9 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas responseObserver.onCompleted(); return; } - logger.error("Authentication provider {}:{} was not successfuly added for profile id {}.", - request.getAuthenticationProvider().getAuthenticationType().name(), - request.getAuthenticationProvider().getAuthenticationProvider(), request.getProfileId()); - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.INTERNAL_SERVER_ERROR)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), + "Authentication provider was not successfuly added for profile id {}.", request.getProfileId(), + Cause.INTERNAL_SERVER_ERROR); return; } @@ -696,8 +661,8 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Optional> validationResult = validator .validateContactInfoRequest(request.getAccountId(), request.getContactInfo()); if (validationResult.isPresent()) { - prepareErrorStatusResponse(responseObserver, validationResult.get().getKey(), - validationResult.get().getValue()); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), + validationResult.get().getValue(), "", validationResult.get().getKey()); return; } if (request.getContactInfo().getType() == ContactType.PHONE_CONTACT) { @@ -712,9 +677,8 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas responseObserver.onCompleted(); return; } - logger.error("Contact info {}:{} was not added to account {}.", request.getContactInfo().getType().name(), - request.getContactInfo().getValue(), request.getAccountId()); - prepareErrorStatusResponse(responseObserver, Cause.ERROR_ADDING_CONTACT_INFO, "Error adding contact info"); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), + "Contact info was not added to account {}.", request.getAccountId(), Cause.ERROR_ADDING_CONTACT_INFO); return; } @@ -726,8 +690,9 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Optional> validationResult = validator .validateContactInfoRequest(request.getAccountId(), request.getContactInfo()); if (validationResult.isPresent()) { - prepareErrorStatusResponse(responseObserver, validationResult.get().getKey(), - validationResult.get().getValue()); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), + "Validation failed. {}.", validationResult.get().getRight(), + validationResult.get().getLeft()); return; } if (request.getContactInfo().getType() == ContactType.PHONE_CONTACT) { @@ -742,9 +707,9 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas responseObserver.onCompleted(); return; } - logger.error("Contact info {}:{} was not removed from account {}.", request.getContactInfo().getType().name(), - request.getContactInfo().getValue(), request.getAccountId()); - prepareErrorStatusResponse(responseObserver, Cause.ERROR_REMOVING_CONTACT_INFO, "Error removing contact info"); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), + "Contact info was not removed from account {}.", request.getAccountId(), + Cause.ERROR_REMOVING_CONTACT_INFO); return; } @@ -754,40 +719,34 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Deleting Authentication Provider from profile: {}", request); if ((request.getProfileId() == null) || (request.getProfileId().isEmpty())) { - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.MISSING_PROFILE_ID)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing profile id.", "", + Cause.MISSING_PROFILE_ID); return; } if (request.getAuthenticationProvider().getAuthenticationTypeValue() == 0) { - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.MISSING_AUTH_PROVIDER_TYPE)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing auth provider type.", + "", Cause.MISSING_AUTH_PROVIDER_TYPE); return; } if (request.getAuthenticationProvider().getAuthenticationProvider() == null || request.getAuthenticationProvider().getAuthenticationProvider().isEmpty()) { - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.MISSING_AUTH_PROVIDER_IDENTIFIER)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing auth provider id.", + "", Cause.MISSING_AUTH_PROVIDER_IDENTIFIER); return; } Cause cause = validator.validateDeleteAuthenticationProviderRequest(request); if (cause != null) { - responseObserver - .onNext(StatusResponse.newBuilder().setError(ErrorResponse.newBuilder().setCause(cause)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Validation failed", "", + cause); return; } // Make sure that the requested profile id for update exists in DB. Profile profile = profileRepository.findByProfileId(UUID.fromString(request.getProfileId())); if (profile == null) { - logger.error("Profile id {} missing in DB.", request.getProfileId()); - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(Cause.PROFILE_NOT_FOUND)).build()); - responseObserver.onCompleted(); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Profile id {} missing in DB.", + request.getProfileId(), Cause.PROFILE_NOT_FOUND); return; } @@ -834,17 +793,16 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas .validateEditContactInfoRequest(request.getAccountId(), request.getOldContactInfo(), request.getEditedContactInfo()); if (validationResultEditContactInfo.isPresent()) { - prepareErrorStatusResponse(responseObserver, validationResultEditContactInfo.get().getKey(), - validationResultEditContactInfo.get().getValue()); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), + validationResultEditContactInfo.get().getValue(), "", + validationResultEditContactInfo.get().getKey()); return; } if (!request.getOldContactInfo().getType().equals(request.getEditedContactInfo().getType())) { - logger.error("Error editing Contact info for account {}. Different types: {} and {}.", - request.getAccountId(), request.getOldContactInfo().getType().name(), - request.getEditedContactInfo().getType().name()); - prepareErrorStatusResponse(responseObserver, Cause.ERROR_EDITING_CONTACT_INFO, - "Error editing contact info"); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), + "Error editing Contact info for account {}. Different types: {} and {}.", request.getAccountId(), + Cause.ERROR_EDITING_CONTACT_INFO); return; } @@ -863,26 +821,12 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas responseObserver.onCompleted(); return; } - logger.error("Contact info {}:{} was not edited for account {}.", request.getOldContactInfo().getType().name(), - request.getOldContactInfo().getValue(), request.getAccountId()); - prepareErrorStatusResponse(responseObserver, Cause.ERROR_EDITING_CONTACT_INFO, "Error editing contact info"); + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), + "Contact info was not edited for account {}.", request.getAccountId(), + Cause.ERROR_EDITING_CONTACT_INFO); return; } - private static void logAndBuildGrpcResponse(StreamObserver responseObserver, Validation validation) { - logger.debug(validation.getErrorMessage()); - responseObserver - .onNext(SearchResponse.newBuilder().setError(ErrorResponse.newBuilder().setCause(validation.getCause().get())).build()); - responseObserver.onCompleted(); - } - - private static void logAndBuildGrpcResponse(StreamObserver responseObserver, ValidationError error) { - logger.debug(error.getMessage()); - responseObserver - .onNext(SearchResponse.newBuilder().setError(ErrorResponse.newBuilder().setCause(error.getCause())).build()); - responseObserver.onCompleted(); - } - private SearchResultDetails buildSearchResultDetails(String id, ByteBuffer avatar, String firstName, String lastName) { SearchResultDetails.Builder searchResultDetails = SearchResultDetails.newBuilder(); @@ -893,23 +837,48 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas return searchResultDetails.build(); } + + private static void logAndBuildGrpcSearchResponse(StreamObserver responseObserver, + SearchResponse.Builder newBuilder, String logMessage, String logValue, Cause cause) { - private void sendErrorMessageForAccountsResponse(StreamObserver responseObserver, Cause cause) { - responseObserver.onNext(AccountsResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(cause)).build()); + logger.debug(logMessage, logValue); + responseObserver.onNext(newBuilder.setError(ErrorResponse.newBuilder().setCause(cause)).build()); responseObserver.onCompleted(); } - private void sendErrorMessageForAccountResponse(StreamObserver responseObserver, Cause cause) { - responseObserver.onNext(AccountResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(cause)).build()); + private static void logAndBuildGrpcAccountResponse(StreamObserver responseObserver, + AccountResponse.Builder newBuilder, String logMessage, String logValue, Cause cause) { + + logger.error(logMessage, logValue); + responseObserver.onNext(newBuilder.setError(ErrorResponse.newBuilder().setCause(cause)).build()); responseObserver.onCompleted(); } - public void prepareErrorStatusResponse(StreamObserver responseObserver, Cause error, - String message) { - responseObserver.onNext(StatusResponse.newBuilder() - .setError(ErrorResponse.newBuilder().setCause(error).setMessage(message)).build()); + private static void logAndBuildGrpcAccountsResponse(StreamObserver responseObserver, + AccountsResponse.Builder newBuilder, String logMessage, String logValue, Cause cause) { + logger.error(logMessage, logValue); + responseObserver.onNext(newBuilder.setError(ErrorResponse.newBuilder().setCause(cause)).build()); + responseObserver.onCompleted(); + } + + private static void logAndBuildGrpcPendingAccountResponse(StreamObserver responseObserver, + CreatePendingAccountResponse.Builder newBuilder, String logMessage, String logValue, Cause cause) { + logger.error(logMessage, logValue); + responseObserver.onNext(newBuilder.setError(ErrorResponse.newBuilder().setCause(cause)).build()); + responseObserver.onCompleted(); + } + + private static void logAndBuildGrpcProfileResponse(StreamObserver responseObserver, + ProfileResponse.Builder newBuilder, String logMessage, String logValue, Cause cause) { + logger.error(logMessage, logValue); + responseObserver.onNext(newBuilder.setError(ErrorResponse.newBuilder().setCause(cause)).build()); + responseObserver.onCompleted(); + } + + private static void logAndBuildGrpcStatusResponse(StreamObserver responseObserver, + StatusResponse.Builder newBuilder, String logMessage, String logValue, Cause cause) { + logger.error(logMessage, logValue); + responseObserver.onNext(newBuilder.setError(ErrorResponse.newBuilder().setCause(cause)).build()); responseObserver.onCompleted(); }