public async Task <IActionResult> PutLibraryUserRegistrationRequest(int id, LibraryUserRegistrationRequest libraryUserRegistrationRequest)
        {
            if (id != libraryUserRegistrationRequest.RequestId)
            {
                return(BadRequest());
            }

            _context.Entry(libraryUserRegistrationRequest).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!LibraryUserRegistrationRequestExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(NoContent());
        }
        public async Task <IActionResult> Activate(Guid id)
        {
            var libraryUserRequest =
                await _context.LibraryUserRegistrationRequest.FirstOrDefaultAsync(
                    a => a.UserRequestStatus == "New" &&
                    a.ActivationCode == id.
                    ToString());

            if (libraryUserRequest != null)
            {
                LibraryUserRegistrationRequest Request = (LibraryUserRegistrationRequest)libraryUserRequest;
                if ((DateTime.Today - Request.RequestTime).TotalDays > 3)
                {
                    ViewBag.Message = "Your membership request verification time has expired. Please apply again";
                }
                else
                {
                    ViewBag.Message =
                        "Hi! " + Request.FirstName + " " + Request.LastName +
                        " Your library membership request has been received by WellDev." +
                        " Please take the original and photocopy of your identification document (NID or Passport)" +
                        " to the library administrator office for user account activation with in 30 days";
                    Request.UserRequestStatus = "Email Verified";
                    await _context.SaveChangesAsync();
                }
            }
            else
            {
                ViewBag.Message = "Invalid Request";
            }

            return(View());
        }
        public async Task <IActionResult> RegisterAccount([Bind("FirstName,LastName,Nidno,PassportNo,Email,MobileNo,HomeAddress,City,Country,DateOfBirth,Uname,Upassword,ConfirmPassword")] LibraryUserRegistrationRequest libraryUserRequest)
        {
            //Model validation
            if (ModelState.IsValid)
            {
                string message = null;

                #region Custom Model Validation
                //validate Date Of Birth
                if (string.IsNullOrEmpty(libraryUserRequest.DateOfBirth))
                {
                    ModelState.AddModelError(
                        "DateOfBirth",
                        "You must provide your Date Of Birth");
                    return(View(libraryUserRequest));
                }

                //Email verify: active user
                var userWithEmail =
                    await _context.LibraryUser.
                    FirstOrDefaultAsync(
                        a => a.Email == libraryUserRequest.Email &&
                        a.AccountStatus == "Active");

                if (userWithEmail != null)
                {
                    ModelState.
                    AddModelError(
                        "Email", "There is already a member account with mailing address");
                    return(View(libraryUserRequest));
                }

                //Email verify: active user request
                var userRequestWithEmail =
                    await _context.
                    LibraryUserRegistrationRequest.
                    FirstOrDefaultAsync(
                        a => a.Email == libraryUserRequest.Email &&
                        (a.UserRequestStatus != "New" ||
                         a.UserRequestStatus == "Email Veified"));

                if (userRequestWithEmail != null)
                {
                    ModelState.
                    AddModelError(
                        "Email",
                        "There is already a pending membership request for this mailing address");
                    return(View(libraryUserRequest));
                }

                //Email verify: rejected in last three months
                var rejectedInthreeMonth =
                    await _context.LibraryUserRegistrationRequest.FirstOrDefaultAsync(
                        a =>
                        (a.Email == libraryUserRequest.Email ||
                         a.Nidno == libraryUserRequest.Nidno ||
                         a.PassportNo == libraryUserRequest.PassportNo) &&
                        a.UserRequestStatus == "Reject" &&
                        a.RequestTime >= DateTime.Now.AddMonths(-3));

                if (rejectedInthreeMonth != null)
                {
                    ViewBag.Status = true;
                    message        =
                        "Libarry Membership Request for "
                        + libraryUserRequest.FirstName
                        + " " + libraryUserRequest.LastName + " "
                        + "has been rejected less then three months ago. We can not receive your application now."
                        + " Please try again later";
                    ViewBag.Message = message;
                    return(View(libraryUserRequest));
                }

                //check unique username
                var resultUser =
                    await _context.
                    LibraryUser.
                    FirstOrDefaultAsync(
                        a => a.Uname == libraryUserRequest.Uname);

                var resultUserRequest =
                    await _context.
                    LibraryUserRegistrationRequest.
                    FirstOrDefaultAsync(
                        a => a.Uname == libraryUserRequest.Uname &&
                        (a.UserRequestStatus != "New" ||
                         a.UserRequestStatus == "Email Verified"));

                if (resultUser != null || resultUserRequest != null)
                {
                    ModelState.
                    AddModelError("Uname", "User Name is not available. Please select a different User Name");
                    return(View(libraryUserRequest));
                }
                #endregion

                #region Add Request
                //generate activation code
                libraryUserRequest.ActivationCode = System.Guid.NewGuid().ToString();

                //Password Hashing
                libraryUserRequest.Upassword = CryptoHelper.Hash(libraryUserRequest.Upassword);

                //Set datetime
                libraryUserRequest.RequestTime       = System.DateTime.Now;
                libraryUserRequest.UserRequestStatus = "New";

                //Save Request
                _context.LibraryUserRegistrationRequest.Add(libraryUserRequest);
                await _context.SaveChangesAsync();

                #endregion

                #region Send Email
                //Send email to user
                //SendEmailWithVerificationString(libraryUserRequest.Email, libraryUserRequest.ActivationCode);
                ViewBag.Status = true;
                message        = "Libarry Membership Request for "
                                 + libraryUserRequest.FirstName +
                                 " " + libraryUserRequest.LastName + " " +
                                 "is successfully placed. To Verify request please check your mail for activation link."
                                 + " if you fail to activate with in 3 days your activation link will expire";
                ViewBag.Message = message;
                #endregion

                return(View(libraryUserRequest));
            }
            return(View(libraryUserRequest));
        }