Nathan.fooo 2cd88594e8
feat: migrate user data to cloud (#3078)
* refactor: weak passed-in params in handler

* refactor: rename struct

* chore: update tables

* chore: update schema

* chore: add permission

* chore: update tables

* chore: support transaction mode

* chore: workspace database id

* chore: add user workspace

* feat: return list of workspaces

* chore: add user to workspace

* feat: separate database row table

* refactor: update schema

* chore: partition table

* chore: use transaction

* refactor: dir

* refactor: collab db ref

* fix: collab db lock

* chore: rename files

* chore: add tables descriptions

* chore: update readme

* docs: update documentation

* chore: rename crate

* chore: update ref

* chore: update tests

* chore: update tests

* refactor: crate deps

* chore: update crate ref

* chore: remove unused deps

* chore: remove unused deps

* chore: update collab crate refs

* chore: replace client with transaction in pooler

* refactor: return error type

* refactor: use anyhow error in deps

* feat: supabase postgrest user signin (wip)

* fix: Cargo.toml source git deps, changed Error to anyhow::Error

* fix: uuid serialization

* chore: fix conflict

* chore: extend the response

* feat: add implementation place holders

* feat: impl get_user_workspaces

* feat: impl get_user_profile

* test: create workspace

* fix: postgrest: field names and alias

* chore: implement folder restful api

* chore: implement collab storate with restful api

* feat: added placeholders for impl: update_user_profile, check_user

* feat: impl: update_user_profile

* feat: impl: check_user

* fix: use UidResponse, add more debug info for serde serialization error

* fix: get_user_profile: use Optional<UserProfileResponse>

* chore: imple init sync

* chore: support soft delete

* feat: postgresql: add migration test

* feat: postgresql migration test: added UID display and colored output

* feat: postgresql migration test: workspace role

* feat: postgresql migration test: create shared common utils

* feat: postgresql migration test: fixed shebang

* chore: add flush_collab_update pg function

* chore: implement datbaase and document restful api

* chore: migrate to use restful api

* chore: update table schema

* chore: fix tests

* chore: remove unused code

* chore: format code

* chore: remove unused env

* fix: tauri build

* fix: tauri build

---------

Co-authored-by: Fu Zi Xiang <speed2exe@live.com.sg>
2023-07-29 09:46:24 +08:00

87 lines
2.8 KiB
Rust

use std::ops::Deref;
use std::time::Duration;
use flowy_document2::entities::{DocumentSnapshotStatePB, DocumentSyncStatePB};
use flowy_document2::notification::DocumentNotification::DidUpdateDocumentSnapshotState;
use flowy_test::document::document_event::DocumentEventTest;
use crate::document::supabase_test::helper::{
assert_document_data_equal, FlowySupabaseDocumentTest,
};
use crate::util::receive_with_timeout;
#[tokio::test]
async fn supabase_initial_document_snapshot_test() {
if let Some(test) = FlowySupabaseDocumentTest::new().await {
let view = test.create_document().await;
let mut rx = test
.notification_sender
.subscribe::<DocumentSnapshotStatePB>(&view.id, DidUpdateDocumentSnapshotState);
receive_with_timeout(&mut rx, Duration::from_secs(30))
.await
.unwrap();
let snapshots = test.get_document_snapshots(&view.id).await;
assert_eq!(snapshots.items.len(), 1);
let document_data = test.get_document_data(&view.id).await;
assert_document_data_equal(&snapshots.items[0].data, &view.id, document_data);
}
}
#[tokio::test]
async fn supabase_document_edit_sync_test() {
if let Some(test) = FlowySupabaseDocumentTest::new().await {
let view = test.create_document().await;
let document_id = view.id.clone();
let core = test.deref().deref().clone();
let document_event = DocumentEventTest::new_with_core(core);
document_event
.insert_index(&document_id, "hello world", 0, None)
.await;
// wait all update are send to the remote
let mut rx = test
.notification_sender
.subscribe_with_condition::<DocumentSyncStatePB, _>(&document_id, |pb| pb.is_finish);
receive_with_timeout(&mut rx, Duration::from_secs(30))
.await
.unwrap();
let document_data = test.get_document_data(&document_id).await;
let update = test.get_collab_update(&document_id).await;
assert_document_data_equal(&update, &document_id, document_data);
}
}
#[tokio::test]
async fn supabase_document_edit_sync_test2() {
if let Some(test) = FlowySupabaseDocumentTest::new().await {
let view = test.create_document().await;
let document_id = view.id.clone();
let core = test.deref().deref().clone();
let document_event = DocumentEventTest::new_with_core(core);
for i in 0..10 {
document_event
.insert_index(&document_id, "hello world", i, None)
.await;
}
// wait all update are send to the remote
let mut rx = test
.notification_sender
.subscribe_with_condition::<DocumentSyncStatePB, _>(&document_id, |pb| pb.is_finish);
receive_with_timeout(&mut rx, Duration::from_secs(30))
.await
.unwrap();
let document_data = test.get_document_data(&document_id).await;
let update = test.get_collab_update(&document_id).await;
assert_document_data_equal(&update, &document_id, document_data);
}
}