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))); }
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); }
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(); } }
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); }
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()); } } }
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); }