public ActionResult Detail(AuctionItemDetailModel auctionItem)
        {
            var dalAuctionItem = AuctionItemRepository.Instance.Select(auctionItem.Id);

            if (auctionItem.NewBidding != null)
            {
                if (string.IsNullOrEmpty(auctionItem.NewBidding.BiddingPhoneNumber) && string.IsNullOrEmpty(auctionItem.NewBidding.BiddingMobileNumber))
                {
                    ModelState.AddModelError("NewBidding.BiddingPhoneNumber", "Een telefoonnummer is verplicht");
                    ModelState.AddModelError("NewBidding.BiddingMobileNumber", string.Empty);
                }

                if (ModelState.IsValidField("NewBidding.Bidding"))
                {
                    var highestBid = AuctionItemBiddingRepository.Instance.SelectHighest(auctionItem.Id);
                    if (highestBid != null)
                    {
                        // Now check if higher than highest bid so far
                        if (auctionItem.NewBidding.Bidding <= highestBid.Bidding)
                        {
                            ModelState.AddModelError("NewBidding.Bidding", string.Format("Bieding moet hoger zijn dan € {0}", highestBid.Bidding));
                        }
                    }
                    else
                    {
                        // Check if minimum bid is reached
                        var minimumBidToUse = Math.Max(dalAuctionItem.MinimumPrice, (decimal)0.01);

                        if (auctionItem.NewBidding.Bidding < minimumBidToUse)
                        {
                            ModelState.AddModelError("NewBidding.Bidding", string.Format("Bieding moet minimaal € {0} zijn", minimumBidToUse));
                        }
                    }
                }

                if (ModelState.IsValid)
                {
                    var dalEntity = auctionItem.NewBidding.ToDalEntity(auctionItem.Id);
                    AuctionItemBiddingRepository.Instance.Save(dalEntity);

                    AuctionHub.UpdateAuctionHighestBid(auctionItem.Id, dalEntity.Date, dalEntity.Bidding);

                    MailHelper.SendBidConfirmationMail(dalEntity.Id);
                    MailHelper.SendNewBidMails(auctionItem.Id, dalEntity.BiddingEmail);

                    return(RedirectToAction("Detail", new { id = auctionItem.Id }));
                }
            }

            return(View(new AuctionItemDetailModel(dalAuctionItem)));
        }
Ejemplo n.º 2
0
        public async Task SignalR_BiddingTest()
        {
            Mock <IHubCallerClients> mockClients     = new Mock <IHubCallerClients>();
            Mock <IClientProxy>      mockClientProxy = new Mock <IClientProxy>();

            mockClients.Setup(clients => clients.All).Returns(mockClientProxy.Object);

            AuctionHub hub = new AuctionHub()
            {
                Clients = mockClients.Object
            };

            await hub.SendBidding("User1", 10.0M);

            // assert
            mockClients.Verify(clients => clients.All, Times.Once);
            mockClientProxy.Verify(clientProxy => clientProxy.SendAsync("ReceiveBidding", default(CancellationToken)), Times.Once);
        }
Ejemplo n.º 3
0
 public void Execute(IJobExecutionContext context)
 {
     using (var _db = new ApplicationDbContext())
     {
         var auctions = _db.Auctions.Where(item => !item.IsFinished);
         foreach (var auction in auctions)
         {
             if (auction.DateEnd <= DateTime.UtcNow)
             {
                 AuctionHub.FinishAuction(auction.Id);
                 if (auction.LastBuyer != null)
                 {
                     auction.IsFinished = true;
                     _db.Orders.Add(new Order
                     {
                         Amount          = auction.Product.Amount,
                         BuyerId         = auction.BuyerId,
                         FullPrice       = auction.Product.Amount * auction.Product.Price,
                         ProductId       = auction.Id,
                         ShippingAddress = auction.LastBuyer.User.Address,
                         Status          = OrderStatus.InProccess
                     });
                     var product = _db.Products.Find(auction.Id);
                     product.Amount -= product.Amount;
                 }
                 else
                 {
                     auction.IsStarted = false;
                 }
             }
             else if (auction.DateStart <= DateTime.UtcNow && auction.DateEnd >= DateTime.UtcNow && !auction.IsStarted)
             {
                 auction.IsStarted = true;
                 AuctionHub.BeginAuction(auction.Id);
             }
             else if (auction.IsStarted)
             {
                 AuctionHub.RefreshAuction(auction.Id, auction.DateEnd, auction.LastBid, auction.LastBuyer?.User.UserName);
             }
         }
         _db.SaveChanges();
     }
 }
Ejemplo n.º 4
0
        public void AuctionTest()
        {
            AuctionViewModel auctionViewModel = new AuctionViewModel();

            bool updateCalled = false;
            var  hub          = new AuctionHub();
            var  mockClients  = new Mock <IHubCallerConnectionContext <dynamic> >();

            hub.Clients = mockClients.Object;
            dynamic all = new ExpandoObject();

            //all.placebid = new action<string, string>((price, name) => {
            //    updatecalled = true;
            //});
            all.addMessage = new Action <string>((message) =>
            {
                updateCalled = true;
            });
            mockClients.Setup(m => m.All).Returns((ExpandoObject)all);
            //hub.PlaceBid("20", "user");
            hub.AddMessage("Test Message");
            Assert.IsTrue(updateCalled);
        }
Ejemplo n.º 5
0
        public async Task <ActionResult> Bid(string id, decimal increment, decimal expVal)
        {
            if (increment <= 0 || expVal <= 0)
            {
                return(HttpNotFound());
            }
            var status = "OK";

            using (var trans = Db.Database.BeginTransaction())
            {
                try
                {
                    var auction = await Db.Auctions.Include(x => x.LastBidder).Include(x => x.User).FirstOrDefaultAsync(x => x.Id == id);

                    var currencyPrice = auction.CurrencyPrice;
                    var user          = await UserManager.FindByIdAsync(User.Identity.GetUserId());

                    if (auction == null || auction.RealStatus == Auction.AuctionStatus.READY || user.Id == auction.User.Id)
                    {
                        trans.Rollback();
                        return(HttpNotFound());
                    }
                    var avlMoney = user.Tokens * auction.CurrencyPrice;
                    if (auction.RealStatus == Auction.AuctionStatus.COMPLETED)
                    {
                        status = "ERR:Auction has ended";
                    }
                    else if (auction.CurrentAmmount != expVal)
                    {
                        status = "ERR:Somebody overtook you to this bid";
                    }
                    else if (auction.CurrentAmmount + increment > avlMoney && (auction.LastBidder == null || auction.LastBidder.Id != user.Id))
                    {
                        status = "ERR:Not enough tokens";
                    }
                    else if (auction.LastBidder != null && auction.LastBidder.Id == user.Id && avlMoney < increment)
                    {
                        status = "ERR:Not enough tokens";
                    }
                    else
                    {
                        var newId = Guid.NewGuid().ToString();
                        Db.Bids.Add(new Models.Bid
                        {
                            Id        = newId,
                            AuctionId = auction.Id,
                            Increment = increment,
                            TimeStamp = DateTime.Now,
                            UserId    = user.Id
                        });
                        if (auction.LastBidder != null)
                        {
                            auction.LastBidder.Tokens += auction.CurrentAmmount / currencyPrice;
                            auction.User.Tokens       -= auction.CurrentAmmount / currencyPrice;
                        }
                        auction.CurrentAmmount += increment;
                        var prevBidder = auction.LastBidder != null?auction.LastBidder.Id:"";
                        auction.LastBidder         = user;
                        auction.LastBidder.Tokens -= auction.CurrentAmmount / currencyPrice;
                        auction.User.Tokens       += auction.CurrentAmmount / currencyPrice;
                        AuctionHub.PriceUpdate(id, auction.CurrentAmmount, auction.LastBidder != null ? auction.LastBidder.FirstName + " " + auction.LastBidder.LastName : auction.User.FirstName + " " + auction.User.LastName, prevBidder, auction.CurrentAmmount / currencyPrice);
                    }
                    await Db.SaveChangesAsync();

                    trans.Commit();
                    var response = new {
                        status     = status,
                        ammount    = auction.CurrentAmmount,
                        lastBidder = auction.LastBidder != null ? auction.LastBidder.FirstName + " " + auction.LastBidder.LastName : auction.User.FirstName + " " + auction.User.LastName,
                        tokens     = user.Tokens
                    };
                    return(Json(response));
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    return(HttpNotFound());
                }
            }
        }
Ejemplo n.º 6
0
        public Boolean processBid()
        {
            object  u = SynchronizationUtils.getLockOnUser(this.user_id);
            Boolean status;

            lock (u)
            {
                status = User.Pay(this.tokens, this.user_id);
            }
            if (!status)
            {
                return(false);
            }
            Bid    lastBid = null;
            object a       = SynchronizationUtils.getLockOnAuction(this.auction_id);

            lock (a)
            {
                Auction auction = Auction.getByKey(this.auction_id);
                if (auction == null || auction.state != KeysUtils.AuctionOpened() || auction.token_price > this.tokens)
                {
                    status = false;
                }
                else
                {
                    //TODO calculate more stuf? price in currency(cant think right now)
                    auction.token_price   = this.tokens;
                    auction.current_price = auction.token_price * auction.tokenValue;
                    auction.saveChanges();
                    lastBid = Bid.LastBidForAuction(auction);
                    //TODO should remove last bid?
                    this.save();
                    User thisUser = User.getById(this.user_id);
                    AuctionHub.RefreshPrice(this.auction_id, thisUser.email, this.tokens, auction.currency, auction.current_price);
                    AuctionHub.UpdateBidInsert(this.tokens, this.auction_id, thisUser.email, this.time, auction.current_price, auction.currency);
                    status = true;
                }
            }

            if (status == false)
            {
                lock (u)
                {
                    User.Pay(-this.tokens, this.user_id);
                }
            }
            else
            {
                if (lastBid != null)
                {
                    object uOld = SynchronizationUtils.getLockOnUser(lastBid.user_id);
                    lock (uOld)
                    {
                        User.Pay(-lastBid.tokens, lastBid.user_id);
                    }
                    SynchronizationUtils.returnLockOnUser(lastBid.user_id);
                }
            }
            SynchronizationUtils.returnLockOnUser(this.user_id);
            SynchronizationUtils.returnLockOnAuction(this.auction_id);
            return(status);
        }