Exemplo n.º 1
0
        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;
            }
        }