chore: update grid setting

This commit is contained in:
appflowy
2022-06-20 09:37:52 +08:00
parent 8594da65c4
commit c73eb2961a
10 changed files with 146 additions and 61 deletions

View File

@ -30,6 +30,17 @@ pub(crate) async fn get_grid_setting_handler(
data_result(grid_setting)
}
#[tracing::instrument(level = "trace", skip(data, manager), err)]
pub(crate) async fn update_grid_setting_handler(
data: Data<GridSettingChangesetPayload>,
manager: AppData<Arc<GridManager>>,
) -> Result<(), FlowyError> {
let params: GridSettingChangesetParams = data.into_inner().try_into()?;
let editor = manager.open_grid(&params.grid_id).await?;
let _ = editor.update_grid_setting(params).await?;
Ok(())
}
#[tracing::instrument(level = "debug", skip(data, manager), err)]
pub(crate) async fn get_grid_blocks_handler(
data: Data<QueryGridBlocksPayload>,

View File

@ -11,6 +11,7 @@ pub fn create(grid_manager: Arc<GridManager>) -> Module {
.event(GridEvent::GetGridData, get_grid_data_handler)
.event(GridEvent::GetGridBlocks, get_grid_blocks_handler)
.event(GridEvent::GetGridSetting, get_grid_setting_handler)
.event(GridEvent::UpdateGridSetting, get_grid_setting_handler)
// Field
.event(GridEvent::GetFields, get_fields_handler)
.event(GridEvent::UpdateField, update_field_handler)
@ -53,6 +54,9 @@ pub enum GridEvent {
#[event(input = "GridId", output = "GridSetting")]
GetGridSetting = 2,
#[event(input = "GridId", input = "GridSettingChangesetPayload")]
UpdateGridSetting = 3,
#[event(input = "QueryFieldPayload", output = "RepeatedField")]
GetFields = 10,

View File

@ -1,4 +1,4 @@
use crate::services::grid_editor::GridMetaEditor;
use crate::services::grid_editor::GridRevisionEditor;
use crate::services::persistence::block_index::BlockIndexCache;
use crate::services::persistence::kv::GridKVPersistence;
use crate::services::persistence::GridDatabase;
@ -6,7 +6,7 @@ use bytes::Bytes;
use dashmap::DashMap;
use flowy_database::ConnectionPool;
use flowy_error::{FlowyError, FlowyResult};
use flowy_grid_data_model::revision::{BuildGridContext, GridInfoRevision, GridRevision};
use flowy_grid_data_model::revision::{BuildGridContext, GridRevision, GridSettingRevision};
use flowy_revision::disk::{SQLiteGridBlockMetaRevisionPersistence, SQLiteGridRevisionPersistence};
use flowy_revision::{RevisionManager, RevisionPersistence, RevisionWebSocket};
use flowy_sync::client_grid::{make_block_meta_delta, make_grid_delta};
@ -20,7 +20,7 @@ pub trait GridUser: Send + Sync {
}
pub struct GridManager {
editor_map: Arc<DashMap<String, Arc<GridMetaEditor>>>,
editor_map: Arc<DashMap<String, Arc<GridRevisionEditor>>>,
grid_user: Arc<dyn GridUser>,
block_index_cache: Arc<BlockIndexCache>,
#[allow(dead_code)]
@ -67,7 +67,7 @@ impl GridManager {
}
#[tracing::instrument(level = "debug", skip_all, fields(grid_id), err)]
pub async fn open_grid<T: AsRef<str>>(&self, grid_id: T) -> FlowyResult<Arc<GridMetaEditor>> {
pub async fn open_grid<T: AsRef<str>>(&self, grid_id: T) -> FlowyResult<Arc<GridRevisionEditor>> {
let grid_id = grid_id.as_ref();
tracing::Span::current().record("grid_id", &grid_id);
self.get_or_create_grid_editor(grid_id).await
@ -92,14 +92,14 @@ impl GridManager {
// pub fn update_grid_info()
// #[tracing::instrument(level = "debug", skip(self), err)]
pub fn get_grid_editor(&self, grid_id: &str) -> FlowyResult<Arc<GridMetaEditor>> {
pub fn get_grid_editor(&self, grid_id: &str) -> FlowyResult<Arc<GridRevisionEditor>> {
match self.editor_map.get(grid_id) {
None => Err(FlowyError::internal().context("Should call open_grid function first")),
Some(editor) => Ok(editor.clone()),
}
}
async fn get_or_create_grid_editor(&self, grid_id: &str) -> FlowyResult<Arc<GridMetaEditor>> {
async fn get_or_create_grid_editor(&self, grid_id: &str) -> FlowyResult<Arc<GridRevisionEditor>> {
match self.editor_map.get(grid_id) {
None => {
tracing::trace!("Create grid editor with id: {}", grid_id);
@ -121,10 +121,10 @@ impl GridManager {
&self,
grid_id: &str,
pool: Arc<ConnectionPool>,
) -> Result<Arc<GridMetaEditor>, FlowyError> {
) -> Result<Arc<GridRevisionEditor>, FlowyError> {
let user = self.grid_user.clone();
let rev_manager = self.make_grid_rev_manager(grid_id, pool.clone())?;
let grid_editor = GridMetaEditor::new(grid_id, user, rev_manager, self.block_index_cache.clone()).await?;
let grid_editor = GridRevisionEditor::new(grid_id, user, rev_manager, self.block_index_cache.clone()).await?;
Ok(grid_editor)
}
@ -160,7 +160,7 @@ pub async fn make_grid_view_data(
grid_id: view_id.to_string(),
fields: build_context.field_revs,
blocks: build_context.blocks,
info: GridInfoRevision::default(),
setting: GridSettingRevision::default(),
};
// Create grid

View File

@ -20,7 +20,7 @@ use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::RwLock;
pub struct GridMetaEditor {
pub struct GridRevisionEditor {
grid_id: String,
user: Arc<dyn GridUser>,
grid_pad: Arc<RwLock<GridRevisionPad>>,
@ -28,13 +28,13 @@ pub struct GridMetaEditor {
block_manager: Arc<GridBlockManager>,
}
impl Drop for GridMetaEditor {
impl Drop for GridRevisionEditor {
fn drop(&mut self) {
tracing::trace!("Drop GridMetaEditor");
}
}
impl GridMetaEditor {
impl GridRevisionEditor {
pub async fn new(
grid_id: &str,
user: Arc<dyn GridUser>,
@ -46,7 +46,7 @@ impl GridMetaEditor {
let grid_pad = rev_manager.load::<GridPadBuilder>(Some(cloud)).await?;
let rev_manager = Arc::new(rev_manager);
let grid_pad = Arc::new(RwLock::new(grid_pad));
let blocks = grid_pad.read().await.get_block_metas();
let blocks = grid_pad.read().await.get_block_revs();
let block_meta_manager = Arc::new(GridBlockManager::new(grid_id, &user, blocks, persistence).await?);
Ok(Arc::new(Self {
@ -165,13 +165,15 @@ impl GridMetaEditor {
pub async fn replace_field(&self, field_rev: FieldRevision) -> FlowyResult<()> {
let field_id = field_rev.id.clone();
let _ = self.modify(|pad| Ok(pad.replace_field_rev(field_rev)?)).await?;
let _ = self
.modify(|grid_pad| Ok(grid_pad.replace_field_rev(field_rev)?))
.await?;
let _ = self.notify_did_update_grid_field(&field_id).await?;
Ok(())
}
pub async fn delete_field(&self, field_id: &str) -> FlowyResult<()> {
let _ = self.modify(|grid| Ok(grid.delete_field_rev(field_id)?)).await?;
let _ = self.modify(|grid_pad| Ok(grid_pad.delete_field_rev(field_id)?)).await?;
let field_order = FieldOrder::from(field_id);
let notified_changeset = GridFieldChangeset::delete(&self.grid_id, vec![field_order]);
let _ = self.notify_did_update_grid(notified_changeset).await?;
@ -242,12 +244,16 @@ impl GridMetaEditor {
}
pub async fn create_block(&self, grid_block: GridBlockRevision) -> FlowyResult<()> {
let _ = self.modify(|grid| Ok(grid.create_block_meta(grid_block)?)).await?;
let _ = self
.modify(|grid_pad| Ok(grid_pad.create_block_rev(grid_block)?))
.await?;
Ok(())
}
pub async fn update_block(&self, changeset: GridBlockRevisionChangeset) -> FlowyResult<()> {
let _ = self.modify(|grid| Ok(grid.update_block_meta(changeset)?)).await?;
let _ = self
.modify(|grid_pad| Ok(grid_pad.update_block_rev(changeset)?))
.await?;
Ok(())
}
@ -400,7 +406,7 @@ impl GridMetaEditor {
}
pub async fn get_block_metas(&self) -> FlowyResult<Vec<GridBlockRevision>> {
let grid_blocks = self.grid_pad.read().await.get_block_metas();
let grid_blocks = self.grid_pad.read().await.get_block_revs();
Ok(grid_blocks)
}
@ -416,7 +422,7 @@ impl GridMetaEditor {
let pad_read_guard = self.grid_pad.read().await;
let field_orders = pad_read_guard.get_field_orders();
let mut block_orders = vec![];
for block_order in pad_read_guard.get_block_metas() {
for block_order in pad_read_guard.get_block_revs() {
let row_orders = self.block_manager.get_row_orders(&block_order.block_id).await?;
let block_order = GridBlockOrder {
block_id: block_order.block_id,
@ -433,7 +439,16 @@ impl GridMetaEditor {
}
pub async fn get_grid_setting(&self) -> FlowyResult<GridSetting> {
todo!()
let pad_read_guard = self.grid_pad.read().await;
let grid_setting_rev = pad_read_guard.get_grid_setting_rev();
Ok(grid_setting_rev.into())
}
pub async fn update_grid_setting(&self, params: GridSettingChangesetParams) -> FlowyResult<()> {
let _ = self
.modify(|grid_pad| Ok(grid_pad.update_grid_setting_rev(params)?))
.await?;
Ok(())
}
pub async fn grid_block_snapshots(&self, block_ids: Option<Vec<String>>) -> FlowyResult<Vec<GridBlockSnapshot>> {
@ -442,7 +457,7 @@ impl GridMetaEditor {
.grid_pad
.read()
.await
.get_block_metas()
.get_block_revs()
.into_iter()
.map(|block_meta| block_meta.block_id)
.collect::<Vec<String>>(),
@ -492,7 +507,7 @@ impl GridMetaEditor {
pub async fn duplicate_grid(&self) -> FlowyResult<BuildGridContext> {
let grid_pad = self.grid_pad.read().await;
let original_blocks = grid_pad.get_block_metas();
let original_blocks = grid_pad.get_block_revs();
let (duplicated_fields, duplicated_blocks) = grid_pad.duplicate_grid_meta().await;
let mut blocks_meta_data = vec![];
@ -551,7 +566,7 @@ impl GridMetaEditor {
}
async fn block_id(&self) -> FlowyResult<String> {
match self.grid_pad.read().await.get_block_metas().last() {
match self.grid_pad.read().await.get_block_revs().last() {
None => Err(FlowyError::internal().context("There is no grid block in this grid")),
Some(grid_block) => Ok(grid_block.block_id.clone()),
}
@ -597,7 +612,7 @@ impl GridMetaEditor {
}
#[cfg(feature = "flowy_unit_test")]
impl GridMetaEditor {
impl GridRevisionEditor {
pub fn rev_manager(&self) -> Arc<RevisionManager> {
self.rev_manager.clone()
}

View File

@ -1,6 +1,6 @@
use bytes::Bytes;
use flowy_grid::services::field::*;
use flowy_grid::services::grid_editor::{GridMetaEditor, GridPadBuilder};
use flowy_grid::services::grid_editor::{GridPadBuilder, GridRevisionEditor};
use flowy_grid::services::row::CreateRowMetaPayload;
use flowy_grid_data_model::entities::{
CellChangeset, Field, FieldChangesetParams, FieldOrder, FieldType, InsertFieldParams, RowOrder,
@ -75,7 +75,7 @@ pub enum EditorScript {
pub struct GridEditorTest {
pub sdk: FlowySDKTest,
pub grid_id: String,
pub editor: Arc<GridMetaEditor>,
pub editor: Arc<GridRevisionEditor>,
pub field_revs: Vec<FieldRevision>,
pub grid_block_revs: Vec<GridBlockRevision>,
pub row_revs: Vec<Arc<RowRevision>>,
@ -101,9 +101,9 @@ impl GridEditorTest {
sdk,
grid_id,
editor,
field_revs: field_revs,
field_revs,
grid_block_revs: grid_blocks,
row_revs: row_revs,
row_revs,
field_count: FieldType::COUNT,
row_order_by_row_id: HashMap::default(),
}
@ -239,7 +239,7 @@ impl GridEditorTest {
}
}
async fn get_row_revs(editor: &Arc<GridMetaEditor>) -> Vec<Arc<RowRevision>> {
async fn get_row_revs(editor: &Arc<GridRevisionEditor>) -> Vec<Arc<RowRevision>> {
editor.grid_block_snapshots(None).await.unwrap().pop().unwrap().row_revs
}