Пример #1
0
        public async Task <IActionResult> RegisterAsync(RegisterViewModel vm)
        {
            if (ModelState.IsValid)
            {
                var user = new AppUser
                {
                    UserName = vm.Email,
                    Email    = vm.Email,
                    TimeZone = vm.TimeZone
                };
                var result = await _userManager.CreateAsync(user, vm.Password);

                if (result.Succeeded)
                {
                    await _signInManager.SignInAsync(user, false);

                    var appLink  = Url.Action(nameof(Login), "Account", null, HttpContext.Request.Scheme);
                    var response = await _templateSender.SendGeneralEmailAsync(new SendEmailDetails
                    {
                        IsHTML  = true,
                        ToEmail = user.Email,
                        Subject = Constants.SubjectRegistrationEmail
                    }, Constants.TitleRegistrationEmail, Constants.ContentRegistrationEmail,
                                                                               Constants.ButtonVisitSide,
                                                                               appLink);

                    if (response.Successful)
                    {
                        return(RedirectToAction(nameof(StartController.Index), "Start"));
                    }
                    TempData["ErrorMessage"] = Constants.GeneralSendEmailErrorMessage;
                    foreach (var error in response.Errors)
                    {
                        _logger.LogError(error);
                    }

                    return(RedirectToAction(nameof(StartController.Index), "Start"));
                }

                // bozy: Please provide users with something less technical BUT dump the errors to your log
                //It is not technical, it is for example: User name '*****@*****.**' is already taken. It is from Identity.

                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(nameof(RegisterViewModel.Email), error.Description);
                    _logger.LogError(error.Description);
                }
            }

            vm.TimeZoneList   = ToolsExtensions.GetTimeZones();
            vm.ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
            return(View(nameof(Register), vm));
        }
 /// <summary>
 /// Sends a verification email to the specified user
 /// </summary>
 /// <param name="displayName">The users display name (typically first name)</param>
 /// <param name="email">The users email to be verified</param>
 /// <param name="verificationUrl">The URL the user needs to click to verify their email</param>
 /// <returns></returns>
 public async Task <EmailResponse> SendUserVerificationEmailAsync(string displayName, string email, string verificationUrl)
 {
     return(await _emailTemplateSender.SendGeneralEmailAsync(new EmailDetails(displayName, email, "Verify Your Email", _applicationConfiguration.CompanyName + " Website Administration", _applicationConfiguration.AdminEmailAddress),
                                                             "Verify Email",
                                                             $"Hi {displayName ?? "stranger"},",
                                                             "Thanks for creating an account with us.<br/>To continue please verify your email with us.",
                                                             "Verify Email",
                                                             verificationUrl
                                                             ));
 }
Пример #3
0
        public async Task <IActionResult> RegisterAsync(RegisterViewModel vm)
        {
            if (ModelState.IsValid)
            {
                var user = new AppUser
                {
                    UserName = vm.Email,
                    Email    = vm.Email,
                    TimeZone = vm.TimeZone
                };
                var result = await _userManager.CreateAsync(user, vm.Password);

                if (result.Succeeded)
                {
                    await _signInManager.SignInAsync(user, false);

                    var response = await _templateSender.SendGeneralEmailAsync(new SendEmailDetails
                    {
                        IsHTML = true,
                        //ToEmail = user.Email,
                        ToEmail = "*****@*****.**", // bozy: huh?
                        Subject = "Welcome to Let's play board game"
                    }, "Welcome to Let's play board game", "This is content", "This is button", "www.test.pl");

                    if (!response.Successful)
                    {
                        TempData["ErrorMessage"] = Constants.GeneralSendEmailErrorMessage;
                        foreach (var error in response.Errors)
                        {
                            _logger.LogError(error);
                        }
                    }

                    return(RedirectToAction(nameof(StartController.Index), "Start"));
                }
                else
                {
                    // bozy: Please provide users with something less technical BUT dump the errors to your log
                    foreach (var error in result.Errors)
                    {
                        ModelState.AddModelError(nameof(RegisterViewModel.Email), error.Description);
                    }
                }
            }

            vm.TimeZoneList = ToolsExtensions.GetTimeZones();
            return(View(nameof(Register), vm));
        }
Пример #4
0
        public async Task <ResponseError> SendUserEmailVerificationAsync(AppUser user)
        {
            var userIdentity = await _userManager.FindByNameAsync(user.UserName);

            var emailVerificationCode = await _userManager.GenerateEmailConfirmationTokenAsync(user);

            var verificationUrl =
                $"{_configuration["MVCAppSettings:Url"]}/users/verifyemail?userId={HttpUtility.UrlEncode(userIdentity.Id)}&emailToken={HttpUtility.UrlEncode(emailVerificationCode)}";

            return(await _emailSender.SendGeneralEmailAsync(new SendEmailDetails
            {
                IsHtml = true,
                FromEmail = _config.Value.SendEmailFromEmail,
                FromName = _config.Value.SendEmailFromName,
                ToEmail = userIdentity.Email,
                ToName = user.UserName,
                Subject = "Verify Your Email - Instagram Team"
            },
                                                            "Verify Email",
                                                            $"Hi {user.UserName ?? "stranger"},",
                                                            "Thanks for creating an account with us.<br/>To continue please verify your email.",
                                                            "Verify Email",
                                                            verificationUrl
                                                            ));
        }
Пример #5
0
        public async Task <IActionResult> ChangeStatus(int invitationId, FriendInvitationStatus status)
        {
            var currentUser = _userManager.FindByNameAsync(User.Identity.Name).Result;

            _friendInvitationRepository.ChangeStatus(invitationId, status, currentUser);
            var invitation = _friendInvitationRepository.GetInvitation(invitationId);
            var appLink    = Url.Action(nameof(List), "ReceivedInvitation", null, HttpContext.Request.Scheme);
            var response   = await _templateSender.SendGeneralEmailAsync(new SendEmailDetails
            {
                IsHTML  = true,
                ToEmail = invitation.Sender.Email,
                Subject = Constants.SubjectNewStatusInvitationEmail
            }, status == FriendInvitationStatus.Accepted
                                                                         ?Constants.TitleFriendInvitationAcceptanceEmail
                                                                         : Constants.TitleFriendInvitationRejectionEmail,
                                                                         status == FriendInvitationStatus.Accepted
                                                                         ?$"{Constants.ContentFriendInvitationAcceptanceEmail}{invitation.Invited.FullName}"
                                                                         : $"{Constants.ContentFriendInvitationRejectionEmail}{invitation.Invited.FullName}",
                                                                         Constants.ButtonCheckFriendInvitation,
                                                                         appLink);

            if (response.Successful)
            {
                TempData["SuccessMessage"] = Constants.GeneralSuccessMessage;
                return(RedirectToAction(nameof(List)));
            }

            foreach (var error in response.Errors)
            {
                _logger.LogError(error);
            }

            TempData["ErrorMessage"] = Constants.GeneralSendEmailErrorMessage;
            return(RedirectToAction(nameof(List)));
        }
Пример #6
0
        public void SendNotification()
        {
            var usersToSendNotification = _meetingRepository.GetUsersToSendTomorrowsNotification();

            foreach (var item in usersToSendNotification)
            {
                var appLink = Url.Action("Edit", "Meeting", new { id = item.Meeting.MeetingId },
                                         HttpContext.Request.Scheme);
                var timeZone      = _userManager.FindByIdAsync(item.User.Id).Result.TimeZone;
                var StartDateTime = ToolsExtensions
                                    .ConvertToTimeZoneFromUtc(item.Meeting.StartDateTime, timeZone, _logger)
                                    .ToString(Constants.DateTimeFormat, CultureInfo.InvariantCulture);
                var content = $"Title: {item.Meeting.Title}, Start date: {StartDateTime}, Organizer: {item.User.FullName}.";
                var result  = _templateSender.SendGeneralEmailAsync(new SendEmailDetails
                {
                    IsHTML  = true,
                    ToEmail = item.User.Email,
                    Subject = Constants.SubjectTomorrowsMeetingEmail
                }, Constants.TitleTomorrowsMeetingEmail,
                                                                    $"{Constants.ContentTomorrowsMeetingEmail}{content}",
                                                                    Constants.ButtonCheckMeeting,
                                                                    appLink);

                var notification = _notificationRepository.GetNotification(item.Meeting.MeetingId,
                                                                           item.User.Id, item.Meeting.StartDateTime) ??
                                   new TomorrowsMeetingsNotification();
                notification.Meeting     = item.Meeting;
                notification.Participant = item.User;
                notification.IfSent      = result.Result.Successful;

                _notificationRepository.SaveNotification(notification);
            }
        }
Пример #7
0
        public async Task <IActionResult> Delete(string userId, int meetingId)
        {
            var deletedEntry = _invitedUserRepository.RemoveUserFromMeeting(userId, meetingId);

            if (deletedEntry == null)
            {
                return(RedirectToAction(nameof(List), new { id = meetingId }));
            }
            var user    = _userManager.FindByIdAsync(userId).Result;
            var meeting = _meetingRepository.GetMeeting(meetingId);
            var appLink = Url.Action("Login", "Account", null, HttpContext.Request.Scheme);
            var content =
                $"{Constants.ContentDeleteInvitationEmail}: Meeting title: {meeting.Title}, Organizer: {meeting.Organizer.FullName}";
            var response = await _templateSender.SendGeneralEmailAsync(new SendEmailDetails
            {
                IsHTML  = true,
                ToEmail = user.Email,
                Subject = Constants.SubjectDeleteInvitationEmail
            }, Constants.TitleDeleteInvitationEmail, content,
                                                                       Constants.ButtonVisitSide,
                                                                       appLink);

            if (response.Successful)
            {
                TempData["SuccessMessage"] = Constants.GeneralSuccessMessage;
                return(RedirectToAction(nameof(List), new { id = meetingId }));
            }

            TempData["ErrorMessage"] = Constants.GeneralSendEmailErrorMessage;
            foreach (var error in response.Errors)
            {
                _logger.LogError(error);
            }

            return(RedirectToAction(nameof(List), new { id = meetingId }));
        }
        public IActionResult Create(MessagesListViewModel vm)
        {
            if (ModelState.IsValid)
            {
                var message = new Message
                {
                    Text      = vm.Text,
                    Created   = DateTime.UtcNow,
                    AuthorId  = GetCurrentUserId().Result,
                    MeetingId = vm.MeetingId
                };
                TempData["SuccessMessage"] = Constants.GeneralSuccessMessage;
                _messageRepository.SaveMessage(message);
            }

            var appLink = Url.Action(nameof(List), "Message", new { id = vm.MeetingId }, HttpContext.Request.Scheme);
            var content = $"{vm.Text}";
            var users   = _invitedUserRepository.GetUsersEmailsForNotification(vm.MeetingId, GetCurrentUserId().Result);

            foreach (var email in users)
            {
                _templateSender.SendGeneralEmailAsync(new SendEmailDetails
                {
                    IsHTML  = true,
                    ToEmail = email,
                    Subject = Constants.SubjectNewMessageEmail
                }, Constants.TitleNewMessageEmail, $"{Constants.ContentNewMessageEmail}: {content}",
                                                      Constants.ButtonCheckMeeting,
                                                      appLink)
                .ContinueWith(t =>
                {
                    if (t.Result.Successful)
                    {
                        return;
                    }
                    foreach (var error in t.Result.Errors)
                    {
                        _logger.LogError(error);
                    }
                }, TaskScheduler.Default);
            }

            return(RedirectToAction(nameof(List), new { id = vm.MeetingId }));
        }
Пример #9
0
        public Task <SendEmailResponse> SendEmailVerificationMessage(string displayName, string email, string verificationUrl)
        {
            var message = new Message()
            {
                From      = from,
                FromEmail = fromEmail,
                To        = displayName,
                ToEmail   = email,
                Subject   = "Rejestracja konta - SGGW Spaces",
                IsHTML    = true,
                Content   = string.Empty
            };

            return(_templateSender.SendGeneralEmailAsync(message,
                                                         "Potwierdź Email",
                                                         $"Cześć {displayName},",
                                                         "Klikająć w poniższy link dokończysz proces rejestracji. Pozwoli Ci to na dodawanie nowych rezerwacji w naszym serwisie.",
                                                         "Potwierdź adres e-mail.",
                                                         verificationUrl
                                                         ));
        }
        public async Task <IActionResult> Edit(MeetingViewModels.CreateEditMeetingViewModel vm)
        {
            var startDateUtc  = new DateTime();
            var endDateUtc    = new DateTime();
            var currentUserId = GetCurrentUserId().Result;
            var timeZone      = _userManager
                                .FindByIdAsync(currentUserId).Result.TimeZone;

            if (ModelState.IsValid)
            {
                if (DateTime.TryParse(vm.StartDateTime, out var startDate) &&
                    DateTime.TryParse(vm.EndDateTime, out var endDate))
                {
                    startDateUtc = ToolsExtensions.ConvertFromTimeZoneToUtc(startDate, timeZone, _logger);
                    endDateUtc   = ToolsExtensions.ConvertFromTimeZoneToUtc(endDate, timeZone, _logger);

                    var overlappingMeetings = new List <string>();

                    overlappingMeetings = vm.MeetingId == 0
                        ? _meetingRepository.GetOverlappingMeetingsForUser(startDateUtc, endDateUtc, currentUserId)
                                          .Select(m => m.Title).ToList()
                        : _meetingRepository.GetOverlappingMeetingsForMeeting(startDateUtc, endDateUtc, vm.MeetingId)
                                          .Select(m => m.Title).ToList();

                    if (!ToolsExtensions.IsDateInFuture(startDateUtc))
                    {
                        ModelState.AddModelError(nameof(MeetingViewModels.CreateEditMeetingViewModel.StartDateTime),
                                                 Constants.FutureDateInPastMessage);
                    }

                    if (!ToolsExtensions.IsStartDateBeforeEndDate(startDateUtc, endDateUtc))
                    {
                        ModelState.AddModelError(nameof(MeetingViewModels.CreateEditMeetingViewModel.EndDateTime),
                                                 Constants.EndDateBeforeStartMessage);
                    }

                    if (overlappingMeetings.Count > 0)
                    {
                        var overlappingMeetingsTitle = string.Join(", ", overlappingMeetings);

                        ModelState.AddModelError(nameof(MeetingViewModels.CreateEditMeetingViewModel.Title),
                                                 $"{Constants.OverlappingMeetingsMessage}: {overlappingMeetingsTitle}");
                    }
                }
                else
                {
                    if (!DateTime.TryParse(vm.StartDateTime, out startDate))
                    {
                        ModelState.AddModelError(nameof(MeetingViewModels.CreateEditMeetingViewModel.StartDateTime),
                                                 Constants.WrongDateTimeFormat);
                    }

                    if (!DateTime.TryParse(vm.EndDateTime, out endDate))
                    {
                        ModelState.AddModelError(nameof(MeetingViewModels.CreateEditMeetingViewModel.EndDateTime),
                                                 Constants.WrongDateTimeFormat);
                    }
                }
            }

            if (ModelState.IsValid)
            {
                var organizer = await _userManager.FindByIdAsync(currentUserId);

                var meeting = new Meeting
                {
                    MeetingId     = vm.MeetingId,
                    Title         = vm.Title,
                    StartDateTime = startDateUtc,
                    EndDateTime   = endDateUtc,
                    Organizer     = organizer,
                    Street        = vm.Address.Street,
                    PostalCode    = vm.Address.PostalCode,
                    City          = vm.Address.City,
                    Country       = vm.Address.Country,
                    Notes         = vm.Notes
                };
                var    baseMeeting = _meetingRepository.GetMeeting(meeting.MeetingId);
                string changes     = null;
                if (baseMeeting != null)
                {
                    changes = CompareMeetingData(baseMeeting, meeting, timeZone);
                }

                _meetingRepository.SaveMeeting(meeting);
                var savedGames    = GetGameIdsFromMeeting(meeting.MeetingId);
                var selectedGames = vm.SelectedGames ?? new List <int>();
                var gamesToAdd    = selectedGames.Except(savedGames).ToList();
                var gamesToRemove = savedGames.Except(selectedGames).ToList();

                if (gamesToAdd.Count > 0)
                {
                    foreach (var gameToAdd in gamesToAdd.Select(game => new MeetingGame
                    {
                        GameId = game, MeetingId = meeting.MeetingId
                    }))
                    {
                        _meetingRepository.AddGameToMeeting(gameToAdd);
                    }
                }

                if (gamesToRemove.Count > 0)
                {
                    foreach (var game in gamesToRemove)
                    {
                        _meetingRepository.RemoveGameFromMeeting(game, meeting.MeetingId);
                    }
                }

                TempData["SuccessMessage"] = Constants.GeneralSuccessMessage;
                if (changes == null)
                {
                    return(RedirectToAction(nameof(Edit), new { id = meeting.MeetingId }));
                }
                var appLink = Url.Action(nameof(Edit), "Meeting", new { id = baseMeeting.MeetingId },
                                         HttpContext.Request.Scheme);
                foreach (var email in _invitedUserRepository.GetUsersEmailsForNotification(baseMeeting.MeetingId, currentUserId))
                {
                    _templateSender.SendGeneralEmailAsync(new SendEmailDetails
                    {
                        IsHTML  = true,
                        ToEmail = email,
                        Subject = Constants.SubjectChangeMeetingDataEmail
                    }, Constants.TitleChangeMeetingDataEmail,
                                                          $"{Constants.ContentChangeMeetingDataEmail}: {changes}",
                                                          Constants.ButtonCheckMeeting,
                                                          appLink)
                    .ContinueWith(t =>
                    {
                        if (t.Result.Successful)
                        {
                            return;
                        }
                        foreach (var error in t.Result.Errors)
                        {
                            _logger.LogError(error);
                        }
                    }, TaskScheduler.Default);
                }

                return(RedirectToAction(nameof(Edit), new { id = meeting.MeetingId }));
            }

            vm.Games = _meetingRepository.GetGamesForOrganizer(vm.MeetingId, currentUserId).OrderBy(g => g.Title);
            return(View(vm));
        }
Пример #11
0
        public async Task <IActionResult> SendEmailAsync(EmailFromContactFormModel emailFromForm)
        {
            // Return bad request if no email sent
            if (emailFromForm == null)
            {
                return(BadRequest());
            }

            // Add new model error if email and name are the same
            if (emailFromForm.Name == emailFromForm.Email)
            {
                ModelState.AddModelError("FromEmail", "Your name should be different from your email");
            }

            // Return bad request if the model state failed
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            // Create new DTO for sending the email
            var email = EmailControllerHelper.CreateEmailToSendDto(
                emailFromForm.Name,
                emailFromForm.Email,
                emailFromForm.Message);

            // Send the email using the general template and get the response
            var response = await _emailTemplateSender.SendGeneralEmailAsync(
                email,
                $"You've got a message from:<br/>{emailFromForm.Name}",
                $"Reply to: {emailFromForm.Email}",
                emailFromForm.Message
                );

            // If the email was not sent...
            if (!response.Successful)
            {
                return(StatusCode(500, "A problem occurred while trying to send the email."));
            }

            // If the email was sent successfully...
            try
            {
                // Add Html content to email
                email.Email.MessageHtml = response.Email.Email.MessageHtml;

                // Map email body to email entity
                var deliveredEmailEntity = _mapper.Map <EmailMessageModel, DeliveredEmail>(email.Email);

                // Populate entity Sender field
                PopulateDeliveredEmailAddress(email.Sender,
                                              (senderEmailAddress) => { deliveredEmailEntity.Sender = senderEmailAddress; });

                // Populate entity Receiver field
                PopulateDeliveredEmailAddress(email.Receiver,
                                              (receiverEmailAddress) => { deliveredEmailEntity.Receiver = receiverEmailAddress; });

                // Add new entry into DB
                _emailRepository.AddDeliveredEmail(deliveredEmailEntity);

                // Save all outstanding changes to DB
                if (!_emailRepository.Save())
                {
                    return(StatusCode(500, "A problem occurred while saving to the database."));
                }
            }
            catch (Exception)
            {
                return(StatusCode(500, "A problem occurred while saving to the database."));
            }

            // Return email response to client
            return(StatusCode(201, response.Successful));

            // Helper method that checks if sender/receiver of email already exists in DB - uses those entries if they exist
            void PopulateDeliveredEmailAddress(EmailAddressModel person, Action <EmailAddress> setResult)
            {
                // If current person's email address exists in DB...
                if (_emailRepository.EmailAddressExists(person.Email))
                {
                    // Set result to be email address from DB
                    setResult(_emailRepository.GetEmailAddress(person));
                }
                // If person is not in DB...
                else
                {
                    // Set result to be new email address
                    setResult(_mapper.Map <EmailAddressModel, EmailAddress>(person));
                }
            }
        }
Пример #12
0
        public async Task <IActionResult> Sent(FriendInvitationViewModel.SentInvitationsViewModel vm)
        {
            if (string.IsNullOrEmpty(vm.InvitedEmail))
            {
                TempData["ErrorMessage"] = Constants.EmptyEmailInvitationMessage;
                return(RedirectToAction(nameof(List)));
            }

            if (!ModelState.IsValid)
            {
                return(RedirectToAction(nameof(List), new { vm.InvitedEmail }));
            }

            var currentUserId = GetCurrentUserId().Result;

            if (_friendInvitationRepository.IfInvitationWasSentByCurrentUser(currentUserId, vm.InvitedEmail))
            {
                TempData["ErrorMessage"] = Constants.ExistingInvitationSentByCurrentUserErrorMessage;
                return(RedirectToAction(nameof(List), new { vm.InvitedEmail }));
            }

            var invitedUser      = _userManager.FindByEmailAsync(vm.InvitedEmail).Result;
            var currentUserEmail = _userManager.FindByIdAsync(currentUserId).Result.Email;

            if (ToolsExtensions.IfStringsEqual(currentUserEmail, vm.InvitedEmail))
            {
                TempData["ErrorMessage"] = Constants.InvitationSentToAndByCurrentUserErrorMessage;
                return(RedirectToAction(nameof(List), new { vm.InvitedEmail }));
            }

            if (invitedUser != null &&
                _friendInvitationRepository.IfInvitationWasReceivedByCurrentUser(invitedUser.Id, currentUserEmail))
            {
                TempData["ErrorMessage"] = Constants.ExistingInvitationReceivedByCurrentUserErrorMessage;
                return(RedirectToAction(nameof(List), new { vm.InvitedEmail }));
            }

            var appLinkRegister = Url.Action("Register", "Account", new { Email = vm.InvitedEmail },
                                             HttpContext.Request.Scheme);
            var appLinkInvitations = Url.Action("List", "ReceivedInvitation", null, HttpContext.Request.Scheme);
            var response           = await _templateSender.SendGeneralEmailAsync(new SendEmailDetails
            {
                IsHTML  = true,
                ToEmail = vm.InvitedEmail,
                Subject = Constants.SubjectNewFriendInvitationEmail
            }, Constants.TitleNewFriendInvitationEmail,
                                                                                 invitedUser != null
                                                                                 ?Constants.ContentNewFriendInvitationExistingUserEmail
                                                                                 : Constants.ContentNewFriendInvitationNonExistingUserEmail,
                                                                                 invitedUser != null?Constants.ButtonCheckFriendInvitation : Constants.ButtonVisitSide,
                                                                                 invitedUser != null?appLinkInvitations : appLinkRegister);

            if (response.Successful)
            {
                var invitation = new FriendInvitation();
                if (invitedUser != null)
                {
                    invitation.Invited         = invitedUser;
                    TempData["SuccessMessage"] = Constants.ExistingAccountSentInvitationMessage;
                }
                else
                {
                    TempData["SuccessMessage"] = Constants.NoAccountSentInvitationMessage;
                }

                invitation.InvitedEmail = vm.InvitedEmail;
                invitation.SenderId     = currentUserId;
                _friendInvitationRepository.AddInvitation(invitation);

                return(RedirectToAction(nameof(List)));
            }

            _logger.LogCritical(vm.InvitedEmail);
            TempData["ErrorMessage"] =
                $"{Constants.GeneralSendEmailErrorMessage} {Constants.FriendInvitationEmailErrorMessage}";
            foreach (var error in response.Errors)
            {
                _logger.LogError(error);
            }

            return(RedirectToAction(nameof(List), new { vm.InvitedEmail }));
        }