diff --git a/pom.xml b/pom.xml index e3c914b8c50481e00def69206f602fdf6187ffaf..ad5011adebf767aa79b6645cb5d78ad47b931ec5 100644 --- a/pom.xml +++ b/pom.xml @@ -192,11 +192,42 @@ + + + + kr.motd.maven + os-maven-plugin + 1.6.1 + + org.springframework.boot spring-boot-maven-plugin + + + org.xolstice.maven.plugins + protobuf-maven-plugin + 0.6.1 + + + com.google.protobuf:protoc:3.3.0:exe:${os.detected.classifier} + + grpc-java + + io.grpc:protoc-gen-grpc-java:1.4.0:exe:${os.detected.classifier} + + + + + + compile + compile-custom + + + + diff --git a/src/main/java/biz/nynja/account/components/AccountServiceHelper.java b/src/main/java/biz/nynja/account/components/AccountServiceHelper.java index c47fa789bc087d4b2cb4b4839c5007de28c3ad57..b8b4071254c5f46af095b93d16e4b62867eb7d1c 100644 --- a/src/main/java/biz/nynja/account/components/AccountServiceHelper.java +++ b/src/main/java/biz/nynja/account/components/AccountServiceHelper.java @@ -3,6 +3,7 @@ */ package biz.nynja.account.components; +import biz.nynja.account.grpc.AuthenticationType; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -20,6 +21,10 @@ public class AccountServiceHelper { public Account getAccountByAuthenticationProviderHelper(String authenticationIdentifier, String type) { + if (AuthenticationType.EMAIL.toString().equals(type)) { + authenticationIdentifier = authenticationIdentifier.toLowerCase(); + } + List accounts = accountByAuthenticationProviderRepository .findAllByAuthenticationProvider(authenticationIdentifier); diff --git a/src/main/java/biz/nynja/account/models/AccountBuilder.java b/src/main/java/biz/nynja/account/models/AccountBuilder.java index 6d7e3d53a095e8f264a2285d73e8513d695d738a..858dd863e2acc6c96fde53e39ec2d2cc2cd45877 100644 --- a/src/main/java/biz/nynja/account/models/AccountBuilder.java +++ b/src/main/java/biz/nynja/account/models/AccountBuilder.java @@ -4,6 +4,7 @@ package biz.nynja.account.models; import biz.nynja.account.grpc.AccessStatus; +import biz.nynja.account.grpc.AuthenticationType; import biz.nynja.account.grpc.CompletePendingAccountCreationRequest; import biz.nynja.account.grpc.UpdateAccountRequest; import biz.nynja.account.validation.Validators; @@ -21,8 +22,12 @@ public class AccountBuilder { newAccount.setAccountId(pendingAccount.getAccountId()); newAccount.setProfileId(pendingAccount.getProfileId()); newAccount.setAccountMark(request.getAccountMark()); - newAccount.setAuthenticationProvider(pendingAccount.getAuthenticationProvider()); newAccount.setAuthenticationProviderType(pendingAccount.getAuthenticationProviderType()); + if (AuthenticationType.EMAIL.toString().equals(pendingAccount.getAuthenticationProviderType())) { + newAccount.setAuthenticationProvider(pendingAccount.getAuthenticationProvider().toLowerCase()); + } else { + newAccount.setAuthenticationProvider(pendingAccount.getAuthenticationProvider()); + } newAccount.setFirstName(request.getFirstName()); newAccount.setLastName(request.getLastName()); newAccount.setAvatar(request.getAvatar()); diff --git a/src/main/java/biz/nynja/account/permissions/PermissionsInterceptor.java b/src/main/java/biz/nynja/account/permissions/PermissionsInterceptor.java index 63c7b1de41e34d79b0b3cf34e1424473204e5455..b66e9fbb54460935eb3d9b96eb9eecddb31e2f12 100644 --- a/src/main/java/biz/nynja/account/permissions/PermissionsInterceptor.java +++ b/src/main/java/biz/nynja/account/permissions/PermissionsInterceptor.java @@ -10,6 +10,7 @@ import java.util.Base64; import java.util.Optional; import java.util.UUID; +import biz.nynja.account.services.AdminService2Impl; import org.lognet.springboot.grpc.GRpcGlobalInterceptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,6 +53,9 @@ public class PermissionsInterceptor implements ServerInterceptor { private static final Class SERVICE_CLASS = AccountServiceImpl.class; private static final Class ADMIN_SERVICE_CLASS = AdminServiceImpl.class; + // Added by Jayendra + private static final Class ADMIN_SERVICE2_CLASS = AdminService2Impl.class; + public static final Metadata.Key ACCESS_TOKEN_METADATA = Metadata.Key.of("Authorization", ASCII_STRING_MARSHALLER); public static final Context.Key ACCESS_TOKEN_CTX = Context.key("accessToken"); @@ -160,7 +164,8 @@ public class PermissionsInterceptor implements ServerInterceptor { // Get the rpc method called Method[] allMethods = SERVICE_CLASS.getDeclaredMethods(); Method[] adminMethods = ADMIN_SERVICE_CLASS.getDeclaredMethods(); - + Method[] admin2Methods = ADMIN_SERVICE2_CLASS.getDeclaredMethods(); + for (Method method : allMethods) { if (method.getName().equals(rpc)) { return method; @@ -172,7 +177,13 @@ public class PermissionsInterceptor implements ServerInterceptor { return method; } } - + + for (Method method : admin2Methods) { + if (method.getName().equals(rpc)) { + return method; + } + } + return null; } diff --git a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java index 0a703de65f807707ac084ed391895cbcef7c2aaa..ae9259913541cc91b5269574cb87fd000b9764a1 100644 --- a/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java +++ b/src/main/java/biz/nynja/account/repositories/AccountRepositoryAdditionalImpl.java @@ -3,6 +3,7 @@ */ package biz.nynja.account.repositories; +import biz.nynja.account.grpc.AuthenticationType; import java.time.DateTimeException; import java.time.Instant; import java.util.HashSet; @@ -983,8 +984,10 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio @Override public Optional getAccountByLoginOption(AuthenticationProvider loginOption) throws IncorrectAccountCountException { + String loginOptionValue = AuthenticationType.EMAIL.toString().equals(loginOption.getType()) ? + loginOption.getValue().toLowerCase() : loginOption.getValue(); ProfileByAuthenticationProvider profile = profileByAuthenticationProviderRepository - .findByAuthenticationProviderAndAuthenticationProviderType(loginOption.getValue(), + .findByAuthenticationProviderAndAuthenticationProviderType(loginOptionValue, loginOption.getType()); if (profile == null) { return Optional.empty(); @@ -1008,8 +1011,10 @@ public class AccountRepositoryAdditionalImpl implements AccountRepositoryAdditio @Override public Optional searchAccountByLoginOption(AuthenticationProvider loginOption) throws IncorrectAccountCountException { + String loginOptionValue = AuthenticationType.EMAIL.toString().equals(loginOption.getType()) ? + loginOption.getValue().toLowerCase() : loginOption.getValue(); ProfileByAuthenticationProvider profileByAuthProvider = profileByAuthenticationProviderRepository - .findByAuthenticationProviderAndAuthenticationProviderType(loginOption.getValue(), + .findByAuthenticationProviderAndAuthenticationProviderType(loginOptionValue, loginOption.getType()); if (profileByAuthProvider == null) { return Optional.empty(); diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index f5bcaee78ce470e8bc58f7369430c3947036f73c..6eda54cf602eb8a74d426a5aa08f516dbe803e9c 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -6,7 +6,6 @@ package biz.nynja.account.services; import static biz.nynja.account.validation.Validators.account; import static biz.nynja.account.validation.Validators.authenticationProvider; import static biz.nynja.account.validation.Validators.pendingAccount; -import static biz.nynja.account.validation.Validators.phoneValidator; import static biz.nynja.account.validation.Validators.util; import java.util.List; @@ -480,11 +479,11 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (cause.isPresent()) { response = CreatePendingAccountResponse.newBuilder() .setError(ErrorResponse.newBuilder().setCause(cause.get())).build(); - logger.info("ERROR: Creating pending account for provider {} and accoutn Id {}.", + logger.info("ERROR: Creating pending account for provider {} and account Id {}.", request.getAuthenticationProvider(), response.getPendingAccountDetails().getAccountId()); } else { response = accountCreator.retrieveCreatePendingAccountResponse(request); - logger.info("SUCCESS: Created pending account for provider {} and accoutn Id {}.", + logger.info("SUCCESS: Created pending account for provider {} and account Id {}.", request.getAuthenticationProvider(), response.getPendingAccountDetails().getAccountId()); } @@ -498,8 +497,9 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas public void completePendingAccountCreation(CompletePendingAccountCreationRequest request, StreamObserver responseObserver) { - logger.info("Complete pending account creation for account id {} and username {} ...", request.getAccountId(), - request.getUsername().toLowerCase()); + logger.info("Complete pending account creation for account id {} and username {} ...", + request.getAccountId(), + request.getUsername()); logger.debug("Complete pending account creation...: {} ...", request); AccountResponse response = accountCreator.retrieveCompletePendingAccountResponse(request); @@ -686,6 +686,15 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas AddAuthenticationProviderRequest newRequest = AddAuthenticationProviderRequest.newBuilder() .setProfileId(request.getProfileId()).setAuthenticationProvider(newAuthProviderDetails).build(); request = newRequest; + } else if (request.getAuthenticationProvider().getAuthenticationType() == AuthenticationType.EMAIL) { + var lowercase = request.getAuthenticationProvider().getAuthenticationProvider().toLowerCase(); + request = request.toBuilder() + .setAuthenticationProvider( + request + .getAuthenticationProvider() + .toBuilder() + .setAuthenticationProvider(lowercase)) + .build(); } // Make sure that the requested profile id for update exists in DB. @@ -906,6 +915,9 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas if (request.getAuthenticationProvider().getAuthenticationType() == AuthenticationType.PHONE) { authenticationProviderToDelete.setValue(phoneNumberNormalizer .getNormalizedPhoneNumber(request.getAuthenticationProvider().getAuthenticationProvider())); + } else if (request.getAuthenticationProvider().getAuthenticationType() == AuthenticationType.EMAIL) { + authenticationProviderToDelete.setValue( + request.getAuthenticationProvider().getAuthenticationProvider().toLowerCase()); } Optional existingAuthProviderToDelete = AuthenticationProvider diff --git a/src/main/java/biz/nynja/account/services/AdminService2Impl.java b/src/main/java/biz/nynja/account/services/AdminService2Impl.java new file mode 100644 index 0000000000000000000000000000000000000000..3f08369a5872a189f2aa8427c8530d16d0295266 --- /dev/null +++ b/src/main/java/biz/nynja/account/services/AdminService2Impl.java @@ -0,0 +1,814 @@ +package biz.nynja.account.services; + + +import biz.nynja.account.models.Account; +import biz.nynja.account.permissions.PerformPermissionCheck; +import biz.nynja.account.permissions.Permitted; +import biz.nynja.account.permissions.RoleConstants; +import biz.nynja.account.services.admin.repository.AdminAccountRepository; +import biz.nynja.account2.admin.grpc.*; +import com.google.protobuf.ProtocolStringList; +import io.grpc.stub.StreamObserver; +import org.lognet.springboot.grpc.GRpcService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +/** + * AdminService2Impl contains endpoints for market admin + * panel to filter accounts while broadcasting message + * This endpoints are permitted to Token with role admin + * + * This service contains endpoints which doesn't exists in AdminService + * + * @author Jayendra + * @since 2019-12-04 + * + */ + +@GRpcService +public class AdminService2Impl extends AdminAccountService2Grpc.AdminAccountService2ImplBase { + + @Autowired + private AdminAccountRepository accountService; + + private static final Logger logger = LoggerFactory.getLogger(AdminService2Impl.class); + + @Override + @Permitted(role = RoleConstants.ANY) + public void searchByAccountId(SearchByAccountIdRequest request, StreamObserver responseObserver) { + + logger.info("Search Account By Account Id Endpoint."); + logger.info(""); + + String accountId = request.getAccountId(); + logger.info("Account-Id : " + accountId); + + List accountsList = null; + String nextPageState = null; + ErrorResponse errorResponse = null; + + + accountsList = accountService.getAccountByAccountId(UUID.fromString(accountId)); + logger.info("Accounts-list : {}", accountsList); + + + if (accountsList == null) { + logger.info("Account list in null."); + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else if (accountsList.size() == 0) { + logger.info("Account list size is zero."); + + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else { + + AccountsList.Builder accountsListBuilder = AccountsList.newBuilder(); + for (Account account : accountsList) { + + System.out.println(""); + System.out.println("Account : "); + System.out.println(account); + System.out.println(""); + + accountsListBuilder.addAccountDetails(AccountDetails.newBuilder().setFirstName((account.getFirstName() == null) ? "" : account.getFirstName()) + .setLastName((account.getLastName() == null) ? "" : account.getLastName()).setProfileId((account.getProfileId() == null) ? "" : account.getProfileId().toString()) + .setAccountId(account.getAccountId().toString()).setAuthenticationprovider((account.getAuthenticationProvider() == null) ? "" : account.getAuthenticationProvider()) + .setAuthenticationprovidertype((account.getAuthenticationProviderType() == null) ? "" : account.getAuthenticationProviderType()) + .setAccountMark((account.getAccountMark() != null) ? account.getAccountMark() : "").setAccountName((account.getAccountName() != null) ? account.getAccountName() : "") + .setAvatar((account.getAvatar() != null) ? account.getAvatar() : "").setCreationTimestamp((account.getCreationTimestamp() != null) ? account.getCreationTimestamp() : 0) + .setQrCode((account.getQrCode() != null) ? account.getQrCode() : "") + .setUsername(account.getUsername()).build()); + } + + accountsListBuilder.build(); + + AccountsResponse response = (errorResponse == null) ? AccountsResponse.newBuilder().setAccountsList(accountsListBuilder) + .build() : AccountsResponse.newBuilder().setError(errorResponse).build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } + } + + @Override + @Permitted(role = RoleConstants.ANY) + public void getAccountsByCreationTime(GetAccountsByCreationTime request, + StreamObserver responseObserver) { + + logger.info(""); + logger.info("Get accounts by creation time endpoint."); + + int limit = request.getLimit(); + String pageState = request.getPageState(); + int pagination = request.getPagination(); // Do pagination 'Yes' or 'No' + long fromCreationTime = request.getFromCreationTime(); + long toCreationTime = request.getToCreationTime(); + + logger.info("Limit : {}", limit); + logger.info("PageState : {}", pageState); + logger.info("Pagination : {}", pagination); + logger.info("FromCreationTime : {}", fromCreationTime); + logger.info("ToCreationTime : {}", toCreationTime); + logger.info(""); + + List accountsList = null; + String nextPageState = null; + ErrorResponse errorResponse = null; + + // Fetching records on basis of pagination. + if (pagination == 1) { + logger.info("Fetching records on basis of pagination."); + + + Map accountsMap = (pageState.equals("nil")) ? accountService.getAccountsByCreationTimeStampPagination(fromCreationTime, toCreationTime, limit, null) : accountService.getAccountsByCreationTimeStampPagination(fromCreationTime, toCreationTime, limit, pageState); + + if(accountsMap == null){ + + logger.info("No accounts found"); + logger.info(""); + + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } + + accountsList = (List) accountsMap.get("accounts"); + nextPageState = accountsMap.get("pageState").toString(); + + logger.info("Next page state : " + nextPageState); + + + if (accountsList == null) { + logger.info("Account list in null."); + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else if (accountsList.size() == 0) { + logger.info("Account list size is zero."); + + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else { + + AccountsList.Builder accountsListBuilder = AccountsList.newBuilder(); + + for (Account account : accountsList) { + + accountsListBuilder.addAccountDetails(AccountDetails.newBuilder().setFirstName((account.getFirstName() == null) ? "" : account.getFirstName()) + .setLastName((account.getLastName() == null) ? "" : account.getLastName()).setProfileId((account.getProfileId() == null) ? "" : account.getProfileId().toString()) + .setAccountId(account.getAccountId().toString()).setAuthenticationprovider((account.getAuthenticationProvider() == null) ? "" : account.getAuthenticationProvider()) + .setAuthenticationprovidertype((account.getAuthenticationProviderType() == null) ? "" : account.getAuthenticationProviderType()) + .setAccountMark((account.getAccountMark() != null) ? account.getAccountMark() : "").setAccountName((account.getAccountName() != null) ? account.getAccountName() : "") + .setAvatar((account.getAvatar() != null) ? account.getAvatar() : "").setCreationTimestamp((account.getCreationTimestamp() != null) ? account.getCreationTimestamp() : 0) + .setQrCode((account.getQrCode() != null) ? account.getQrCode() : "") + .setUsername(account.getUsername()).build()); + } + + if (nextPageState != null) { + accountsListBuilder.setNextPageState(nextPageState); + } + + accountsListBuilder.build(); + + AccountsResponse response = (errorResponse == null) ? AccountsResponse.newBuilder().setAccountsList(accountsListBuilder) + .build() : AccountsResponse.newBuilder().setError(errorResponse).build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + + } + + } else { + logger.info("Not fetching records on basis of pagination."); + + accountsList = accountService.getAccountsByCreationTimeStamp(fromCreationTime, toCreationTime); + logger.info("Accounts-list : {}", accountsList); + + if (accountsList == null) { + logger.info("Account list in null."); + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else if (accountsList.size() == 0) { + logger.info("Account list size is zero."); + + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else { + + AccountsList.Builder accountsListBuilder = AccountsList.newBuilder(); + for (Account account : accountsList) { + + accountsListBuilder.addAccountDetails(AccountDetails.newBuilder().setFirstName((account.getFirstName() == null) ? "" : account.getFirstName()) + .setLastName((account.getLastName() == null) ? "" : account.getLastName()).setProfileId((account.getProfileId() == null) ? "" : account.getProfileId().toString()) + .setAccountId(account.getAccountId().toString()).setAuthenticationprovider((account.getAuthenticationProvider() == null) ? "" : account.getAuthenticationProvider()) + .setAuthenticationprovidertype((account.getAuthenticationProviderType() == null) ? "" : account.getAuthenticationProviderType()) + .setAccountMark((account.getAccountMark() != null) ? account.getAccountMark() : "").setAccountName((account.getAccountName() != null) ? account.getAccountName() : "") + .setAvatar((account.getAvatar() != null) ? account.getAvatar() : "").setCreationTimestamp((account.getCreationTimestamp() != null) ? account.getCreationTimestamp() : 0) + .setQrCode((account.getQrCode() != null) ? account.getQrCode() : "") + .setUsername(account.getUsername()).build()); + } + + accountsListBuilder.build(); + + AccountsResponse response = (errorResponse == null) ? AccountsResponse.newBuilder().setAccountsList(accountsListBuilder) + .build() : AccountsResponse.newBuilder().setError(errorResponse).build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } + + } + + } + + @Override + @Permitted(role = RoleConstants.ANY) + public void getAccounts(GetAllAccountsRequest request, + StreamObserver responseObserver) { + + logger.info(""); + logger.info("Get all accounts endpoint."); + + ProtocolStringList accountIdsList = request.getAccountIdsList(); + + // List accountIdsList = null; + int allAccounts = request.getAllAccounts(); + int pagination = request.getPagination(); + String pageState = request.getPageState(); + int limit = request.getLimit(); + + logger.info("Request Parameters"); + logger.info("accountIdsList : " + accountIdsList); + logger.info("allAccounts : " + allAccounts); + logger.info("pagination : " + pagination); + logger.info("pageState : " + pageState); + logger.info("limit : " + limit); + + /*System.out.println(""); + System.out.println("===================="); + System.out.println("Request Parameters :"); + System.out.println("===================="); + System.out.println(""); + System.out.println("accountIdsList : " + accountIdsList); + System.out.println("allAccounts : " + allAccounts); + System.out.println("pagination : " + pagination); + System.out.println("pageState : " + pageState); + System.out.println("limit : " + limit); + System.out.println(""); + System.out.println("------------");*/ + + List accountsList = null; + String nextPageState = null; + ErrorResponse errorResponse = null; + + + if (!accountIdsList.isEmpty()) { + logger.info("Fetching details on basis of given account Ids."); + System.out.println("Fetching details on basis of given account Ids."); + System.out.println(""); + + // Set accountIds = new HashSet<>(accountIdsList.size()); + + UUID[] accountIds = new UUID[accountIdsList.size()]; + + for (int i = 0; i <= accountIdsList.size() - 1; i++) { + accountIds[i] = UUID.fromString(accountIdsList.get(i)); + } + + accountsList = accountService.getAccountByIds(accountIds); + } else if (pagination == 1) { + + logger.info("Fetching details on basis of pagination."); + System.out.println(""); + System.out.println("Fetching details on basis of pagination."); + + if (pageState == null || pageState.equals("") || limit <= 0) { + + logger.info("Invalid input for pagination"); + logger.info("pageState : " + pageState); + logger.info("Limit : " + limit); + System.out.println(""); + System.out.println("Invalid input for pagination"); + System.out.println("limit : " + limit); + System.out.println("pageState : " + pageState); + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.INVALID_INPUT).setMessage("Your input is not valid.") + .build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } + + Map accountsMap = (pageState.equals("nil")) ? accountService.getAccountsByPagination(limit, null) : accountService.getAccountsByPagination(limit, pageState); + + if(accountsMap == null){ + + logger.info("No accounts found"); + logger.info(""); + + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } + + accountsList = (List) accountsMap.get("accounts"); + nextPageState = accountsMap.get("pageState").toString(); + + logger.info("Next page state : " + nextPageState); + System.out.println("Next page state : " + nextPageState); + + } else { + logger.info("Fetching all account Details."); + System.out.println("Fetching all account Details."); + System.out.println(""); + + accountsList = accountService.getAllAccounts(); + } + + logger.info("Accounts list size : " + accountsList.size()); + System.out.println("Accounts list size : " + accountsList.size()); + System.out.println(""); + + if (accountsList.size() <= 0) { + logger.info("No account details found : "); + System.out.println("No account details found : "); + System.out.println(""); + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } + + AccountsList.Builder accountsListBuilder = AccountsList.newBuilder(); + + for (Account account : accountsList) { + + /* accountsListBuilder.addAccountDetails(AccountDetails.newBuilder().setFirstName(account.getFirstName()) + .setLastName(account.getLastName()).setProfileId(account.getProfileId().toString()) + .setAccountId(account.getAccountId().toString()).setAuthenticationprovider(account.getAuthenticationProvider()) + .setAuthenticationprovidertype(account.getAuthenticationProviderType()) + .setUsername(account.getUsername()).build());*/ + + accountsListBuilder.addAccountDetails(AccountDetails.newBuilder().setFirstName((account.getFirstName() == null) ? "" : account.getFirstName()) + .setLastName((account.getLastName() == null) ? "" : account.getLastName()).setProfileId((account.getProfileId() == null) ? "" : account.getProfileId().toString()) + .setAccountId(account.getAccountId().toString()).setAuthenticationprovider((account.getAuthenticationProvider() == null) ? "" : account.getAuthenticationProvider()) + .setAuthenticationprovidertype((account.getAuthenticationProviderType() == null) ? "" : account.getAuthenticationProviderType()) + .setAccountMark((account.getAccountMark() != null) ? account.getAccountMark() : "").setAccountName((account.getAccountName() != null) ? account.getAccountName() : "") + .setAvatar((account.getAvatar() != null) ? account.getAvatar() : "").setCreationTimestamp((account.getCreationTimestamp() != null) ? account.getCreationTimestamp() : 0) + .setQrCode((account.getQrCode() != null) ? account.getQrCode() : "") + .setUsername(account.getUsername()).build()); + } + + if (nextPageState != null) { + accountsListBuilder.setNextPageState(nextPageState); + } + + accountsListBuilder.build(); + + AccountsResponse response = (errorResponse == null) ? AccountsResponse.newBuilder().setAccountsList(accountsListBuilder) + .build() : AccountsResponse.newBuilder().setError(errorResponse).build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + + } + + + @Override + @Permitted(role = RoleConstants.ANY) + public void searchByUsername(SearchByUsernameRequest request, + StreamObserver responseObserver) { + + logger.info("Search By Username Endpoint."); + logger.info(""); + + String username = request.getUsername(); + logger.info("Username : " + username); + + List accountsList = null; + String nextPageState = null; + ErrorResponse errorResponse = null; + + + accountsList = accountService.getAccountByUsername(username); + logger.info("Accounts-list : {}", accountsList); + + + if (accountsList == null) { + logger.info("Account list in null."); + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else if (accountsList.size() == 0) { + logger.info("Account list size is zero."); + + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else { + + AccountsList.Builder accountsListBuilder = AccountsList.newBuilder(); + for (Account account : accountsList) { + + System.out.println(""); + System.out.println("Account : "); + System.out.println(account); + System.out.println(""); + + accountsListBuilder.addAccountDetails(AccountDetails.newBuilder().setFirstName((account.getFirstName() == null) ? "" : account.getFirstName()) + .setLastName((account.getLastName() == null) ? "" : account.getLastName()).setProfileId((account.getProfileId() == null) ? "" : account.getProfileId().toString()) + .setAccountId(account.getAccountId().toString()).setAuthenticationprovider((account.getAuthenticationProvider() == null) ? "" : account.getAuthenticationProvider()) + .setAuthenticationprovidertype((account.getAuthenticationProviderType() == null) ? "" : account.getAuthenticationProviderType()) + .setAccountMark((account.getAccountMark() != null) ? account.getAccountMark() : "").setAccountName((account.getAccountName() != null) ? account.getAccountName() : "") + .setAvatar((account.getAvatar() != null) ? account.getAvatar() : "").setCreationTimestamp((account.getCreationTimestamp() != null) ? account.getCreationTimestamp() : 0) + .setQrCode((account.getQrCode() != null) ? account.getQrCode() : "") + .setUsername(account.getUsername()).build()); + } + + accountsListBuilder.build(); + + AccountsResponse response = (errorResponse == null) ? AccountsResponse.newBuilder().setAccountsList(accountsListBuilder) + .build() : AccountsResponse.newBuilder().setError(errorResponse).build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } + + } + + @Override + @Permitted(role = RoleConstants.ANY) + public void searchByFirstname(SearchByFirstNameRequest request, + StreamObserver responseObserver) { + + logger.info("Search By FirstName Endpoint."); + logger.info(""); + + String firstName = request.getFirstName(); + + logger.info("Firstname : " + firstName); + + List accountsList = null; + String nextPageState = null; + ErrorResponse errorResponse = null; + + accountsList = accountService.getAccountByFirstname(firstName); + logger.info("Accounts-list : {}", accountsList); + + + + if (accountsList == null) { + logger.info("Account list in null."); + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else if (accountsList.size() == 0) { + logger.info("Account list size is zero."); + + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else { + + AccountsList.Builder accountsListBuilder = AccountsList.newBuilder(); + for (Account account : accountsList) { + + accountsListBuilder.addAccountDetails(AccountDetails.newBuilder().setFirstName((account.getFirstName() == null) ? "" : account.getFirstName()) + .setLastName((account.getLastName() == null) ? "" : account.getLastName()).setProfileId((account.getProfileId() == null) ? "" : account.getProfileId().toString()) + .setAccountId(account.getAccountId().toString()).setAuthenticationprovider((account.getAuthenticationProvider() == null) ? "" : account.getAuthenticationProvider()) + .setAuthenticationprovidertype((account.getAuthenticationProviderType() == null) ? "" : account.getAuthenticationProviderType()) + .setAccountMark((account.getAccountMark() != null) ? account.getAccountMark() : "").setAccountName((account.getAccountName() != null) ? account.getAccountName() : "") + .setAvatar((account.getAvatar() != null) ? account.getAvatar() : "").setCreationTimestamp((account.getCreationTimestamp() != null) ? account.getCreationTimestamp() : 0) + .setQrCode((account.getQrCode() != null) ? account.getQrCode() : "") + .setUsername(account.getUsername()).build()); + } + + accountsListBuilder.build(); + + AccountsResponse response = (errorResponse == null) ? AccountsResponse.newBuilder().setAccountsList(accountsListBuilder) + .build() : AccountsResponse.newBuilder().setError(errorResponse).build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } + + + } + + @Override + @Permitted(role = RoleConstants.ANY) + public void searchByLastname(SearchByLastNameRequest request, + StreamObserver responseObserver) { + + logger.info("Search By LastName Endpoint."); + logger.info(""); + + String lastName = request.getLastName(); + + logger.info("Lastname : " + lastName); + + List accountsList = null; + String nextPageState = null; + ErrorResponse errorResponse = null; + + accountsList = accountService.getAccountByLastname(lastName); + logger.info("Accounts-list : {}", accountsList); + + + if (accountsList == null) { + logger.info("Account list in null."); + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else if (accountsList.size() == 0) { + logger.info("Account list size is zero."); + + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else { + + AccountsList.Builder accountsListBuilder = AccountsList.newBuilder(); + for (Account account : accountsList) { + + accountsListBuilder.addAccountDetails(AccountDetails.newBuilder().setFirstName((account.getFirstName() == null) ? "" : account.getFirstName()) + .setLastName((account.getLastName() == null) ? "" : account.getLastName()).setProfileId((account.getProfileId() == null) ? "" : account.getProfileId().toString()) + .setAccountId(account.getAccountId().toString()).setAuthenticationprovider((account.getAuthenticationProvider() == null) ? "" : account.getAuthenticationProvider()) + .setAuthenticationprovidertype((account.getAuthenticationProviderType() == null) ? "" : account.getAuthenticationProviderType()) + .setAccountMark((account.getAccountMark() != null) ? account.getAccountMark() : "").setAccountName((account.getAccountName() != null) ? account.getAccountName() : "") + .setAvatar((account.getAvatar() != null) ? account.getAvatar() : "").setCreationTimestamp((account.getCreationTimestamp() != null) ? account.getCreationTimestamp() : 0) + .setQrCode((account.getQrCode() != null) ? account.getQrCode() : "") + .setUsername(account.getUsername()).build()); + } + + accountsListBuilder.build(); + + AccountsResponse response = (errorResponse == null) ? AccountsResponse.newBuilder().setAccountsList(accountsListBuilder) + .build() : AccountsResponse.newBuilder().setError(errorResponse).build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } + + } + + @Override + @Permitted(role = RoleConstants.ANY) + public void searchByPhoneNumber(SearchByPhoneNumberRequest request, + StreamObserver responseObserver) { + + logger.info("Search By PhoneNumber Endpoint."); + logger.info(""); + + String phoneNumber = request.getPhoneNumber(); + + logger.info("Phonenumber : " + phoneNumber); + + List accountsList = null; + String nextPageState = null; + ErrorResponse errorResponse = null; + + accountsList = accountService.getAccountByAuthenticationProvider(phoneNumber); + logger.info("Accounts-list : {}", accountsList); + + + if (accountsList == null) { + logger.info("Account list in null."); + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else if (accountsList.size() == 0) { + logger.info("Account list size is zero."); + + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else { + + AccountsList.Builder accountsListBuilder = AccountsList.newBuilder(); + for (Account account : accountsList) { + + accountsListBuilder.addAccountDetails(AccountDetails.newBuilder().setFirstName((account.getFirstName() == null) ? "" : account.getFirstName()) + .setLastName((account.getLastName() == null) ? "" : account.getLastName()).setProfileId((account.getProfileId() == null) ? "" : account.getProfileId().toString()) + .setAccountId(account.getAccountId().toString()).setAuthenticationprovider((account.getAuthenticationProvider() == null) ? "" : account.getAuthenticationProvider()) + .setAuthenticationprovidertype((account.getAuthenticationProviderType() == null) ? "" : account.getAuthenticationProviderType()) + .setAccountMark((account.getAccountMark() != null) ? account.getAccountMark() : "").setAccountName((account.getAccountName() != null) ? account.getAccountName() : "") + .setAvatar((account.getAvatar() != null) ? account.getAvatar() : "").setCreationTimestamp((account.getCreationTimestamp() != null) ? account.getCreationTimestamp() : 0) + .setQrCode((account.getQrCode() != null) ? account.getQrCode() : "") + .setUsername(account.getUsername()).build()); + } + + accountsListBuilder.build(); + + AccountsResponse response = (errorResponse == null) ? AccountsResponse.newBuilder().setAccountsList(accountsListBuilder) + .build() : AccountsResponse.newBuilder().setError(errorResponse).build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } + } + + @Override + @Permitted(role = RoleConstants.ANY) + public void searchByEmail(SearchByEmailRequest request, + StreamObserver responseObserver) { + + logger.info("Search By Email Endpoint."); + logger.info(""); + + String email = request.getEmail().toLowerCase(); + + logger.info("Email : " + email); + + List accountsList = null; + String nextPageState = null; + ErrorResponse errorResponse = null; + + accountsList = accountService.getAccountByAuthenticationProvider(email); + logger.info("Account-list : {}", accountsList); + + + + if (accountsList == null) { + logger.info("Account list in null."); + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else if (accountsList.size() == 0) { + logger.info("Account list size is zero."); + + + errorResponse = ErrorResponse.newBuilder().setCause(ErrorResponse.Cause.ACCOUNTS_NOT_FOUND) + .setMessage("Accounts are not found").build(); + + AccountsResponse response = AccountsResponse.newBuilder().setError(errorResponse).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } else { + + AccountsList.Builder accountsListBuilder = AccountsList.newBuilder(); + for (Account account : accountsList) { + + accountsListBuilder.addAccountDetails(AccountDetails.newBuilder().setFirstName((account.getFirstName() == null) ? "" : account.getFirstName()) + .setLastName((account.getLastName() == null) ? "" : account.getLastName()).setProfileId((account.getProfileId() == null) ? "" : account.getProfileId().toString()) + .setAccountId(account.getAccountId().toString()).setAuthenticationprovider((account.getAuthenticationProvider() == null) ? "" : account.getAuthenticationProvider()) + .setAuthenticationprovidertype((account.getAuthenticationProviderType() == null) ? "" : account.getAuthenticationProviderType()) + .setAccountMark((account.getAccountMark() != null) ? account.getAccountMark() : "").setAccountName((account.getAccountName() != null) ? account.getAccountName() : "") + .setAvatar((account.getAvatar() != null) ? account.getAvatar() : "").setCreationTimestamp((account.getCreationTimestamp() != null) ? account.getCreationTimestamp() : 0) + .setQrCode((account.getQrCode() != null) ? account.getQrCode() : "") + .setUsername(account.getUsername()).build()); + } + + accountsListBuilder.build(); + + AccountsResponse response = (errorResponse == null) ? AccountsResponse.newBuilder().setAccountsList(accountsListBuilder) + .build() : AccountsResponse.newBuilder().setError(errorResponse).build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + return; + + } + } + + +} diff --git a/src/main/java/biz/nynja/account/services/admin/repository/AdminAccountRepository.java b/src/main/java/biz/nynja/account/services/admin/repository/AdminAccountRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..faf8afc50983dd4188d47da4871ce077ecd9e748 --- /dev/null +++ b/src/main/java/biz/nynja/account/services/admin/repository/AdminAccountRepository.java @@ -0,0 +1,212 @@ +package biz.nynja.account.services.admin.repository; + +import biz.nynja.account.models.Account; +import com.datastax.driver.core.PagingState; +import com.datastax.driver.core.Statement; +import com.datastax.driver.core.querybuilder.QueryBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.cassandra.core.CassandraTemplate; +import org.springframework.data.cassandra.core.query.CassandraPageRequest; +import org.springframework.data.cassandra.core.query.Criteria; +import org.springframework.data.cassandra.core.query.Query; +import org.springframework.data.domain.Slice; +import org.springframework.stereotype.Service; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +/** + * This Admin Account Repository contains account search functions for + * market admin panel to filter accounts while broadcasting message + * + * @author Jayendra + * @since 2019-12-04 + */ + + +@Service +public class AdminAccountRepository { + + @Autowired + private CassandraTemplate cassandraTemplate; + + private static final Class ENTITY_CLASS = Account.class; + private static final Logger logger = LoggerFactory.getLogger(AdminAccountRepository.class); + + + public List getAccountByAccountId(UUID accountId) { + + Statement statement = QueryBuilder.select().from("account") + .where(QueryBuilder.eq("accountid", accountId)); + + return cassandraTemplate.select(statement, ENTITY_CLASS); + } + + public List getAccountByAuthenticationProvider(String authenticationprovider) { + + Statement statement = QueryBuilder.select().from("accountbyauthenticationprovider") + .where(QueryBuilder.eq("authenticationprovider", authenticationprovider)); + + return cassandraTemplate.select(statement, ENTITY_CLASS); + + } + + public List getAccountByUsername(String username) { + + Statement statement = QueryBuilder.select().from("accountbyusername") + .where(QueryBuilder.eq("username", username)); + + return cassandraTemplate.select(statement, ENTITY_CLASS); + + } + + public List getAccountByFirstname(String firstname) { + + Statement statement = QueryBuilder.select().from("accountbyfirstname") + .where(QueryBuilder.eq("firstname", firstname)); + + return cassandraTemplate.select(statement, ENTITY_CLASS); + + } + + public List getAccountByLastname(String lastname) { + + Statement statement = QueryBuilder.select().from("accountbylastname") + .where(QueryBuilder.eq("lastname", lastname)); + + return cassandraTemplate.select(statement, ENTITY_CLASS); + + } + + + public List getAllAccounts() { + String getAllAccounts = "SELECT * FROM " + cassandraTemplate.getTableName(ENTITY_CLASS).toString() + ""; + return (List) cassandraTemplate.select(getAllAccounts, ENTITY_CLASS); + } + + public List getAccountByIds(UUID[] acccountIds) { + + Query query = Query.query(Criteria.where("accountid").in(acccountIds)); + return (List) cassandraTemplate.select(query, ENTITY_CLASS); + } + + + public long getAllAccountsSize() { + + return cassandraTemplate.count(ENTITY_CLASS); + + } + + public List getAccountsByCreationTimeStamp(long fromCreationTime, long toCreationTime) { + + Statement statement = QueryBuilder.select().from("accountbycreationtimestamp") + .where(QueryBuilder.gte("creationtimestamp", fromCreationTime)) + .and(QueryBuilder.lte("creationtimestamp", toCreationTime)).allowFiltering(); + + return cassandraTemplate.select(statement, ENTITY_CLASS); + } + + + public Map getAccountsByCreationTimeStampPagination(long fromCreationTime, long toCreationTime, int fetchSize, String pageState) { + + Statement statement = QueryBuilder.select().from("accountbycreationtimestamp") + .where(QueryBuilder.gte("creationtimestamp", fromCreationTime)) + .and(QueryBuilder.lte("creationtimestamp", toCreationTime)).allowFiltering().setFetchSize(fetchSize); + + if (pageState != null) { + statement.setPagingState(PagingState.fromString(pageState)); + } + + Slice accounts = cassandraTemplate.slice(statement, ENTITY_CLASS); + List accountsList = accounts.getContent(); + + + if (accountsList != null) { + logger.info("Content Size : {}", accountsList.size()); + } + + logger.info("Accounts has next : {}", accounts.hasNext()); + + Map accountsPagedData = new HashMap<>(2); + + String nextPageState = null; + + if (accountsList == null || accountsList.size() == 0) { + logger.info("No more content in accounts pagination"); + System.out.println(""); + System.out.println("No more data in accounts pagination"); + return null; + + } else if (accountsList.size() < fetchSize) { + logger.info("No more content in next page"); + System.out.println(""); + System.out.println("No more data in next page"); + + nextPageState = "end"; + + } else { + + CassandraPageRequest next = (CassandraPageRequest) accounts.nextPageable(); + nextPageState = next.getPagingState().toString(); + } + + accountsPagedData.put("pageState", nextPageState); + accountsPagedData.put("accounts", accountsList); + + return accountsPagedData; + + } + + + public Map getAccountsByPagination(int fetchSize, String pageState) { + + com.datastax.driver.core.Statement select = QueryBuilder.select().from(cassandraTemplate.getTableName(ENTITY_CLASS).toString()).setFetchSize(fetchSize); + + if (pageState != null) { + select.setPagingState(PagingState.fromString(pageState)); + } + + Slice accounts = cassandraTemplate.slice(select, ENTITY_CLASS); + List accountsList = accounts.getContent(); + + if (accountsList != null) { + logger.info("Content Size : {}", accountsList.size()); + } + logger.info("Accounts has next : {}", accounts.hasNext()); + + + Map accountsPagedData = new HashMap<>(2); + + String nextPageState = null; + + if (accountsList == null || accountsList.size() == 0) { + logger.info("No more content in accounts pagination"); + System.out.println(""); + System.out.println("No more data in accounts pagination"); + return null; + + } else if (accountsList.size() < fetchSize) { + logger.info("No more content in next page"); + System.out.println(""); + System.out.println("No more data in next page"); + + nextPageState = "end"; + + } else { + + CassandraPageRequest next = (CassandraPageRequest) accounts.nextPageable(); + nextPageState = next.getPagingState().toString(); + } + + accountsPagedData.put("pageState", nextPageState); + accountsPagedData.put("accounts", accountsList); + + return accountsPagedData; + } + + +} + 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 cdcb8ea11eb4fbb575cc122c8e353a2f7d260d5a..38980c69a04da1486e86f234154dc6565455d395 100644 --- a/src/main/java/biz/nynja/account/services/decomposition/AccountCreator.java +++ b/src/main/java/biz/nynja/account/services/decomposition/AccountCreator.java @@ -68,6 +68,11 @@ public class AccountCreator { phoneNumberNormalizer.getNormalizedPhoneNumber(request.getAuthenticationProvider())) .build(); request = newRequest; + } else if (request.getAuthenticationType() == AuthenticationType.EMAIL) { + request = request + .toBuilder() + .setAuthenticationProvider(request.getAuthenticationProvider().toLowerCase()) + .build(); } CreatePendingAccountResponse response = updateAndValidatePendingAccountCreation(request); diff --git a/src/main/proto/admin_account2.proto b/src/main/proto/admin_account2.proto new file mode 100644 index 0000000000000000000000000000000000000000..86e35723565b2dc2db8ebaee91dcac0d0bfbcd45 --- /dev/null +++ b/src/main/proto/admin_account2.proto @@ -0,0 +1,144 @@ +syntax = "proto3"; + +option java_package = "biz.nynja.account2.admin.grpc"; +option java_multiple_files = true; + + +/* Each user could have one or more roles listed bellow: */ +enum Role { + UNKNOWN_ROLE = 0; + USER = 1; // regular user + ACCOUNT_ADMIN = 2; // this role must be treated as account admin + AUTH_SERVICE = 3; // role used by the authentication service + AUTHENTICATION_ADMIN = 4; // this role must be treated as authentication admin +} + +message Date { + int32 year = 1; // year in format YYYY i.e 2019 + int32 month = 2; //month: from 1(January) to 12(December) + int32 day = 3; // valid day with value from 1 to 31 +} + + +enum AccessStatus { + UNKNOWN_ACCESS_STATUS = 0; + ENABLED = 1; // Regular running user. + SUSPENDED = 2; // Behaves exactly as deleted for certain period. + DISABLED = 3; // All requests from such user are discarded including login. +} + +enum ContactType { + MISSING_CONTACT_TYPE = 0; + PHONE_CONTACT = 1; + EMAIL_CONTACT = 2; + FACEBOOK_CONTACT = 3; + GOOGLEPLUS_CONTACT = 4; + TWITTER_CONTACT = 5; +} + +message ContactDetails { + ContactType type = 1; + string value = 2; // depends on the contact type. For example phone number when type is PHONE etc. + /* The label is not mandatory. It could be used only when type field is set to 'PHONE_CONTACT'. + * The value of this label should clarify the phone number: for example "work", "home" etc. */ + string label = 3; + string countrySelector = 4; // This is country selector for phone number contact info (selectors like BG, US and so on) +} + +message AccountDetails { + string accountId = 1; // account id + string profileId = 2; // profile id + string firstName = 3; // User's first name + string lastName = 4; // User's last name + string username = 5; // Unique identifier + string authenticationprovider = 6; + string authenticationprovidertype = 7; + AccessStatus accessStatus = 8; + string accountMark = 9; + string accountName = 10; + string avatar = 11; + Date birthday = 12; + repeated ContactDetails contactsInfo = 13; // Contacts that belong to the account + int64 creationTimestamp = 14; // Creation timestamp is set when account is created. + int64 lastUpdateTimestamp = 15; // Update timestamp is '0' if account is never updated. + string qrCode = 16; // Unique identifier that is used for generation of the QR + repeated Role roles = 17; // Array of Roles that belongs to the account +} + +message AccountsList { + repeated AccountDetails accountDetails = 1; + string nextPageState = 2; // pageState of next page if pagination is enabled in request. + +} + +message AccountsResponse { + oneof result { + ErrorResponse error = 1; + AccountsList accountsList = 2; + } +} + +message ErrorResponse { + enum Cause { + INTERNAL_SERVER_ERROR = 0; + INVALID_INPUT = 1; + ACCOUNTS_NOT_FOUND = 2; + } + Cause cause = 1; + string message = 2; +} + +message GetAllAccountsRequest { + + repeated string accountIds = 1; // Fetch details by given accountids + int32 allAccounts = 2; // Fetch all account details + int32 pagination = 3; // Do pagination 1 -> true, 0 -> false + int32 limit = 4; // (required only in case of pagination) Number of records in a page + string pageState = 5; // (required only in case of pagination) Defines next page, pageState = 'nil' incase of first page. + +} + +message SearchByUsernameRequest { + string username = 1; +} + +message SearchByFirstNameRequest { + string firstName = 1; +} + +message SearchByLastNameRequest { + string lastName = 1; +} + +message SearchByPhoneNumberRequest { + string phoneNumber = 1; +} + +message SearchByEmailRequest { + string email = 1; +} + +message SearchByAccountIdRequest { + string accountId = 1; +} + +message GetAccountsByCreationTime { + int64 fromCreationTime = 1; + int64 toCreationTime = 2; + int32 pagination = 3; // Do pagination 1 -> true, 0 -> false + int32 limit = 4; // (required only in case of pagination) Number of records in a page + string pageState = 5; // (required only in case of pagination) Defines next page, pageState = 'nil' incase of first page. +} + +service AdminAccountService2 { + rpc getAccounts (GetAllAccountsRequest) returns (AccountsResponse); + rpc getAccountsByCreationTime (GetAccountsByCreationTime) returns (AccountsResponse); + rpc searchByUsername (SearchByUsernameRequest) returns (AccountsResponse); + rpc searchByFirstname (SearchByFirstNameRequest) returns (AccountsResponse); + rpc searchByLastname (SearchByLastNameRequest) returns (AccountsResponse); + rpc searchByPhoneNumber (SearchByPhoneNumberRequest) returns (AccountsResponse); + rpc searchByEmail (SearchByEmailRequest) returns (AccountsResponse); + rpc searchByAccountId (SearchByAccountIdRequest) returns (AccountsResponse); +} + + diff --git a/src/test/java/biz/nynja/account/services/AccountServiceTests.java b/src/test/java/biz/nynja/account/services/AccountServiceTests.java index 148df8dd1465d7bf09e2d816b99ff2bae34cad22..b1a1f30ced5c9015b41a8b4c9ec400a9d49e82cb 100644 --- a/src/test/java/biz/nynja/account/services/AccountServiceTests.java +++ b/src/test/java/biz/nynja/account/services/AccountServiceTests.java @@ -111,7 +111,7 @@ import io.grpc.Metadata; import io.grpc.stub.MetadataUtils; /** - * AccountService unit tests. + * AdminAccountRepository unit tests. */ @RunWith(SpringRunner.class)