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); } } } }
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."); } } }
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."); } } } }
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."); } } } }