Skip to content

Commit ffc6f14

Browse files
committed
chore: fix GroupConfigurationRevision deserialize error
1 parent 93f5b5d commit ffc6f14

File tree

8 files changed

+116
-139
lines changed

8 files changed

+116
-139
lines changed

frontend/rust-lib/flowy-grid/src/entities/group_entities/configuration.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,12 @@ pub struct TextGroupConfigurationPB {
1717
pub struct SelectOptionGroupConfigurationPB {
1818
#[pb(index = 1)]
1919
hide_empty: bool,
20-
21-
#[pb(index = 2)]
22-
groups: Vec<GroupRecordPB>,
2320
}
2421

2522
impl std::convert::From<SelectOptionGroupConfigurationRevision> for SelectOptionGroupConfigurationPB {
2623
fn from(rev: SelectOptionGroupConfigurationRevision) -> Self {
2724
Self {
2825
hide_empty: rev.hide_empty,
29-
groups: rev.groups.into_iter().map(GroupRecordPB::from).collect(),
3026
}
3127
}
3228
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ impl GridManager {
131131
async fn get_or_create_grid_editor(&self, grid_id: &str) -> FlowyResult<Arc<GridRevisionEditor>> {
132132
match self.grid_editors.get(grid_id) {
133133
None => {
134-
tracing::trace!("Create grid editor with id: {}", grid_id);
135134
let db_pool = self.grid_user.db_pool()?;
136135
let editor = self.make_grid_rev_editor(grid_id, db_pool).await?;
137136

frontend/rust-lib/flowy-grid/src/services/grid_view_editor.rs

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -348,30 +348,18 @@ impl GroupConfigurationWriter for GroupConfigurationWriterImpl {
348348
&self,
349349
field_id: &str,
350350
field_type: FieldTypeRevision,
351-
configuration_id: &str,
352-
content: String,
351+
group_configuration: GroupConfigurationRevision,
353352
) -> AFFuture<FlowyResult<()>> {
354353
let user_id = self.user_id.clone();
355-
let configuration_id = configuration_id.to_owned();
356354
let rev_manager = self.rev_manager.clone();
357355
let view_pad = self.view_pad.clone();
358356
let field_id = field_id.to_owned();
359357

360358
wrap_future(async move {
361-
let is_contained = view_pad.read().await.contains_group(&field_id, &field_type);
362-
let changeset = if is_contained {
363-
view_pad.write().await.with_mut_group(
364-
&field_id,
365-
&field_type,
366-
&configuration_id,
367-
|group_configuration| {
368-
group_configuration.content = content;
369-
},
370-
)?
371-
} else {
372-
let group_rev = GroupConfigurationRevision::new(field_id.clone(), field_type, content)?;
373-
view_pad.write().await.insert_group(&field_id, &field_type, group_rev)?
374-
};
359+
let changeset = view_pad
360+
.write()
361+
.await
362+
.insert_group(&field_id, &field_type, group_configuration)?;
375363

376364
if let Some(changeset) = changeset {
377365
let _ = apply_change(&user_id, rev_manager, changeset).await?;

frontend/rust-lib/flowy-grid/src/services/group/configuration.rs

Lines changed: 82 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use crate::services::group::{default_group_configuration, Group};
22
use flowy_error::{FlowyError, FlowyResult};
33
use flowy_grid_data_model::revision::{
4-
FieldRevision, FieldTypeRevision, GroupConfigurationContent, GroupConfigurationRevision, GroupRecordRevision,
4+
FieldRevision, FieldTypeRevision, GroupConfigurationContentSerde, GroupConfigurationRevision, GroupRecordRevision,
55
};
6+
use std::marker::PhantomData;
67

78
use indexmap::IndexMap;
89
use lib_infra::future::AFFuture;
@@ -20,52 +21,46 @@ pub trait GroupConfigurationWriter: Send + Sync + 'static {
2021
&self,
2122
field_id: &str,
2223
field_type: FieldTypeRevision,
23-
configuration_id: &str,
24-
content: String,
24+
group_configuration: GroupConfigurationRevision,
2525
) -> AFFuture<FlowyResult<()>>;
2626
}
2727

2828
pub struct GenericGroupConfiguration<C> {
29-
pub configuration: C,
30-
configuration_id: String,
29+
pub configuration: Arc<GroupConfigurationRevision>,
30+
configuration_content: PhantomData<C>,
3131
field_rev: Arc<FieldRevision>,
3232
groups_map: IndexMap<String, Group>,
3333
writer: Arc<dyn GroupConfigurationWriter>,
3434
}
3535

3636
impl<C> GenericGroupConfiguration<C>
3737
where
38-
C: GroupConfigurationContent,
38+
C: GroupConfigurationContentSerde,
3939
{
40+
#[tracing::instrument(level = "trace", skip_all, err)]
4041
pub async fn new(
4142
field_rev: Arc<FieldRevision>,
4243
reader: Arc<dyn GroupConfigurationReader>,
4344
writer: Arc<dyn GroupConfigurationWriter>,
4445
) -> FlowyResult<Self> {
45-
let configuration_rev = match reader.get_group_configuration(field_rev.clone()).await {
46+
let configuration = match reader.get_group_configuration(field_rev.clone()).await {
4647
None => {
4748
let default_group_configuration = default_group_configuration(&field_rev);
4849
writer
49-
.save_group_configuration(
50-
&field_rev.id,
51-
field_rev.ty,
52-
&default_group_configuration.id,
53-
default_group_configuration.content.clone(),
54-
)
50+
.save_group_configuration(&field_rev.id, field_rev.ty, default_group_configuration.clone())
5551
.await?;
5652
Arc::new(default_group_configuration)
5753
}
5854
Some(configuration) => configuration,
5955
};
6056

61-
let configuration_id = configuration_rev.id.clone();
62-
let configuration = C::from_configuration_content(&configuration_rev.content)?;
57+
// let configuration = C::from_configuration_content(&configuration_rev.content)?;
6358
Ok(Self {
64-
configuration_id,
6559
field_rev,
6660
groups_map: IndexMap::new(),
6761
writer,
6862
configuration,
63+
configuration_content: PhantomData,
6964
})
7065
}
7166

@@ -78,11 +73,12 @@ where
7873
}
7974

8075
pub(crate) async fn merge_groups(&mut self, groups: Vec<Group>) -> FlowyResult<()> {
81-
let (group_revs, groups) = merge_groups(self.configuration.get_groups(), groups);
82-
self.configuration.set_groups(group_revs);
83-
let _ = self.save_configuration().await?;
76+
let (group_revs, groups) = merge_groups(&self.configuration.groups, groups);
77+
self.mut_configuration(move |configuration| {
78+
configuration.groups = group_revs;
79+
true
80+
})?;
8481

85-
tracing::trace!("merge new groups: {}", groups.len());
8682
groups.into_iter().for_each(|group| {
8783
self.groups_map.insert(group.id.clone(), group);
8884
});
@@ -91,19 +87,17 @@ where
9187

9288
#[allow(dead_code)]
9389
pub(crate) async fn hide_group(&mut self, group_id: &str) -> FlowyResult<()> {
94-
self.configuration.with_mut_group(group_id, |group_rev| {
90+
self.mut_configuration_group(group_id, |group_rev| {
9591
group_rev.visible = false;
96-
});
97-
let _ = self.save_configuration().await?;
92+
})?;
9893
Ok(())
9994
}
10095

10196
#[allow(dead_code)]
10297
pub(crate) async fn show_group(&mut self, group_id: &str) -> FlowyResult<()> {
103-
self.configuration.with_mut_group(group_id, |group_rev| {
98+
self.mut_configuration_group(group_id, |group_rev| {
10499
group_rev.visible = true;
105-
});
106-
let _ = self.save_configuration().await?;
100+
})?;
107101
Ok(())
108102
}
109103

@@ -123,7 +117,21 @@ where
123117
match (from_group_index, to_group_index) {
124118
(Some(from_index), Some(to_index)) => {
125119
self.groups_map.swap_indices(from_index, to_index);
126-
self.configuration.swap_group(from_group_id, to_group_id);
120+
121+
self.mut_configuration(|configuration| {
122+
let from_index = configuration
123+
.groups
124+
.iter()
125+
.position(|group| group.group_id == from_group_id);
126+
let to_index = configuration
127+
.groups
128+
.iter()
129+
.position(|group| group.group_id == to_group_id);
130+
if let (Some(from), Some(to)) = (from_index, to_index) {
131+
configuration.groups.swap(from, to);
132+
}
133+
true
134+
})?;
127135
Ok(())
128136
}
129137
_ => Err(FlowyError::out_of_bounds()),
@@ -138,24 +146,54 @@ where
138146
}
139147
}
140148

141-
pub async fn save_configuration(&self) -> FlowyResult<()> {
142-
let content = self.configuration.to_configuration_content()?;
143-
let _ = self
144-
.writer
145-
.save_group_configuration(&self.field_rev.id, self.field_rev.ty, &self.configuration_id, content)
146-
.await?;
149+
pub fn save_configuration(&self) -> FlowyResult<()> {
150+
let configuration = (&*self.configuration).clone();
151+
let writer = self.writer.clone();
152+
let field_id = self.field_rev.id.clone();
153+
let field_type = self.field_rev.ty.clone();
154+
tokio::spawn(async move {
155+
match writer
156+
.save_group_configuration(&field_id, field_type, configuration)
157+
.await
158+
{
159+
Ok(_) => {}
160+
Err(e) => {
161+
tracing::error!("Save group configuration failed: {}", e);
162+
}
163+
}
164+
});
165+
147166
Ok(())
148167
}
149-
}
150168

151-
// impl<T> GroupConfigurationReader for Arc<T>
152-
// where
153-
// T: GroupConfigurationReader,
154-
// {
155-
// fn get_group_configuration(&self, field_rev: Arc<FieldRevision>) -> AFFuture<Arc<GroupConfigurationRevision>> {
156-
// (**self).get_group_configuration(field_rev)
157-
// }
158-
// }
169+
fn mut_configuration_group(
170+
&mut self,
171+
group_id: &str,
172+
mut_groups_fn: impl Fn(&mut GroupRecordRevision),
173+
) -> FlowyResult<()> {
174+
self.mut_configuration(|configuration| {
175+
match configuration.groups.iter_mut().find(|group| group.group_id == group_id) {
176+
None => false,
177+
Some(group_rev) => {
178+
mut_groups_fn(group_rev);
179+
true
180+
}
181+
}
182+
})
183+
}
184+
185+
fn mut_configuration(
186+
&mut self,
187+
mut_configuration_fn: impl FnOnce(&mut GroupConfigurationRevision) -> bool,
188+
) -> FlowyResult<()> {
189+
let configuration = Arc::make_mut(&mut self.configuration);
190+
let is_changed = mut_configuration_fn(configuration);
191+
if is_changed {
192+
let _ = self.save_configuration()?;
193+
}
194+
Ok(())
195+
}
196+
}
159197

160198
fn merge_groups(old_group_revs: &[GroupRecordRevision], groups: Vec<Group>) -> (Vec<GroupRecordRevision>, Vec<Group>) {
161199
tracing::trace!("Merge group: old: {}, new: {}", old_group_revs.len(), groups.len());
@@ -172,6 +210,7 @@ fn merge_groups(old_group_revs: &[GroupRecordRevision], groups: Vec<Group>) -> (
172210
group_map.insert(group.id.clone(), group);
173211
});
174212

213+
// Inert
175214
let mut sorted_groups: Vec<Group> = vec![];
176215
for group_rev in old_group_revs {
177216
if let Some(group) = group_map.remove(&group_rev.group_id) {
@@ -184,5 +223,6 @@ fn merge_groups(old_group_revs: &[GroupRecordRevision], groups: Vec<Group>) -> (
184223
.map(|group| GroupRecordRevision::new(group.id.clone()))
185224
.collect::<Vec<GroupRecordRevision>>();
186225

226+
tracing::trace!("group revs: {}, groups: {}", new_group_revs.len(), sorted_groups.len());
187227
(new_group_revs, sorted_groups)
188228
}

frontend/rust-lib/flowy-grid/src/services/group/controller.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::services::group::configuration::GenericGroupConfiguration;
55
use crate::services::group::entities::Group;
66
use flowy_error::FlowyResult;
77
use flowy_grid_data_model::revision::{
8-
FieldRevision, GroupConfigurationContent, RowChangeset, RowRevision, TypeOptionDataDeserializer,
8+
FieldRevision, GroupConfigurationContentSerde, RowChangeset, RowRevision, TypeOptionDataDeserializer,
99
};
1010

1111
use std::marker::PhantomData;
@@ -76,7 +76,7 @@ pub struct GenericGroupController<C, T, G, P> {
7676

7777
impl<C, T, G, P> GenericGroupController<C, T, G, P>
7878
where
79-
C: GroupConfigurationContent,
79+
C: GroupConfigurationContentSerde,
8080
T: TypeOptionDataDeserializer,
8181
G: GroupGenerator<ConfigurationType = GenericGroupConfiguration<C>, TypeOptionType = T>,
8282
{
@@ -109,7 +109,7 @@ where
109109
impl<C, T, G, P> GroupControllerSharedOperation for GenericGroupController<C, T, G, P>
110110
where
111111
P: CellBytesParser,
112-
C: GroupConfigurationContent,
112+
C: GroupConfigurationContentSerde,
113113
Self: GroupAction<CellDataType = P::Object>,
114114
{
115115
fn field_id(&self) -> &str {

frontend/rust-lib/flowy-grid/src/services/group/group_service.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,14 @@ impl GroupService {
7171
vec![]
7272
}
7373
};
74-
7574
drop(write_guard);
7675
}
7776
Some(groups)
7877
}
79-
Err(_) => Some(vec![]),
78+
Err(err) => {
79+
tracing::error!("Load group failed: {}", err);
80+
Some(vec![])
81+
}
8082
}
8183
}
8284

@@ -183,7 +185,7 @@ impl GroupService {
183185
}
184186
}
185187

186-
#[tracing::instrument(level = "trace", skip_all)]
188+
#[tracing::instrument(level = "trace", skip(self, field_rev), err)]
187189
async fn make_group_controller(
188190
&self,
189191
field_type: &FieldType,

shared-lib/flowy-grid-data-model/src/revision/grid_setting_rev.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ pub type FilterConfigurationsByFieldId = HashMap<String, Vec<Arc<FilterConfigura
2525
pub type GroupConfiguration = Configuration<GroupConfigurationRevision>;
2626
pub type GroupConfigurationsByFieldId = HashMap<String, Vec<Arc<GroupConfigurationRevision>>>;
2727

28-
#[derive(Debug, Clone, Serialize, Deserialize, Default, Eq, PartialEq)]
28+
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
2929
#[serde(transparent)]
3030
pub struct Configuration<T>
3131
where
32-
T: Debug + Clone + Default + Eq + PartialEq + serde::Serialize + serde::de::DeserializeOwned + 'static,
32+
T: Debug + Clone + Default + serde::Serialize + serde::de::DeserializeOwned + 'static,
3333
{
3434
/// Key: field_id
3535
/// Value: this value contains key/value.
@@ -41,7 +41,7 @@ where
4141

4242
impl<T> Configuration<T>
4343
where
44-
T: Debug + Clone + Default + Eq + PartialEq + serde::Serialize + serde::de::DeserializeOwned + 'static,
44+
T: Debug + Clone + Default + serde::Serialize + serde::de::DeserializeOwned + 'static,
4545
{
4646
pub fn get_mut_objects(&mut self, field_id: &str, field_type: &FieldTypeRevision) -> Option<&mut Vec<Arc<T>>> {
4747
let value = self
@@ -93,19 +93,19 @@ where
9393
}
9494
}
9595

96-
#[derive(Debug, Clone, Serialize, Deserialize, Default, Eq, PartialEq)]
96+
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
9797
#[serde(transparent)]
9898
pub struct ObjectIndexMap<T>
9999
where
100-
T: Debug + Clone + Default + Eq + PartialEq + serde::Serialize + serde::de::DeserializeOwned + 'static,
100+
T: Debug + Clone + Default + serde::Serialize + serde::de::DeserializeOwned + 'static,
101101
{
102102
#[serde(with = "indexmap::serde_seq")]
103103
pub object_by_field_type: IndexMap<FieldTypeRevision, Vec<Arc<T>>>,
104104
}
105105

106106
impl<T> ObjectIndexMap<T>
107107
where
108-
T: Debug + Clone + Default + Eq + PartialEq + serde::Serialize + serde::de::DeserializeOwned + 'static,
108+
T: Debug + Clone + Default + serde::Serialize + serde::de::DeserializeOwned + 'static,
109109
{
110110
pub fn new() -> Self {
111111
ObjectIndexMap::default()
@@ -114,7 +114,7 @@ where
114114

115115
impl<T> std::ops::Deref for ObjectIndexMap<T>
116116
where
117-
T: Debug + Clone + Default + Eq + PartialEq + serde::Serialize + serde::de::DeserializeOwned + 'static,
117+
T: Debug + Clone + Default + serde::Serialize + serde::de::DeserializeOwned + 'static,
118118
{
119119
type Target = IndexMap<FieldTypeRevision, Vec<Arc<T>>>;
120120

@@ -125,7 +125,7 @@ where
125125

126126
impl<T> std::ops::DerefMut for ObjectIndexMap<T>
127127
where
128-
T: Debug + Clone + Default + Eq + PartialEq + serde::Serialize + serde::de::DeserializeOwned + 'static,
128+
T: Debug + Clone + Default + serde::Serialize + serde::de::DeserializeOwned + 'static,
129129
{
130130
fn deref_mut(&mut self) -> &mut Self::Target {
131131
&mut self.object_by_field_type

0 commit comments

Comments
 (0)