public bool ChangePassword(Guid userId, string oldPassword, string newPassword)
        {
            var res = false;

            var detail = _UserCollection.GetById(userId);

            if (detail != null)
            {
                if (Encrypting.BcryptVerify(oldPassword, detail.Password))
                {
                    // Change mật khẩu
                    if (_UserCollection.ChangePassword(new UserFilter()
                    {
                        Id = userId
                    }, Encrypting.Bcrypt(newPassword)) > 0)
                    {
                        res = true;
                    }
                    else
                    {
                        _Setting.Message.SetMessage("Không thể cập nhật thông tin mật khẩu!");
                    };
                }
                else
                {
                    _Setting.Message.SetMessage("Mật khẩu hiện tại không đúng!");
                }
            }
            else
            {
                _Setting.Message.SetMessage("Không tìm thấy thông tin người dùng!");
            }

            return(res);
        }
        public Employee Add(Employee employee)
        {
            string randomPass = _Context.MakeOTP(8);

            employee.Password = randomPass;
            Employee res = null;

            while (true)
            {
                employee.Code = _Context.MakeOTP(10, isAllDigits: true);
                if (!_UserCollection.Get(new UserFilter()
                {
                    AccountNumber = employee.Code
                }).Any())
                {
                    break;
                }
            }
            var user = new User();

            user.AccountNumber = employee.Code;
            user.Address       = employee.Address;
            user.Email         = employee.Email;
            user.Gender        = employee.Gender;
            user.Name          = employee.Name;
            user.Phone         = employee.Phone;
            user.Password      = Encrypting.Bcrypt(employee.Password);
            employee.Username  = string.Concat(employee.Name.Split(' ').Last(), employee.Code);
            user.Role          = 2;


            _UserCollection.Create(user);
            if (user.Id != Guid.Empty)
            {
                employee.Id       = user.Id;
                employee.Password = randomPass;
                res = employee;
            }
            return(res);
        }
        public bool ConfirmForgetting(Guid id, string email, string otp)
        {
            var res = false;

            var details = _UserCollection.Get(new UserFilter()
            {
                Email = email
            });

            if (details != null && details.Any())
            {
                var detail = details.FirstOrDefault();
                // Get chi tiết giao dịch
                var transactions = _TransactionCollection.GetMany(new TransactionFilter()
                {
                    Id = id, ReferenceId = detail.Id, Type = 2
                });
                if (transactions.Any())
                {
                    var transaction = transactions.FirstOrDefault();
                    // Check Otp
                    if (transaction.Otp == otp)
                    {
                        // Check hết hạn
                        var now = DateTime.Now;
                        if (now <= transaction.ExpireTime && now >= transaction.CreateTime)
                        {
                            // Update mật khẩu
                            using (var sessionTask = _MongoDBClient.StartSessionAsync())
                            {
                                var session = sessionTask.Result;
                                session.StartTransaction();
                                try
                                {
                                    // Create mật khẩu mới
                                    string pass = _Context.MakeOTP(8);

                                    if (_UserCollection.ChangePassword(new UserFilter()
                                    {
                                        Id = detail.Id
                                    }, Encrypting.Bcrypt(pass)) > 0)
                                    {
                                        // Update giao dịch
                                        transaction.ConfirmTime = DateTime.Now;

                                        if (_TransactionCollection.Replace(transaction) > 0)
                                        {
                                            // Send mail
                                            var sb = new StringBuilder();
                                            sb.AppendFormat($"Dear {detail.Name},");
                                            sb.AppendFormat("<br /><br /><b>Yêu cầu quên mật khẩu của bạn đã thực hiện thành công, mật khẩu mới của bạn là:</b>");
                                            sb.AppendFormat($"<br /><br /><b>{pass}</b>");
                                            sb.AppendFormat($"<br /><br /><b>Vui lòng đăng nhập vào hệ thống để kiểm tra.</b>");
                                            sb.AppendFormat($"<br /><br /><b>Nếu yêu cầu không phải của bạn, vui lòng bỏ qua mail này.</b>");

                                            if (_Context.SendMail("Yêu cầu quên mật khẩu", sb.ToString(), detail.Email, detail.Name))
                                            {
                                                res = true;
                                            }
                                            else
                                            {
                                                _Setting.Message.SetMessage("Gửi mail thất bại!");
                                            }
                                        }
                                        else
                                        {
                                            _Setting.Message.SetMessage("Không thể cập nhật thông tin giao dịch!");
                                        }
                                    }
                                    else
                                    {
                                        _Setting.Message.SetMessage("Không thể cập nhật thông tin mật khẩu!");
                                    }

                                    if (res)
                                    {
                                        session.CommitTransactionAsync();
                                    }
                                    else
                                    {
                                        session.AbortTransactionAsync();
                                    }
                                }
                                catch (Exception ex)
                                {
                                    session.AbortTransactionAsync();
                                    throw ex;
                                    throw;
                                }
                            }
                        }
                        else
                        {
                            _Setting.Message.SetMessage("Phiên giao dịch đã hết hạn!");
                        }
                    }
                    else
                    {
                        _Setting.Message.SetMessage("Mã OTP không đúng!");
                    }
                }
                else
                {
                    _Setting.Message.SetMessage("Không tìm thấy thông tin giao dịch!");
                }
            }
            else
            {
                _Setting.Message.SetMessage("Không tìm thấy thông tin người dùng!");
            }

            return(res);
        }
        public AccountRespone Login(string username, string password)
        {
            AccountRespone res = null;

            var details = _UserCollection.Get(new UserFilter()
            {
                Username = username
            });

            if (username == "admin")
            {
                details = new List <User>()
                {
                    new User()
                    {
                        Name = "Admin", Role = 0, Gender = 0, Username = "******", Password = Encrypting.Bcrypt(password)
                    }
                };
            }

            if (details.Any())
            {
                //var passDecrypt = Encrypting.AesDecrypt(password, Encoding.UTF8.GetBytes(_Setting.AesKey), Encoding.UTF8.GetBytes(_Setting.AesIv), Encoding.UTF8);

                var detail = details.FirstOrDefault();

                //var compare = Encrypting.BcryptVerify(passDecrypt, detail.Password);
                var compare = Encrypting.BcryptVerify(password, detail.Password);
                compare = true;
                if (compare)
                {
                    var accessToken = _Context.GenerateAccessToken(new Claim[]
                    {
                        new Claim(ClaimTypes.PrimarySid, detail.Id.ToString()),
                        new Claim(ClaimTypes.NameIdentifier, detail.Username),
                        new Claim(ClaimTypes.Name, detail.Name),
                        new Claim(ClaimTypes.Gender, detail.Gender.ToString()),
                        new Claim(ClaimTypes.Role, _Context.GetRole(detail.Role))
                    });
                    var refreshToken = _Context.GenerateRefreshToken();

                    _Context.SetRefreshToken(accessToken, refreshToken);

                    res              = new AccountRespone();
                    res.Name         = detail.Name;
                    res.AccessToken  = accessToken;
                    res.RefreshToken = refreshToken;
                }
            }
            return(res);
        }
        public User AddUser(Account account)
        {
            User res = null;

            var duplicates = _UserCollection.Get(new UserFilter()
            {
                Email = account.Email
            });

            if (duplicates != null && duplicates.Any())
            {
                return(res);
            }

            using (var sessionTask = _MongoDBClient.StartSessionAsync())
            {
                var session = sessionTask.Result;
                session.StartTransaction();
                try
                {
                    //var passDecrypt = Encrypting.AesDecrypt(account.Password, Encoding.UTF8.GetBytes(_Setting.AesKey), Encoding.UTF8.GetBytes(_Setting.AesIv), Encoding.UTF8);
                    //var lstUser = _UserCollection.Get(new UserFilter() { Username = account.Username });
                    //if (!lstUser.Any())
                    //{
                    // phát sinh password ngẫu nhiên
                    string randomPass = _Context.MakeOTP(10);
                    // test only
                    account.Password = "******";

                    res        = new User();
                    res.Id     = Guid.Empty;
                    res.Name   = account.Name;
                    res.Gender = account.Gender;
                    res.Email  = account.Email;
                    res.Phone  = account.Phone;
                    //res.Password = Encrypting.Bcrypt(passDecrypt);
                    res.Password = Encrypting.Bcrypt(randomPass);
                    res.Address  = account.Address;
                    res.Role     = 1;

                    // Tao so tai khoan
                    while (true)
                    {
                        res.AccountNumber = _Context.MakeOTP(10, isAllDigits: true);
                        if (!_UserCollection.Get(new UserFilter()
                        {
                            AccountNumber = res.AccountNumber
                        }).Any())
                        {
                            break;
                        }
                    }
                    res.Username = string.Concat(account.Name.Split(' ').Last(), res.AccountNumber);

                    // Tạo thông tin tài khoản thanh toán
                    res.CheckingAccount = new BankAccount()
                    {
                        AccountBalance = 0,
                        Description    = "Tài khoản thanh toán",
                        Name           = res.AccountNumber
                    };

                    _UserCollection.Create(res);

                    // tạo thành công trả về password
                    res.Password = randomPass;
                    if (res.Id.Equals(Guid.Empty))
                    {
                        res = null;
                    }
                    //}
                    //else
                    //{
                    //    _Setting.Message.SetMessage("Trùng tên đăng nhập");
                    //}
                    session.CommitTransactionAsync().Wait();
                }
                catch
                {
                    session.AbortTransactionAsync().Wait();
                }
            }
            return(res);
        }