Exemplo n.º 1
0
        public string Manage(string guid, bool approve)
        {
            if (Session["user"] == null || !(bool)Session["isAdmin"])
            {
                return(string.Empty);
            }

            if (string.IsNullOrWhiteSpace(guid) || !Guid.TryParse(guid, out var id))
            {
                return("#Error: Invalid auction id.");
            }

            using (var db = new AuctionHouseDB())
            {
                using (var transaction = db.Database.BeginTransaction(IsolationLevel.Serializable))
                {
                    try
                    {
                        var auction = db.FindAuctionById(id);

                        if (auction == null)
                        {
                            throw new TransactionException("Could not find auction with such id.");
                        }

                        if (auction.OpenedOn != null)
                        {
                            throw new TransactionException("Auction was already managed.");
                        }

                        auction.OpenedOn = DateTime.Now;
                        if (!approve)
                        {
                            auction.CompletedOn = auction.OpenedOn;
                        }

                        db.Entry(auction).State = EntityState.Modified;

                        db.SaveChanges();
                        transaction.Commit();

                        try { AuctionHub.HubContext.Clients.All.onAuctionManaged(auction.ID.ToString(), auction.Title, approve ? auction.AuctionTime : 0, auction.StartingPrice, string.Empty, "[No bidder]", "<b>" + auction.OpenedOn.Value.ToString(Settings.DateTimeFormat) + "</b>", auction.CompletedOn != null ? "<b>" + auction.CompletedOn.Value.ToString(Settings.DateTimeFormat) + "</b>" : "<b style=\"color: red;\">Not complete</b>"); }
                        catch (Exception ex) { log.Error(ex); }

                        return("Auction successfully managed.");
                    }
                    catch (TransactionException ex)
                    {
                        transaction.Rollback();
                        return("#Error: " + ex.Message);
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        log.Error(ex.Message, ex);
                        return("#Error: Unknown error occured.");
                    }
                }
            }
        }
Exemplo n.º 2
0
        public string Claim(string guid)
        {
            var user = Session["user"] as User;

            if (user == null)
            {
                return(string.Empty);
            }

            using (var db = new AuctionHouseDB())
            {
                using (var transaction = db.Database.BeginTransaction(IsolationLevel.Serializable))
                {
                    try
                    {
                        Auction auction = null;
                        if (Guid.TryParse(guid, out var id))
                        {
                            auction = db.FindAuctionById(id);
                        }

                        if (auction == null)
                        {
                            throw new TransactionException("Invalid auction.");
                        }

                        if (auction.Holder != user.ID)
                        {
                            throw new TransactionException("Can't claim auction prize.");
                        }

                        if (auction.OpenedOn == null)
                        {
                            throw new TransactionException("Auction is not opened.");
                        }

                        var now = DateTime.Now;

                        if (now < auction.OpenedOn.Value.AddSeconds(auction.AuctionTime))
                        {
                            throw new TransactionException("Auction is not finished yet.");
                        }

                        if (auction.CompletedOn != null)
                        {
                            throw new TransactionException("Auction is completed, no prize left to claim.");
                        }

                        auction.CompletedOn     = now;
                        db.Entry(auction).State = EntityState.Modified;

                        var lastBid = auction.LastBid;

                        if (lastBid != null)
                        {
                            user                 = db.FindUserById(user.ID);
                            user.Balance        += lastBid.Amount;
                            db.Entry(user).State = EntityState.Modified;
                        }

                        db.SaveChanges();
                        transaction.Commit();

                        return("Successfully claimed auction prize. Please, check your balance.");
                    }
                    catch (TransactionException ex)
                    {
                        transaction.Rollback();
                        return("#Error: " + ex.Message);
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        log.Error(ex.Message, ex);
                        return("#Error: Unknown error occured.");
                    }
                }
            }
        }
Exemplo n.º 3
0
        public string Bid(string guid, decimal amount)
        {
            var user = Session["user"] as User;

            if (user == null)
            {
                return("#Error: Please, log in!");
            }

            if (!Guid.TryParse(guid, out var id))
            {
                return("#Error: Invalid guid.");
            }

            using (var db = new AuctionHouseDB())
            {
                using (var transaction = db.Database.BeginTransaction(IsolationLevel.Serializable))
                {
                    try
                    {
                        var auction = db.FindAuctionById(id);
                        if (auction == null)
                        {
                            throw new TransactionException("Auction does not exist (to bid on such).");
                        }

                        if (auction.OpenedOn == null)
                        {
                            throw new TransactionException("Auction is not opened yet.");
                        }

                        if (auction.CompletedOn != null || DateTime.Now >= auction.OpenedOn.Value.AddSeconds(auction.AuctionTime))
                        {
                            throw new TransactionException("Auctions is closed.");
                        }

                        if (auction.Holder == user.ID)
                        {
                            throw new TransactionException("Cannot bid on owning auction.");
                        }

                        var lastBid = auction.LastBid;
                        if (lastBid != null)
                        {
                            if (amount <= lastBid.Amount)
                            {
                                throw new TransactionException("Cannot bid with lower price than current.");
                            }
                        }
                        else
                        {
                            if (amount <= auction.StartingPrice)
                            {
                                throw new TransactionException("Cannot bid with lower price than current.");
                            }
                        }

                        user = db.FindUserById(user.ID);
                        if (user.Balance < amount)
                        {
                            throw new TransactionException("Insufficient funds.");
                        }

                        if (lastBid != null)
                        {
                            lastBid.User.Balance        += lastBid.Amount;
                            db.Entry(lastBid.User).State = EntityState.Modified;
                        }

                        user.Balance        -= amount;
                        db.Entry(user).State = EntityState.Modified;

                        var bid = new Bid
                        {
                            ID      = Guid.NewGuid(),
                            Bidder  = user.ID,
                            Auction = auction.ID,
                            BidOn   = DateTime.Now,
                            Amount  = amount
                        };

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

                        try { AuctionHub.HubContext.Clients.All.onBid(auction.ID.ToString(), user.ID.ToString(), user.FirstName + " " + user.LastName, bid.BidOn.ToString(Settings.DateTimeFormat), amount); }
                        catch (Exception ex) { log.Error(ex); }

                        return("Bidding successful.");
                    }
                    catch (TransactionException ex)
                    {
                        transaction.Rollback();
                        return("#Error: " + ex.Message);
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        log.Error(ex.Message, ex);
                        return("#Error: Unknown error occured.");
                    }
                }
            }
        }
Exemplo n.º 4
0
        public ActionResult Show(string id)
        {
            using (var db = new AuctionHouseDB())
            {
                try
                {
                    if (!Guid.TryParse(id, out var guid))
                    {
                        return(HttpNotFound());
                    }
                    var auction = db.FindAuctionById(guid, true);
                    if (auction == null)
                    {
                        return(HttpNotFound());
                    }

                    if (auction.OpenedOn == null &&
                        (Session["user"] == null || !(bool)Session["isAdmin"] && ((User)Session["user"]).ID != auction.Holder))
                    {
                        return(HttpNotFound());
                    }

                    if (auction.OpenedOn != null && auction.CompletedOn == null)
                    {
                        var completedOn = auction.OpenedOn.Value.AddSeconds(auction.AuctionTime);
                        if (DateTime.Now >= completedOn)
                        {
                            auction.CompletedOn = completedOn;
                        }
                    }

                    var images = new List <string>(16);
                    var path   = "/assets/storage/auctions/" + auction.ID.ToString() + "/";
                    foreach (var file in Directory.EnumerateFiles(Server.MapPath("~" + path)))
                    {
                        if (file.EndsWith(".png"))
                        {
                            images.Add(path + Path.GetFileName(file));
                        }
                    }

                    ViewBag.ImageSources = images;

                    var lastBid = auction.LastBid;
                    if (lastBid != null)
                    {
                        ViewBag.Bidder       = lastBid.User;
                        ViewBag.CurrentPrice = lastBid.Amount;
                    }
                    else
                    {
                        ViewBag.CurrentPrice = auction.StartingPrice;
                    }

                    return(View(auction));
                }
                catch (Exception ex)
                {
                    log.Error(ex.Message, ex);
                    return(View("Error"));
                }
            }
        }