public async Task <bool> ResetPassword(UserDTO userDTO)
        {
            var existedUser = await database.UserRepository.GetEntityByIdAsync(userDTO.Id);

            if (existedUser == null)
            {
                return(false);
            }

            string newPass = RandomNumbers.Generate();

            EmailSender sender = new EmailSender($"Hello, {userDTO.Firstname}." +
                                                 $" Your new password: <br>" +
                                                 $" <b>{newPass}</b> <br> " +
                                                 $" If you want, you can change it in your profile. <br> " +
                                                 $" Have a nice day :) ");

            await sender.SendAsync("Reset password on BookingSector",
                                   userDTO.Email,
                                   $"{userDTO.Lastname} {userDTO.Firstname}");

            existedUser.Password = SHA256Hash.Compute(newPass);

            var  updatedUser = database.UserRepository.UpdateEntity(existedUser);
            bool isSaved     = await database.SaveAsync();

            return(isSaved ?
                   true :
                   false);
        }
        public async Task <UserDTO> InsertUserAsync(UserDTO userDTO)
        {
            // Check email
            string inputEmail    = userDTO.Email.Trim();
            var    existingEmail = await GetUserByEmailAsync(inputEmail);

            if (existingEmail != null)
            {
                throw new HttpStatusCodeException(HttpStatusCode.Conflict,
                                                  $"User with email: {inputEmail}, Already exists.");
            }

            // Password generate
            string inputPassword = (IsNullOrEmpty(userDTO.Password)) ?
                                   RandomNumbers.Generate() :
                                   userDTO.Password;


            // Get data
            var insertUser = mapper.Map <UserDTO, User>(userDTO);

            insertUser.Password = SHA256Hash.Compute(inputPassword);

            // Update user (from guest)
            var existingUser = await database.UserRepository
                               .GetByCondition(x => x.Phone == userDTO.Phone)
                               .FirstOrDefaultAsync();

            // User data after update/insert
            User insertedUser = new User();

            if (existingUser != null &&
                existingUser.RoleId == (int)UserRolesEnum.Guest)
            {
                existingUser.Email    = userDTO.Email;
                existingUser.Role.Id  = (int)UserRolesEnum.User;
                existingUser.Password = insertUser.Password;

                insertedUser = database.UserRepository.UpdateEntity(existingUser);
            }
            else
            {
                insertUser.RoleId = (int)UserRolesEnum.User;
                insertedUser      = await database.UserRepository.InsertEntityAsync(insertUser);
            }

            bool isSaved = await database.SaveAsync();

            if (!isSaved)
            {
                return(null);
            }

            // Send email
            await SendEmail(insertedUser, insertUser, inputEmail);


            return(mapper.Map <User, UserDTO>(insertedUser));
        }
        public bool IsPasswordTheSame(User user, string password)
        {
            var hashedPassword = SHA256Hash.Compute(password);

            return(hashedPassword
                   .Zip(user.Password, (a, b) => a == b)
                   .Contains(false) == false);
        }
        public async Task <bool> CheckPasswords(string password, int id)
        {
            var entity = await database.UserRepository.GetEntityByIdAsync(id);

            byte[] passToCheck = SHA256Hash.Compute(password);

            return(entity.Password.SequenceEqual(passToCheck));
        }
        public async Task <UserDTO> UpdateUserPassById(int id, UserDTO userDTO)
        {
            var existedUser = await database.UserRepository.GetEntityByIdAsync(id);

            if (existedUser == null)
            {
                return(null);
            }

            existedUser.Password = SHA256Hash.Compute(userDTO.Password);

            var  updatedUser = database.UserRepository.UpdateEntity(existedUser);
            bool isSaved     = await database.SaveAsync();

            return(isSaved ?
                   mapper.Map <User, UserDTO>(updatedUser) :
                   null);
        }
        public async Task <UserDTO> InsertUserAsync(UserDTO userDTO)
        {
            // Check email
            string inputEmail    = userDTO.Email.Trim();
            var    existingEmail = await GetUserByEmailAsync(inputEmail);

            if (existingEmail != null)
            {
                throw new HttpException(HttpStatusCode.Conflict,
                                        $"Користувач з поштою: {inputEmail}, вжє існує.");
            }

            // Password generate
            string inputPassword = (IsNullOrEmpty(userDTO.Password)) ?
                                   RandomNumbers.Generate() :
                                   userDTO.Password;


            // Get data
            var insertUser = mapper.Map <UserDTO, User>(userDTO);

            insertUser.Password = SHA256Hash.Compute(inputPassword);

            // User data after update/insert
            User insertedUser;

            insertUser.RoleId = (int)UserRolesEnum.USER;
            insertedUser      = await database.UserRepository.InsertAsync(insertUser);

            bool isSaved = await database.SaveAsync();

            if (!isSaved)
            {
                return(null);
            }

            //Send email
            await SendEmail(insertedUser, insertUser, inputEmail);


            return(mapper.Map <User, UserDTO>(insertedUser));
        }
        public static List <User> CreateUsers()
        {
            return(new List <User>()
            {
                new User
                {
                    Id = 1,
                    Firstname = "User 1",
                    Lastname = "testUserSurname",
                    Phone = "8888888888",
                    RoleId = 2,
                    Password = SHA256Hash.Compute("12345"),
                    Email = "*****@*****.**",
                    Photo = null,
                    CreateDate = new DateTime(2019, 12, 28, 10, 20, 0),
                    CreateUserId = 1,
                    ModDate = new DateTime(2019, 12, 28, 10, 30, 0),
                    ModUserId = 2
                },
                new User
                {
                    Id = 2,
                    Firstname = "User 2",
                    Lastname = "testUserSurname",
                    Phone = "7777777777",
                    RoleId = 2,
                    Password = SHA256Hash.Compute("qwe123"),
                    Email = "*****@*****.**",
                    Photo = null,
                    CreateDate = new DateTime(2019, 12, 28, 10, 20, 0),
                    CreateUserId = 1,
                    ModDate = new DateTime(2019, 12, 28, 10, 30, 0),
                    ModUserId = 2
                },
                new User
                {
                    Id = 3,
                    Firstname = "User 3",
                    Lastname = "testUserSurname",
                    Phone = "9999999999",
                    RoleId = 2,
                    Password = SHA256Hash.Compute("blabla228"),
                    Email = "*****@*****.**",
                    Photo = null,
                    CreateDate = new DateTime(2019, 12, 28, 10, 20, 0),
                    CreateUserId = 1,
                    ModDate = new DateTime(2019, 12, 28, 10, 30, 0),
                    ModUserId = 2
                },

                new User
                {
                    Id = 4,
                    Firstname = "User 4",
                    Lastname = "testUserSurname",
                    Phone = "9999999999",
                    RoleId = 2,
                    Password = SHA256Hash.Compute("dhsrtjsh5yae"),
                    Email = "*****@*****.**",
                    Photo = null,
                    CreateDate = new DateTime(2019, 12, 28, 10, 20, 0),
                    CreateUserId = 1,
                    ModDate = new DateTime(2019, 12, 28, 10, 30, 0),
                    ModUserId = 2
                },

                new User
                {
                    Id = 5,
                    Firstname = "User 5",
                    Lastname = "testUserSurname123",
                    Phone = "6666666666",
                    RoleId = 2,
                    Password = SHA256Hash.Compute("1345123"),
                    Email = "*****@*****.**",
                    Photo = null,
                    CreateDate = new DateTime(2019, 12, 28, 10, 20, 0),
                    CreateUserId = 1,
                    ModDate = new DateTime(2019, 12, 28, 10, 30, 0),
                    ModUserId = 2
                },

                new User
                {
                    Id = 6,
                    Firstname = "User 6",
                    Lastname = "testUserSurname",
                    Phone = "9999999999",
                    RoleId = 2,
                    Password = SHA256Hash.Compute("dxhsh34"),
                    Email = "*****@*****.**",
                    Photo = null,
                    CreateDate = new DateTime(2019, 12, 28, 10, 20, 0),
                    CreateUserId = 1,
                    ModDate = new DateTime(2019, 12, 28, 10, 30, 0),
                    ModUserId = 2
                },

                new User
                {
                    Id = 7,
                    Firstname = "User 7",
                    Lastname = "testUserSurname",
                    Phone = "9999999999",
                    RoleId = 2,
                    Password = SHA256Hash.Compute("ztfjrxh5rhrfxhxth"),
                    Email = "*****@*****.**",
                    Photo = null,
                    CreateDate = new DateTime(2019, 12, 28, 10, 20, 0),
                    CreateUserId = 1,
                    ModDate = new DateTime(2019, 12, 28, 10, 30, 0),
                    ModUserId = 2
                }
            });
        }