docs/update database documentation (#1824)

* chore: update event name

* chore: add events and notifications documentation & remove unused code
This commit is contained in:
Nathan.fooo
2023-02-08 10:40:40 +08:00
committed by GitHub
parent 781f0ab88b
commit e157c19174
56 changed files with 253 additions and 411 deletions

View File

@ -61,7 +61,6 @@ impl AsRef<str> for FolderId {
pub struct FolderManager {
pub user: Arc<dyn WorkspaceUser>,
pub(crate) cloud_service: Arc<dyn FolderCouldServiceV1>,
pub(crate) persistence: Arc<FolderPersistence>,
pub(crate) workspace_controller: Arc<WorkspaceController>,
pub(crate) app_controller: Arc<AppController>,
@ -118,7 +117,6 @@ impl FolderManager {
Self {
user,
cloud_service,
persistence,
workspace_controller,
app_controller,
@ -249,7 +247,7 @@ impl DefaultFolderBuilder {
let repeated_workspace = RepeatedWorkspacePB {
items: vec![workspace_rev.into()],
};
send_notification(token, FolderNotification::UserCreateWorkspace)
send_notification(token, FolderNotification::DidCreateWorkspace)
.payload(repeated_workspace)
.send();
Ok(())

View File

@ -5,19 +5,28 @@ const OBSERVABLE_CATEGORY: &str = "Workspace";
#[derive(ProtoBuf_Enum, Debug)]
pub(crate) enum FolderNotification {
Unknown = 0,
UserCreateWorkspace = 10,
UserDeleteWorkspace = 11,
WorkspaceUpdated = 12,
WorkspaceListUpdated = 13,
WorkspaceAppsChanged = 14,
WorkspaceSetting = 15,
AppUpdated = 21,
ViewUpdated = 31,
ViewDeleted = 32,
ViewRestored = 33,
ViewMoveToTrash = 34,
UserUnauthorized = 100,
TrashUpdated = 1000,
/// Trigger after creating a workspace
DidCreateWorkspace = 1,
/// Trigger after deleting a workspace
DidDeleteWorkspace = 2,
/// Trigger after updating a workspace
DidUpdateWorkspace = 3,
/// Trigger when the number of apps of the workspace is changed
DidUpdateWorkspaceApps = 4,
/// Trigger when the settings of the workspace are changed. The changes including the latest visiting view, etc
DidUpdateWorkspaceSetting = 5,
/// Trigger when the properties including rename,update description of the app are changed
DidUpdateApp = 20,
/// Trigger when the properties including rename,update description of the view are changed
DidUpdateView = 30,
/// Trigger after deleting the view
DidDeleteView = 31,
/// Trigger when restore the view from trash
DidRestoreView = 32,
/// Trigger after moving the view to trash
DidMoveViewToTrash = 33,
/// Trigger when the number of trash is changed
DidUpdateTrash = 34,
}
impl std::default::Default for FolderNotification {

View File

@ -72,7 +72,6 @@ impl AppController {
Ok(Some(app))
})
.await?;
self.read_app_on_server(params)?;
Ok(app)
}
@ -89,7 +88,7 @@ impl AppController {
})
.await?
.into();
send_notification(&app_id, FolderNotification::AppUpdated)
send_notification(&app_id, FolderNotification::DidUpdateApp)
.payload(app)
.send();
self.update_app_on_server(params)?;
@ -147,34 +146,6 @@ impl AppController {
Ok(())
}
#[tracing::instrument(level = "trace", skip(self), err)]
fn read_app_on_server(&self, params: AppIdPB) -> Result<(), FlowyError> {
let token = self.user.token()?;
let server = self.cloud_service.clone();
let persistence = self.persistence.clone();
tokio::spawn(async move {
match server.read_app(&token, params).await {
Ok(Some(app_rev)) => {
match persistence
.begin_transaction(|transaction| transaction.create_app(app_rev.clone()))
.await
{
Ok(_) => {
let app: AppPB = app_rev.into();
send_notification(&app.id, FolderNotification::AppUpdated)
.payload(app)
.send();
}
Err(e) => log::error!("Save app failed: {:?}", e),
}
}
Ok(None) => {}
Err(e) => log::error!("Read app failed: {:?}", e),
}
});
Ok(())
}
fn listen_trash_controller_event(&self) {
let mut rx = self.trash_controller.subscribe();
let persistence = self.persistence.clone();
@ -246,7 +217,7 @@ fn notify_apps_changed<'a>(
.map(|app_rev| app_rev.into())
.collect();
let repeated_app = RepeatedAppPB { items };
send_notification(workspace_id, FolderNotification::WorkspaceAppsChanged)
send_notification(workspace_id, FolderNotification::DidUpdateWorkspaceApps)
.payload(repeated_app)
.send();
Ok(())

View File

@ -206,7 +206,7 @@ impl TrashController {
fn notify_trash_changed<T: Into<RepeatedTrashPB>>(repeated_trash: T) {
let repeated_trash = repeated_trash.into();
tracing::Span::current().record("n_trash", repeated_trash.len());
send_anonymous_notification(FolderNotification::TrashUpdated)
send_anonymous_notification(FolderNotification::DidUpdateTrash)
.payload(repeated_trash)
.send();
}

View File

@ -4,7 +4,7 @@ use crate::manager::{ViewDataProcessor, ViewDataProcessorMap};
use crate::{
entities::{
trash::{RepeatedTrashIdPB, TrashType},
view::{CreateViewParams, UpdateViewParams, ViewIdPB, ViewPB},
view::{CreateViewParams, UpdateViewParams, ViewPB},
},
errors::{FlowyError, FlowyResult},
event_map::{FolderCouldServiceV1, WorkspaceUser},
@ -194,7 +194,7 @@ impl ViewController {
})
.await?;
send_notification(view_id, FolderNotification::ViewMoveToTrash)
send_notification(view_id, FolderNotification::DidMoveViewToTrash)
.payload(deleted_view)
.send();
@ -260,7 +260,7 @@ impl ViewController {
transaction.update_view(changeset)?;
let view_rev = transaction.read_view(&view_id)?;
let view: ViewPB = view_rev.clone().into();
send_notification(&view_id, FolderNotification::ViewUpdated)
send_notification(&view_id, FolderNotification::DidUpdateView)
.payload(view)
.send();
notify_views_changed(&view_rev.app_id, self.trash_controller.clone(), &transaction)?;
@ -310,35 +310,6 @@ impl ViewController {
Ok(())
}
#[tracing::instrument(level = "debug", skip(self), err)]
fn read_view_on_server(&self, params: ViewIdPB) -> Result<(), FlowyError> {
let token = self.user.token()?;
let server = self.cloud_service.clone();
let persistence = self.persistence.clone();
// TODO: Retry with RetryAction?
tokio::spawn(async move {
match server.read_view(&token, params).await {
Ok(Some(view_rev)) => {
match persistence
.begin_transaction(|transaction| transaction.create_view(view_rev.clone()))
.await
{
Ok(_) => {
let view: ViewPB = view_rev.into();
send_notification(&view.id, FolderNotification::ViewUpdated)
.payload(view)
.send();
}
Err(e) => log::error!("Save view failed: {:?}", e),
}
}
Ok(None) => {}
Err(e) => log::error!("Read view failed: {:?}", e),
}
});
Ok(())
}
fn listen_trash_can_event(&self) {
let mut rx = self.trash_controller.subscribe();
let persistence = self.persistence.clone();
@ -407,7 +378,7 @@ async fn handle_trash_event(
let view_revs = read_local_views_with_transaction(identifiers, &transaction)?;
for view_rev in view_revs {
notify_views_changed(&view_rev.app_id, trash_can.clone(), &transaction)?;
notify_dart(view_rev.into(), FolderNotification::ViewDeleted);
notify_dart(view_rev.into(), FolderNotification::DidDeleteView);
}
Ok(())
})
@ -420,7 +391,7 @@ async fn handle_trash_event(
let view_revs = read_local_views_with_transaction(identifiers, &transaction)?;
for view_rev in view_revs {
notify_views_changed(&view_rev.app_id, trash_can.clone(), &transaction)?;
notify_dart(view_rev.into(), FolderNotification::ViewRestored);
notify_dart(view_rev.into(), FolderNotification::DidRestoreView);
}
Ok(())
})
@ -506,7 +477,7 @@ fn notify_views_changed<'a>(
app_rev.belongings.retain(|view| !trash_ids.contains(&view.id));
let app: AppPB = app_rev.into();
send_notification(belong_to_id, FolderNotification::AppUpdated)
send_notification(belong_to_id, FolderNotification::DidUpdateApp)
.payload(app)
.send();

View File

@ -53,7 +53,7 @@ impl WorkspaceController {
.map(|workspace_rev| workspace_rev.into())
.collect();
let repeated_workspace = RepeatedWorkspacePB { items: workspaces };
send_notification(&token, FolderNotification::UserCreateWorkspace)
send_notification(&token, FolderNotification::DidCreateWorkspace)
.payload(repeated_workspace)
.send();
set_current_workspace(&user_id, &workspace.id);
@ -73,7 +73,7 @@ impl WorkspaceController {
})
.await?;
send_notification(&workspace_id, FolderNotification::WorkspaceUpdated)
send_notification(&workspace_id, FolderNotification::DidUpdateWorkspace)
.payload(workspace)
.send();
self.update_workspace_on_server(params)?;
@ -92,7 +92,7 @@ impl WorkspaceController {
self.read_workspaces(None, &user_id, &transaction)
})
.await?;
send_notification(&token, FolderNotification::UserDeleteWorkspace)
send_notification(&token, FolderNotification::DidDeleteWorkspace)
.payload(repeated_workspace)
.send();
self.delete_workspace_on_server(workspace_id)?;
@ -236,7 +236,7 @@ pub async fn notify_workspace_setting_did_change(
})
.await?;
send_notification(&token, FolderNotification::WorkspaceSetting)
send_notification(&token, FolderNotification::DidUpdateWorkspaceSetting)
.payload(workspace_setting)
.send();
Ok(())

View File

@ -6,7 +6,6 @@ use crate::entities::{
use crate::{
errors::FlowyError,
manager::FolderManager,
notification::{send_notification, FolderNotification},
services::{get_current_workspace, read_workspace_apps, WorkspaceController},
};
use lib_dispatch::prelude::{data_result, AFPluginData, AFPluginState, DataResult};
@ -71,7 +70,6 @@ pub(crate) async fn read_workspaces_handler(
Ok(workspaces)
})
.await?;
let _ = read_workspaces_on_server(folder, user_id, params);
data_result(workspaces)
}
@ -81,10 +79,6 @@ pub async fn read_cur_workspace_handler(
) -> DataResult<WorkspaceSettingPB, FlowyError> {
let user_id = folder.user.user_id()?;
let workspace_id = get_current_workspace(&user_id)?;
let params = WorkspaceIdPB {
value: Some(workspace_id.clone()),
};
let workspace = folder
.persistence
.begin_transaction(|transaction| {
@ -101,60 +95,5 @@ pub async fn read_cur_workspace_handler(
.unwrap_or(None)
.map(|view_rev| view_rev.into());
let setting = WorkspaceSettingPB { workspace, latest_view };
let _ = read_workspaces_on_server(folder, user_id, params);
data_result(setting)
}
#[tracing::instrument(level = "trace", skip(folder_manager), err)]
fn read_workspaces_on_server(
folder_manager: AFPluginState<Arc<FolderManager>>,
user_id: String,
params: WorkspaceIdPB,
) -> Result<(), FlowyError> {
let (token, server) = (folder_manager.user.token()?, folder_manager.cloud_service.clone());
let persistence = folder_manager.persistence.clone();
tokio::spawn(async move {
let workspace_revs = server.read_workspace(&token, params).await?;
persistence
.begin_transaction(|transaction| {
for workspace_rev in &workspace_revs {
let m_workspace = workspace_rev.clone();
let app_revs = m_workspace.apps.clone();
transaction.create_workspace(&user_id, m_workspace)?;
tracing::trace!("Save {} apps", app_revs.len());
for app_rev in app_revs {
let view_revs = app_rev.belongings.clone();
match transaction.create_app(app_rev) {
Ok(_) => {}
Err(e) => log::error!("create app failed: {:?}", e),
}
tracing::trace!("Save {} views", view_revs.len());
for view_rev in view_revs {
match transaction.create_view(view_rev) {
Ok(_) => {}
Err(e) => log::error!("create view failed: {:?}", e),
}
}
}
}
Ok(())
})
.await?;
let repeated_workspace = RepeatedWorkspacePB {
items: workspace_revs
.into_iter()
.map(|workspace_rev| workspace_rev.into())
.collect(),
};
send_notification(&token, FolderNotification::WorkspaceListUpdated)
.payload(repeated_workspace)
.send();
Result::<(), FlowyError>::Ok(())
});
Ok(())
}