Skip to content

Commit b85990e

Browse files
committed
feat: migration database (#2009)
* feat: migration database * ci: fix tauri ci * feat: migrate database view * ci: fix ci
1 parent b0d525a commit b85990e

File tree

18 files changed

+353
-171
lines changed

18 files changed

+353
-171
lines changed

frontend/appflowy_tauri/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"is-hotkey": "^0.2.0",
2828
"jest": "^29.5.0",
2929
"nanoid": "^4.0.0",
30+
"protoc-gen-ts": "^0.8.5",
3031
"react": "^18.2.0",
3132
"react-dom": "^18.2.0",
3233
"react-error-boundary": "^3.1.4",

frontend/rust-lib/flowy-codegen/src/flowy_toml.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,15 @@ pub struct FlowyConfig {
2020
}
2121

2222
fn default_proto_output() -> String {
23-
"resources/proto".to_owned()
23+
let mut path = PathBuf::from("resources");
24+
path.push("proto");
25+
path.to_str().unwrap().to_owned()
2426
}
2527

2628
fn default_protobuf_crate() -> String {
27-
"src/protobuf".to_owned()
29+
let mut path = PathBuf::from("src");
30+
path.push("protobuf");
31+
path.to_str().unwrap().to_owned()
2832
}
2933

3034
impl FlowyConfig {

frontend/rust-lib/flowy-codegen/src/protobuf_file/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,15 @@ fn generate_ts_protobuf_files(
127127
}
128128
let protoc_bin_path = protoc_bin_path.to_str().unwrap().to_owned();
129129
paths.iter().for_each(|path| {
130+
// if let Err(err) = Command::new(protoc_bin_path.clone())
131+
// .arg(format!("--ts_out={}", output.to_str().unwrap()))
132+
// .arg(format!("--proto_path={}", proto_file_output_path))
133+
// .arg(path)
134+
// .spawn()
135+
// {
136+
// panic!("Generate ts pb file failed: {}, {:?}", path, err);
137+
// }
138+
130139
let result = cmd_lib::run_cmd! {
131140
${protoc_bin_path} --ts_out=${output} --proto_path=${proto_file_output_path} ${path}
132141
};

frontend/rust-lib/flowy-core/src/deps_resolve/folder_deps.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ impl FolderDepsResolver {
6060
.await,
6161
);
6262

63-
if let (Ok(user_id), Ok(token)) = (user.user_id(), user.token()) {
64-
match folder_manager.initialize(&user_id, &token).await {
65-
Ok(_) => {},
66-
Err(e) => tracing::error!("Initialize folder manager failed: {}", e),
67-
}
68-
}
63+
// if let (Ok(user_id), Ok(token)) = (user.user_id(), user.token()) {
64+
// match folder_manager.initialize(&user_id, &token).await {
65+
// Ok(_) => {},
66+
// Err(e) => tracing::error!("Initialize folder manager failed: {}", e),
67+
// }
68+
// }
6969

7070
let receiver = Arc::new(FolderWSMessageReceiverImpl(folder_manager.clone()));
7171
ws_conn.add_ws_message_receiver(receiver).unwrap();
@@ -339,7 +339,7 @@ impl ViewDataProcessor for DatabaseViewDataProcessor {
339339
}
340340
}
341341

342-
fn layout_type_from_view_layout(layout: ViewLayoutTypePB) -> LayoutTypePB {
342+
pub fn layout_type_from_view_layout(layout: ViewLayoutTypePB) -> LayoutTypePB {
343343
match layout {
344344
ViewLayoutTypePB::Grid => LayoutTypePB::Grid,
345345
ViewLayoutTypePB::Board => LayoutTypePB::Board,

frontend/rust-lib/flowy-core/src/deps_resolve/grid_deps.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,12 @@ impl DatabaseDepsResolver {
2525
) -> Arc<DatabaseManager> {
2626
let user = Arc::new(GridUserImpl(user_session.clone()));
2727
let rev_web_socket = Arc::new(GridRevisionWebSocket(ws_conn));
28-
let database_manager = Arc::new(DatabaseManager::new(
29-
user.clone(),
28+
Arc::new(DatabaseManager::new(
29+
user,
3030
rev_web_socket,
3131
task_scheduler,
3232
Arc::new(DatabaseDBConnectionImpl(user_session)),
33-
));
34-
35-
if let (Ok(user_id), Ok(token)) = (user.user_id(), user.token()) {
36-
match database_manager.initialize(&user_id, &token).await {
37-
Ok(_) => {},
38-
Err(e) => tracing::error!("Initialize grid manager failed: {}", e),
39-
}
40-
}
41-
42-
database_manager
33+
))
4334
}
4435
}
4536

frontend/rust-lib/flowy-core/src/lib.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use flowy_database::manager::DatabaseManager;
66
use flowy_document::entities::DocumentVersionPB;
77
use flowy_document::{DocumentConfig, DocumentManager};
88
use flowy_error::FlowyResult;
9-
use flowy_folder::entities::ViewDataFormatPB;
9+
use flowy_folder::entities::{ViewDataFormatPB, ViewLayoutTypePB};
1010
use flowy_folder::{errors::FlowyError, manager::FolderManager};
1111
pub use flowy_net::get_client_server_configuration;
1212
use flowy_net::local_server::LocalServer;
@@ -17,6 +17,7 @@ use flowy_user::services::{UserSession, UserSessionConfig};
1717
use lib_dispatch::prelude::*;
1818
use lib_dispatch::runtime::tokio_default_runtime;
1919

20+
use flowy_database::entities::LayoutTypePB;
2021
use lib_infra::future::{to_fut, Fut};
2122
use module::make_plugins;
2223
pub use module::*;
@@ -306,7 +307,36 @@ impl UserStatusListener {
306307
async fn did_sign_in(&self, token: &str, user_id: &str) -> FlowyResult<()> {
307308
self.folder_manager.initialize(user_id, token).await?;
308309
self.document_manager.initialize(user_id).await?;
309-
self.database_manager.initialize(user_id, token).await?;
310+
311+
let cloned_folder_manager = self.folder_manager.clone();
312+
let get_views_fn = to_fut(async move {
313+
cloned_folder_manager
314+
.get_current_workspace()
315+
.await
316+
.map(|workspace| {
317+
workspace
318+
.apps
319+
.items
320+
.into_iter()
321+
.flat_map(|app| app.belongings.items)
322+
.flat_map(|view| match view.layout {
323+
ViewLayoutTypePB::Grid | ViewLayoutTypePB::Board | ViewLayoutTypePB::Calendar => {
324+
Some((
325+
view.id,
326+
view.name,
327+
layout_type_from_view_layout(view.layout),
328+
))
329+
},
330+
_ => None,
331+
})
332+
.collect::<Vec<(String, String, LayoutTypePB)>>()
333+
})
334+
.unwrap_or_default()
335+
});
336+
self
337+
.database_manager
338+
.initialize(user_id, token, get_views_fn)
339+
.await?;
310340
self
311341
.ws_conn
312342
.start(token.to_owned(), user_id.to_owned())

frontend/rust-lib/flowy-database/src/manager.rs

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::services::database_view::{
77
make_database_view_rev_manager, make_database_view_revision_pad, DatabaseViewEditor,
88
};
99
use crate::services::persistence::block_index::BlockRowIndexer;
10-
use crate::services::persistence::database_ref::{DatabaseInfo, DatabaseRef, DatabaseRefIndexer};
10+
use crate::services::persistence::database_ref::{DatabaseInfo, DatabaseRefs, DatabaseViewRef};
1111
use crate::services::persistence::kv::DatabaseKVPersistence;
1212
use crate::services::persistence::migration::DatabaseMigration;
1313
use crate::services::persistence::rev_sqlite::{
@@ -29,6 +29,7 @@ use flowy_revision::{
2929
use flowy_sqlite::ConnectionPool;
3030
use flowy_task::TaskDispatcher;
3131

32+
use lib_infra::future::Fut;
3233
use revision_model::Revision;
3334
use std::sync::Arc;
3435
use tokio::sync::RwLock;
@@ -43,7 +44,7 @@ pub struct DatabaseManager {
4344
editors_by_database_id: RwLock<HashMap<String, Arc<DatabaseEditor>>>,
4445
database_user: Arc<dyn DatabaseUser>,
4546
block_indexer: Arc<BlockRowIndexer>,
46-
database_ref_indexer: Arc<DatabaseRefIndexer>,
47+
database_refs: Arc<DatabaseRefs>,
4748
#[allow(dead_code)]
4849
kv_persistence: Arc<DatabaseKVPersistence>,
4950
task_scheduler: Arc<RwLock<TaskDispatcher>>,
@@ -61,30 +62,30 @@ impl DatabaseManager {
6162
let editors_by_database_id = RwLock::new(HashMap::new());
6263
let kv_persistence = Arc::new(DatabaseKVPersistence::new(database_db.clone()));
6364
let block_indexer = Arc::new(BlockRowIndexer::new(database_db.clone()));
64-
let database_ref_indexer = Arc::new(DatabaseRefIndexer::new(database_db.clone()));
65-
let migration = DatabaseMigration::new(
66-
database_user.clone(),
67-
database_db,
68-
database_ref_indexer.clone(),
69-
);
65+
let database_refs = Arc::new(DatabaseRefs::new(database_db));
66+
let migration = DatabaseMigration::new(database_user.clone(), database_refs.clone());
7067
Self {
7168
editors_by_database_id,
7269
database_user,
7370
kv_persistence,
7471
block_indexer,
75-
database_ref_indexer,
72+
database_refs,
7673
task_scheduler,
7774
migration,
7875
}
7976
}
8077

81-
pub async fn initialize_with_new_user(&self, user_id: &str, _token: &str) -> FlowyResult<()> {
82-
self.migration.run(user_id).await?;
78+
pub async fn initialize_with_new_user(&self, _user_id: &str, _token: &str) -> FlowyResult<()> {
8379
Ok(())
8480
}
8581

86-
pub async fn initialize(&self, user_id: &str, _token: &str) -> FlowyResult<()> {
87-
self.migration.run(user_id).await?;
82+
pub async fn initialize(
83+
&self,
84+
user_id: &str,
85+
_token: &str,
86+
get_views_fn: Fut<Vec<(String, String, LayoutTypePB)>>,
87+
) -> FlowyResult<()> {
88+
self.migration.run(user_id, get_views_fn).await?;
8889
Ok(())
8990
}
9091

@@ -98,7 +99,7 @@ impl DatabaseManager {
9899
) -> FlowyResult<()> {
99100
let db_pool = self.database_user.db_pool()?;
100101
let _ = self
101-
.database_ref_indexer
102+
.database_refs
102103
.bind(database_id, view_id.as_ref(), true, name);
103104
let rev_manager = self.make_database_rev_manager(database_id, db_pool)?;
104105
rev_manager.reset_object(revisions).await?;
@@ -113,7 +114,9 @@ impl DatabaseManager {
113114
revisions: Vec<Revision>,
114115
) -> FlowyResult<()> {
115116
let view_id = view_id.as_ref();
116-
let rev_manager = make_database_view_rev_manager(&self.database_user, view_id).await?;
117+
let user_id = self.database_user.user_id()?;
118+
let pool = self.database_user.db_pool()?;
119+
let rev_manager = make_database_view_rev_manager(&user_id, pool, view_id).await?;
117120
rev_manager.reset_object(revisions).await?;
118121
Ok(())
119122
}
@@ -129,12 +132,13 @@ impl DatabaseManager {
129132
Ok(())
130133
}
131134

135+
#[tracing::instrument(level = "trace", skip_all, err)]
132136
pub async fn open_database_view<T: AsRef<str>>(
133137
&self,
134138
view_id: T,
135139
) -> FlowyResult<Arc<DatabaseEditor>> {
136140
let view_id = view_id.as_ref();
137-
let database_info = self.database_ref_indexer.get_database_with_view(view_id)?;
141+
let database_info = self.database_refs.get_database_with_view(view_id)?;
138142
self
139143
.get_or_create_database_editor(&database_info.database_id, view_id)
140144
.await
@@ -143,7 +147,7 @@ impl DatabaseManager {
143147
#[tracing::instrument(level = "debug", skip_all)]
144148
pub async fn close_database_view<T: AsRef<str>>(&self, view_id: T) -> FlowyResult<()> {
145149
let view_id = view_id.as_ref();
146-
let database_info = self.database_ref_indexer.get_database_with_view(view_id)?;
150+
let database_info = self.database_refs.get_database_with_view(view_id)?;
147151
tracing::Span::current().record("database_id", &database_info.database_id);
148152

149153
// Create a temporary reference database_editor in case of holding the write lock
@@ -172,7 +176,7 @@ impl DatabaseManager {
172176

173177
// #[tracing::instrument(level = "debug", skip(self), err)]
174178
pub async fn get_database_editor(&self, view_id: &str) -> FlowyResult<Arc<DatabaseEditor>> {
175-
let database_info = self.database_ref_indexer.get_database_with_view(view_id)?;
179+
let database_info = self.database_refs.get_database_with_view(view_id)?;
176180
let database_editor = self
177181
.editors_by_database_id
178182
.read()
@@ -189,13 +193,14 @@ impl DatabaseManager {
189193
}
190194

191195
pub async fn get_databases(&self) -> FlowyResult<Vec<DatabaseInfo>> {
192-
self.database_ref_indexer.get_all_databases()
196+
self.database_refs.get_all_databases()
193197
}
194198

195-
pub async fn get_database_ref_views(&self, database_id: &str) -> FlowyResult<Vec<DatabaseRef>> {
196-
self
197-
.database_ref_indexer
198-
.get_ref_views_with_database(database_id)
199+
pub async fn get_database_ref_views(
200+
&self,
201+
database_id: &str,
202+
) -> FlowyResult<Vec<DatabaseViewRef>> {
203+
self.database_refs.get_ref_views_with_database(database_id)
199204
}
200205

201206
async fn get_or_create_database_editor(
@@ -277,7 +282,7 @@ impl DatabaseManager {
277282
database_pad,
278283
rev_manager,
279284
self.block_indexer.clone(),
280-
self.database_ref_indexer.clone(),
285+
self.database_refs.clone(),
281286
self.task_scheduler.clone(),
282287
)
283288
.await?;
@@ -354,7 +359,7 @@ pub async fn link_existing_database(
354359
.await?;
355360

356361
let _ = database_manager
357-
.database_ref_indexer
362+
.database_refs
358363
.bind(database_id, view_id, false, &name);
359364
Ok(())
360365
}
@@ -424,14 +429,14 @@ pub async fn create_new_database(
424429
Ok(())
425430
}
426431

427-
impl DatabaseRefIndexerQuery for DatabaseRefIndexer {
428-
fn get_ref_views(&self, database_id: &str) -> FlowyResult<Vec<DatabaseRef>> {
432+
impl DatabaseRefIndexerQuery for DatabaseRefs {
433+
fn get_ref_views(&self, database_id: &str) -> FlowyResult<Vec<DatabaseViewRef>> {
429434
self.get_ref_views_with_database(database_id)
430435
}
431436
}
432437

433-
impl DatabaseRefIndexerQuery for Arc<DatabaseRefIndexer> {
434-
fn get_ref_views(&self, database_id: &str) -> FlowyResult<Vec<DatabaseRef>> {
438+
impl DatabaseRefIndexerQuery for Arc<DatabaseRefs> {
439+
fn get_ref_views(&self, database_id: &str) -> FlowyResult<Vec<DatabaseViewRef>> {
435440
(**self).get_ref_views(database_id)
436441
}
437442
}

frontend/rust-lib/flowy-database/src/services/database/database_editor.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::services::database_view::{
1818
};
1919
use crate::services::filter::FilterType;
2020
use crate::services::persistence::block_index::BlockRowIndexer;
21-
use crate::services::persistence::database_ref::DatabaseRef;
21+
use crate::services::persistence::database_ref::DatabaseViewRef;
2222
use crate::services::row::{DatabaseBlockRow, DatabaseBlockRowRevision, RowRevisionBuilder};
2323
use bytes::Bytes;
2424
use database_model::*;
@@ -42,7 +42,7 @@ use std::sync::Arc;
4242
use tokio::sync::{broadcast, RwLock};
4343

4444
pub trait DatabaseRefIndexerQuery: Send + Sync + 'static {
45-
fn get_ref_views(&self, database_id: &str) -> FlowyResult<Vec<DatabaseRef>>;
45+
fn get_ref_views(&self, database_id: &str) -> FlowyResult<Vec<DatabaseViewRef>>;
4646
}
4747

4848
pub struct DatabaseEditor {
@@ -695,6 +695,7 @@ impl DatabaseEditor {
695695
Ok(())
696696
}
697697

698+
#[tracing::instrument(level = "trace", skip(self), err)]
698699
pub async fn get_database(&self, view_id: &str) -> FlowyResult<DatabasePB> {
699700
let pad = self.database_pad.read().await;
700701
let fields = pad

0 commit comments

Comments
 (0)