/// <summary>
        /// Add email addresses to an application
        /// </summary>
        /// <param name="id">application id</param>
        public ActionResult Share(int id)
        {
            var applicant   = GetCurrentApplicant();
            var application = _context.Applications.Find(id);

            if (application == null)
            {
                throw new HttpResponseException(HttpStatusCode.BadRequest);
            }

            ShareApplicationViewModel vm = new ShareApplicationViewModel(application, applicant);

            // If applicant is not registered with application
            if (application.Applicants.All(x => x.Id != applicant.Id))
            {
                // If on share request list
                if (application.SharedRequests.Any(x => x.EmailAddress == applicant.User.Email))
                {
                    return(View("AcceptShare", vm));
                }
            }
            else
            {
                return(View(vm));
            }

            throw new HttpResponseException(HttpStatusCode.Forbidden);
        }
        public async Task <ActionResult> UpdateApplicationInvites(
            [ModelBinder(typeof(ApplicationInvitesModelBinder))] List <EmailInfo> emailList, int applicationId)
        {
            var applicant   = GetCurrentApplicant();
            var application = (applicant.Applications.FirstOrDefault(x => x.Id == applicationId));

            if (application == null)
            {
                throw new HttpResponseException(HttpStatusCode.BadRequest);
            }

            if (!ModelState.IsValid)
            {
                ShareApplicationViewModel vm = new ShareApplicationViewModel(application, applicant);
                vm.ShareRequests.Clear();
                vm.ShareRequests.AddRange(emailList);
                return(View("Share", vm));
            }

            List <MailMessage> messages  = new List <MailMessage>();
            List <EmailInfo>   newShares = new List <EmailInfo>();

            foreach (var toshare in emailList)
            {
                if (!application.SharedRequests.Contains(toshare))
                {
                    MailMessage message = new MailMessage("*****@*****.**", toshare.EmailAddress)
                    {
                        Subject =
                            $"[Application ID #{applicationId}] {applicant.User.Name} invites you to work on a {application.DisplayName} Project"
                    };
                    EmailInviteViewModel invite = new EmailInviteViewModel()
                    {
                        Address = application.ProjectInfo.ToString(),
                        ToName  = toshare.EmailAddress,
                        ApplicationDisplayName = application.DisplayName,
                    };
                    if (Request.Url != null)
                    {
                        invite.RegisterUrl    = this.Url.Action("Register", "Account", new object(), Request.Url.Scheme);
                        invite.ApplicationUrl = Url.Action("Share", "Applications", new { id = application.Id }, Request.Url.Scheme);
                    }
                    message.Body = RenderRazorViewToString("InviteEmail", invite);

                    message.IsBodyHtml = true;
                    // Send invite via email
                    messages.Add(message);
                    newShares.Add(toshare);
                }
            }
            await Contact(messages);

            application.SharedRequests.AddRange(newShares);
            foreach (var newShare in newShares)
            {
                var foundApplicant = _context.Users.Include(x => x.Data).FirstOrDefault(x => x.Email == newShare.EmailAddress);
                // Only Add notification if the applicant already exists.
                foundApplicant?.Data.Notifications.Add(new ShareApplicationNotification()
                {
                    Applicant     = foundApplicant.Data,
                    ApplicantId   = foundApplicant.DataId,
                    ApplicationId = application.Id
                });
            }
            _context.SaveChanges();
            return(RedirectToAction("Share", "Applications", new { id = applicationId }));
        }