From 50605186fe0047fe66718bbaf4c87f7e8a7a5101 Mon Sep 17 00:00:00 2001 From: appflowy Date: Wed, 15 Jun 2022 11:43:24 +0800 Subject: [PATCH] chore: update view info --- .../rust-lib/flowy-folder/src/event_map.rs | 4 ++ frontend/rust-lib/flowy-folder/src/manager.rs | 12 +++++- .../src/services/view/controller.rs | 28 +++++++++++-- .../src/services/view/event_handler.rs | 8 ++-- frontend/rust-lib/flowy-grid/src/manager.rs | 2 + .../flowy-sdk/src/deps_resolve/folder_deps.rs | 23 +++++++++-- shared-lib/flowy-error-code/src/code.rs | 3 ++ .../src/entities/view_info.rs | 39 ++++++++++++++++-- .../flowy-folder-data-model/src/parser/mod.rs | 1 + .../src/parser/view_info/mod.rs | 5 +++ .../src/parser/view_info/object_id.rs | 19 +++++++++ .../src/parser/view_info/view_ext.rs | 40 +++++++++++++++++++ .../src/revision/view.rs | 12 ++++-- 13 files changed, 175 insertions(+), 21 deletions(-) create mode 100644 shared-lib/flowy-folder-data-model/src/parser/view_info/mod.rs create mode 100644 shared-lib/flowy-folder-data-model/src/parser/view_info/object_id.rs create mode 100644 shared-lib/flowy-folder-data-model/src/parser/view_info/view_ext.rs diff --git a/frontend/rust-lib/flowy-folder/src/event_map.rs b/frontend/rust-lib/flowy-folder/src/event_map.rs index b1a0b186a3..8caf43c9c0 100644 --- a/frontend/rust-lib/flowy-folder/src/event_map.rs +++ b/frontend/rust-lib/flowy-folder/src/event_map.rs @@ -43,6 +43,7 @@ pub fn create(folder: Arc) -> Module { .data(folder.trash_controller.clone()) .data(folder.clone()); + // Workspace module = module .event(FolderEvent::CreateWorkspace, create_workspace_handler) .event(FolderEvent::ReadCurWorkspace, read_cur_workspace_handler) @@ -50,12 +51,14 @@ pub fn create(folder: Arc) -> Module { .event(FolderEvent::OpenWorkspace, open_workspace_handler) .event(FolderEvent::ReadWorkspaceApps, read_workspace_apps_handler); + // App module = module .event(FolderEvent::CreateApp, create_app_handler) .event(FolderEvent::ReadApp, read_app_handler) .event(FolderEvent::UpdateApp, update_app_handler) .event(FolderEvent::DeleteApp, delete_app_handler); + // View module = module .event(FolderEvent::CreateView, create_view_handler) .event(FolderEvent::ReadView, read_view_handler) @@ -68,6 +71,7 @@ pub fn create(folder: Arc) -> Module { .event(FolderEvent::CloseView, close_view_handler) .event(FolderEvent::MoveFolderItem, move_item_handler); + // Trash module = module .event(FolderEvent::ReadTrash, read_trash_handler) .event(FolderEvent::PutbackTrash, putback_trash_handler) diff --git a/frontend/rust-lib/flowy-folder/src/manager.rs b/frontend/rust-lib/flowy-folder/src/manager.rs index d9664004c9..8f5f318f95 100644 --- a/frontend/rust-lib/flowy-folder/src/manager.rs +++ b/frontend/rust-lib/flowy-folder/src/manager.rs @@ -14,6 +14,7 @@ use flowy_sync::client_document::default::{initial_quill_delta_string, initial_r use flowy_error::FlowyError; use flowy_folder_data_model::entities::view::ViewDataType; +use flowy_folder_data_model::entities::UpdateViewInfoParams; use flowy_folder_data_model::user_default; use flowy_revision::disk::SQLiteTextBlockRevisionPersistence; use flowy_revision::{RevisionManager, RevisionPersistence, RevisionWebSocket}; @@ -244,11 +245,18 @@ pub trait ViewDataProcessor { fn close_container(&self, view_id: &str) -> FutureResult<(), FlowyError>; - fn view_delta_data(&self, view_id: &str) -> FutureResult; + fn get_delta_data(&self, view_id: &str) -> FutureResult; fn create_default_view(&self, user_id: &str, view_id: &str) -> FutureResult; - fn process_view_delta_data(&self, user_id: &str, view_id: &str, data: Vec) -> FutureResult; + fn create_view_from_delta_data( + &self, + user_id: &str, + view_id: &str, + data: Vec, + ) -> FutureResult; + + fn handle_view_info_updated(&self, params: UpdateViewInfoParams) -> FutureResult<(), FlowyError>; fn data_type(&self) -> ViewDataType; } diff --git a/frontend/rust-lib/flowy-folder/src/services/view/controller.rs b/frontend/rust-lib/flowy-folder/src/services/view/controller.rs index ce701e705a..7f8e910424 100644 --- a/frontend/rust-lib/flowy-folder/src/services/view/controller.rs +++ b/frontend/rust-lib/flowy-folder/src/services/view/controller.rs @@ -15,7 +15,7 @@ use crate::{ use bytes::Bytes; use flowy_database::kv::KV; use flowy_folder_data_model::entities::view::{gen_view_id, ViewDataType}; -use flowy_folder_data_model::entities::{ViewExtData, ViewInfo}; +use flowy_folder_data_model::entities::{UpdateViewInfoParams, ViewExtData, ViewInfo}; use flowy_folder_data_model::revision::ViewRevision; use flowy_sync::entities::text_block_info::TextBlockId; use futures::{FutureExt, StreamExt}; @@ -65,7 +65,7 @@ impl ViewController { params.data = view_data.to_vec(); } else { let delta_data = processor - .process_view_delta_data(&user_id, ¶ms.view_id, params.data.clone()) + .create_view_from_delta_data(&user_id, ¶ms.view_id, params.data.clone()) .await?; let _ = self .create_view(¶ms.view_id, params.data_type.clone(), delta_data) @@ -211,7 +211,7 @@ impl ViewController { .await?; let processor = self.get_data_processor(&view_rev.data_type)?; - let delta_bytes = processor.view_delta_data(view_id).await?; + let delta_bytes = processor.get_delta_data(view_id).await?; let duplicate_params = CreateViewParams { belong_to_id: view_rev.belong_to_id.clone(), name: format!("{} (copy)", &view_rev.name), @@ -259,6 +259,28 @@ impl ViewController { Ok(view_rev) } + #[tracing::instrument(level = "debug", skip(self, params), err)] + pub(crate) async fn update_view_info(&self, params: UpdateViewInfoParams) -> Result { + let changeset = ViewChangeset::new(params.clone()); + let view_id = changeset.id.clone(); + let view_rev = self + .persistence + .begin_transaction(|transaction| { + let _ = transaction.update_view(changeset)?; + let view_rev = transaction.read_view(&view_id)?; + let view: View = view_rev.clone().into(); + send_dart_notification(&view_id, FolderNotification::ViewUpdated) + .payload(view) + .send(); + let _ = notify_views_changed(&view_rev.belong_to_id, self.trash_controller.clone(), &transaction)?; + Ok(view_rev) + }) + .await?; + + let _ = self.update_view_on_server(params); + Ok(view_rev) + } + pub(crate) async fn latest_visit_view(&self) -> FlowyResult> { match KV::get_str(LATEST_VIEW_ID) { None => Ok(None), diff --git a/frontend/rust-lib/flowy-folder/src/services/view/event_handler.rs b/frontend/rust-lib/flowy-folder/src/services/view/event_handler.rs index 85efa862ef..691f3fb058 100644 --- a/frontend/rust-lib/flowy-folder/src/services/view/event_handler.rs +++ b/frontend/rust-lib/flowy-folder/src/services/view/event_handler.rs @@ -11,7 +11,7 @@ use crate::{ services::{TrashController, ViewController}, }; use flowy_folder_data_model::entities::view::{MoveFolderItemParams, MoveFolderItemPayload, MoveFolderItemType}; -use flowy_folder_data_model::entities::ViewInfo; +use flowy_folder_data_model::entities::{UpdateViewInfoParams, UpdateViewInfoPayload, ViewInfo}; use flowy_folder_data_model::revision::TrashRevision; use lib_dispatch::prelude::{data_result, AppData, Data, DataResult}; use std::{convert::TryInto, sync::Arc}; @@ -56,11 +56,11 @@ pub(crate) async fn update_view_handler( #[tracing::instrument(level = "debug", skip(data, controller), err)] pub(crate) async fn update_view_info_handler( - data: Data, + data: Data, controller: AppData>, ) -> Result<(), FlowyError> { - let params: UpdateViewParams = data.into_inner().try_into()?; - let _ = controller.update_view(params).await?; + let params: UpdateViewInfoParams = data.into_inner().try_into()?; + let _ = controller.update_view_info(params).await?; Ok(()) } diff --git a/frontend/rust-lib/flowy-grid/src/manager.rs b/frontend/rust-lib/flowy-grid/src/manager.rs index 2965cb5bd9..18ff4f654f 100644 --- a/frontend/rust-lib/flowy-grid/src/manager.rs +++ b/frontend/rust-lib/flowy-grid/src/manager.rs @@ -89,6 +89,8 @@ impl GridManager { Ok(()) } + // pub fn update_grid_info() + // #[tracing::instrument(level = "debug", skip(self), err)] pub fn get_grid_editor(&self, grid_id: &str) -> FlowyResult> { match self.editor_map.get(grid_id) { diff --git a/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs b/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs index 846dddd55e..40f091d46b 100644 --- a/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs +++ b/frontend/rust-lib/flowy-sdk/src/deps_resolve/folder_deps.rs @@ -26,6 +26,7 @@ use lib_infra::future::{BoxResultFuture, FutureResult}; use lib_ws::{WSChannel, WSMessageReceiver, WebSocketRawMessage}; use std::collections::HashMap; +use flowy_folder::entities::UpdateViewInfoParams; use flowy_grid_data_model::entities::BuildGridContext; use std::convert::TryFrom; use std::{convert::TryInto, sync::Arc}; @@ -173,7 +174,7 @@ impl ViewDataProcessor for TextBlockViewDataProcessor { }) } - fn view_delta_data(&self, view_id: &str) -> FutureResult { + fn get_delta_data(&self, view_id: &str) -> FutureResult { let view_id = view_id.to_string(); let manager = self.0.clone(); FutureResult::new(async move { @@ -197,7 +198,7 @@ impl ViewDataProcessor for TextBlockViewDataProcessor { }) } - fn process_view_delta_data( + fn create_view_from_delta_data( &self, _user_id: &str, _view_id: &str, @@ -206,6 +207,11 @@ impl ViewDataProcessor for TextBlockViewDataProcessor { FutureResult::new(async move { Ok(Bytes::from(data)) }) } + fn handle_view_info_updated(&self, _params: UpdateViewInfoParams) -> FutureResult<(), FlowyError> { + tracing::warn!("Unimplemented the handle_view_info_updated in TextBlock"); + FutureResult::new(async { Ok(()) }) + } + fn data_type(&self) -> ViewDataType { ViewDataType::TextBlock } @@ -245,7 +251,7 @@ impl ViewDataProcessor for GridViewDataProcessor { }) } - fn view_delta_data(&self, view_id: &str) -> FutureResult { + fn get_delta_data(&self, view_id: &str) -> FutureResult { let view_id = view_id.to_string(); let grid_manager = self.0.clone(); FutureResult::new(async move { @@ -264,7 +270,12 @@ impl ViewDataProcessor for GridViewDataProcessor { FutureResult::new(async move { make_grid_view_data(&user_id, &view_id, grid_manager, build_context).await }) } - fn process_view_delta_data(&self, user_id: &str, view_id: &str, data: Vec) -> FutureResult { + fn create_view_from_delta_data( + &self, + user_id: &str, + view_id: &str, + data: Vec, + ) -> FutureResult { let user_id = user_id.to_string(); let view_id = view_id.to_string(); let grid_manager = self.0.clone(); @@ -276,6 +287,10 @@ impl ViewDataProcessor for GridViewDataProcessor { }) } + fn handle_view_info_updated(&self, params: UpdateViewInfoParams) -> FutureResult<(), FlowyError> { + todo!() + } + fn data_type(&self) -> ViewDataType { ViewDataType::Grid } diff --git a/shared-lib/flowy-error-code/src/code.rs b/shared-lib/flowy-error-code/src/code.rs index 8941684948..352c4abbdb 100644 --- a/shared-lib/flowy-error-code/src/code.rs +++ b/shared-lib/flowy-error-code/src/code.rs @@ -114,6 +114,9 @@ pub enum ErrorCode { #[display(fmt = "Invalid date time format")] InvalidDateTimeFormat = 500, + #[display(fmt = "The input string is empty or contains invalid characters")] + UnexpectedEmptyString = 999, + #[display(fmt = "Invalid data")] InvalidData = 1000, } diff --git a/shared-lib/flowy-folder-data-model/src/entities/view_info.rs b/shared-lib/flowy-folder-data-model/src/entities/view_info.rs index 7cb598e534..a4f0fd8645 100644 --- a/shared-lib/flowy-folder-data-model/src/entities/view_info.rs +++ b/shared-lib/flowy-folder-data-model/src/entities/view_info.rs @@ -1,5 +1,6 @@ use crate::entities::{RepeatedView, ViewDataType}; use crate::parser::view::ViewIdentify; +use crate::parser::view_info::{ViewFilterParser, ViewGroupParser, ViewSortParser}; use flowy_derive::ProtoBuf; use flowy_error_code::ErrorCode; use std::convert::TryInto; @@ -43,22 +44,22 @@ pub struct ViewExtData { #[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)] pub struct ViewFilter { #[pb(index = 1)] - pub field_id: String, + pub object_id: String, } #[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)] pub struct ViewGroup { #[pb(index = 1)] - pub group_field_id: String, + pub group_object_id: String, #[pb(index = 2, one_of)] - pub sub_group_field_id: Option, + pub sub_group_object_id: Option, } #[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)] pub struct ViewSort { #[pb(index = 1)] - pub field_id: String, + pub object_id: String, } #[derive(Default, ProtoBuf)] @@ -82,3 +83,33 @@ pub struct UpdateViewInfoParams { pub group: Option, pub sort: Option, } + +impl TryInto for UpdateViewInfoPayload { + type Error = ErrorCode; + + fn try_into(self) -> Result { + let view_id = ViewIdentify::parse(self.view_id)?.0; + + let filter = match self.filter { + None => None, + Some(filter) => Some(ViewFilterParser::parse(filter)?), + }; + + let group = match self.group { + None => None, + Some(group) => Some(ViewGroupParser::parse(group)?), + }; + + let sort = match self.sort { + None => None, + Some(sort) => Some(ViewSortParser::parse(sort)?), + }; + + Ok(UpdateViewInfoParams { + view_id, + filter, + group, + sort, + }) + } +} diff --git a/shared-lib/flowy-folder-data-model/src/parser/mod.rs b/shared-lib/flowy-folder-data-model/src/parser/mod.rs index 3ee0f4b591..5f16ba6b38 100644 --- a/shared-lib/flowy-folder-data-model/src/parser/mod.rs +++ b/shared-lib/flowy-folder-data-model/src/parser/mod.rs @@ -1,4 +1,5 @@ pub mod app; pub mod trash; pub mod view; +pub mod view_info; pub mod workspace; diff --git a/shared-lib/flowy-folder-data-model/src/parser/view_info/mod.rs b/shared-lib/flowy-folder-data-model/src/parser/view_info/mod.rs new file mode 100644 index 0000000000..fc7202c4cb --- /dev/null +++ b/shared-lib/flowy-folder-data-model/src/parser/view_info/mod.rs @@ -0,0 +1,5 @@ +mod object_id; +mod view_ext; + +pub use object_id::*; +pub use view_ext::*; diff --git a/shared-lib/flowy-folder-data-model/src/parser/view_info/object_id.rs b/shared-lib/flowy-folder-data-model/src/parser/view_info/object_id.rs new file mode 100644 index 0000000000..155dea5fa8 --- /dev/null +++ b/shared-lib/flowy-folder-data-model/src/parser/view_info/object_id.rs @@ -0,0 +1,19 @@ +use crate::errors::ErrorCode; + +#[derive(Debug)] +pub struct ObjectId(pub String); + +impl ObjectId { + pub fn parse(s: String) -> Result { + if s.trim().is_empty() { + return Err(ErrorCode::UnexpectedEmptyString); + } + Ok(Self(s)) + } +} + +impl AsRef for ObjectId { + fn as_ref(&self) -> &str { + &self.0 + } +} diff --git a/shared-lib/flowy-folder-data-model/src/parser/view_info/view_ext.rs b/shared-lib/flowy-folder-data-model/src/parser/view_info/view_ext.rs new file mode 100644 index 0000000000..80d1d56f51 --- /dev/null +++ b/shared-lib/flowy-folder-data-model/src/parser/view_info/view_ext.rs @@ -0,0 +1,40 @@ +use crate::entities::{ViewFilter, ViewGroup, ViewSort}; +use crate::errors::ErrorCode; +use crate::parser::view_info::ObjectId; + +pub struct ViewFilterParser(pub ViewFilter); + +impl ViewFilterParser { + pub fn parse(value: ViewFilter) -> Result { + let object_id = ObjectId::parse(value.object_id)?.0; + Ok(ViewFilter { object_id }) + } +} + +pub struct ViewGroupParser(pub ViewGroup); + +impl ViewGroupParser { + pub fn parse(value: ViewGroup) -> Result { + let group_object_id = ObjectId::parse(value.group_object_id)?.0; + + let sub_group_object_id = match value.sub_group_object_id { + None => None, + Some(object_id) => Some(ObjectId::parse(object_id)?.0), + }; + + Ok(ViewGroup { + group_object_id, + sub_group_object_id, + }) + } +} + +pub struct ViewSortParser(pub ViewSort); + +impl ViewSortParser { + pub fn parse(value: ViewSort) -> Result { + let object_id = ObjectId::parse(value.object_id)?.0; + + Ok(ViewSort { object_id }) + } +} diff --git a/shared-lib/flowy-folder-data-model/src/revision/view.rs b/shared-lib/flowy-folder-data-model/src/revision/view.rs index e58ee95928..63a87bf82c 100644 --- a/shared-lib/flowy-folder-data-model/src/revision/view.rs +++ b/shared-lib/flowy-folder-data-model/src/revision/view.rs @@ -111,22 +111,26 @@ impl std::convert::From for ViewExtData { impl std::convert::From for ViewFilter { fn from(rev: ViewFilterRevision) -> Self { - ViewFilter { field_id: rev.field_id } + ViewFilter { + object_id: rev.field_id, + } } } impl std::convert::From for ViewGroup { fn from(rev: ViewGroupRevision) -> Self { ViewGroup { - group_field_id: rev.group_field_id, - sub_group_field_id: rev.sub_group_field_id, + group_object_id: rev.group_field_id, + sub_group_object_id: rev.sub_group_field_id, } } } impl std::convert::From for ViewSort { fn from(rev: ViewSortRevision) -> Self { - ViewSort { field_id: rev.field_id } + ViewSort { + object_id: rev.field_id, + } } }