diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index acbb79359197fbb180781427d7e0f43630c7a2b3..191f704fce6d75cd48cf37973a2a409169290b1e 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -89,6 +89,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas private static final Logger logger = LoggerFactory.getLogger(AccountServiceImpl.class); private static final byte MIN_NUMBER_OF_AUTH_PROVIDERS_IN_PROFILE = 1; + private static final String EMPTY_ERROR_MESSAGE = ""; private final AccountRepositoryAdditional accountRepositoryAdditional; private final ProfileRepository profileRepository; @@ -136,12 +137,13 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Getting account by authentication provider: {}", request); if (request.getAuthenticationTypeValue() == 0) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), - "Missing authentication provider", "", Cause.MISSING_AUTH_PROVIDER_TYPE); + "Missing authentication provider", "", Cause.MISSING_AUTH_PROVIDER_TYPE, EMPTY_ERROR_MESSAGE); return; } if (request.getAuthenticationIdentifier() == null || request.getAuthenticationIdentifier().isEmpty()) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), - "Missing authentication provider identifier", "", Cause.MISSING_AUTH_PROVIDER_ID); + "Missing authentication provider identifier", "", Cause.MISSING_AUTH_PROVIDER_ID, + EMPTY_ERROR_MESSAGE); return; } Optional accountResponse = accountProvider.getAccountResponseByAuthenticationProvider( @@ -150,12 +152,13 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (!accountResponse.isPresent()) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Account not found for identifier: {}", request.getAuthenticationIdentifier(), - Cause.ACCOUNT_NOT_FOUND); + Cause.ACCOUNT_NOT_FOUND, "Account not found"); return; } if (!permissionsValidator.isRpcAllowed(accountResponse.get().getAccountDetails().getAccountId())) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), - "Account info can not be obtained for this account.", "", Cause.ERROR_PERMISSION_DENIED); + "Account info can not be obtained for this account.", "", Cause.ERROR_PERMISSION_DENIED, + "Permission denied"); return; } AccountResponse response = accountResponse.get(); @@ -184,7 +187,8 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas account = accountProvider.searchAccountByLoginOption(AuthenticationType.EMAIL, request.getEmail()); } catch (IncorrectAccountCountException e) { logAndBuildGrpcSearchResponse(responseObserver, SearchResponse.newBuilder(), - "Error while searching for e-mail. {}.", e.getMessage(), Cause.INTERNAL_SERVER_ERROR, "Error while searching for e-mail."); + "Error while searching for e-mail. {}.", e.getMessage(), Cause.INTERNAL_SERVER_ERROR, + "Error while searching for e-mail."); return; } @@ -252,7 +256,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Validation validation = validateGetByUsernameRequest(request); if (validation.hasErrors()) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), validation.getErrorMessage(), - "", validation.getCause().get()); + "", validation.getCause().get(), validation.getErrorMessage()); return; } @@ -260,18 +264,20 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (!accountResponse.isPresent()) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Account not found", "", - Cause.ACCOUNT_NOT_FOUND); + Cause.ACCOUNT_NOT_FOUND, "Account not found"); return; } if (!permissionsValidator.isRpcAllowed(accountResponse.get().getAccountDetails().getAccountId())) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), - "Account info can not be obtained for this account.", "", Cause.ERROR_PERMISSION_DENIED); + "Account info can not be obtained for this account.", "", Cause.ERROR_PERMISSION_DENIED, + "Permission denied"); return; } AccountResponse response = accountResponse.get(); - logger.info("SUCCESS: Found result for account by username {}. Account Id = {}.", request.getUsername(), response.getAccountDetails().getAccountId()); + logger.info("SUCCESS: Found result for account by username {}. Account Id = {}.", request.getUsername(), + response.getAccountDetails().getAccountId()); responseObserver.onNext(response); responseObserver.onCompleted(); } @@ -336,24 +342,26 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if ((request.getQrCode() == null) || request.getQrCode().isEmpty()) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Missing QR code.", "", - Cause.MISSING_QR_CODE); + Cause.MISSING_QR_CODE, "Missing QR code"); return; } Optional accountResponse = accountProvider.getAccountResponseByQrCode(request.getQrCode()); if (!accountResponse.isPresent()) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Account not found", "", - Cause.ACCOUNT_NOT_FOUND); + Cause.ACCOUNT_NOT_FOUND, "Account not found"); return; } if (!permissionsValidator.isRpcAllowed(accountResponse.get().getAccountDetails().getAccountId())) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), - "Account info can not be obtained for this account.", "", Cause.ERROR_PERMISSION_DENIED); + "Account info can not be obtained for this account.", "", Cause.ERROR_PERMISSION_DENIED, + "Permission denied"); return; } AccountResponse response = accountResponse.get(); - logger.info("SUCCESS: Found result for account by QR code {}. Account Id={}.", request.getQrCode(), response.getAccountDetails().getAccountId()); + logger.info("SUCCESS: Found result for account by QR code {}. Account Id={}.", request.getQrCode(), + response.getAccountDetails().getAccountId()); responseObserver.onNext(response); responseObserver.onCompleted(); } @@ -424,26 +432,26 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Getting account by account id: {}", request.getAccountId()); if ((request.getAccountId() == null) || (request.getAccountId().isEmpty())) { - logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Missing account id", "", - Cause.MISSING_ACCOUNT_ID); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Missing account ID", "", + Cause.MISSING_ACCOUNT_ID, "Missing account ID"); return; } if (!util.isValidUuid(request.getAccountId())) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Invalid account id: {}", - request.getAccountId(), Cause.INVALID_ACCOUNT_ID); + request.getAccountId(), Cause.INVALID_ACCOUNT_ID, "Invalid Account ID"); return; } if (!permissionsValidator.isRpcAllowed(request.getAccountId())) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Account info can not be obtained for account {}.", request.getAccountId(), - Cause.ERROR_PERMISSION_DENIED); + Cause.ERROR_PERMISSION_DENIED, "Permission denied"); return; } Optional account = accountProvider.getAccountByAccountId(request); if (!account.isPresent()) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Account id not found: {}", - request.getAccountId(), Cause.ACCOUNT_NOT_FOUND); + request.getAccountId(), Cause.ACCOUNT_NOT_FOUND, "Account not found"); return; } AccountResponse response = account.get(); @@ -465,13 +473,14 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Optional cause = pendingAccount.validateCreatePendingAccountRequest(request); if (cause.isPresent()) { - response = CreatePendingAccountResponse.newBuilder().setError(ErrorResponse.newBuilder().setCause(cause.get())) - .build(); + response = CreatePendingAccountResponse.newBuilder() + .setError(ErrorResponse.newBuilder().setCause(cause.get())).build(); } else { response = accountCreator.retrieveCreatePendingAccountResponse(request); } - logger.info("SUCCESS: Created pending account for provider {} and accoutn Id {}.", request.getAuthenticationProvider(), response.getPendingAccountDetails().getAccountId()); + logger.info("SUCCESS: Created pending account for provider {} and accoutn Id {}.", + request.getAuthenticationProvider(), response.getPendingAccountDetails().getAccountId()); responseObserver.onNext(response); responseObserver.onCompleted(); } @@ -501,39 +510,41 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.debug("Updating account...: {}", request); if ((request.getAccountId() == null) || (request.getAccountId().isEmpty())) { - logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Missing account id", "", - Cause.MISSING_ACCOUNT_ID); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Missing account ID", "", + Cause.MISSING_ACCOUNT_ID, "Missing account ID"); return; } if (!util.isValidUuid(request.getAccountId())) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Invalid account id: {}", - request.getAccountId(), Cause.INVALID_ACCOUNT_ID); + request.getAccountId(), Cause.INVALID_ACCOUNT_ID, "Invalid Account ID"); return; } if (!permissionsValidator.isRpcAllowed(request.getAccountId())) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Can not update account {}.", - request.getAccountId(), Cause.ERROR_PERMISSION_DENIED); + request.getAccountId(), Cause.ERROR_PERMISSION_DENIED, "Permission denied"); return; } - Optional cause = account.validateUpdateAccountRequest(request); - if (cause.isPresent()) { - logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Validation failed", "", - cause.get()); + Validation validation = account.validateUpdateAccountRequest(request); + if (validation.hasErrors()) { + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), + "Validation failed: " + validation.getErrorMessage(), "", validation.getFirstCause().get(), + validation.getFirstMessage().get()); return; } if (request.getUsername() != null && !request.getUsername().trim().isEmpty() && accountRepositoryAdditional .foundExistingNotOwnUsername(UUID.fromString(request.getAccountId()), request.getUsername())) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), - "User name already in use: {}", request.getUsername(), Cause.USERNAME_ALREADY_USED); + "User name already in use: {}", request.getUsername(), Cause.USERNAME_ALREADY_USED, + "Username is already used"); return; } Account updatedAccount = accountRepositoryAdditional.updateAccount(request); if (updatedAccount == null) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), "Error updating account.", - "", Cause.ERROR_UPDATING_ACCOUNT); + "", Cause.ERROR_UPDATING_ACCOUNT, "Failed to update account"); return; } logger.info("SUCCESS: Account \"{}\" updated in the DB", updatedAccount.getAccountId()); @@ -551,25 +562,26 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if ((request.getAccountId() == null) || (request.getAccountId().isEmpty())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing account id", "", - Cause.MISSING_ACCOUNT_ID); + Cause.MISSING_ACCOUNT_ID, "Missing account ID"); return; } if (!util.isValidUuid(request.getAccountId())) { logger.info("Can not delete account. Invalid account id: {}", request.getAccountId()); logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Invalid account id: {}", - request.getAccountId(), Cause.INVALID_ACCOUNT_ID); + request.getAccountId(), Cause.INVALID_ACCOUNT_ID, "Invalid Account ID"); return; } if (!permissionsValidator.isRpcAllowed(request.getAccountId())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Can not delete account {}.", - request.getAccountId(), Cause.ERROR_PERMISSION_DENIED); + request.getAccountId(), Cause.ERROR_PERMISSION_DENIED, "Permission denied"); return; } boolean wasAccountDeleted = accountRepositoryAdditional.deleteAccount(UUID.fromString(request.getAccountId())); if (!wasAccountDeleted) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), - "Error deleting account with id", request.getAccountId(), Cause.ERROR_DELETING_ACCOUNT); + "Error deleting account with id", request.getAccountId(), Cause.ERROR_DELETING_ACCOUNT, + "Failed to delete account"); return; } logger.info("SUCCESS: Account successfully deleted: {}", request.getAccountId()); @@ -585,12 +597,12 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.debug("Deleting profile: {}", request); if ((request.getProfileId() == null) || (request.getProfileId().isEmpty())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing profile id", "", - Cause.MISSING_PROFILE_ID); + Cause.MISSING_PROFILE_ID, "Missing profile id"); return; } if (!util.isValidUuid(request.getProfileId())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Invalid profile id: {}", - request.getProfileId(), Cause.INVALID_PROFILE_ID); + request.getProfileId(), Cause.INVALID_PROFILE_ID, "Invalid profile id"); return; } @@ -599,7 +611,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (wasProfileDeleted.isPresent()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Error deleting profile.", "", - wasProfileDeleted.get()); + wasProfileDeleted.get(), "Failed to delete profile"); return; } logger.info("SUCCESS: Profile with Id {} was deleted successfully.", request.getProfileId()); @@ -623,12 +635,12 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if ((request.getProfileId() == null) || (request.getProfileId().isEmpty())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing profile id", "", - Cause.MISSING_PROFILE_ID); + Cause.MISSING_PROFILE_ID, "Missing profile id"); return; } if (!util.isValidUuid(request.getProfileId())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Invalid profile id: {}", - request.getProfileId(), Cause.INVALID_PROFILE_ID); + request.getProfileId(), Cause.INVALID_PROFILE_ID, "Invalid profile id"); return; } @@ -638,14 +650,14 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (!permissionsValidator.isRpcAllowed(existingAccountsForProfile)) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Can not add authentication provider to profile {}.", request.getProfileId(), - Cause.ERROR_PERMISSION_DENIED); + Cause.ERROR_PERMISSION_DENIED, "Permission denied"); return; } - Optional cause = authenticationProvider.validateAddAuthenticationProviderRequest(request); - if (cause.isPresent()) { + Validation validation = authenticationProvider.validateAddAuthenticationProviderRequest(request); + if (validation.hasErrors()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Validation failed", "", - cause.get()); + validation.getFirstCause().get(), validation.getFirstMessage().get()); return; } @@ -665,7 +677,8 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Profile profile = profileRepository.findByProfileId(UUID.fromString(request.getProfileId())); if (profile == null) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), - "Profile id {} not found in DB.", request.getProfileId(), Cause.PROFILE_NOT_FOUND); + "Profile id {} not found in DB.", request.getProfileId(), Cause.PROFILE_NOT_FOUND, + "Profile not found"); return; } @@ -674,7 +687,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas .getMaxAuthenticationprovidersPerProfile()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Max number of authentication providers reached for profile id {}.", request.getProfileId(), - Cause.MAX_PROVIDERS_PER_PROFILE_REACHED); + Cause.MAX_PROVIDERS_PER_PROFILE_REACHED, "You have reached the max number of login options"); return; } @@ -686,7 +699,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (profileByAuthProvider != null) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Authentication provider: {} already used.", request.getAuthenticationProvider().toString(), - Cause.AUTH_PROVIDER_ALREADY_USED); + Cause.AUTH_PROVIDER_ALREADY_USED, "Login option is already used"); return; } @@ -695,7 +708,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (!result) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Authentication provider was not successfuly added for profile id {}.", request.getProfileId(), - Cause.INTERNAL_SERVER_ERROR); + Cause.INTERNAL_SERVER_ERROR, "Failed to add login option to profile"); return; } @@ -715,22 +728,25 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Adding contact info to account requested."); logger.debug("Adding contact info to account requested: {}", request); + // TODO use Validation object Optional> validationResult = account .validateContactInfoRequest(request.getAccountId(), request.getContactInfo()); if (validationResult.isPresent()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), - validationResult.get().getValue(), "", validationResult.get().getKey()); + validationResult.get().getValue(), "", validationResult.get().getKey(), + validationResult.get().getValue()); return; } if (!util.isValidUuid(request.getAccountId())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Invalid account id: {}", - request.getAccountId(), Cause.INVALID_ACCOUNT_ID); + request.getAccountId(), Cause.INVALID_ACCOUNT_ID, "Invalid Account ID"); return; } if (!permissionsValidator.isRpcAllowed(request.getAccountId())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), - "Can not add contact info to account {}.", request.getAccountId(), Cause.ERROR_PERMISSION_DENIED); + "Can not add contact info to account {}.", request.getAccountId(), Cause.ERROR_PERMISSION_DENIED, + "Permission denied"); return; } @@ -738,7 +754,8 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Validation validation = account.validateContactInfoPhoneLabel(request.getContactInfo().getLabel()); if (validation.hasErrors()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), - validation.getErrorMessage(), "", validation.getCause().get()); + "Validation failed: " + validation.getErrorMessage(), "", validation.getFirstCause().get(), + validation.getFirstMessage().get()); return; } request = phoneNumberNormalizer.normalizePhoneNumber(request); @@ -749,13 +766,13 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (!result.isPresent()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Reached max count of contact info for type {}.", request.getContactInfo().getType().name(), - Cause.MAX_CONTACT_INFO_OF_TYPE_REACHED); + Cause.MAX_CONTACT_INFO_OF_TYPE_REACHED, "You have reached the max number of records for this type"); return; } if (!result.get().booleanValue()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Contact info was not added to account {}.", request.getAccountId(), - Cause.ERROR_ADDING_CONTACT_INFO); + Cause.ERROR_ADDING_CONTACT_INFO, "Failed to add contact info"); return; } logger.info("SUCCESS: Contact info {}:{} was added to account {}.", request.getContactInfo().getType().name(), @@ -777,19 +794,20 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas .validateContactInfoRequest(request.getAccountId(), request.getContactInfo()); if (validationResult.isPresent()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Validation failed. {}.", - validationResult.get().getRight(), validationResult.get().getLeft()); + validationResult.get().getRight(), validationResult.get().getLeft(), + validationResult.get().getRight()); return; } if (!util.isValidUuid(request.getAccountId())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Invalid account id: {}", - request.getAccountId(), Cause.INVALID_ACCOUNT_ID); + request.getAccountId(), Cause.INVALID_ACCOUNT_ID, "Invalid Account ID"); return; } if (!permissionsValidator.isRpcAllowed(request.getAccountId())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Can not remove contact info from account {}.", request.getAccountId(), - Cause.ERROR_PERMISSION_DENIED); + Cause.ERROR_PERMISSION_DENIED, "Permission denied"); return; } @@ -802,7 +820,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (!result) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Contact info was not removed from account {}.", request.getAccountId(), - Cause.ERROR_DELETING_CONTACT_INFO); + Cause.ERROR_DELETING_CONTACT_INFO, "Failed to delete conact info"); return; } logger.info("SUCCESS: Contact info {}:{} was removed from account {}.", @@ -821,31 +839,31 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if ((request.getProfileId() == null) || (request.getProfileId().isEmpty())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing profile id.", "", - Cause.MISSING_PROFILE_ID); + Cause.MISSING_PROFILE_ID, "Missing profile id"); return; } if (!util.isValidUuid(request.getProfileId())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Invalid profile id: {}", - request.getProfileId(), Cause.INVALID_PROFILE_ID); + request.getProfileId(), Cause.INVALID_PROFILE_ID, "Invalid profile id"); return; } if (request.getAuthenticationProvider().getAuthenticationTypeValue() == 0) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing auth provider type.", - "", Cause.MISSING_AUTH_PROVIDER_TYPE); + "", Cause.MISSING_AUTH_PROVIDER_TYPE, "Missing login option type"); return; } if (request.getAuthenticationProvider().getAuthenticationProvider() == null || request.getAuthenticationProvider().getAuthenticationProvider().isEmpty()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing auth provider id.", - "", Cause.MISSING_AUTH_PROVIDER_ID); + "", Cause.MISSING_AUTH_PROVIDER_ID, "Missing login option value (id)"); return; } - Optional cause = authenticationProvider.validateDeleteAuthenticationProviderRequest(request); - if (cause.isPresent()) { + Validation validation = authenticationProvider.validateDeleteAuthenticationProviderRequest(request); + if (validation.hasErrors()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Validation failed", "", - cause.get()); + validation.getFirstCause().get(), validation.getFirstMessage().get()); return; } @@ -855,7 +873,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (!permissionsValidator.isRpcAllowed(existingAccountsForProfile)) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Can not delete authentication provider from profile {}.", request.getProfileId(), - Cause.ERROR_PERMISSION_DENIED); + Cause.ERROR_PERMISSION_DENIED, "Permission denied"); return; } @@ -863,7 +881,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Profile profile = profileRepository.findByProfileId(UUID.fromString(request.getProfileId())); if (profile == null) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Profile id {} missing in DB.", - request.getProfileId(), Cause.PROFILE_NOT_FOUND); + request.getProfileId(), Cause.PROFILE_NOT_FOUND, "Profile not found"); return; } @@ -881,7 +899,8 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (!existingAuthProviderToDelete.isPresent()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Authentication provider {} is not used by this profile.", - authenticationProviderToDelete.toString(), Cause.AUTH_PROVIDER_NOT_FOUND); + authenticationProviderToDelete.toString(), Cause.AUTH_PROVIDER_NOT_FOUND, + "Login option to delete not found"); return; } @@ -889,7 +908,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (!removedFromObject) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Error removing authentication provider {}.", existingAuthProviderToDelete.get().toString(), - Cause.INTERNAL_SERVER_ERROR); + Cause.INTERNAL_SERVER_ERROR, "Error when removing login option"); return; } @@ -973,30 +992,33 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Editing contact info for account requested."); logger.debug("Editing contact info for account requested: {}", request); + // TODO use Validation object Optional> validationResultEditContactInfo = account.validateEditContactInfoRequest( request.getAccountId(), request.getOldContactInfo(), request.getEditedContactInfo()); if (validationResultEditContactInfo.isPresent()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), validationResultEditContactInfo.get().getValue(), "", - validationResultEditContactInfo.get().getKey()); + validationResultEditContactInfo.get().getKey(), validationResultEditContactInfo.get().getValue()); return; } if (!util.isValidUuid(request.getAccountId())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Invalid account id: {}", - request.getAccountId(), Cause.INVALID_ACCOUNT_ID); + request.getAccountId(), Cause.INVALID_ACCOUNT_ID, "Invalid Account ID"); return; } if (!permissionsValidator.isRpcAllowed(request.getAccountId())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), - "Can not edit contact info for account {}.", request.getAccountId(), Cause.ERROR_PERMISSION_DENIED); + "Can not edit contact info for account {}.", request.getAccountId(), Cause.ERROR_PERMISSION_DENIED, + "Permission denied"); return; } if (!request.getOldContactInfo().getType().equals(request.getEditedContactInfo().getType())) { + // TODO we must extend log method to support multiple parameters logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Error editing Contact info for account {}. Different types: {} and {}.", request.getAccountId(), - Cause.ERROR_EDITING_CONTACT_INFO); + Cause.ERROR_EDITING_CONTACT_INFO, "Failed to update contact info - wrong type."); return; } if (request.getOldContactInfo().getType() == ContactType.PHONE_CONTACT) { @@ -1004,7 +1026,8 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas request.getEditedContactInfo().getLabel()); if (validation.hasErrors()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), - validation.getErrorMessage(), "", validation.getCause().get()); + validation.getErrorMessage(), "", validation.getFirstCause().get(), + validation.getFirstMessage().get()); return; } request = phoneNumberNormalizer.normalizePhoneNumbers(request); @@ -1016,7 +1039,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (!result) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Contact info was not edited for account {}.", request.getAccountId(), - Cause.ERROR_EDITING_CONTACT_INFO); + Cause.ERROR_EDITING_CONTACT_INFO, "Failed to update contact info."); return; } logger.info("SUCCESS: Edited Contact Info {}:{} to {}:{} for account {}.", @@ -1049,18 +1072,20 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.info("Updating auth provider for profile {} requested.", request.getProfileId()); logger.debug("Updating auth provider for profile requested: {}", request); + // Use validation object Optional> validationResultUpdateAuthProvider = authenticationProvider .validateUpdateAuthProviderRequest(request.getProfileId(), request.getOldAuthProvider(), request.getUpdatedAuthProvider()); if (validationResultUpdateAuthProvider.isPresent()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Auth provider was not updated: {}.", validationResultUpdateAuthProvider.get().getValue(), - validationResultUpdateAuthProvider.get().getKey()); + validationResultUpdateAuthProvider.get().getKey(), + validationResultUpdateAuthProvider.get().getValue()); return; } if (!util.isValidUuid(request.getProfileId())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Invalid profile id: {}.", - request.getProfileId(), validationResultUpdateAuthProvider.get().getKey()); + request.getProfileId(), validationResultUpdateAuthProvider.get().getKey(), "Invalid profile id."); return; } @@ -1070,21 +1095,22 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (!permissionsValidator.isRpcAllowed(existingAccountsForProfile)) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Can not update authentication provider in profile {}.", request.getProfileId(), - Cause.ERROR_PERMISSION_DENIED); + Cause.ERROR_PERMISSION_DENIED, "Permission denied"); return; } if (!authenticationProvider .canUseAsAdditionalLoginOption(request.getUpdatedAuthProvider().getAuthenticationType())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), - "Invalid additional login option type used.", "", Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE); + "Invalid additional login option type used.", "", Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE, + "Invalid additional login option type used."); return; } if (request.getOldAuthProvider().equals(request.getUpdatedAuthProvider())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "The same old and new auth providers requested to update for profile {}.", request.getProfileId(), - Cause.ERROR_UPDATING_AUTH_PROVIDER); + Cause.ERROR_UPDATING_AUTH_PROVIDER, "Failed to update login option."); return; } if (request.getOldAuthProvider().getAuthenticationTypeValue() == AuthenticationType.PHONE_VALUE @@ -1102,7 +1128,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas request.getOldAuthProvider().getAuthenticationProvider(), request.getProfileId()); logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Auth provider was not updated for profile {}.", request.getProfileId(), - Cause.ERROR_UPDATING_AUTH_PROVIDER); + Cause.ERROR_UPDATING_AUTH_PROVIDER, ""); return; } logger.info("SUCCESS: Updated auth provider {}:{} to {}:{} for profile {}.", @@ -1126,7 +1152,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Validation validation = validateGetAccountByLoginOptionRequest(request); if (validation.hasErrors()) { logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), validation.getErrorMessage(), - "", validation.getCause().get()); + "", validation.getCause().get(), validation.getErrorMessage()); return; } @@ -1134,13 +1160,14 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas Optional account = accountProvider.getAccountResponseByLoginOption( request.getAuthenticationType(), request.getAuthenticationIdentifier()); if (!account.isPresent()) { - logAndBuildGrpcAccountResponse( - responseObserver, AccountResponse.newBuilder(), "Account not found for login option: " - + request.getAuthenticationIdentifier() + ":" + request.getAuthenticationIdentifier(), - "", Cause.ACCOUNT_NOT_FOUND); + logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), + "Account not found for login option: " + request.getAuthenticationIdentifier() + ":" + + request.getAuthenticationIdentifier(), + "", Cause.ACCOUNT_NOT_FOUND, "Account not found"); } else { AccountResponse response = account.get(); - logger.info("SUCCESS: Found account by login option {}. Account Id={}.", request.getAuthenticationIdentifier(), response.getAccountDetails().getAccountId()); + logger.info("SUCCESS: Found account by login option {}. Account Id={}.", + request.getAuthenticationIdentifier(), response.getAccountDetails().getAccountId()); responseObserver.onNext(response); responseObserver.onCompleted(); } @@ -1150,7 +1177,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas logger.debug("Error getting account by login option {}:{}: {}", request.getAuthenticationType(), request.getAuthenticationIdentifier(), e.getCause()); logAndBuildGrpcAccountResponse(responseObserver, AccountResponse.newBuilder(), - Cause.INTERNAL_SERVER_ERROR.toString(), "", Cause.INTERNAL_SERVER_ERROR); + Cause.INTERNAL_SERVER_ERROR.toString(), "", Cause.INTERNAL_SERVER_ERROR, "Internal server error"); } } @@ -1195,8 +1222,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas account.get().getAvatar(), account.get().getFirstName(), account.get().getLastName()); SearchResponse response = SearchResponse.newBuilder().setSearchResultDetails(searchResultDetails).build(); - logger.info("SUCCESS: Found result for account by social provider {}.", - request.getAuthenticationIdentifier()); + logger.info("SUCCESS: Found result for account by social provider {}.", request.getAuthenticationIdentifier()); responseObserver.onNext(response); responseObserver.onCompleted(); } @@ -1214,12 +1240,12 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas request.getAuthenticationType(), request.getAuthenticationIdentifier()); if (validation.hasErrors()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), validation.getErrorMessage(), - "", validation.getCause().get()); + "", validation.getFirstCause().get(), validation.getFirstMessage().get()); return; } if (!util.isValidUuid(request.getProfileId())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Invalid profile id: {}", - request.getProfileId(), Cause.INVALID_PROFILE_ID); + request.getProfileId(), Cause.INVALID_PROFILE_ID, "Invalid profile id"); return; } @@ -1229,7 +1255,7 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (!permissionsValidator.isRpcAllowed(existingAccountsForProfile)) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Can not update searchable option for authentication provider in profile {}.", - request.getProfileId(), Cause.ERROR_PERMISSION_DENIED); + request.getProfileId(), Cause.ERROR_PERMISSION_DENIED, "Permission denied"); return; } @@ -1237,7 +1263,8 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas request.getAuthenticationType(), request.getAuthenticationIdentifier(), request.getSearchOption())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Can not update searchable option for authentication provider in profile {}.", - request.getProfileId(), Cause.ERROR_UPDATING_SEARCHABLE_OPTION); + request.getProfileId(), Cause.ERROR_UPDATING_SEARCHABLE_OPTION, + "Failed to update searchable option"); return; } @@ -1257,9 +1284,10 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas } private static void logAndBuildGrpcAccountResponse(StreamObserver responseObserver, - AccountResponse.Builder newBuilder, String logMessage, String logValue, Cause cause) { + AccountResponse.Builder newBuilder, String logMessage, String logValue, Cause cause, String errorMessage) { logger.error(logMessage, logValue); - responseObserver.onNext(newBuilder.setError(ErrorResponse.newBuilder().setCause(cause)).build()); + responseObserver.onNext( + newBuilder.setError(ErrorResponse.newBuilder().setCause(cause).setMessage(errorMessage)).build()); responseObserver.onCompleted(); } @@ -1278,9 +1306,10 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas } private static void logAndBuildGrpcStatusResponse(StreamObserver responseObserver, - StatusResponse.Builder newBuilder, String logMessage, String logValue, Cause cause) { + StatusResponse.Builder newBuilder, String logMessage, String logValue, Cause cause, String errorMessage) { logger.error(logMessage, logValue); - responseObserver.onNext(newBuilder.setError(ErrorResponse.newBuilder().setCause(cause)).build()); + responseObserver.onNext( + newBuilder.setError(ErrorResponse.newBuilder().setCause(cause).setMessage(errorMessage)).build()); responseObserver.onCompleted(); } 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 794177b30e5cc52700a4557e75459cbaed50a831..8d31c915774a0fda99df738a727cbe3db0bde1d3 100644 --- a/src/main/java/biz/nynja/account/services/decomposition/AccountCreator.java +++ b/src/main/java/biz/nynja/account/services/decomposition/AccountCreator.java @@ -6,7 +6,6 @@ package biz.nynja.account.services.decomposition; import static biz.nynja.account.validation.Validators.pendingAccount; import java.time.Instant; -import java.util.Optional; import java.util.UUID; import org.slf4j.Logger; @@ -29,6 +28,7 @@ import biz.nynja.account.models.PendingAccountByAuthenticationProvider; import biz.nynja.account.phone.PhoneNumberNormalizer; import biz.nynja.account.repositories.AccountRepositoryAdditional; import biz.nynja.account.repositories.PendingAccountRepository; +import biz.nynja.account.validation.Validation; @Service public class AccountCreator { @@ -129,7 +129,8 @@ public class AccountCreator { request.getAuthenticationType().name(), request.getAuthenticationProvider()))) { return logAndBuildGrpcPendingAccountResponse(CreatePendingAccountResponse.newBuilder(), "Error creating pending account. Authentication provider: {} already used.", - request.getAuthenticationProvider(), Cause.AUTH_PROVIDER_ALREADY_USED); + request.getAuthenticationProvider(), Cause.AUTH_PROVIDER_ALREADY_USED, + "Login option is already used"); } return null; } @@ -152,7 +153,8 @@ public class AccountCreator { if (createdAccount == null) { return logAndBuildGrpcAccountResponse(AccountResponse.newBuilder(), - "Error creating account with useraname: {}", request.getUsername(), Cause.ERROR_CREATING_ACCOUNT); + "Error creating account with useraname: {}", request.getUsername(), Cause.ERROR_CREATING_ACCOUNT, + "Failed to create account"); } else { logger.debug("Account \"{}\" saved into the DB", createdAccount); AccountDetails details = createdAccount.toProto(); @@ -163,28 +165,30 @@ public class AccountCreator { private AccountResponse validateCompletePendingAccountCreationRequest( CompletePendingAccountCreationRequest request) { - Cause cause = pendingAccount.validateCompletePendingAccountCreationRequest(request); - if (cause != null) { - return logAndBuildGrpcAccountResponse(AccountResponse.newBuilder(), "Validation failed", "", cause); + Validation validation = pendingAccount.validateCompletePendingAccountCreationRequest(request); + if (validation.hasErrors()) { + return logAndBuildGrpcAccountResponse(AccountResponse.newBuilder(), "Validation failed: " + validation.getErrorMessage(), + "", validation.getFirstCause().get(), validation.getFirstMessage().get()); } if (request.getUsername() != null && !request.getUsername().trim().isEmpty() && accountRepositoryAdditional .foundExistingNotOwnUsername(UUID.fromString(request.getAccountId()), request.getUsername())) { return logAndBuildGrpcAccountResponse(AccountResponse.newBuilder(), "User name already in use: {}", - request.getUsername(), Cause.USERNAME_ALREADY_USED); + request.getUsername(), Cause.USERNAME_ALREADY_USED, "Username is already used"); } return null; } private static CreatePendingAccountResponse logAndBuildGrpcPendingAccountResponse( - CreatePendingAccountResponse.Builder newBuilder, String logMessage, String logValue, Cause cause) { + CreatePendingAccountResponse.Builder newBuilder, String logMessage, String logValue, Cause cause, + String errorMessage) { logger.error(logMessage, logValue); - return newBuilder.setError(ErrorResponse.newBuilder().setCause(cause)).build(); + return newBuilder.setError(ErrorResponse.newBuilder().setCause(cause).setMessage(errorMessage)).build(); } private static AccountResponse logAndBuildGrpcAccountResponse(AccountResponse.Builder newBuilder, String logMessage, - String logValue, Cause cause) { + String logValue, Cause cause, String errorMessage) { logger.error(logMessage, logValue); - return newBuilder.setError(ErrorResponse.newBuilder().setCause(cause)).build(); + return newBuilder.setError(ErrorResponse.newBuilder().setCause(cause).setMessage(errorMessage)).build(); } } diff --git a/src/main/java/biz/nynja/account/validation/Validation.java b/src/main/java/biz/nynja/account/validation/Validation.java index 9ae0982ccd05c540755579adbc1039bcf38daed4..c157b4e8aa1892960f62750a5ce8c1f321568b7c 100644 --- a/src/main/java/biz/nynja/account/validation/Validation.java +++ b/src/main/java/biz/nynja/account/validation/Validation.java @@ -39,7 +39,7 @@ public class Validation { for (ValidationError error : errors) { builder.append("Message: ").append(error.getMessage()).append(". "); if (error.getCause() != null) { - builder.append("Cause: ").append(error.getCause()); + builder.append("Cause:").append(error.getCause()).append(";"); } } @@ -59,4 +59,19 @@ public class Validation { } + // TODO this is a workaround for now as we have a single cause and error + public Optional getFirstCause() { + if (!hasErrors()) { + return Optional.empty(); + } + return Optional.of(errors.get(0).getCause()); + } + + public Optional getFirstMessage() { + if (!hasErrors()) { + return Optional.empty(); + } + return Optional.of(errors.get(0).getMessage()); + } + } diff --git a/src/main/java/biz/nynja/account/validation/Validators.java b/src/main/java/biz/nynja/account/validation/Validators.java index 801949ebd326464b9539edf5d34eb7c52ef87dc6..38ab7a885d258c918d05359dc3eb45e629633f72 100644 --- a/src/main/java/biz/nynja/account/validation/Validators.java +++ b/src/main/java/biz/nynja/account/validation/Validators.java @@ -154,30 +154,32 @@ public class Validators { return validation; } - public Optional validateUpdateAccountRequest(UpdateAccountRequest request) { + public Validation validateUpdateAccountRequest(UpdateAccountRequest request) { + Validation validation = new Validation(); + if (!util.isValidUuid(request.getAccountId())) { - return Optional.of(Cause.INVALID_ACCOUNT_ID); + validation.addError(new ValidationError("Invalid Account ID", Cause.INVALID_ACCOUNT_ID)); } if (request.getUsername() != null && !request.getUsername().trim().isEmpty() && !isUsernameValid(request.getUsername())) { - return Optional.of(Cause.INVALID_USERNAME); + validation.addError(new ValidationError("Invalid username", Cause.INVALID_USERNAME)); } if (request.getFirstName() != null && request.getFirstName().trim().isEmpty()) { - return Optional.of(Cause.MISSING_FIRST_NAME); + validation.addError(new ValidationError("Missing first name", Cause.MISSING_FIRST_NAME)); } else if (!isFirstNameValid(request.getFirstName())) { - return Optional.of(Cause.INVALID_FIRST_NAME); + validation.addError(new ValidationError("Invalid first name", Cause.INVALID_FIRST_NAME)); } if (request.getLastName() != null && !request.getLastName().trim().isEmpty() && !isLastNameValid(request.getLastName())) { - return Optional.of(Cause.INVALID_LAST_NAME); + validation.addError(new ValidationError("Invalid last name", Cause.INVALID_LAST_NAME)); } if (request.getAccountName() != null && !request.getAccountName().trim().isEmpty() && !isAccountNameValid(request.getAccountName())) { - return Optional.of(Cause.INVALID_ACCOUNT_NAME); + validation.addError(new ValidationError("Invalid account name", Cause.INVALID_ACCOUNT_NAME)); } if (util.validateBirthdayIsSet(request.getBirthday())) { @@ -185,10 +187,10 @@ public class Validators { LocalDate.of(request.getBirthday().getYear(), request.getBirthday().getMonth(), request.getBirthday().getDay()); } catch (DateTimeException e) { - return Optional.of(Cause.INVALID_BIRTHDAY_DATE); + validation.addError(new ValidationError("Invalid birthday format", Cause.INVALID_BIRTHDAY_DATE)); } } - return Optional.empty(); + return validation; } public Optional> validateContactInfo(ContactType type, String contactInfoValue) { @@ -233,7 +235,7 @@ public class Validators { public Optional> validateContactInfoRequest(String accountId, ContactDetails contactDetails) { if ((accountId == null) || (accountId.isEmpty())) { - return Optional.of(new ImmutablePair<>(Cause.MISSING_ACCOUNT_ID, "Missing account id")); + return Optional.of(new ImmutablePair<>(Cause.MISSING_ACCOUNT_ID, "Missing account ID")); } if (contactDetails.getTypeValue() == 0) { return Optional.of(new ImmutablePair<>(Cause.MISSING_CONTACT_INFO_TYPE, "Missing contact info type")); @@ -321,32 +323,47 @@ public class Validators { } } - public Optional validateDeleteAuthenticationProviderRequest( - DeleteAuthenticationProviderRequest request) { + public Validation validateDeleteAuthenticationProviderRequest(DeleteAuthenticationProviderRequest request) { + Validation validation = new Validation(); if (!isValidUuid(request.getProfileId())) { - return Optional.of(Cause.INVALID_PROFILE_ID); + validation.addError(new ValidationError("Invalid profile id", Cause.INVALID_PROFILE_ID)); } - return validateAuthenticationProvider(request.getAuthenticationProvider().getAuthenticationType(), + + Optional authenticationProviderValidation = validateAuthenticationProvider( + request.getAuthenticationProvider().getAuthenticationType(), request.getAuthenticationProvider().getAuthenticationProvider(), true); + if (authenticationProviderValidation.isPresent()) { + validation.addError(new ValidationError( + "Failed deleting a login option due to error" + authenticationProviderValidation.get(), + authenticationProviderValidation.get())); + } + + return validation; } - public Optional validateAddAuthenticationProviderRequest(AddAuthenticationProviderRequest request) { + public Validation validateAddAuthenticationProviderRequest(AddAuthenticationProviderRequest request) { + Validation validation = new Validation(); if (!isValidUuid(request.getProfileId())) { - return Optional.of(Cause.INVALID_PROFILE_ID); + validation.addError(new ValidationError("Invalid profile id", Cause.INVALID_PROFILE_ID)); } Optional authenticationProviderValidation = validateAuthenticationProvider( request.getAuthenticationProvider().getAuthenticationType(), request.getAuthenticationProvider().getAuthenticationProvider()); if (authenticationProviderValidation.isPresent()) { - return authenticationProviderValidation; + validation.addError(new ValidationError( + "Failed adding a login option due to error: " + authenticationProviderValidation.get(), + authenticationProviderValidation.get())); + return validation; } boolean typeCanBeUsed = authenticationProvider .canUseAsAdditionalLoginOption(request.getAuthenticationProvider().getAuthenticationType()); if (typeCanBeUsed) { - return Optional.empty(); + return validation; } else { - return Optional.of(Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE); + validation.addError(new ValidationError("Invalid additional login option type", + Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE)); } + return validation; } public Validation validateUpdateSearchableOptionRequest(String profileId, String authenticationType, @@ -479,36 +496,38 @@ public class Validators { request.getAuthenticationProvider()); } - public Cause validateCompletePendingAccountCreationRequest(CompletePendingAccountCreationRequest request) { + public Validation validateCompletePendingAccountCreationRequest(CompletePendingAccountCreationRequest request) { + Validation validation = new Validation(); + if (request.getAccountId() == null || request.getAccountId().trim().isEmpty()) { - return Cause.MISSING_ACCOUNT_ID; + validation.addError(new ValidationError("Missing Account ID", Cause.MISSING_ACCOUNT_ID)); } if (!Validators.util.isValidUuid(request.getAccountId())) { - return Cause.INVALID_ACCOUNT_ID; + validation.addError(new ValidationError("Invalid Account ID", Cause.INVALID_ACCOUNT_ID)); } if (request.getFirstName() != null && request.getFirstName().trim().isEmpty()) { - return Cause.MISSING_FIRST_NAME; + validation.addError(new ValidationError("Missing first name", Cause.MISSING_FIRST_NAME)); } else if (!account.isFirstNameValid(request.getFirstName())) { - return Cause.INVALID_FIRST_NAME; + validation.addError(new ValidationError("Invalid first name", Cause.INVALID_FIRST_NAME)); } if (request.getLastName() != null && !request.getLastName().trim().isEmpty() && !account.isLastNameValid(request.getLastName())) { - return Cause.INVALID_LAST_NAME; + validation.addError(new ValidationError("Invalid last name", Cause.INVALID_LAST_NAME)); } if (request.getUsername() != null && !request.getUsername().trim().isEmpty() && !account.isUsernameValid(request.getUsername())) { - return Cause.INVALID_USERNAME; + validation.addError(new ValidationError("Invalid username", Cause.INVALID_USERNAME)); } if (request.getAccountName() != null && !request.getAccountName().trim().isEmpty() && !account.isAccountNameValid(request.getAccountName())) { - return Cause.INVALID_ACCOUNT_NAME; + validation.addError(new ValidationError("Invalid account name", Cause.INVALID_ACCOUNT_NAME)); } - return null; + return validation; } } diff --git a/src/test/java/biz/nynja/account/components/ValidatorTests.java b/src/test/java/biz/nynja/account/components/ValidatorTests.java index ec44798e4027ee09947e19a0df052254a35e8830..2c4c4a30d4367307d09ba145420d4d8075987c69 100644 --- a/src/test/java/biz/nynja/account/components/ValidatorTests.java +++ b/src/test/java/biz/nynja/account/components/ValidatorTests.java @@ -11,7 +11,6 @@ import static biz.nynja.account.validation.Validators.util; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.NoSuchElementException; @@ -188,8 +187,8 @@ public class ValidatorTests { @Test(expected = NoSuchElementException.class) public void validateAuthProviderValidTest() { - authenticationProvider.validateAuthenticationProvider(AuthenticationType.EMAIL, - "valid.E-mail1@domain-sub.test.com").get(); + authenticationProvider + .validateAuthenticationProvider(AuthenticationType.EMAIL, "valid.E-mail1@domain-sub.test.com").get(); } @Test @@ -201,26 +200,22 @@ public class ValidatorTests { @Test public void validateAdditionalLoginOptionGoogleplusInvalidTest() { - assertEquals(authenticationProvider - .canUseAsAdditionalLoginOption(AuthenticationType.GOOGLEPLUS), false); + assertEquals(authenticationProvider.canUseAsAdditionalLoginOption(AuthenticationType.GOOGLEPLUS), false); } @Test public void validateAdditionalLoginOptionFacebookInvalidTest() { - assertEquals(authenticationProvider - .canUseAsAdditionalLoginOption(AuthenticationType.FACEBOOK), false); + assertEquals(authenticationProvider.canUseAsAdditionalLoginOption(AuthenticationType.FACEBOOK), false); } @Test public void validateAdditionalLoginOptionPhoneValidTest() { - assertEquals(authenticationProvider - .canUseAsAdditionalLoginOption(AuthenticationType.PHONE), true); + assertEquals(authenticationProvider.canUseAsAdditionalLoginOption(AuthenticationType.PHONE), true); } @Test public void validateAdditionalLoginOptionEmailValidTest() { - assertEquals(authenticationProvider - .canUseAsAdditionalLoginOption(AuthenticationType.EMAIL), true); + assertEquals(authenticationProvider.canUseAsAdditionalLoginOption(AuthenticationType.EMAIL), true); } @Test @@ -259,7 +254,7 @@ public class ValidatorTests { CompletePendingAccountCreationRequest request = CompletePendingAccountCreationRequest.newBuilder() .setAccountId(Util.ACCOUNT_ID.toString()).setFirstName(Util.FIRST_NAME).setLastName(Util.LAST_NAME) .setUsername(Util.USERNAME).build(); - assertNull(pendingAccount.validateCompletePendingAccountCreationRequest(request)); + assertFalse(pendingAccount.validateCompletePendingAccountCreationRequest(request).getFirstCause().isPresent()); } @Test @@ -267,14 +262,16 @@ public class ValidatorTests { CompletePendingAccountCreationRequest request = CompletePendingAccountCreationRequest.newBuilder() .setAccountId(Util.ACCOUNT_ID.toString()).setFirstName(Util.FIRST_NAME).setLastName(Util.LAST_NAME) .setUsername("@alabala").build(); - assertEquals(Cause.INVALID_USERNAME, pendingAccount.validateCompletePendingAccountCreationRequest(request)); + assertEquals(Cause.INVALID_USERNAME, + pendingAccount.validateCompletePendingAccountCreationRequest(request).getFirstCause().get()); } @Test public void validateCompletePendingAccountCreationRequestMissingAccountIdTest() { CompletePendingAccountCreationRequest request = CompletePendingAccountCreationRequest.newBuilder() .setFirstName(Util.FIRST_NAME).setLastName(Util.LAST_NAME).setUsername(Util.USERNAME).build(); - assertEquals(Cause.MISSING_ACCOUNT_ID, pendingAccount.validateCompletePendingAccountCreationRequest(request)); + assertEquals(Cause.MISSING_ACCOUNT_ID, + pendingAccount.validateCompletePendingAccountCreationRequest(request).getFirstCause().get()); } @Test(expected = NoSuchElementException.class) @@ -292,7 +289,7 @@ public class ValidatorTests { .setAuthenticationProvider("invalid.E-mail1.@domain_test.com1").build(); assertEquals(Cause.INVALID_EMAIL, pendingAccount.validateCreatePendingAccountRequest(request).get()); } - + @Test public void testCountryCodeGetterValidNumber() { String countryCode = PhoneNumberUtils.getCountrySelector("359888888888"); // Bulgaria @@ -300,7 +297,7 @@ public class ValidatorTests { countryCode = PhoneNumberUtils.getCountrySelector("1888888888"); // United states assertEquals("US", countryCode); - + countryCode = PhoneNumberUtils.getCountrySelector("380888888888"); // Ukrain assertEquals("UA", countryCode); }