query($sql, "i", $id); if (empty($result)) { return; } $this->id = $id; $this->name = $result[0]['user_name']; $this->password = $result[0]['user_password']; $this->date_registered = $result[0]['user_date_registered']; $this->level = $result[0]['user_level']; $this->invite_code = $result[0]['user_invite_code']; $this->generation = $result[0]['user_generation']; $this->has_value = true; } // TODO: Duplicated code, there should be a common database read function for all models public function get_by_name($name) { $sql = "SELECT user_id, user_password, user_date_registered, user_level, user_invite_code, user_generation FROM users WHERE user_name = ?;"; $result = Database::get()->query($sql, "s", $name); if (empty($result)) { return; } $this->id = $result[0]['user_id']; $this->name = $name; $this->password = $result[0]['user_password']; $this->date_registered = $result[0]['user_date_registered']; $this->level = $result[0]['user_level']; $this->invite_code = $result[0]['user_invite_code']; $this->generation = $result[0]['user_generation']; $this->has_value = true; } public function get_by_invite_code($invite_code) { $sql = "SELECT user_id, user_name, user_password, user_date_registered, user_level, user_generation FROM users WHERE user_invite_code = ?;"; $result = Database::get()->query($sql, "s", $invite_code); if (empty($result)) { return; } $this->id = $result[0]['user_id']; $this->name = $result[0]['user_name']; $this->password = $result[0]['user_password']; $this->date_registered = $result[0]['user_date_registered']; $this->level = $result[0]['user_level']; $this->invite_code = $invite_code; $this->generation = $result[0]['user_generation']; $this->has_value = true; } public function has_value(): bool { return $this->has_value; } public static function register(string $username, string $password, int $generation) { $sql = "INSERT INTO users(user_name, user_password, user_date_registered, user_invite_code, user_generation) VALUES(?, ?, NOW(), ?, ?);"; $pass_hash = password_hash($password, PASSWORD_DEFAULT); $invite_code = generate_invite_code(); Database::get()->query($sql, "sssi", $username, $pass_hash, $invite_code, $generation); } public function update_invite_code() { $sql = "UPDATE users SET user_invite_code = ? WHERE user_id = ?"; Database::get()->query($sql, "si", generate_invite_code(), $this->id); } public function change_password(string $pass_hash) { if (!Session::get()->is_signed_in()) { trigger_error('You are not signed in.'); return; } if (Session::get()->get_current_user()->id != $this->id) { trigger_error("You can't change another user's password."); return; } $sql = "UPDATE users SET user_password = ? WHERE user_id = ?;"; Database::get()->query($sql, "si", $pass_hash, $this->id); } public function get_threads(): array { $sql = "SELECT thread_id FROM threads WHERE thread_author = ? ORDER BY thread_last_post_date DESC"; $result = Database::get()->query($sql, "i", $this->id); $threads = array(); foreach ($result as $row) { $thread = new Thread($row['thread_id']); if ($thread->has_value()) array_push($threads, $thread); } return $threads; } public static function username_exists(string $username): bool { $sql = "SELECT * FROM users WHERE user_name = ?;"; $result = Database::get()->query($sql, "s", $username); return !empty($result); } public static function invite_code_exists($invite_code): bool { $sql = "SELECT * FROM users WHERE user_invite_code = ?;"; $result = Database::get()->query($sql, "s", $invite_code); return !empty($result); } }