Esempio n. 1
0
        public UserTokenTransaction AddTokenTransaction(long userId, DateTime addedDate,
                                                        DateTime confirmedDate, TokenTransactionInsertModel model, TokenTransactionType transactionType)
        {
            var tokenTransaction = _mapper.Map <TokenTransactionInsertModel, UserTokenTransaction>(model);

            tokenTransaction.CustomerId      = userId;
            tokenTransaction.AddedDate       = addedDate;
            tokenTransaction.ConfirmedDate   = confirmedDate;
            tokenTransaction.TransactionType = transactionType;

            _context.UserTokenTransactions.Add(tokenTransaction);

            var user = _context.Users.FirstOrDefault(u => u.Id == userId);

            if (user == null)
            {
                throw new UserDoesNotExistException();
            }
            if (transactionType == TokenTransactionType.Add)
            {
                user.Balance += model.Amount;
            }
            else
            {
                user.Balance -= model.Amount;
            }

            _context.Users.Update(user);
            _context.SaveChanges();
            return(tokenTransaction);
        }
        public async Task <IActionResult> CreateTokenPurchaseRequest([FromBody] TokenTransactionInsertModel model)
        {
            var userId = long.Parse(User.Claims.First().Subject.Name);
            var result = await _tokenService.CreateTokenPurchaseRequest(userId, model);

            return(ApiResponder.RespondSuccess(result));
        }
Esempio n. 3
0
 public async Task <UserTokenTransactionModel> CreateTokenTransaction(long userId,
                                                                      TokenTransactionInsertModel model, TokenTransactionType transactionType)
 {
     using (var transaction = await _context.Database.BeginTransactionAsync())
     {
         try
         {
             var currentDateTime  = DateTime.UtcNow;
             var tokenTransaction = _tokenHelper.AddTokenTransaction(userId, currentDateTime,
                                                                     currentDateTime, model, transactionType);
             transaction.Commit();
             return(_mapper.Map <UserTokenTransaction, UserTokenTransactionModel>(tokenTransaction));
         }
         catch (Exception)
         {
             transaction.Rollback();
             throw;
         }
     }
 }
Esempio n. 4
0
        public async Task <UserTokenTransactionModel> CreateTokenPurchaseRequest(long userId,
                                                                                 TokenTransactionInsertModel model)
        {
            using (var transaction = await _context.Database.BeginTransactionAsync())
            {
                try
                {
                    var pendingTokenPurchaseRequestCount = await _context.UserTokenTransactions.Where(utt =>
                                                                                                      utt.CustomerId == userId && utt.ConfirmedDate < utt.AddedDate && utt.CancelledDate < utt.AddedDate).LongCountAsync();

                    if (pendingTokenPurchaseRequestCount > 0)
                    {
                        throw new PendingTokenTransactionExistsException();
                    }

                    var currentDate      = DateTime.UtcNow;
                    var tokenTransaction = _mapper.Map <TokenTransactionInsertModel, UserTokenTransaction>(model);
                    tokenTransaction.CustomerId        = userId;
                    tokenTransaction.AddedDate         = currentDate;
                    tokenTransaction.TransactionType   = TokenTransactionType.Add;
                    tokenTransaction.IsPurchaseRequest = true;

                    _context.UserTokenTransactions.Add(tokenTransaction);
                    await _context.SaveChangesAsync();

                    transaction.Commit();

                    return(_mapper.Map <UserTokenTransaction, UserTokenTransactionModel>(tokenTransaction));
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }
        public async Task <IActionResult> CreateSpecificUserTokenTransaction(long userId, [FromBody] TokenTransactionInsertModel model, TokenTransactionType transactionType)
        {
            var result = await _tokenService.CreateTokenTransaction(userId, model, transactionType);

            return(ApiResponder.RespondSuccess(result));
        }
Esempio n. 6
0
        public async Task <OrderReturnModel> Checkout(long userId, CheckoutTransferModel model)
        {
            using (var transaction = await _context.Database.BeginTransactionAsync())
            {
                try
                {
                    var order = await _context.Orders
                                .Include(o => o.Customer)
                                .Include(o => o.OrderItems)
                                .ThenInclude(oi => oi.Product)
                                .FirstOrDefaultAsync(o =>
                                                     o.CustomerId == userId && o.AddedDate > o.CheckedOutDate && o.AddedDate > o.ConfirmedDate &&
                                                     o.AddedDate > o.CancelledDate);

                    if (order == null)
                    {
                        order = new Order
                        {
                            AddedDate  = DateTime.UtcNow,
                            CustomerId = userId
                        };

                        _context.Orders.Add(order);
                        _context.SaveChanges();

                        order = await _context.Orders
                                .Include(o => o.Customer)
                                .Include(o => o.OrderItems)
                                .ThenInclude(oi => oi.Product)
                                .FirstOrDefaultAsync(o =>
                                                     o.CustomerId == userId && o.AddedDate > o.CheckedOutDate && o.AddedDate > o.ConfirmedDate &&
                                                     o.AddedDate > o.CancelledDate);
                    }

                    foreach (var item in model.Items)
                    {
                        var product = await _context.Products.FirstOrDefaultAsync(p => p.Id == item.ProductId);

                        if (product == null)
                        {
                            throw new ProductNotFoundException();
                        }

                        if (product.Deprecated)
                        {
                            throw new ProductIsDeprecatedException();
                        }

                        if (product.OutOfStock)
                        {
                            throw new ProductIsOutOfStockException();
                        }

                        var orderItem = _mapper.Map <OrderItemTransferModel, OrderItem>(item);
                        orderItem.OrderId     = order.Id;
                        orderItem.SinglePrice = product.Price;

                        _context.OrderItems.Add(orderItem);
                    }

                    var totalPrice = order.OrderItems.Sum(oi => oi.SinglePrice * oi.Quantity);
                    if (totalPrice > order.Customer.Balance)
                    {
                        throw new InsufficientBalanceException();
                    }

                    order.CustomerName   = model.Name;
                    order.Address        = model.Address;
                    order.Notes          = model.Notes;
                    order.CheckedOutDate = DateTime.UtcNow;

                    // Updating balance
                    var currentDateTime             = DateTime.UtcNow;
                    var tokenTransactionInsertModel = new TokenTransactionInsertModel
                    {
                        Amount = totalPrice,
                        Notes  = $"Payment for order with ID : {order.Id}"
                    };
                    _tokenHelper.AddTokenTransaction(userId, currentDateTime,
                                                     currentDateTime, tokenTransactionInsertModel, TokenTransactionType.Subtract);

                    _context.Orders.Update(order);
                    _context.Users.Update(order.Customer);
                    await _context.SaveChangesAsync();

                    transaction.Commit();

                    var populatedCart = await _context.Orders
                                        .Include(o => o.OrderItems)
                                        .ThenInclude(oi => oi.Product)
                                        .Include(o => o.Customer)
                                        .FirstOrDefaultAsync(o => o.Id == order.Id);

                    return(_mapper.Map <Order, OrderReturnModel>(populatedCart));
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }