public async Task <IActionResult> Update(string id, [Bind("Id,StartingAt,FinishingAt,OwnerEmail,BuyersBid")] AuctionBidViewModel auctionBidViewModel) { if (ModelState.IsValid) { var user = await _userManager.GetUserAsync(User); var auctionsTableEntity = await _repository.GetEntityAsync <AuctionsTableEntity>(StorageTablesNames.Auctions, id, AuctionAppConstants.AuctionsTablePartitionKey); if (auctionsTableEntity.BiddersCollection.ContainsKey(user.Email)) { auctionsTableEntity.BiddersCollection[user.Email] = auctionBidViewModel.BuyersBid; } else { auctionsTableEntity.BiddersCollection.Add(user.Email, auctionBidViewModel.BuyersBid); } await _repository.InsertOrReplaceEntityAsync(StorageTablesNames.Auctions, auctionsTableEntity); return(RedirectToAction("Search", "Auction")); } return(View(auctionBidViewModel)); }
public async Task <IActionResult> Create([FromBody] AuctionBidViewModel bidViewModel) { var userId = GetUserId(); var result = await _bidService.PlaceBid(bidViewModel, userId); if (result.IsSuccess) { return(OkResult <object>(null, "Bid placed")); } else { return(BadResult(result.Errors)); } }
public async Task Should_Reject_Bid_If_User_Id_Are_Not_The_Same() { var bid = new AuctionBidViewModel() { ItemId = "TEST_ITEM_ID", UserId = "TEST_USER_ID", BidPrice = 9999 }; var result = await _bidService.PlaceBid(bid, "OTHER_USER_ID"); result.IsSuccess.ShouldBeFalse(); result.Errors.ShouldContain("discrepancy in userId"); }
public async Task Should_Reject_Bid_If_Validation_For_item_Fail() { var bid = new AuctionBidViewModel() { ItemId = "TEST_ITEM_ID", UserId = "TEST_USER_ID", BidPrice = 9999 }; MockGetListByItemIdWithMaxBidPrice(1000, bid.ItemId); MockValidateItemForBiddingWithResult(false); var result = await _bidService.PlaceBid(bid, bid.UserId); result.IsSuccess.ShouldBeFalse(); result.Errors.ShouldContain("test item validation error"); }
public async Task Should_Reject_Bid_If_Not_Highest() { var bid = new AuctionBidViewModel() { ItemId = "TEST_ITEM_ID", UserId = "TEST_USER_ID", BidPrice = 9999 }; MockGetListByItemIdWithMaxBidPrice(10000, bid.ItemId); MockValidateItemForBiddingWithResult(true); var result = await _bidService.PlaceBid(bid, bid.UserId); result.IsSuccess.ShouldBeFalse(); result.Errors.ShouldContain("Your price need to be higher than the other bids."); }
public async Task <ServiceResult> PlaceBid(AuctionBidViewModel bidViewModel, string userId) { var result = new ServiceResult(); if (bidViewModel.UserId != userId) { result.Errors.Add("discrepancy in userId"); return(result); } var validationResult = await _itemServiceApiClient.ValidateItemForBidding(bidViewModel.ItemId); if (!validationResult.Data) { result.Errors.AddRange(validationResult.Errors); return(result); } var bids = _auctionBidRepository.GetListByItemId(bidViewModel.ItemId); if (bids.Any() && bidViewModel.BidPrice <= bids.Max(x => x.BidPrice)) { result.Errors.Add("Your price need to be higher than the other bids."); return(result); } var bid = _mapper.Map <AuctionBidViewModel, AuctionBid>(bidViewModel); bid.Id = Guid.NewGuid().ToString(); bid.CreatedDateTime = DateTime.Now; await _auctionBidRepository.Create(bid); var @event = new Event <BidPlacedForItemEventData>() { Data = new BidPlacedForItemEventData() { ItemId = bid.ItemId, UserId = bid.UserId, BidPrice = bid.BidPrice }, EventName = BidPlacedForItemEventData.EventName }; @event.TargetQueues.Add(QueueConstants.ItemQueue); _jobService.PublishEvent(@event); return(result); }
public async Task Should_Create_Place_Bid() { var bid = new AuctionBidViewModel() { ItemId = "TEST_ITEM_ID", UserId = "TEST_USER_ID", BidPrice = 9999 }; MockGetListByItemIdWithMaxBidPrice(1000, bid.ItemId); MockValidateItemForBiddingWithResult(true); var result = await _bidService.PlaceBid(bid, bid.UserId); result.IsSuccess.ShouldBeTrue(); await _mockItemServiceApiClient.Received(1).ValidateItemForBidding(Arg.Is <string>(x => x == bid.ItemId)); await _mockAuctionBidRepository.Received(1).Create(Arg.Is <AuctionBid>(x => !string.IsNullOrEmpty(x.Id) && x.ItemId == bid.ItemId && x.UserId == bid.UserId && x.BidPrice == bid.BidPrice)); _mockJobService.Received(1).PublishEvent(Arg.Is <Event <BidPlacedForItemEventData> >( e => e.EventName == BidPlacedForItemEventData.EventName && e.Data.ItemId == bid.ItemId && e.Data.UserId == bid.UserId && e.Data.BidPrice == bid.BidPrice)); }
public async Task <IActionResult> Update(string id) { var user = await _userManager.GetUserAsync(User); var auctionsTableEntity = await _repository.GetEntityAsync <AuctionsTableEntity>(StorageTablesNames.Auctions, id, AuctionAppConstants.AuctionsTablePartitionKey); var auctionBidViewModel = new AuctionBidViewModel { Id = id, BuyersBid = auctionsTableEntity.BiddersCollection.ContainsKey(user.Email) ? auctionsTableEntity.BiddersCollection[user.Email] : 0, StartingAt = auctionsTableEntity.StartingAt, FinishingAt = auctionsTableEntity.FinishingAt, ItemName = auctionsTableEntity.Item.Name, OwnerEmail = auctionsTableEntity.OwnerEmail, Status = auctionsTableEntity.Status }; return(View(auctionBidViewModel)); }