public void AttemptToVerify(AccountEmailAddress emailAddress, EmailVerificationToken token)
 {
     _emailSender.SendEmail(
         new Email()
     {
         Recipient     = emailAddress.EmailAddress,
         Subject       = "Email Address Verification",
         EmailBodyType = EmailBodyType.HTML,
         Body          = $"your token : {token.VerificationToken}"
     });
 }
        public IHttpActionResult SignUp([FromBody] SignUpRequest request)
        {
            try
            {
                User user = (from u in db.Users
                             where u.Username == request.Username
                             select u).FirstOrDefault();

                if (user != null)
                {
                    return(Ok(new { Success = false, Message = "That username is already taken." }));
                }

                user = (from u in db.Users
                        where u.Email == request.Email
                        select u).FirstOrDefault();

                if (user != null)
                {
                    return(Ok(new { Success = false, Message = "An account with that email already exists." }));
                }

                user = new User()
                {
                    Username        = request.Username,
                    Password        = request.Password,
                    Email           = request.Email,
                    IsEmailVerified = false
                };

                db.Users.Add(user);

                db.SaveChanges();

                // Send this user a verification email.
                EmailVerificationToken token = user.SendVerificationEmail();
                db.EmailVerificationTokens.Add(token);
                db.SaveChanges();

                return(Ok(new { Success = true, User = user }));
            }
            catch (Exception ex)
            {
                return(InternalServerError(ex));
            }
        }
        public HttpResponseMessage VerifyEmail(string token)
        {
            try
            {
                // Remove the expired tokens.
                DateTime exactlyOneDayAgo = DateTime.Now.AddDays(-1);
                db.EmailVerificationTokens.RemoveRange(from evt in db.EmailVerificationTokens
                                                       where evt.CreatedAt < exactlyOneDayAgo
                                                       select evt);

                // The api will url-decode the token in the url, so we have to encode it again when we do our comparison.
                token = WebUtility.UrlEncode(token);
                EmailVerificationToken emailToken = (from evt in db.EmailVerificationTokens
                                                     where evt.Token == token
                                                     select evt).FirstOrDefault();

                if (emailToken is null)
                {
                    return(Request.CreateErrorResponse(HttpStatusCode.NotFound, "Email verification token could not be found or has expired."));
                }

                User user = db.Users.Find(emailToken.UserId);
                if (user is null)
                {
                    return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "The user for this token no longer exists."));
                }

                user.IsEmailVerified = true;
                db.SaveChanges();

                HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StringContent(LoadEmailVerifiedHtml())
                };
                response.Content.Headers.ContentType.MediaType = "text/html";
                return(response);
            }
            catch (Exception ex)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex));
            }
        }
        public IHttpActionResult SendVerificationEmail(int userId)
        {
            try
            {
                User user = db.Users.Find(userId);
                if (user is null)
                {
                    return(NotFound());
                }

                EmailVerificationToken token = user.SendVerificationEmail();
                db.EmailVerificationTokens.Add(token);
                db.SaveChanges();

                return(Ok());
            }
            catch (Exception ex)
            {
                return(InternalServerError(ex));
            }
        }
        public EmailVerificationToken InitiateEmailVerification(int userId)
        {
            // if there is a previous token for the user, delete it
            var token = AppContext.EmailVerificationTokens.Where(t => t.UserId == userId).FirstOrDefault();

            if (token != null)
            {
                AppContext.EmailVerificationTokens.Remove(token);
            }

            // generate a new token
            var newToken = Guid.NewGuid().ToString();
            var Token    = new EmailVerificationToken()
            {
                UserId     = userId,
                CreateTime = DateTime.Now,
                ExpiryTime = DateTime.Now.AddDays(1),
                Token      = newToken,
                Used       = false
            };

            AppContext.EmailVerificationTokens.Add(Token);
            return(Token);
        }