public async Task <IActionResult> UserProfileAsync(UserProfileViewModel vm)
        {
            if (ModelState.IsValid)
            {
                var user = await _userManager.FindByNameAsync(User.Identity.Name);

                if (user != null)
                {
                    user.FirstName   = vm.FirstName;
                    user.LastName    = vm.LastName;
                    user.Street      = vm.Address.Street;
                    user.City        = vm.Address.City;
                    user.Country     = vm.Address.Country;
                    user.PostalCode  = vm.Address.PostalCode;
                    user.PhoneNumber = vm.PhoneNumber;
                    user.TimeZone    = vm.TimeZone;

                    var result = await _userManager.UpdateAsync(user);

                    if (result.Succeeded)
                    {
                        TempData["SuccessMessage"] = Constants.GeneralSuccessMessage;
                        return(RedirectToAction(nameof(UserProfileAsync)));
                    }
                }

                _logger.LogCritical(Constants.UnknownId + " of user");
                return(RedirectToAction(nameof(ErrorController.Error), "Error"));
            }

            vm.TimeZoneList = ToolsExtensions.GetTimeZones();
            return(View("UserProfile", vm));
        }
Beispiel #2
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);
            }
        }
        private string CompareMeetingData(Meeting oldMeeting, Meeting newMeeting, string timeZone)
        {
            string changes         = null;
            var    oldStartDateUtc = DateTime.SpecifyKind(oldMeeting.StartDateTime, DateTimeKind.Utc);
            var    newStartDateUtc = DateTime.SpecifyKind(newMeeting.StartDateTime, DateTimeKind.Utc);

            if (oldMeeting.StartDateTime != newMeeting.StartDateTime)
            {
                changes += string.Join(", ",
                                       $"{Constants.OldValueMeetingMessage} Start date: {ToolsExtensions.ConvertToTimeZoneFromUtc(oldStartDateUtc, timeZone, _logger).ToString(Constants.DateTimeFormat, CultureInfo.InvariantCulture)}, " +
                                       $"{Constants.CurrentValueMeetingMessage} Start date: {ToolsExtensions.ConvertToTimeZoneFromUtc(newStartDateUtc, timeZone, _logger).ToString(Constants.DateTimeFormat, CultureInfo.InvariantCulture)}, ");
            }

            if (!ToolsExtensions.IfStringsEqual(oldMeeting.Street, newMeeting.Street))
            {
                changes += string.Join(", ",
                                       $"{Constants.OldValueMeetingMessage} Street (address): {oldMeeting.Street}, " +
                                       $"{Constants.CurrentValueMeetingMessage} Street (address): {newMeeting.Street}, ");
            }

            if (!ToolsExtensions.IfStringsEqual(oldMeeting.City, newMeeting.City))
            {
                changes += string.Join(", ",
                                       $"{Constants.OldValueMeetingMessage} City (address): {oldMeeting.City}, " +
                                       $"{Constants.CurrentValueMeetingMessage} City (address): {newMeeting.City}");
            }

            return(changes);
        }
Beispiel #4
0
        public IActionResult List()
        {
            //TODO sort by status, PEnding first, then sort by Date
            var currentUser             = _userManager.FindByNameAsync(User.Identity.Name).Result;
            var timeZone                = currentUser.TimeZone;
            var receivedInvitationsList = _friendInvitationRepository
                                          .GetInvitationsReceivedByCurrentUser(currentUser.Email)
                                          .Select(item => new FriendInvitationViewModel.ReceivedInvitationsList
            {
                SenderUserName = item.Sender.FullName,
                SenderEmail    = item.Sender.Email,
                Status         = item.Status,
                PostDate       = ToolsExtensions.ConvertToTimeZoneFromUtc(item.PostDateTime, timeZone, _logger)
                                 .ToString(Constants.DateTimeFormat, CultureInfo.InvariantCulture),
                InvitationId = item.FriendInvitationId
            })
                                          .ToList();

            var vm = new FriendInvitationViewModel.ReceivedInvitationsViewModel
            {
                ReceivedInvitationsList = receivedInvitationsList
            };

            return(View(vm));
        }
        private TimeZoneInfo GetTimeZoneOfCurrentUser()
        {
            var currentUser         = _userManager.FindByNameAsync(User.Identity.Name).Result;
            var currentUserTimeZone = currentUser.TimeZone;

            return(ToolsExtensions.ConvertTimeZone(currentUserTimeZone, _logger));
        }
        public async Task <IActionResult> UserProfileAsync()
        {
            var user = await _userManager.FindByNameAsync(User.Identity.Name);

            if (user == null)
            {
                _logger.LogCritical(Constants.UnknownId + " of user");
                return(RedirectToAction(nameof(ErrorController.Error), "Error"));
            }

            var vm = new UserProfileViewModel
            {
                FirstName    = user.FirstName,
                LastName     = user.LastName,
                Email        = user.Email,
                PhoneNumber  = user.PhoneNumber,
                TimeZoneList = ToolsExtensions.GetTimeZones(),
                TimeZone     = user.TimeZone,
                Address      = new AddressViewModels
                {
                    Street     = user.Street,
                    City       = user.City,
                    Country    = user.Country,
                    PostalCode = user.PostalCode
                }
            };

            return(View("UserProfile", vm));
        }
Beispiel #7
0
        public ViewResult Index()
        {
            var currentUserId = GetCurrentUserId().Result;
            var timeZone      = _userManager
                                .FindByIdAsync(currentUserId).Result.TimeZone;
            var upcomingMeetings = _meetingRepository.GetMeetingsForUserForNextDays(currentUserId, 7)
                                   .OrderBy(m => m.StartDateTime);
            var list = (from meeting in upcomingMeetings
                        let games = string.Join(", ", meeting.MeetingGame.Select(mg => mg.Game.Title))
                                    let people = string.Join(", ", meeting.MeetingInvitedUser.Select(iu => iu.AppUser.FullName))
                                                 .Insert(0, $"{meeting.Organizer.FullName}, ")
                                                 let startDateUtc = ToolsExtensions.ConvertToTimeZoneFromUtc(meeting.StartDateTime, timeZone, _logger)
                                                                    select new UpcomingMeetings()
            {
                StartDate = startDateUtc.ToString(Constants.DateTimeFormat, CultureInfo.InvariantCulture),
                Games = games, People = people,
                Url = Url.Action("Edit", "Meeting", new { id = meeting.MeetingId.ToString() },
                                 HttpContext.Request.Scheme)
            }).ToList();

            var mv = new StartViewModels {
                UpcomingMeetings = list
            };

            return(View(mv));
        }
Beispiel #8
0
        public ViewResult HangingTree()
        {
            var game = _gameRepository.Games.Any() ?
                       ToolsExtensions.Random(_gameRepository.Games) : new Game {
                Title = "Empty base", GameId = 42
            };

            return(View(game));
        }
        public IEnumerable <Meeting> Get()
        {
            var currentUserId       = GetCurrentUserId().Result;
            var currentUser         = _userManager.FindByIdAsync(currentUserId).Result;
            var currentUserTimeZone = currentUser.TimeZone;
            var timeZone            = ToolsExtensions.ConvertTimeZone(currentUserTimeZone, _logger);
            var meetings            = _meetingRepository.GetMeetingsForUser(currentUserId);

            return(GetMeetingsWithDates(meetings, timeZone));
        }
Beispiel #10
0
        public void Account_info_return_listof_playerInfo()
        {
            var createdAtDate = ToolsExtensions.DateFromWGTimestamp(createdAt);
            var result        = WGApplication.GetPlayerInfo(new[] { accountId });

            Assert.IsNotNull(result.Data);
            Assert.AreEqual("ok", result.Status);
            Assert.AreEqual(result.Data[0].AccountId, accountId);
            Assert.AreEqual(result.Data[0].CreatedAt, createdAtDate.DateToWGTimesptamp());
        }
Beispiel #11
0
        public void Account_info_return_listof_playerInfo_using_all_parameters_except_accessToken()
        {
            var createdAtDate = ToolsExtensions.DateFromWGTimestamp(createdAt);
            var result        = WGApplication.GetPlayerInfo(new[] { accountId }, WGLanguageField.EN, null, "account_id,created_at");

            Assert.IsNotNull(result.Data);
            Assert.AreEqual("ok", result.Status);
            Assert.AreEqual(result.Data[0].AccountId, accountId);
            Assert.AreEqual(result.Data[0].CreatedAt, createdAtDate.DateToWGTimesptamp());
        }
Beispiel #12
0
        public IActionResult Register()
        {
            if (!User?.Identity?.IsAuthenticated ?? false)
            {
                return(View(new RegisterViewModel {
                    TimeZoneList = ToolsExtensions.GetTimeZones()
                }));
            }

            return(RedirectToAction(nameof(ShelfController.List), "Shelf"));
        }
Beispiel #13
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));
        }
Beispiel #14
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));
        }
Beispiel #15
0
        public IEnumerable <Meeting> Get()
        {
            var currentUserId = GetCurrentUserId().Result;
            var currentUser   = _userManager.FindByIdAsync(currentUserId).Result;
            var timeZone      = currentUser.TimeZone;
            var list          = _meetingRepository.GetMeetingsForUser(currentUserId).ToList();

            foreach (var meeting in list)
            {
                meeting.StartDateTime =
                    ToolsExtensions.ConvertToTimeZoneFromUtc(meeting.StartDateTime, timeZone, _logger);
                meeting.EndDateTime = ToolsExtensions.ConvertToTimeZoneFromUtc(meeting.EndDateTime, timeZone, _logger);
            }

            return(list.AsEnumerable());
        }
Beispiel #16
0
        public async Task <IActionResult> Register(string returnUrl, string email)
        {
            var model = new RegisterViewModel
            {
                Email          = email,
                ReturnUrl      = returnUrl,
                ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(),
                TimeZoneList   = ToolsExtensions.GetTimeZones()
            };

            if (!User?.Identity?.IsAuthenticated ?? false)
            {
                return(View(model));
            }

            return(RedirectToAction(nameof(ShelfController.List), "Shelf"));
        }
        public IActionResult Create()
        {
            var currentUser = _userManager.FindByNameAsync(User.Identity.Name).Result;
            var timeZone    = currentUser.TimeZone;

            return(View(nameof(Edit), new MeetingViewModels.CreateEditMeetingViewModel
            {
                Organizer = currentUser.FullName,
                Games = _meetingRepository.GetGamesForOrganizer(0, currentUser.Id),
                StartDateTime = ToolsExtensions.ConvertToTimeZoneFromUtc(DateTime.UtcNow.AddHours(1), timeZone, _logger)
                                .ToString(Constants.DateTimeFormat, CultureInfo.InvariantCulture),
                EndDateTime = ToolsExtensions.ConvertToTimeZoneFromUtc(DateTime.UtcNow.AddHours(2), timeZone, _logger)
                              .ToString(Constants.DateTimeFormat, CultureInfo.InvariantCulture),
                IsEditable = true,
                Address = new AddressViewModels(),
                TimeZone = timeZone
            }));
        }
Beispiel #18
0
        public IActionResult List(FriendInvitationViewModel.SentInvitationsViewModel vm)
        {
            var currentUser         = _userManager.FindByNameAsync(User.Identity.Name).Result;
            var timeZone            = currentUser.TimeZone;
            var sentInvitationsList = _friendInvitationRepository
                                      .GetInvitationsSentByCurrentUser(currentUser.Id)
                                      .Select(item => new FriendInvitationViewModel.SentInvitationsList()
            {
                InvitedUser = item.Invited != null
                        ? item.Invited.FullName
                        : item.InvitedEmail,
                InvitedEmail = item.InvitedEmail,
                Status       = item.Status,
                PostDate     = ToolsExtensions.ConvertToTimeZoneFromUtc(item.PostDateTime, timeZone, _logger)
                               .ToString(Constants.DateTimeFormat, CultureInfo.InvariantCulture)
            })
                                      .ToList();

            vm.InvitedUsersList = sentInvitationsList;
            return(View(vm));
        }
        public IActionResult Edit(int id)
        {
            var currentUserId = GetCurrentUserId().Result;
            var meeting       = _meetingRepository.GetMeeting(id);

            if (meeting == null)
            {
                _logger.LogCritical($"{Constants.UnknownId} of meeting");
                return(RedirectToAction(nameof(ErrorController.Error), "Error"));
            }

            var timeZone = _userManager.FindByIdAsync(currentUserId).Result.TimeZone;

            var vm = new MeetingViewModels.CreateEditMeetingViewModel
            {
                Organizer     = meeting.Organizer.FullName,
                Title         = meeting.Title,
                MeetingId     = meeting.MeetingId,
                StartDateTime = ToolsExtensions.ConvertToTimeZoneFromUtc(meeting.StartDateTime, timeZone, _logger)
                                .ToString(Constants.DateTimeFormat, CultureInfo.InvariantCulture),
                EndDateTime = ToolsExtensions.ConvertToTimeZoneFromUtc(meeting.EndDateTime, timeZone, _logger)
                              .ToString(Constants.DateTimeFormat, CultureInfo.InvariantCulture),
                Notes         = meeting.Notes,
                Games         = _meetingRepository.GetGamesForOrganizer(id, meeting.OrganizerId).OrderBy(g => g.Title),
                SelectedGames = GetGameIdsFromMeeting(id),
                IsEditable    = meeting.Organizer.UserName == User.Identity.Name,
                TimeZone      = timeZone,
                Address       = new AddressViewModels
                {
                    Street     = meeting.Street,
                    City       = meeting.City,
                    PostalCode = meeting.PostalCode,
                    Country    = meeting.Country
                }
            };

            return(View(vm));
        }
        public IActionResult List(int id)
        {
            if (id == 0)
            {
                return(RedirectToAction(nameof(MeetingController.List), "Meeting"));
            }

            var currentUserId = GetCurrentUserId().Result;
            var currentUser   = _userManager.FindByIdAsync(currentUserId).Result;
            var timeZone      = currentUser.TimeZone;

            var messages = _messageRepository.GetMessagesForMeeting(id).ToList();

            foreach (var message in messages)
            {
                message.Created      = ToolsExtensions.ConvertToTimeZoneFromUtc(message.Created, timeZone, _logger);
                message.Author.Email = message.Author.Email.Trim().ToLower();
            }

            return(View(new MessagesListViewModel {
                Messages = messages, MeetingId = id
            }));
        }
        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));
        }
Beispiel #22
0
        public async Task <IActionResult> ExternalLoginCallback(string timeZone, AuthPageType pageType = AuthPageType.Login,
                                                                string returnUrl = null, string remoteError = null)
        {
            var view  = new ViewResult();
            var field = string.Empty;

            switch (pageType)
            {
            case AuthPageType.Login:
                returnUrl = returnUrl ?? Url.Content("~/");
                view      = View("Login", new LoginViewModel
                {
                    ReturnUrl      = returnUrl,
                    ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList()
                });
                field = nameof(LoginViewModel.Email);
                break;

            case AuthPageType.Register:
                returnUrl = Url.Action(nameof(StartController.Index), "Start");
                field     = nameof(RegisterViewModel.Email);
                view      = View("Register", new RegisterViewModel()
                {
                    ReturnUrl      = returnUrl,
                    ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(),
                    TimeZoneList   = ToolsExtensions.GetTimeZones()
                });
                break;
            }

            if (remoteError != null)
            {
                ModelState.AddModelError(field, Constants.AuthProviderError);
                _logger.LogError($"{Constants.AuthProviderKnownError}: {remoteError}");
                return(view);
            }

            var info = await _signInManager.GetExternalLoginInfoAsync();

            if (info == null)
            {
                ModelState.AddModelError(field, Constants.AuthProviderError);
                _logger.LogError(Constants.AuthProviderUnknownError);
                return(view);
            }

            var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider,
                                                                       info.ProviderKey, false, true);

            if (result.Succeeded)
            {
                return(LocalRedirect(returnUrl));
            }

            var email = info.Principal.FindFirstValue(ClaimTypes.Email);

            if (email == null)
            {
                ModelState.AddModelError(field, Constants.AuthProviderError);
                _logger.LogError(Constants.AuthProviderUnknownEmailError);
                return(view);
            }
            var user = await _userManager.FindByEmailAsync(email);

            if (user == null)
            {
                user = new AppUser
                {
                    UserName = info.Principal.FindFirstValue(ClaimTypes.Email),
                    Email    = info.Principal.FindFirstValue(ClaimTypes.Email),
                    TimeZone = timeZone ?? ToolsExtensions.GetTimeZones().FirstOrDefault().Key
                };
                var resultCreate = await _userManager.CreateAsync(user);

                if (resultCreate.Succeeded)
                {
                    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)
                    {
                        TempData["ErrorMessage"] = Constants.GeneralSendEmailErrorMessage;
                        foreach (var error in response.Errors)
                        {
                            _logger.LogError(error);
                        }
                    }
                }
            }

            await _userManager.AddLoginAsync(user, info);

            await _signInManager.SignInAsync(user, false);

            return(LocalRedirect(returnUrl));
        }
Beispiel #23
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 }));
        }
        public async Task <IActionResult> Edit(MeetingViewModels.CreateEditMeetingViewModel vm)
        {
            var timeZone            = GetTimeZoneOfCurrentUser();
            var startDateUTC        = TimeZoneInfo.ConvertTimeToUtc(vm.StartDateTime, timeZone);
            var endDateUTC          = TimeZoneInfo.ConvertTimeToUtc(vm.EndDateTime, timeZone);
            var currentUserId       = GetCurrentUserId().Result;
            var overlappingMeetings = new List <Meeting>();

            overlappingMeetings = vm.MeetingId == 0
                ? _meetingRepository.GetOverlappingMeetingsForUser(startDateUTC, endDateUTC, currentUserId).ToList()
                : _meetingRepository.GetOverlappingMeetingsForMeeting(startDateUTC, endDateUTC, vm.MeetingId).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 = ": ";
                foreach (var meeting in overlappingMeetings)
                {
                    overlappingMeetingsTitle += meeting.Title + " ";
                }

                ModelState.AddModelError(nameof(MeetingViewModels.CreateEditMeetingViewModel.OrganizerId),
                                         Constants.OverlappingMeetingsMessage + overlappingMeetingsTitle);
            }

            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
                };
                _meetingRepository.SaveMeeting(meeting);
                var savedGames    = GetGameIdsFromMeeting(meeting.MeetingId);
                var selectedGames = vm.SelectedGames ?? new int[0];
                var gamesToAdd    = selectedGames.Except(savedGames).ToList();
                var gamesToRemove = savedGames.Except(selectedGames).ToList();

                if (gamesToAdd.Count > 0)
                {
                    foreach (var game in gamesToAdd)
                    {
                        var gameToAdd = 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;
                return(RedirectToAction(nameof(Edit), new { id = meeting.MeetingId }));
            }

            vm.Organizers = _userManager.Users.ToList();
            vm.Games      = _gameRepository.Games.ToList();
            return(View(vm));
        }
Beispiel #25
0
        public async Task <IActionResult> Add(InvitedUserViewModel.InvitedUserListViewModel vm)
        {
            var userId    = vm.SelectedToInviteUserId;
            var meetingId = vm.MeetingId;

            if (_invitedUserRepository.IfUserIsInvited(meetingId, userId))
            {
                TempData["ErrorMessage"] = Constants.ExistingMeetingInvitationMessage;
                return(RedirectToAction(nameof(List), new { id = meetingId }));
            }

            var meeting          = _meetingRepository.GetMeeting(meetingId);
            var user             = _userManager.FindByIdAsync(userId).Result;
            var games            = meeting.MeetingGame.Select(mg => mg.Game.Title);
            var meetingStartDate = ToolsExtensions
                                   .ConvertToTimeZoneFromUtc(meeting.StartDateTime, user.TimeZone, _logger)
                                   .ToString(Constants.DateTimeFormat, CultureInfo.InvariantCulture);
            var meetingEndDate = ToolsExtensions.ConvertToTimeZoneFromUtc(meeting.EndDateTime, user.TimeZone, _logger)
                                 .ToString(Constants.DateTimeFormat, CultureInfo.InvariantCulture);

            var overlappingMeetings = new List <string>();

            overlappingMeetings = _meetingRepository
                                  .GetOverlappingMeetingsForUser(meeting.StartDateTime, meeting.EndDateTime, userId)
                                  .Select(m => m.Title)
                                  .ToList();
            // bozy This variable should be inside the if part. Moreover setting a variable with a single space is a code smell

            if (overlappingMeetings.Count > 0)
            {
                // use string.Join() instead of foreach.
                var overlappingMeetingsTitle = string.Join(", ", overlappingMeetings);

                TempData["ErrorMessage"] = $"{Constants.OverlappingMeetingsMessage}: {overlappingMeetingsTitle}";
                return(RedirectToAction(nameof(List), new { id = meetingId }));
            }

            _invitedUserRepository.AddUserToMeeting(userId, meetingId, InvitationStatus.Pending);
            TempData["SuccessMessage"] = Constants.GeneralSuccessMessage;

            var appLink = Url.Action(nameof(List), "InvitedUser", new { id = meetingId }, HttpContext.Request.Scheme);
            var content =
                $"{Constants.ContentInviteUserEmail}: Organizer: {meeting.Organizer.FullName}; Start date: {meetingStartDate}; End date: {meetingEndDate};" +
                $" Games: {string.Join(", ", games)}";
            var response = await _templateSender.SendGeneralEmailAsync(new SendEmailDetails
            {
                IsHTML  = true,
                ToEmail = user.Email,
                Subject = Constants.SubjectInviteUserEmail
            }, Constants.TitleInviteUserEmail, content,
                                                                       Constants.ButtonCheckMeeting,
                                                                       appLink);

            if (response.Successful)
            {
                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 }));
        }