private async Task <EWallet> GenerateEWalletForTransactionStatusUpdate(TransactionStatusResource resource)
        {
            var existingTopUpHistoryList = await FindByTopUpTransactionIdAsync(resource.TransactionId);

            if (!existingTopUpHistoryList.Any())
            {
                var errorMessage = string.Format(Constants.TransactionIdNotExists, resource.TransactionId);
                throw new Exception(errorMessage);
            }

            var existingTopUpHistory = existingTopUpHistoryList.OrderByDescending(p => p.ActionDate).FirstOrDefault();
            var eWallet = await _eWalletRepository.FindByUserIdAsync(existingTopUpHistory.UserId);

            if (ExistSuccessTopUpTransactionId(resource.TransactionId, eWallet.TopUpHistories))
            {
                return(eWallet);
            }

            var topUpHistory = eWallet.TopUpHistories.OrderByDescending(p => p.ActionDate).FirstOrDefault();

            eWallet.Balance       += resource.Status == Status.Success ? existingTopUpHistory.Amount : 0;
            eWallet.LastUpdateDate = resource.ActionDate;

            topUpHistory.Status     = resource.Status;
            topUpHistory.ActionDate = resource.ActionDate;

            _eWalletRepository.AddOrUpdateEWallet(eWallet, false);

            return(eWallet);
        }
        public async Task <SaveTransactionResponse> SaveTopUpTransactionStatus(TransactionStatusResource resource)
        {
            try
            {
                var eWallet = await GenerateEWalletForTransactionStatusUpdate(resource);

                await _unitOfWork.CompleteAsync();

                return(new SaveTransactionResponse(eWallet));
            }
            catch (Exception ex)
            {
                var errorMessage = string.Format(Constants.TopUpWrapperErrMsg, ex.Message);
                _logger.LogError(errorMessage);
                return(new SaveTransactionResponse(
                           errorMessage));
            }
        }
        public IActionResult UpdateTopUpStatus([FromBody] TransactionStatusResource resource)
        {
            _logger.LogInformation("updateTopUpStatus Request:" + JsonConvert.SerializeObject(resource));

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState.GetErrorMessages()));
            }

            var result = _eWalletService.SaveTopUpTransactionStatus(resource).GetAwaiter().GetResult();

            if (!result.BaseResponse.Success)
            {
                return(BadRequest(result.BaseResponse.Message));
            }

            var eWalletResource = _mapper.Map <EWallet, TopUpDeductionResource>(result.EWallet);

            eWalletResource.TransactionId = resource.TransactionId;
            _logger.LogInformation("updateTopUpStatus Response:" + JsonConvert.SerializeObject(eWalletResource));

            return(Ok(eWalletResource));
        }