chore: impl local unspport

This commit is contained in:
Nathan 2025-04-20 17:29:27 +08:00
parent fa798f3ecd
commit 791a79a234
8 changed files with 114 additions and 41 deletions

View file

@ -389,7 +389,7 @@ class _CreateWorkspaceButton extends StatelessWidget {
workspaceBloc.add(
UserWorkspaceEvent.createWorkspace(
name,
AuthTypePB.Local,
AuthTypePB.Server,
),
);
},

View file

@ -1270,7 +1270,7 @@ dependencies = [
[[package]]
name = "collab"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=1920e21f47e88a238e11356be0b3ef2f3acdc23e#1920e21f47e88a238e11356be0b3ef2f3acdc23e"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3#f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3"
dependencies = [
"anyhow",
"arc-swap",
@ -1295,7 +1295,7 @@ dependencies = [
[[package]]
name = "collab-database"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=1920e21f47e88a238e11356be0b3ef2f3acdc23e#1920e21f47e88a238e11356be0b3ef2f3acdc23e"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3#f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3"
dependencies = [
"anyhow",
"async-trait",
@ -1335,7 +1335,7 @@ dependencies = [
[[package]]
name = "collab-document"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=1920e21f47e88a238e11356be0b3ef2f3acdc23e#1920e21f47e88a238e11356be0b3ef2f3acdc23e"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3#f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3"
dependencies = [
"anyhow",
"arc-swap",
@ -1356,7 +1356,7 @@ dependencies = [
[[package]]
name = "collab-entity"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=1920e21f47e88a238e11356be0b3ef2f3acdc23e#1920e21f47e88a238e11356be0b3ef2f3acdc23e"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3#f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3"
dependencies = [
"anyhow",
"bytes",
@ -1376,7 +1376,7 @@ dependencies = [
[[package]]
name = "collab-folder"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=1920e21f47e88a238e11356be0b3ef2f3acdc23e#1920e21f47e88a238e11356be0b3ef2f3acdc23e"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3#f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3"
dependencies = [
"anyhow",
"arc-swap",
@ -1398,7 +1398,7 @@ dependencies = [
[[package]]
name = "collab-importer"
version = "0.1.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=1920e21f47e88a238e11356be0b3ef2f3acdc23e#1920e21f47e88a238e11356be0b3ef2f3acdc23e"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3#f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3"
dependencies = [
"anyhow",
"async-recursion",
@ -1461,7 +1461,7 @@ dependencies = [
[[package]]
name = "collab-plugins"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=1920e21f47e88a238e11356be0b3ef2f3acdc23e#1920e21f47e88a238e11356be0b3ef2f3acdc23e"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3#f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3"
dependencies = [
"anyhow",
"async-stream",
@ -1539,7 +1539,7 @@ dependencies = [
[[package]]
name = "collab-user"
version = "0.2.0"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=1920e21f47e88a238e11356be0b3ef2f3acdc23e#1920e21f47e88a238e11356be0b3ef2f3acdc23e"
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3#f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3"
dependencies = [
"anyhow",
"collab",

View file

@ -144,14 +144,14 @@ rocksdb = { git = "https://github.com/rust-rocksdb/rust-rocksdb", rev = "1710120
# To switch to the local path, run:
# scripts/tool/update_collab_source.sh
# ⚠️⚠️⚠️️
collab = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "1920e21f47e88a238e11356be0b3ef2f3acdc23e" }
collab-entity = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "1920e21f47e88a238e11356be0b3ef2f3acdc23e" }
collab-folder = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "1920e21f47e88a238e11356be0b3ef2f3acdc23e" }
collab-document = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "1920e21f47e88a238e11356be0b3ef2f3acdc23e" }
collab-database = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "1920e21f47e88a238e11356be0b3ef2f3acdc23e" }
collab-plugins = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "1920e21f47e88a238e11356be0b3ef2f3acdc23e" }
collab-user = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "1920e21f47e88a238e11356be0b3ef2f3acdc23e" }
collab-importer = { version = "0.1", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "1920e21f47e88a238e11356be0b3ef2f3acdc23e" }
collab = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3" }
collab-entity = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3" }
collab-folder = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3" }
collab-document = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3" }
collab-database = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3" }
collab-plugins = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3" }
collab-user = { version = "0.2", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3" }
collab-importer = { version = "0.1", git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "f029a79e6112c296286cd7bb4c6dcaa4cf0d33f3" }
# Working directory: frontend
# To update the commit ID, run:

View file

@ -1,16 +1,18 @@
#![allow(unused_variables)]
use crate::af_cloud::define::LoggedUser;
use crate::local_server::util::default_encode_collab_for_collab_type;
use collab::entity::EncodedCollab;
use collab_database::database::default_database_data;
use collab_database::workspace_database::default_workspace_database_data;
use collab_document::document_data::default_document_collab_data;
use collab_entity::CollabType;
use collab_user::core::default_user_awareness_data;
use flowy_database_pub::cloud::{DatabaseCloudService, DatabaseSnapshot, EncodeCollabByOid};
use flowy_error::FlowyError;
use flowy_error::{ErrorCode, FlowyError};
use lib_infra::async_trait::async_trait;
use std::sync::Arc;
use uuid::Uuid;
pub(crate) struct LocalServerDatabaseCloudServiceImpl();
pub(crate) struct LocalServerDatabaseCloudServiceImpl {
pub logged_user: Arc<dyn LoggedUser>,
}
#[async_trait]
impl DatabaseCloudService for LocalServerDatabaseCloudServiceImpl {
@ -18,24 +20,20 @@ impl DatabaseCloudService for LocalServerDatabaseCloudServiceImpl {
&self,
object_id: &Uuid,
collab_type: CollabType,
workspace_id: &Uuid,
_workspace_id: &Uuid, // underscore to silence “unused” warning
) -> Result<Option<EncodedCollab>, FlowyError> {
let uid = self.logged_user.user_id()?;
let object_id = object_id.to_string();
match collab_type {
CollabType::Document => {
let encode_collab = default_document_collab_data(&object_id)?;
Ok(Some(encode_collab))
},
CollabType::Database => default_database_data(&object_id)
.await
.map(Some)
.map_err(Into::into),
CollabType::WorkspaceDatabase => Ok(Some(default_workspace_database_data(&object_id))),
CollabType::Folder => Ok(None),
CollabType::DatabaseRow => Ok(None),
CollabType::UserAwareness => Ok(Some(default_user_awareness_data(&object_id))),
CollabType::Unknown => Ok(None),
}
default_encode_collab_for_collab_type(uid, &object_id, collab_type)
.await
.map(Some)
.or_else(|err| {
if matches!(err.code, ErrorCode::NotSupportYet) {
Ok(None)
} else {
Err(err)
}
})
}
async fn create_database_encode_collab(

View file

@ -1,9 +1,14 @@
#![allow(unused_variables)]
use crate::af_cloud::define::LoggedUser;
use crate::local_server::util::default_encode_collab_for_collab_type;
use client_api::entity::workspace_dto::PublishInfoView;
use client_api::entity::PublishInfo;
use collab::core::origin::CollabOrigin;
use collab::preclude::Collab;
use collab_entity::CollabType;
use collab_plugins::local_storage::kv::doc::CollabKVAction;
use collab_plugins::local_storage::kv::KVTransactionDB;
use flowy_error::FlowyError;
use flowy_folder_pub::cloud::{
gen_workspace_id, FolderCloudService, FolderCollabParams, FolderData, FolderSnapshot,
@ -61,7 +66,29 @@ impl FolderCloudService for LocalServerFolderCloudServiceImpl {
collab_type: CollabType,
object_id: &Uuid,
) -> Result<Vec<u8>, FlowyError> {
Err(FlowyError::local_version_not_support())
let object_id = object_id.to_string();
let workspace_id = workspace_id.to_string();
let collab_db = self.logged_user.get_collab_db(uid)?.upgrade().unwrap();
let read_txn = collab_db.read_txn();
let is_exist = read_txn.is_exist(uid, &workspace_id.to_string(), &object_id.to_string());
if is_exist {
// load doc
let collab = Collab::new_with_origin(CollabOrigin::Empty, &object_id, vec![], false);
read_txn.load_doc(uid, &workspace_id, &object_id, collab.doc())?;
let data = collab.encode_collab_v1(|c| {
collab_type
.validate_require_data(c)
.map_err(|err| FlowyError::invalid_data().with_context(err))?;
Ok::<_, FlowyError>(())
})?;
Ok(data.doc_state.to_vec())
} else {
let data = default_encode_collab_for_collab_type(uid, &object_id, collab_type).await?;
drop(read_txn);
// create default folder doc
Err(FlowyError::local_version_not_support())
}
}
async fn batch_create_folder_collab_objects(

View file

@ -3,3 +3,4 @@ pub use server::*;
pub mod impls;
mod server;
pub(crate) mod uid;
mod util;

View file

@ -53,7 +53,9 @@ impl AppFlowyServer for LocalServer {
}
fn database_service(&self) -> Arc<dyn DatabaseCloudService> {
Arc::new(LocalServerDatabaseCloudServiceImpl())
Arc::new(LocalServerDatabaseCloudServiceImpl {
logged_user: self.logged_user.clone(),
})
}
fn database_ai_service(&self) -> Option<Arc<dyn DatabaseAIService>> {

View file

@ -0,0 +1,45 @@
use collab::core::origin::CollabOrigin;
use collab::entity::EncodedCollab;
use collab::preclude::Collab;
use collab_database::database::default_database_data;
use collab_database::workspace_database::default_workspace_database_data;
use collab_document::document_data::default_document_collab_data;
use collab_entity::CollabType;
use collab_user::core::default_user_awareness_data;
use flowy_error::{FlowyError, FlowyResult};
pub async fn default_encode_collab_for_collab_type(
_uid: i64,
object_id: &str,
collab_type: CollabType,
) -> FlowyResult<EncodedCollab> {
match collab_type {
CollabType::Document => {
let encode_collab = default_document_collab_data(object_id)?;
Ok(encode_collab)
},
CollabType::Database => default_database_data(object_id).await.map_err(Into::into),
CollabType::WorkspaceDatabase => Ok(default_workspace_database_data(object_id)),
CollabType::Folder => {
// let collab = Collab::new_with_origin(CollabOrigin::Empty, object_id, vec![], false);
// let workspace = Workspace::new(object_id.to_string(), "".to_string(), uid);
// let folder_data = FolderData::new(workspace);
// let folder = Folder::create(uid, collab, None, folder_data);
// let data = folder.encode_collab_v1(|c| {
// collab_type
// .validate_require_data(c)
// .map_err(|err| FlowyError::invalid_data().with_context(err))?;
// Ok::<_, FlowyError>(())
// })?;
// Ok(data)
Err(FlowyError::not_support())
},
CollabType::DatabaseRow => Err(FlowyError::not_support()),
CollabType::UserAwareness => Ok(default_user_awareness_data(object_id)),
CollabType::Unknown => {
let collab = Collab::new_with_origin(CollabOrigin::Empty, object_id, vec![], false);
let data = collab.encode_collab_v1(|_| Ok::<_, FlowyError>(()))?;
Ok(data)
},
}
}