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 }));
        }
Ejemplo n.º 2
0
        public IActionResult ChangeStatus(string userId, int meetingId, InvitationStatus status)
        {
            _invitedUserRepository.ChangeStatus(userId, meetingId, status);

            var appLink = Url.Action(nameof(List), "InvitedUser", new { id = meetingId }, HttpContext.Request.Scheme);
            var meeting = _meetingRepository.GetMeeting(meetingId);
            var user    = _userManager.FindByIdAsync(userId).Result;
            var content = $"meeting: {meeting.Title}, new status: {status} changed by the user: {user.FullName}";
            var users   = _invitedUserRepository.GetUsersEmailsForNotification(meetingId,
                                                                               _userManager.FindByIdAsync(userId).Result.Id);

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

            TempData["SuccessMessage"] = Constants.GeneralSuccessMessage;
            return(RedirectToAction(nameof(List), new { id = meetingId }));
        }
        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));
        }