Exemplo n.º 1
0
        public ActionResult ViewProfile(string id)
        {
            using (var db = new AuctionHouseDB())
            {
                try
                {
                    if (Session["user"] == null)
                    {
                        return(HttpNotFound());
                    }

                    User user = null;

                    if (Guid.TryParse(id, out var userid))
                    {
                        user = db.FindUserById(userid);
                    }
                    else
                    {
                        user = db.FindUserById(((User)Session["user"]).ID);
                    }

                    if (user == null)
                    {
                        user = Models.User.Dummy;
                    }
                    else if (user.ID == ((User)Session["user"]).ID)
                    {
                        ViewBag.TokenOrders = db.FindUserTokenOrders(user);
                    }

                    return(View(user));
                }
                catch (Exception ex)
                {
                    log.Error(ex.Message, ex);
                    return(View("Error"));
                }
            }
        }
        public void PaymentProcessed(string clientId, string status)
        {
            using (var db = new AuctionHouseDB())
            {
                using (var transaction = db.Database.BeginTransaction(IsolationLevel.Serializable))
                {
                    try
                    {
                        TokenOrder order = null;
                        if (Guid.TryParse(clientId, out var id))
                        {
                            order = db.FindTokenOrderByGuid(id);
                        }
                        if (order == null)
                        {
                            throw new TransactionException("Invalid payment id.");
                        }

                        if (order.Status != null)
                        {
                            throw new TransactionException("Payment already proccessed.");
                        }

                        order.Status          = status == "success";
                        db.Entry(order).State = EntityState.Modified;

                        var     user    = db.FindUserById(order.Buyer);
                        decimal balance = -1;

                        if (order.Status.Value)
                        {
                            user.Balance        += order.Amount;
                            balance              = user.Balance;
                            db.Entry(user).State = EntityState.Modified;
                        }

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

                        try
                        {
                            AuctionHub.HubContext.Clients.All.onTokenOrderCompleted(order.Buyer.ToString(), order.ID.ToString(), balance, order.Status.Value);

                            Mailer.SendMail(Settings.SMTPUsername, "Auction House", user.Email, user.FirstName + " " + user.LastName, "Auction House - Token Order",
                                            "Dear " + user.FirstName + "," + Environment.NewLine +
                                            Environment.NewLine +
                                            "This e-mail has been sent to inform you that your token order" + Environment.NewLine +
                                            "has been processed and marked as [" + (order.Status.Value ? "COMPLETE" : "FAILED") + "]." + Environment.NewLine +
                                            Environment.NewLine +
                                            "Please, do not reply to this e-mail as you will not get any response." + Environment.NewLine +
                                            Environment.NewLine +
                                            "Kind regards," + Environment.NewLine +
                                            "Auction House"
                                            );
                        }
                        catch (Exception ex) { log.Error(ex.Message, ex); }
                    }
                    catch (TransactionException ex)
                    {
                        transaction.Rollback();
                        log.Warn(ex.Message, ex);
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        log.Error(ex.Message, ex);
                    }
                }
            }
        }
Exemplo n.º 3
0
        public string ChangeInfo(string oldpassword, string firstname, string lastname, string email, string password)
        {
            if (Session["user"] == null)
            {
                return(string.Empty);
            }

            using (var db = new AuctionHouseDB())
            {
                try
                {
                    if (string.IsNullOrWhiteSpace(oldpassword))
                    {
                        return("#Error: You must supply your old password!");
                    }

                    User user = (User)Session["user"];
                    if (user.Password != oldpassword.ToMD5())
                    {
                        return("#Error: Old password does not match your current one.");
                    }

                    user = db.FindUserById(user.ID);

                    StringBuilder sb = new StringBuilder("Success: [");

                    if (!string.IsNullOrWhiteSpace(firstname))
                    {
                        user.FirstName = firstname;
                        sb.Append("First Name,");
                    }

                    if (!string.IsNullOrWhiteSpace(lastname))
                    {
                        user.LastName = lastname;
                        sb.Append("Last Name,");
                    }

                    if (!string.IsNullOrWhiteSpace(email) && db.FindUserByEmail(email) == null)
                    {
                        user.Email = email;
                        sb.Append("Email,");
                    }

                    if (!string.IsNullOrWhiteSpace(password))
                    {
                        user.Password = password;
                        sb.Append("Password,");
                    }

                    sb[sb.Length - 1] = ']';

                    if (!ModelState.IsValid)
                    {
                        foreach (var state in ModelState.Values)
                        {
                            foreach (var error in state.Errors)
                            {
                                return("#Error: " + error.ErrorMessage);
                            }
                        }

                        return("#Error: Unknown error.");
                    }

                    user.Password        = user.Password.ToMD5();
                    db.Entry(user).State = EntityState.Modified;

                    try { db.SaveChanges(); }
                    catch { return("#Error: One or more fields are not in a correct format (eg. invalid email)."); }

                    Session["user"] = user;
                    return(sb.ToString());
                }
                catch (Exception ex)
                {
                    log.Error(ex.Message, ex);
                    return("#Error: Unknown error occured.");
                }
            }
        }
Exemplo n.º 4
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.º 5
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.");
                    }
                }
            }
        }