public async Task <ActionResult> SubmitBid(SubmitMarketItemBidModel model) { if (!ModelState.IsValid) { return(RedirectToAction("MarketItem", new { marketItemId = model.MarketItemId })); } var request = new CreateMarketBidModel { BidAmount = model.BidAmount, MarketItemId = model.MarketItemId }; var result = await MarketplaceWriter.CreateBid(User.Identity.GetUserId(), request); if (!result.Success) { return(ViewMessage(new ViewMessageModel(ViewMessageType.Danger, Resources.Market.itemActionErrorMessageTitle, Resources.Market.itemBidErrorMessage))); } var seller = await UserManager.FindByIdAsync(request.MarketItemUserId.ToString()); var buyer = await UserManager.FindByIdAsync(User.Identity.GetUserId()); if (seller != null && buyer != null) { var callbackUrl = Url.Action("MarketItem", "MarketPlace", new { marketItemId = model.MarketItemId }, protocol: Request.Url.Scheme); if (model.MarketItemType == MarketItemType.BuySell) { await SendEmailAsync(EmailTemplateType.MarketPlaceNewSold, model.MarketItemId, seller.Email, seller.Id, seller.UserName, string.Format("{0} {1}", model.BidAmount, model.Currency), buyer.Email, buyer.UserName, model.MarketItemTitle, callbackUrl); await SendEmailAsync(EmailTemplateType.MarketPlaceBought, model.MarketItemId, buyer.Email, buyer.Id, buyer.UserName, string.Format("{0} {1}", model.BidAmount, model.Currency), seller.Email, seller.UserName, model.MarketItemTitle, callbackUrl); } else if (model.MarketItemType == MarketItemType.Auction) { await SendEmailAsync(EmailTemplateType.MarketPlaceNewBid, model.MarketItemId, seller.Email, seller.Id, seller.UserName, model.BidAmount, buyer.Email, buyer.UserName, callbackUrl); } else if (model.MarketItemType == MarketItemType.Wanted) { await SendEmailAsync(EmailTemplateType.MarketPlaceWantedAccept, model.MarketItemId, seller.Email, seller.Id, seller.UserName, string.Format("{0} {1}", model.BidAmount, model.Currency), buyer.Email, buyer.UserName, model.MarketItemTitle, callbackUrl); await SendEmailAsync(EmailTemplateType.MarketPlaceWantedAccepted, model.MarketItemId, buyer.Email, buyer.Id, buyer.UserName, string.Format("{0} {1}", model.BidAmount, model.Currency), seller.Email, seller.UserName, model.MarketItemTitle, callbackUrl); } } return(RedirectToAction("MarketItem", new { marketItemId = model.MarketItemId })); }
public async Task <IWriterResult> CreateBid(string userId, CreateMarketBidModel model) { try { if (model.BidAmount < 0.00000001M) { return(new WriterResult(false, "Your bid must be greater than 0.00000001")); } var currentUser = new Guid(userId); using (var context = ExchangeDataContextFactory.CreateContext()) { var user = await context.Users.FirstOrDefaultNoLockAsync(x => x.Id == currentUser); if (user == null) { return(new WriterResult(false, "Unauthorized")); } var marketItem = await context.MarketItem .Include(m => m.Bids) .Where(x => x.Id == model.MarketItemId) .FirstOrDefaultNoLockAsync().ConfigureAwait(false); if (marketItem == null) { return(new WriterResult(false, $"Market item #{model.MarketItemId} not found.")); } if (marketItem.Status != MarketItemStatus.Active) { return(new WriterResult(false, "This item has closed")); } var maxBid = marketItem.Bids.Any() ? marketItem.Bids.Max(x => x.BidAmount) : 0; if (maxBid >= model.BidAmount) { return(new WriterResult(false, $"Your bid must be greater than {maxBid}.")); } var newbid = new Entity.MarketItemBid { BidAmount = marketItem.Type == MarketItemType.Auction ? model.BidAmount : marketItem.AskingPrice, MarketItemId = marketItem.Id, Timestamp = DateTime.UtcNow, UserId = currentUser }; if (marketItem.Type != MarketItemType.Auction) { newbid.IsWinningBid = true; marketItem.Status = MarketItemStatus.Complete; } marketItem.Bids.Add(newbid); await context.SaveChangesAsync().ConfigureAwait(false); model.MarketItemUserId = marketItem.UserId; return(new WriterResult(true)); } } catch (Exception) { throw; } }