/// <summary>
        /// Sends an e-mail with a notification that the user has given access to a generic analysis.
        /// </summary>
        /// <param name="viewModel">Represents the view model of the e-mail.</param>
        public async Task SendAddedToAnalysisEmailAsync(EmailAddedToAnalysisViewModel viewModel)
        {
            // Define the variables for the e-mail.
            var apiKey      = _configuration.GetSection("Authentication:SendGrid:AppKey").Value;
            var client      = new SendGridClient(apiKey);
            var from        = new EmailAddress(_configuration.GetSection("EmailSender:Email").Value, _configuration.GetSection("EmailSender:Name").Value);
            var to          = new EmailAddress(viewModel.Email, viewModel.Email);
            var subject     = "NetControl4BioMed - You shared an analysis";
            var htmlContent = await _renderer.RenderPartialToStringAsync("_EmailAddedToAnalysisPartial", viewModel);

            var msg = MailHelper.CreateSingleEmail(from, to, subject, string.Empty, htmlContent);
            // Send the e-mail.
            await client.SendEmailAsync(msg);
        }
        public async Task <IActionResult> OnPostAsync(string id)
        {
            // Get the current user.
            var user = await _userManager.GetUserAsync(User);

            // Check if there isn't any ID provided.
            if (string.IsNullOrEmpty(id))
            {
                // Display a message.
                TempData["StatusMessage"] = "Error: No ID has been provided.";
                // Redirect to the index page.
                return(RedirectToPage("/Content/DatabaseTypes/PPI/Created/Analyses/Index"));
            }
            // Get the items with the provided ID.
            var items = _context.Analyses
                        .Where(item => item.AnalysisDatabases.Any(item1 => item1.Database.DatabaseType.Name == "PPI"))
                        .Where(item => item.IsPublic || item.AnalysisUsers.Any(item1 => item1.User == user))
                        .Where(item => item.Id == id);

            // Check if there were no items found.
            if (items == null || !items.Any())
            {
                // Display a message.
                TempData["StatusMessage"] = "Error: No item has been found with the provided ID, or you don't have access to it.";
                // Redirect to the index page.
                return(RedirectToPage("/Content/DatabaseTypes/PPI/Created/Analyses/Index"));
            }
            // Define the view.
            View = new ViewModel
            {
                Analysis = items
                           .Include(item => item.AnalysisUsers)
                           .ThenInclude(item => item.User)
                           .Include(item => item.AnalysisUserInvitations)
                           .First()
            };
            // Check if the user does not exist.
            if (user == null)
            {
                // Display a message.
                TempData["StatusMessage"] = "Error: You need to be logged in to add a user to the analysis.";
                // Redirect to the index page.
                return(RedirectToPage("/Content/DatabaseTypes/PPI/Created/Analyses/Details/Accounts/Users/Index", new { id = View.Analysis.Id }));
            }
            // Check if the reCaptcha is valid.
            if (!await _reCaptchaChecker.IsValid(Input.ReCaptchaToken))
            {
                // Add an error to the model.
                ModelState.AddModelError(string.Empty, "The reCaptcha verification failed.");
                // Return the page.
                return(Page());
            }
            // Check if the provided model is not valid.
            if (!ModelState.IsValid)
            {
                // Add an error to the model.
                ModelState.AddModelError(string.Empty, "An error was encountered. Please check again the input fields.");
                // Return the page.
                return(Page());
            }
            // Check if the provided e-mail address already has access to the network.
            if (View.Analysis.AnalysisUsers.Any(item => item.User.Email == Input.Email) || View.Analysis.AnalysisUserInvitations.Any(item => item.Email == Input.Email))
            {
                // Add an error to the model.
                ModelState.AddModelError(string.Empty, "The user with the provided e-mail already has access to the network.");
                // Return the page.
                return(Page());
            }
            // Try to get the user with the provided e-mail address.
            var userToAdd = _context.Users
                            .FirstOrDefault(item => item.Email == Input.Email);

            // Check if any user has been found.
            if (userToAdd != null)
            {
                // Define a new task.
                var task = new AnalysisUsersTask
                {
                    Items = new List <AnalysisUserInputModel>
                    {
                        new AnalysisUserInputModel
                        {
                            Analysis = new AnalysisInputModel
                            {
                                Id = View.Analysis.Id
                            },
                            User = new UserInputModel
                            {
                                Id = userToAdd.Id
                            }
                        }
                    }
                };
                // Try to run the task.
                try
                {
                    // Run the task.
                    await task.CreateAsync(_serviceProvider, CancellationToken.None);
                }
                catch (Exception exception)
                {
                    // Add an error to the model.
                    ModelState.AddModelError(string.Empty, exception.Message);
                    // Redisplay the page.
                    return(Page());
                }
            }
            else
            {
                // Define a new task.
                var task = new AnalysisUserInvitationsTask
                {
                    Items = new List <AnalysisUserInvitationInputModel>
                    {
                        new AnalysisUserInvitationInputModel
                        {
                            Analysis = new AnalysisInputModel
                            {
                                Id = View.Analysis.Id
                            },
                            Email = Input.Email
                        }
                    }
                };
                // Try to run the task.
                try
                {
                    // Run the task.
                    await task.CreateAsync(_serviceProvider, CancellationToken.None);
                }
                catch (Exception exception)
                {
                    // Add an error to the model.
                    ModelState.AddModelError(string.Empty, exception.Message);
                    // Redisplay the page.
                    return(Page());
                }
            }
            // Define the view model for the e-mail.
            var emailAddedToAnalysisViewModel = new EmailAddedToAnalysisViewModel
            {
                Email          = user.Email,
                Name           = View.Analysis.Name,
                Url            = _linkGenerator.GetUriByPage(HttpContext, "/Content/DatabaseTypes/PPI/Created/Analyses/Details/Index", handler: null, values: new { id = View.Analysis.Id }),
                AddedEmail     = Input.Email,
                ApplicationUrl = _linkGenerator.GetUriByPage(HttpContext, "/Index", handler: null, values: null)
            };
            // Send the defined e-mails.
            await _emailSender.SendAddedToAnalysisEmailAsync(emailAddedToAnalysisViewModel);

            // Define the view model for the e-mail.
            var emailWasAddedToAnalysisViewModel = new EmailWasAddedToAnalysisViewModel
            {
                Email          = Input.Email,
                Name           = View.Analysis.Name,
                Url            = _linkGenerator.GetUriByPage(HttpContext, "/Content/DatabaseTypes/PPI/Created/Analyses/Details/Index", handler: null, values: new { id = View.Analysis.Id }),
                AddedByEmail   = user.Email,
                ApplicationUrl = _linkGenerator.GetUriByPage(HttpContext, "/Index", handler: null, values: null)
            };
            // Send the defined e-mails.
            await _emailSender.SendWasAddedToAnalysisEmailAsync(emailWasAddedToAnalysisViewModel);

            // Display a message to the user.
            TempData["StatusMessage"] = "Success: 1 user added successfully to the analysis.";
            // Redirect to the users page.
            return(RedirectToPage("/Content/DatabaseTypes/PPI/Created/Analyses/Details/Accounts/Users/Index", new { id = View.Analysis.Id }));
        }
        public async Task <IActionResult> OnPostAsync(string id)
        {
            // Get the current user.
            var user = await _userManager.GetUserAsync(User);

            // Check if the user does not exist.
            if (user == null)
            {
                // Display a message.
                TempData["StatusMessage"] = "Error: An error occured while trying to load the user data. If you are already logged in, please log out and try again.";
                // Redirect to the home page.
                return(RedirectToPage("/Index"));
            }
            // Check if there isn't any ID provided.
            if (string.IsNullOrEmpty(id))
            {
                // Display a message.
                TempData["StatusMessage"] = "Error: No ID has been provided.";
                // Redirect to the index page.
                return(RedirectToPage("/Content/Created/Analyses/Index"));
            }
            // Get the items with the provided ID.
            var items = _context.Analyses
                        .Where(item => item.AnalysisUsers.Any(item1 => item1.User == user))
                        .Where(item => item.Id == id);

            // Check if there were no items found.
            if (items == null || !items.Any())
            {
                // Display a message.
                TempData["StatusMessage"] = "Error: No item has been found with the provided ID, or you don't have access to it.";
                // Redirect to the index page.
                return(RedirectToPage("/Content/Created/Analyses/Index"));
            }
            // Define the view.
            View = new ViewModel
            {
                Analysis = items
                           .Include(item => item.AnalysisUsers)
                           .ThenInclude(item => item.User)
                           .Include(item => item.AnalysisUserInvitations)
                           .First()
            };
            // Check if the reCaptcha is valid.
            if (!await _reCaptchaChecker.IsValid(Input.ReCaptchaToken))
            {
                // Add an error to the model.
                ModelState.AddModelError(string.Empty, "The reCaptcha verification failed.");
                // Return the page.
                return(Page());
            }
            // Check if the provided model is not valid.
            if (!ModelState.IsValid)
            {
                // Add an error to the model.
                ModelState.AddModelError(string.Empty, "An error was encountered. Please check again the input fields.");
                // Return the page.
                return(Page());
            }
            // Check if the provided e-mail address already has access to the network.
            if (View.Analysis.AnalysisUsers.Any(item => item.User.Email == Input.Email) || View.Analysis.AnalysisUserInvitations.Any(item => item.Email == Input.Email))
            {
                // Add an error to the model.
                ModelState.AddModelError(string.Empty, "The user with the provided e-mail already has access to the network.");
                // Return the page.
                return(Page());
            }
            // Try to get the user with the provided e-mail address.
            var userToAdd = _context.Users
                            .FirstOrDefault(item => item.Email == Input.Email);

            // Check if any user has been found.
            if (userToAdd != null)
            {
                // Create the user permission.
                var networkUser = new AnalysisUser
                {
                    UserId          = userToAdd.Id,
                    User            = userToAdd,
                    AnalysisId      = View.Analysis.Id,
                    Analysis        = View.Analysis,
                    DateTimeCreated = DateTime.Now
                };
                // Mark it for addition to the database.
                _context.AnalysisUsers.Add(networkUser);
                // Save the changes to the database.
                await _context.SaveChangesAsync();
            }
            else
            {
                // Create the user permission.
                var networkUserInvitation = new AnalysisUserInvitation
                {
                    Email           = Input.Email,
                    AnalysisId      = View.Analysis.Id,
                    Analysis        = View.Analysis,
                    DateTimeCreated = DateTime.Now
                };
                // Mark it for addition to the database.
                _context.AnalysisUserInvitations.Add(networkUserInvitation);
                // Save the changes to the database.
                await _context.SaveChangesAsync();
            }
            // Define the view model for the e-mails.
            var emailAddedToAnalysisViewModel = new EmailAddedToAnalysisViewModel
            {
                Email          = user.Email,
                Name           = View.Analysis.Name,
                Url            = _linkGenerator.GetUriByPage(HttpContext, "/Content/Created/Analyses/Details/Index", handler: null, values: new { id = View.Analysis.Id }),
                AddedEmail     = Input.Email,
                ApplicationUrl = _linkGenerator.GetUriByPage(HttpContext, "/Index", handler: null, values: null)
            };
            var emailWasAddedToAnalysisViewModel = new EmailWasAddedToAnalysisViewModel
            {
                Email          = Input.Email,
                Name           = View.Analysis.Name,
                Url            = _linkGenerator.GetUriByPage(HttpContext, "/Content/Created/Analyses/Details/Index", handler: null, values: new { id = View.Analysis.Id }),
                AddedByEmail   = user.Email,
                ApplicationUrl = _linkGenerator.GetUriByPage(HttpContext, "/Index", handler: null, values: null)
            };
            // Send the defined e-mails.
            await _emailSender.SendAddedToAnalysisEmailAsync(emailAddedToAnalysisViewModel);

            await _emailSender.SendWasAddedToAnalysisEmailAsync(emailWasAddedToAnalysisViewModel);

            // Display a message to the user.
            TempData["StatusMessage"] = "Success: 1 user added successfully to the network.";
            // Redirect to the users page.
            return(RedirectToPage("/Content/Created/Analyses/Details/Accounts/Users/Index", new { id = View.Analysis.Id }));
        }