Example #1
0
        public IHttpActionResult PostBidById(int id, BidInputModel bidData)
        {
            if (!ModelState.IsValid || bidData == null)
            {
                return(this.BadRequest(ModelState));
            }

            var bid = this.db.Offers.Find(id);

            if (bid == null)
            {
                return(this.NotFound());
            }

            var currentUserId = User.Identity.GetUserId();

            if (currentUserId == null)
            {
                return(this.Unauthorized());
            }

            var offerDate = this.db.Offers.Where(o => o.Id == id).Select(o => o.ExpirationDate).First();

            if (offerDate < DateTime.Now)
            {
                return(this.BadRequest("Offer has expired."));
            }

            var bestBidPrice = this.db.Bids
                               .OrderByDescending(b => b.Id)
                               .Where(b => b.OfferId == id)
                               .Select(b => b.BidPrice)
                               .FirstOrDefault();


            if (bestBidPrice >= bidData.BidPrice)
            {
                return(this.BadRequest("Your bid should be > " + bestBidPrice));
            }

            var bit = new Bid()
            {
                BidderId = currentUserId,
                BidPrice = bidData.BidPrice,
                Comment  = bidData.Comment,
                Date     = DateTime.Now,
                OfferId  = id
            };

            this.db.Bids.Add(bit);
            this.db.SaveChanges();

            return(this.Ok(new
            {
                Id = bit.Id,
                Author = User.Identity.GetUserName(),
                Message = "Bid created."
            }));
        }
        public async Task <ActionResult <BidModel> > AddBid(BidInputModel model, int id)
        {
            if (!User.TryGetUserIdentity(out UserIdentity userIdentity))
            {
                return(StatusCode(500));
            }
            var result = await bidService.AddAsync(model, userIdentity.Id, id);

            if (result == null)
            {
                return(BadRequest());
            }
            return(result);
        }
Example #3
0
        public IHttpActionResult Bid(int id, BidInputModel bidData)
        {
            if (bidData == null)
            {
                return(BadRequest("Missing bid data."));
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var offer = this.db.Offers.All()
                        .Where(o => o.Id == id)
                        .Select(o => new
            {
                InitialPrice       = o.InitialPrice,
                ExpirationDateTime = o.ExpirationDateTime,
                Bids = o.Bids.Select(b => b.OfferedPrice)
            })
                        .FirstOrDefault();

            if (offer == null)
            {
                return(this.NotFound());
            }

            if (offer.ExpirationDateTime < DateTime.Now)
            {
                return(this.BadRequest("Offer has expired."));
            }

            var maxBidPrice = offer.InitialPrice;

            if (offer.Bids.Any())
            {
                maxBidPrice = offer.Bids.Max();
            }

            if (bidData.BidPrice <= maxBidPrice)
            {
                return(this.BadRequest("Your bid should be > " + maxBidPrice));
            }

            var currentUserId = User.Identity.GetUserId();
            var user          = this.db.UserStore.FindByIdAsync(currentUserId).Result;

            if (user == null)
            {
                return(this.Unauthorized());
            }

            var bid = new Bid()
            {
                OfferId      = id,
                BidderId     = currentUserId,
                OfferedPrice = bidData.BidPrice,
                Comment      = bidData.Comment,
                DateCreated  = DateTime.Now
            };

            db.Bids.Add(bid);
            db.SaveChanges();

            return(this.Ok(
                       new { bid.Id, Bidder = user.UserName, Message = "Bid created." }));
        }
Example #4
0
        /// <inheritdoc />
        public async Task <BidModel> AddAsync(BidInputModel model, int bidderId, int auctionItemId)
        {
            if (!Validator.TryValidateObject(model, new ValidationContext(model), null, true))
            {
                return(null);
            }
            try {
                AuctionItem auctionItem = await workUnit.AuctionItemRepository.GetAll()
                                          .Where(x => x.Id == auctionItemId)
                                          .Select(x => new AuctionItem {
                    Id = x.Id,
                    ActualCloseDate = x.ActualCloseDate,
                    StartDate       = x.StartDate,
                    WinningBid      = x.WinningBid,
                    StartingPrice   = x.StartingPrice
                }).FirstOrDefaultAsync();

                var dateTimeUtcNow = DateTime.UtcNow;
                if (auctionItem == null ||
                    dateTimeUtcNow <= auctionItem.StartDate ||
                    dateTimeUtcNow >= auctionItem.ActualCloseDate)
                {
                    return(null);
                }
                if (auctionItem.StartingPrice >= model.Price ||
                    (auctionItem.WinningBid != null &&
                     (auctionItem.WinningBid.Price >= model.Price ||
                      auctionItem.WinningBid.BidderId == bidderId)))
                {
                    return(null);
                }
                var newClosingDate = dateTimeUtcNow.AddMinutes(minIntervalToClosingAuctionItemMinutes);
                if ((auctionItem.ActualCloseDate - dateTimeUtcNow).Minutes <= minIntervalToClosingAuctionItemMinutes)
                {
                    auctionItem.ActualCloseDate = newClosingDate;
                    workUnit.AuctionItemRepository.UpdateActualClosingDate(auctionItem);
                }
                Bid bid = mapper.Map <Bid>(model);
                bid.BidderId                = bidderId;
                bid.AuctionItemId           = auctionItemId;
                await using var transaction = await workUnit.BeginTransactionAsync(IsolationLevel.Serializable);

                await workUnit.BidRepository.AddAsync(bid);

                await workUnit.SaveAsync();

                auctionItem.WinningBidId = bid.Id;
                workUnit.AuctionItemRepository.UpdateWinningBidId(auctionItem);
                await workUnit.SaveAsync();

                await transaction.CommitAsync();

                var result = mapper.Map <BidModel>(bid);
                return(result);
            } catch (DbUpdateException) {
                return(null);
            } catch (Exception ex) {
                logger.LogError(ex, ExceptionThrownInService);
                throw;
            }
        }