public string ChangeSystem([Bind(Include = "RecentAuctions,DefaultAuctionTime,SilverPackage,GoldPackage,PlatinumPackage,Currency,PriceRate")] SystemParameters parameters) { if (!ModelState.IsValid) { return("#Error: One or more parameters are not valid."); } using (var db = new AuctionHouseDB()) { try { var current = db.GetCurrentSystemParameters(); current.RecentAuctions = parameters.RecentAuctions; current.DefaultAuctionTime = parameters.DefaultAuctionTime; current.SilverPackage = parameters.SilverPackage; current.GoldPackage = parameters.GoldPackage; current.PlatinumPackage = parameters.PlatinumPackage; current.Currency = parameters.Currency; current.PriceRate = parameters.PriceRate; db.Entry(current).State = EntityState.Modified; db.SaveChanges(); return("Successfully changed parameters!"); } catch (Exception ex) { log.Error(ex.Message, ex); return("#Error: Could change parameters."); } } }
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."); } } } }
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."); } } } }