Example #1
0
        public async Task <Transaction> AddStakeTransaction(
            string userId,
            double amountInUserCurrency,
            string description)
        {
            ServiceValidator.IsInputStringEmptyOrNull(userId);
            ServiceValidator.IsInputStringEmptyOrNull(description);
            ServiceValidator.CheckStringLength(description, 10, 100);
            ServiceValidator.ValueIsBetween(amountInUserCurrency, 0, double.MaxValue);

            var userWin = await this.dbContext.Users
                          .Include(w => w.Wallet)
                          .ThenInclude(w => w.Currency)
                          .FirstOrDefaultAsync(u => u.Id == userId && u.IsDeleted != true);

            ServiceValidator.ObjectIsNotEqualNull(userWin);

            var userCurrency = userWin.Wallet.Currency.Name;
            var bankRates    = await this.currencyService.GetRatesAsync();

            double normalisedCurrency = 0;

            if (bankRates.ContainsKey(userCurrency))
            {
                double normalisedUserCurrency = bankRates[userCurrency];
                normalisedCurrency = amountInUserCurrency / normalisedUserCurrency;
            }
            else
            {
                throw new EntityCurrencyNotFoundException("Unknown user currency");
            }

            var newTransaction = new Transaction()
            {
                UserId            = userId,
                OriginalAmount    = amountInUserCurrency,
                Description       = description,
                TransactionTypeId = 2,
                NormalisedAmount  = normalisedCurrency
            };

            userWin.Wallet.NormalisedBalance -= normalisedCurrency;
            userWin.Wallet.DisplayBalance     = userWin.Wallet.NormalisedBalance * bankRates[userCurrency];

            if (userWin.Wallet.NormalisedBalance < 0)
            {
                throw new InsufficientFundsException("Insufficient funds for the requested operation");
            }
            else
            {
                await this.dbContext.Transactions.AddAsync(newTransaction);

                await this.dbContext.SaveChangesAsync();

                return(newTransaction);
            }
        }
Example #2
0
        public async Task <Transaction> AddDepositTransaction(
            string userId,
            string cardId,
            double amountInUserCurrency,
            string description)
        {
            ServiceValidator.IsInputStringEmptyOrNull(userId);
            ServiceValidator.IsInputStringEmptyOrNull(cardId);
            ServiceValidator.IsInputStringEmptyOrNull(description);
            ServiceValidator.CheckStringLength(description, 10, 100);
            ServiceValidator.ValueIsBetween(amountInUserCurrency, 0, double.MaxValue);

            var userWin = await this.dbContext.Users
                          .Include(w => w.Wallet)
                          .ThenInclude(wall => wall.Currency)
                          .FirstOrDefaultAsync(u => u.Id == userId && u.IsDeleted != true);

            var bankCard = await this.dbContext.BankCards.FirstOrDefaultAsync(bc => bc.Id == cardId);

            ServiceValidator.ObjectIsNotEqualNull(userWin);
            ServiceValidator.ObjectIsNotEqualNull(bankCard);

            var userCurrency = userWin.Wallet.Currency.Name;
            var bankRates    = await this.currencyService.GetRatesAsync();

            double normalisedCurrency = 0;

            if (bankRates.ContainsKey(userCurrency))
            {
                double normalisedUserCurrency = bankRates[userCurrency];
                normalisedCurrency = amountInUserCurrency / normalisedUserCurrency;
            }
            else
            {
                throw new EntityCurrencyNotFoundException("Unknown user currency");
            }

            var newTransaction = new Transaction()
            {
                UserId            = userId,
                OriginalAmount    = amountInUserCurrency,
                Description       = description,
                TransactionTypeId = 3,
                NormalisedAmount  = normalisedCurrency,
                CardId            = bankCard.Id
            };

            userWin.Wallet.NormalisedBalance += normalisedCurrency;
            userWin.Wallet.DisplayBalance     = userWin.Wallet.NormalisedBalance * bankRates[userCurrency];
            bankCard.MoneyAdded += amountInUserCurrency;

            await this.dbContext.Transactions.AddAsync(newTransaction);

            await this.dbContext.SaveChangesAsync();

            return(newTransaction);
        }
Example #3
0
        public async Task <IEnumerable <Transaction> > GetTransactionByType(string transactionTypeName)
        {
            ServiceValidator.IsInputStringEmptyOrNull(transactionTypeName);
            ServiceValidator.CheckStringLength(transactionTypeName, 3, 20);

            var transactionsQuery = await this.dbContext
                                    .Transactions
                                    .Where(t => t.TransactionType.Name == transactionTypeName && t.IsDeleted != true)
                                    .ToListAsync();

            ServiceValidator.ValueNotEqualZero(transactionsQuery.Count());

            return(transactionsQuery);
        }
Example #4
0
        public async Task <BankCard> AddCard(string cardNumber, string userId, DateTime expiration)
        {
            ServiceValidator.IsInputStringEmptyOrNull(cardNumber);
            ServiceValidator.CheckStringLength(cardNumber, 16, 16);
            ServiceValidator.ValidateCardNumber(cardNumber);
            ServiceValidator.IsInputStringEmptyOrNull(userId);
            ServiceValidator.CheckCardExpirationDate(expiration);

            var bankCard = new BankCard()
            {
                CardNumber = cardNumber,
                UserId     = userId,
                Expiration = expiration,
                IsDeleted  = false,
            };

            await this.dbContext.BankCards.AddAsync(bankCard);

            await this.dbContext.SaveChangesAsync();

            return(bankCard);
        }