// // Created by Shell on 2026/7/16. // #ifndef SEADISK_SEAFILE_STORE_HPP #define SEADISK_SEAFILE_STORE_HPP #include "seafile/api/seafile_api.hpp" #include #include "storage/repo_entry.hpp" #include "storage/repo_info.hpp" namespace seafile::fs { class SeafileStore final { public: /// construction /// @param db_path database file path /// @param server the server url of seafile /// @param user user /// @param password password SeafileStore(const std::string& db_path, const std::string& server, const std::string& user, const std::string& password); SeafileStore(const SeafileStore&) = delete; ~SeafileStore(); tl::expected auth(); ///初始化数据库信息 [[nodiscard]] tl::expected init(); /// 检查是否已经更新到最新 /// @return true 已经最新,false 需要更新 tl::expected checkIsUpdated(const std::string& repo_id); /// 检查是否需要更新元素据,如果需要同步则自动同步 tl::expected checkAndSync(const std::string& repo_id); /// 返回路径的信息 /// @param path 需要查询的路径 /// @return 路径信息 [[nodiscard]] tl::expected, api::SeafileException> pathInfo( const std::string& path); /// 返回路径下面的子项目信息 /// @param path 路径 /// @return 子项目信息 [[nodiscard]] tl::expected, std::vector>, api::SeafileException> listDir(const std::string& path); /// 读取文件内容 /// @param repo_id 仓库 id /// @param path 仓库内绝对路径 /// @param offset 起始偏移 /// @param length 读取长度 /// @return 文件内容 [[nodiscard]] tl::expected readFile( const std::string& repo_id, const std::string& path, size_t offset, size_t length) const; /// 获取已缓存的账号信息(用于卷大小) /// @return 账号信息 [[nodiscard]] tl::expected accountInfo() const; /// 同步用户信息 [[nodiscard]] tl::expected syncUserInfo() const; /// 同步repo信息 [[nodiscard]] tl::expected, api::SeafileException> syncRepos(); /// 同步 [[nodiscard]] tl::expected sync(); static std::filesystem::path storePath(); /// 获取路径信息 /// @param repo_id repo id /// @param path 路径 /// @return 路径信息 tl::expected findRepoEntry( const std::string& repo_id, const std::string& path); private: tl::expected findRepoByName(const std::string& name); tl::expected fetchAndStoreRepoDir( const std::string& repo_id, const std::string& parent_path) const; std::vector queryDirectoryChildren( const std::string& repo_id, const std::string& parent_path); class Database; std::unique_ptr database; std::string api_server; std::string username; std::string password; api::SeaFileApi api; }; } #endif //SEADISK_SEAFILE_STORE_HPP