Example #1
0
        // Метод, реализующий полноценное добавление нового пользователя в БД
        public RegisterError AddUser(AddUser newUser)
        {
            _db.BeginTransaction();

            // Проверка - существует ли в БД уже такой логин
            if (_db.CheckIfInTable("users", new DbVal("login"), new DbVal($"'{newUser.Login}'")))
            {
                _db.RollbackTransaction();
                return(RegisterError.LOGIN_EXISTS);
            }

            // Добавление пользователя (без пароля)
            bool result = _db.AddToTable("users",
                                         new DbVal("role_id", "login"),
                                         new DbVal(2, newUser.Login)
                                         );

            if (result)
            {
                // Получение id добавленного пользователя
                int userId = -1;
                int.TryParse(_db.GetFromTableSorted("users", new DbVal("id"), "id", IDatabase.OrderType.DESC, limit: 1)[0][0], out userId);
                if (userId < 0)
                {
                    _db.RollbackTransaction();
                    return(RegisterError.OTHER);
                }

                // Генерация соли
                string salt = "";
                for (int i = userId - 20; i < new Random().Next(userId - 10, userId); i++)
                {
                    salt += new Random().Next(0, Math.Abs(i / 2));
                }

                // Вычисление хэша
                string hash = CreatePasswordHash(newUser.Passw, salt);

                // Добавление пароля
                result = _db.AddToTable("passwords",
                                        new DbVal("user_id", "hash", "salt"),
                                        new DbVal(userId, hash, salt)
                                        );

                if (result)
                {
                    // Получение id добавленного пароля
                    int passwId = -1;
                    int.TryParse(_db.GetFromTableSorted("passwords", new DbVal("id"), "id", IDatabase.OrderType.DESC, limit: 1)[0][0], out passwId);
                    if (passwId < 0)
                    {
                        _db.RollbackTransaction();
                        return(RegisterError.OTHER);
                    }

                    // Обновление id пароля длля пользователя
                    result = _db.ChangeInTable("users", new DbVal("passw_id"), new DbVal(passwId), $"id={userId}");
                }
            }

            if (result)
            {
                _db.CommitTransaction();
            }
            else
            {
                _db.RollbackTransaction();
            }

            return((result) ? RegisterError.NONE : RegisterError.OTHER);
        }