public async Task SendAdminRsvpNotificationAsync(WeddingGuest guest, WeddingGuest oldResponse) { string body; string greeting = guest.UpdatedRsvp ? "Updated RSVP Notification: " : "RSVP Notification: "; greeting += string.Format("{0} {1}", guest.FirstName, guest.LastName); string oldRsvpHeader = ""; string oldRsvpTable = ""; string newRsvpHeader = ""; string newRsvpTable = ""; if (guest.UpdatedRsvp) { oldRsvpHeader = "<h4>Old RSVP Responses:</h4>"; newRsvpHeader = "<h4>New RSVP Responses:</h4>"; oldRsvpTable = FormatRsvpTable(oldResponse); } else { newRsvpHeader = "<h4>RSVP Responses:</h4>"; } newRsvpTable = FormatRsvpTable(guest); var message = new MailMessage(); message.To.Add(new MailAddress("*****@*****.**")); message.From = new MailAddress("*****@*****.**"); message.Subject = greeting; using (var sr = new StreamReader(Server.MapPath("\\Templates\\") + "AdminRsvpNotificationEmailTemplate.html")) { body = await sr.ReadToEndAsync(); } message.Body = string.Format(body, greeting, oldRsvpHeader, oldRsvpTable, newRsvpHeader, newRsvpTable); message.IsBodyHtml = true; using (var smtp = new SmtpClient()) { var credential = new NetworkCredential { UserName = ConfigurationManager.AppSettings["MAIL_USER"], Password = ConfigurationManager.AppSettings["MAIL_PASSWORD"] }; smtp.Credentials = credential; smtp.Host = "smtp.sendgrid.net"; smtp.Port = 587; smtp.EnableSsl = true; await smtp.SendMailAsync(message); } }
public IActionResult RSVPWedding(int id) { if (HttpContext.Session.GetInt32("uuid") == null) { return(RedirectToAction("Index")); } WeddingGuest Guest = new WeddingGuest(); Guest.GuestId = HttpContext.Session.GetInt32("uuid").GetValueOrDefault(); Guest.WeddingId = id; _context.WeddingGuests.Add(Guest); _context.SaveChanges(); return(RedirectToAction("WeddingList")); }
public IActionResult LeaveWedding(int weddingId) { var userId = _userManager.GetUserId(User); WeddingGuest weddingGuest = _context.WedddingGuests.Where(wg => wg.WeddingId == weddingId && wg.GuestId == userId).First(); if (weddingGuest != null) { _context.WedddingGuests.Remove(weddingGuest); _context.SaveChanges(); } return(RedirectToAction("Dashboard")); }
public IActionResult UNRSVP(int id) { int?uId = HttpContext.Session.GetInt32("UserId"); if (uId == null) { return(RedirectToAction("Index")); } WeddingGuest ToDelete = _context.WeddingGuests.FirstOrDefault(i => i.WeddingId == (int)id); if (ToDelete == null) { return(RedirectToAction("Dashboard")); } _context.Remove(ToDelete); _context.SaveChanges(); return(RedirectToAction("Dashboard")); }
public IActionResult UpdateGuestStatus(int weddingId, WeddingGuest.StatusOptions status) { string userId = User.FindFirst(ClaimTypes.NameIdentifier).Value; _logger.LogInformation($"=== UpdateGuestStatus({weddingId},{userId},{status}) ==="); WeddingGuest guest = _dbContext.WeddingGuests.Where(x => x.WeddingId == weddingId && x.IdentityUserId == userId).FirstOrDefault(); if (guest != null) { guest.Status = status; _dbContext.WeddingGuests.Update(guest); _dbContext.SaveChanges(); } ; TempData["userIdFilter"] = userId; return(View("Index", _dbContext)); }
public IActionResult RSVP(int id) { Wedding SelectedWedding = _wContext.weddings .Where(w => w.WeddingId == id) .SingleOrDefault(); if (_wContext.wedding_guests.Where(g => g.UserId == ActiveUser.UserId).Where(w => w.WeddingId == SelectedWedding.WeddingId).Count() == 0) { WeddingGuest NewGuest = new WeddingGuest(SelectedWedding, ActiveUser); _wContext.Add(NewGuest); _wContext.SaveChanges(); } else { WeddingGuest NewGuest = _wContext.wedding_guests .Where(g => g.UserId == ActiveUser.UserId) .Where(w => w.WeddingId == SelectedWedding.WeddingId) .SingleOrDefault(); } return(RedirectToAction("Dashboard", "Wedding")); }
public IActionResult AddGuest(int WeddingId, string Email, string Description) { _logger.LogInformation($"=== AddGuest(WeddingId={WeddingId}, Email={Email}, Description={Description}) ==="); Wedding wedding = _dbContext.Weddings.Include(x => x.WeddingGuests).Where(x => x.WeddingId == WeddingId).FirstOrDefault(); if (!_dbContext.WeddingGuests.Any(x => x.WeddingId == WeddingId && x.InvitedEmail == Email)) { _logger.LogInformation($"=== AddGuest(WeddingId={WeddingId}, Adding new guest with Email={Email}) ==="); WeddingGuest weddingGuest = new WeddingGuest(); weddingGuest.WeddingId = WeddingId; weddingGuest.InvitedEmail = Email; weddingGuest.GuestDescription = Description; _dbContext.WeddingGuests.Add(weddingGuest); _dbContext.SaveChanges(); } else { _logger.LogInformation($"=== AddGuest(WeddingId={WeddingId}, Guest ALREADY exists with Email={Email}) ==="); } return(RedirectToAction($"EditWedding", new { weddingId = WeddingId })); //return View("EditWedding",model: new WeddingForm(wedding)); }
public async Task SendRsvpEmailAsync(WeddingGuest guest) { string body; string greeting = guest.UpdatedRsvp ? "We received your updated RSVP info. " : "Thank you for your RSVP. "; if (guest.CanAttend == true) { greeting += "We're so glad you'll be able to join us"; if (guest.PlusOneCanAtend == false && guest.PlusOneIsKnown) { greeting += string.Format(", but we're sorry {0} won't be able to make it.", guest.FirstNamePlusOne); } else { greeting += "."; } } else { greeting += "We're sorry you won't be able to join us."; } // format info table string infoTable = FormatRsvpTable(guest); //string infoTable = ""; string instructions = guest.CanAttend != false ? "If this information is incorrect, or if you need to change your responses in the future, please use the following link:" : "If your plans change and you'd like to attend, please email Lisa and Russ as soon as possible at <a href = \"mailto:[email protected]?subject=Please Change My RSVP\">[email protected]</a>, and we'll do our best to accommodate you"; var callbackUrl = Url.Action("RSVP", "WeddingGuests", new { userId = guest.Id }, protocol: Request.Url.Scheme); var button = guest.CanAttend != false?string.Format("<table border='0' cellpadding='0' cellspacing='12' width='100%'><tr><td align='center'><table border='0' cellpadding='0' cellspacing='0'><tr><td bgcolor='#853641' style='padding: 12px 18px 12px 18px; -webkit-border-radius: 3px; border-radius: 3px; background-color: #853641;' align='center'><a href='{0}' style='text-decoration: none; font-size: 18px; color: #ffffff; '>Update RSVP Info</a></td></tr></table></td></tr></table>", callbackUrl) : ""; using (var sr = new StreamReader(Server.MapPath("\\Templates\\") + "RsvpConfirmationEmailTemplate.html")) { body = await sr.ReadToEndAsync(); } string messageBody = string.Format(body, greeting, guest.FirstName, infoTable, instructions, button); string subject = guest.UpdatedRsvp ? "Updated RSVP Confirmation--Russ and Lisa's Wedding" : "RSVP Confirmation--Russ and Lisa's Wedding"; await UserManager.SendEmailAsync(guest.Id, subject, messageBody); }
public IActionResult RSVP(int id, IndexWrapper Form) { int?uId = HttpContext.Session.GetInt32("UserId"); if (uId == null) { return(RedirectToAction("Index")); } if (ModelState.IsValid) { WeddingGuest ToAdd = new WeddingGuest { UserId = (int)uId, WeddingId = id }; _context.Add(ToAdd); _context.SaveChanges(); return(RedirectToAction("Dashboard")); } else { return(Dashboard()); } }
public async Task <ActionResult> Invite(InviteWeddingGuestViewModel model) { InviteWeddingGuestViewModel viewModel = new InviteWeddingGuestViewModel(); if (ModelState.IsValid) { var newUser = new WeddingGuest { FirstName = model.FirstName, LastName = model.LastName, UserName = model.Email, Email = model.Email, PhoneNumber = model.PhoneNumber, IsActive = true, InviteDate = DateTime.Now, HasPlusOne = model.HasPlusOne, PlusOneIsKnown = model.PlusOneIsKnown, FirstNamePlusOne = model.FirstNamePlusOne, LastNamePlusOne = model.LastNamePlusOne, InviteMessage = model.InviteMessage }; // set guest's password to their email address string password = model.Email; var adminresult = await UserManager.CreateAsync(newUser, password); string requestMessage = ""; if (adminresult.Succeeded) { // send invitation email to guest string body; string salutation; string plusOneMessage = newUser.HasPlusOne && !newUser.PlusOneIsKnown ? "<h4>But wait, there's more... you get to bring a <i>PLUS ONE!</i> (so choose your guest wisely...)</h4>" : ""; string specialMessage = string.IsNullOrEmpty(newUser.InviteMessage) ? "" : "<hr /><p><strong>Special Message from The Honeys: </strong>" + newUser.InviteMessage + "</p><hr />"; if (newUser.PlusOneIsKnown) { salutation = newUser.FirstName + " and " + newUser.FirstNamePlusOne; } else { salutation = newUser.FirstName; } using (var sr = new StreamReader(Server.MapPath("\\Templates\\") + "InviteWeddingGuestEmailTemplate.html")) { body = await sr.ReadToEndAsync(); } var code = await UserManager.GenerateEmailConfirmationTokenAsync(newUser.Id); var callbackUrl = Url.Action("RSVP", "WeddingGuests", new { userId = newUser.Id }, protocol: Request.Url.Scheme); string messageBody = string.Format(body, salutation, plusOneMessage, specialMessage, callbackUrl); await UserManager.SendEmailAsync(newUser.Id, "Please RSVP--You're invited to Russ and Lisa's Wedding!", messageBody); //Add User to the selected Roles var result = await UserManager.AddToRoleAsync(newUser.Id, "WeddingGuest"); if (!result.Succeeded) { ModelState.AddModelError("", result.Errors.First()); ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync(), "Name", "Name"); return(View(viewModel)); } } else { ModelState.AddModelError("", adminresult.Errors.First()); ViewBag.RoleId = new SelectList(await RoleManager.Roles.ToListAsync(), "Name", "Name"); return(View(viewModel)); } Success("Wedding Guest was invited successfully. " + requestMessage, true); return(RedirectToAction("Index")); } return(View(viewModel)); }
public string FormatRsvpTable(WeddingGuest model) { string rsvpTable = "<table border='0' cellpadding='6' cellspacing='0' width='100%'>"; var attendMessage = string.Empty; switch (model.CanAttend) { case true: attendMessage = "Yes"; break; case false: attendMessage = "No"; break; case null: attendMessage = "Unsure"; break; default: break; } rsvpTable += string.Format("<tr><td width = '25%' align = 'right' valign = 'top' >Can you attend?:</ td ><td width = '75%' align = 'left' valign = 'top' >{0}</ td ></ tr >", attendMessage); if (model.CanAttend == true) { rsvpTable += string.Format("<tr><td width = '25%' align = 'right' valign = 'top' >Would you like a meatless option?:</ td ><td width = '75%' align = 'left' valign = 'top' >{0}</ td ></ tr >", model.Meatless == true ? "Yes" : "No"); rsvpTable += string.Format("<tr><td width = '25%' align = 'right' valign = 'top' >Would you like a vegan option?:</ td ><td width = '75%' align = 'left' valign = 'top' >{0}</ td ></ tr >", model.Vegan == true ? "Yes" : "No"); rsvpTable += string.Format("<tr><td width = '25%' align = 'right' valign = 'top' >Dietary needs:</ td ><td width = '75%' align = 'left' valign = 'top' >{0}</ td ></ tr >", model.DietaryNotes); if (model.HasPlusOne) { var PlusOneAttendMessage = string.Empty; switch (model.PlusOneCanAtend) { case true: PlusOneAttendMessage = "Yes"; break; case false: PlusOneAttendMessage = "No"; break; case null: PlusOneAttendMessage = "Unsure"; break; default: break; } rsvpTable += string.Format("<tr><td width = '25%' align = 'right' valign = 'top' >{0}:</ td ><td width = '75%' align = 'left' valign = 'top' >{1}</ td ></ tr >", model.PlusOneIsKnown ? string.Format("Will {0} be able to attend?", model.FirstNamePlusOne) : "Would you like to bring a 'plus one'?", PlusOneAttendMessage); if (!model.PlusOneIsKnown == true && model.PlusOneCanAtend == true) { rsvpTable += string.Format("<tr><td width = '25%' align = 'right' valign = 'top' >Name of your 'plus one':</ td ><td width = '75%' align = 'left' valign = 'top' >{0}</ td ></ tr >", model.FirstNamePlusOne + " " + model.LastNamePlusOne); } if (model.PlusOneCanAtend == true) { rsvpTable += string.Format("<tr><td width = '25%' align = 'right' valign = 'top' >Would {0} like a meatless option?:</ td ><td width = '75%' align = 'left' valign = 'top' >{1}</ td ></ tr >", model.PlusOneIsKnown ? model.FirstNamePlusOne : "your 'plus one'", model.Meatless == true ? "Yes" : "No"); rsvpTable += string.Format("<tr><td width = '25%' align = 'right' valign = 'top' >Would {0} like a vegan option?:</ td ><td width = '75%' align = 'left' valign = 'top' >{1}</ td ></ tr >", model.PlusOneIsKnown ? model.FirstNamePlusOne : "your 'plus one'", model.Vegan == true ? "Yes" : "No"); rsvpTable += string.Format("<tr><td width = '25%' align = 'right' valign = 'top' >Dietary needs for {0}:</ td ><td width = '75%' align = 'left' valign = 'top' >{1}</ td ></ tr >", model.PlusOneIsKnown ? model.FirstNamePlusOne : "your 'plus one'", model.DietaryNotes); } } } rsvpTable += "</table>"; return(rsvpTable); }