|
@@ -1,9 +1,10 @@
|
|
use crate::entities::parser::NotEmptyStr;
|
|
use crate::entities::parser::NotEmptyStr;
|
|
use crate::entities::{
|
|
use crate::entities::{
|
|
- CheckboxFilterCondition, DateFilterCondition, FieldType, NumberFilterCondition, SelectOptionCondition,
|
|
|
|
- TextFilterCondition,
|
|
|
|
|
|
+ CheckboxFilterPB, DateFilterContent, DateFilterPB, FieldType, NumberFilterPB, SelectOptionFilterPB, TextFilterPB,
|
|
};
|
|
};
|
|
|
|
+use crate::services::field::SelectOptionIds;
|
|
use crate::services::filter::FilterType;
|
|
use crate::services::filter::FilterType;
|
|
|
|
+use bytes::Bytes;
|
|
use flowy_derive::ProtoBuf;
|
|
use flowy_derive::ProtoBuf;
|
|
use flowy_error::ErrorCode;
|
|
use flowy_error::ErrorCode;
|
|
use grid_rev_model::{FieldRevision, FieldTypeRevision, FilterRevision};
|
|
use grid_rev_model::{FieldRevision, FieldTypeRevision, FilterRevision};
|
|
@@ -14,29 +15,49 @@ use std::sync::Arc;
|
|
pub struct FilterPB {
|
|
pub struct FilterPB {
|
|
#[pb(index = 1)]
|
|
#[pb(index = 1)]
|
|
pub id: String,
|
|
pub id: String,
|
|
-}
|
|
|
|
|
|
|
|
-#[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)]
|
|
|
|
-pub struct RepeatedGridFilterConfigurationPB {
|
|
|
|
- #[pb(index = 1)]
|
|
|
|
- pub items: Vec<FilterPB>,
|
|
|
|
|
|
+ #[pb(index = 2)]
|
|
|
|
+ pub ty: FieldType,
|
|
|
|
+
|
|
|
|
+ #[pb(index = 3)]
|
|
|
|
+ pub data: Vec<u8>,
|
|
}
|
|
}
|
|
|
|
|
|
impl std::convert::From<&FilterRevision> for FilterPB {
|
|
impl std::convert::From<&FilterRevision> for FilterPB {
|
|
fn from(rev: &FilterRevision) -> Self {
|
|
fn from(rev: &FilterRevision) -> Self {
|
|
- Self { id: rev.id.clone() }
|
|
|
|
|
|
+ let field_type: FieldType = rev.field_type_rev.into();
|
|
|
|
+ let bytes: Bytes = match field_type {
|
|
|
|
+ FieldType::RichText => TextFilterPB::from(rev).try_into().unwrap(),
|
|
|
|
+ FieldType::Number => NumberFilterPB::from(rev).try_into().unwrap(),
|
|
|
|
+ FieldType::DateTime => DateFilterPB::from(rev).try_into().unwrap(),
|
|
|
|
+ FieldType::SingleSelect => SelectOptionFilterPB::from(rev).try_into().unwrap(),
|
|
|
|
+ FieldType::MultiSelect => SelectOptionFilterPB::from(rev).try_into().unwrap(),
|
|
|
|
+ FieldType::Checkbox => CheckboxFilterPB::from(rev).try_into().unwrap(),
|
|
|
|
+ FieldType::URL => TextFilterPB::from(rev).try_into().unwrap(),
|
|
|
|
+ };
|
|
|
|
+ Self {
|
|
|
|
+ id: rev.id.clone(),
|
|
|
|
+ ty: rev.field_type_rev.into(),
|
|
|
|
+ data: bytes.to_vec(),
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-impl std::convert::From<Vec<Arc<FilterRevision>>> for RepeatedGridFilterConfigurationPB {
|
|
|
|
|
|
+#[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)]
|
|
|
|
+pub struct RepeatedFilterPB {
|
|
|
|
+ #[pb(index = 1)]
|
|
|
|
+ pub items: Vec<FilterPB>,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+impl std::convert::From<Vec<Arc<FilterRevision>>> for RepeatedFilterPB {
|
|
fn from(revs: Vec<Arc<FilterRevision>>) -> Self {
|
|
fn from(revs: Vec<Arc<FilterRevision>>) -> Self {
|
|
- RepeatedGridFilterConfigurationPB {
|
|
|
|
|
|
+ RepeatedFilterPB {
|
|
items: revs.into_iter().map(|rev| rev.as_ref().into()).collect(),
|
|
items: revs.into_iter().map(|rev| rev.as_ref().into()).collect(),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-impl std::convert::From<Vec<FilterPB>> for RepeatedGridFilterConfigurationPB {
|
|
|
|
|
|
+impl std::convert::From<Vec<FilterPB>> for RepeatedFilterPB {
|
|
fn from(items: Vec<FilterPB>) -> Self {
|
|
fn from(items: Vec<FilterPB>) -> Self {
|
|
Self { items }
|
|
Self { items }
|
|
}
|
|
}
|
|
@@ -89,20 +110,17 @@ pub struct CreateFilterPayloadPB {
|
|
pub field_type: FieldType,
|
|
pub field_type: FieldType,
|
|
|
|
|
|
#[pb(index = 3)]
|
|
#[pb(index = 3)]
|
|
- pub condition: u32,
|
|
|
|
-
|
|
|
|
- #[pb(index = 4)]
|
|
|
|
- pub content: String,
|
|
|
|
|
|
+ pub data: Vec<u8>,
|
|
}
|
|
}
|
|
|
|
|
|
impl CreateFilterPayloadPB {
|
|
impl CreateFilterPayloadPB {
|
|
#[allow(dead_code)]
|
|
#[allow(dead_code)]
|
|
- pub fn new<T: Into<u32>>(field_rev: &FieldRevision, condition: T, content: String) -> Self {
|
|
|
|
|
|
+ pub fn new<T: TryInto<Bytes, Error = ::protobuf::ProtobufError>>(field_rev: &FieldRevision, data: T) -> Self {
|
|
|
|
+ let data = data.try_into().unwrap_or_else(|_| Bytes::new());
|
|
Self {
|
|
Self {
|
|
field_id: field_rev.id.clone(),
|
|
field_id: field_rev.id.clone(),
|
|
field_type: field_rev.ty.into(),
|
|
field_type: field_rev.ty.into(),
|
|
- condition: condition.into(),
|
|
|
|
- content,
|
|
|
|
|
|
+ data: data.to_vec(),
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -114,22 +132,39 @@ impl TryInto<CreateFilterParams> for CreateFilterPayloadPB {
|
|
let field_id = NotEmptyStr::parse(self.field_id)
|
|
let field_id = NotEmptyStr::parse(self.field_id)
|
|
.map_err(|_| ErrorCode::FieldIdIsEmpty)?
|
|
.map_err(|_| ErrorCode::FieldIdIsEmpty)?
|
|
.0;
|
|
.0;
|
|
- let condition = self.condition as u8;
|
|
|
|
|
|
+ let condition;
|
|
|
|
+ let mut content = "".to_string();
|
|
|
|
+ let bytes: &[u8] = self.data.as_ref();
|
|
|
|
+
|
|
match self.field_type {
|
|
match self.field_type {
|
|
FieldType::RichText | FieldType::URL => {
|
|
FieldType::RichText | FieldType::URL => {
|
|
- let _ = TextFilterCondition::try_from(condition)?;
|
|
|
|
|
|
+ let filter = TextFilterPB::try_from(bytes).map_err(|_| ErrorCode::ProtobufSerde)?;
|
|
|
|
+ condition = filter.condition as u8;
|
|
|
|
+ content = filter.content;
|
|
}
|
|
}
|
|
FieldType::Checkbox => {
|
|
FieldType::Checkbox => {
|
|
- let _ = CheckboxFilterCondition::try_from(condition)?;
|
|
|
|
|
|
+ let filter = CheckboxFilterPB::try_from(bytes).map_err(|_| ErrorCode::ProtobufSerde)?;
|
|
|
|
+ condition = filter.condition as u8;
|
|
}
|
|
}
|
|
FieldType::Number => {
|
|
FieldType::Number => {
|
|
- let _ = NumberFilterCondition::try_from(condition)?;
|
|
|
|
|
|
+ let filter = NumberFilterPB::try_from(bytes).map_err(|_| ErrorCode::ProtobufSerde)?;
|
|
|
|
+ condition = filter.condition as u8;
|
|
|
|
+ content = filter.content;
|
|
}
|
|
}
|
|
FieldType::DateTime => {
|
|
FieldType::DateTime => {
|
|
- let _ = DateFilterCondition::try_from(condition)?;
|
|
|
|
|
|
+ let filter = DateFilterPB::try_from(bytes).map_err(|_| ErrorCode::ProtobufSerde)?;
|
|
|
|
+ condition = filter.condition as u8;
|
|
|
|
+ content = DateFilterContent {
|
|
|
|
+ start: filter.start,
|
|
|
|
+ end: filter.end,
|
|
|
|
+ timestamp: filter.timestamp,
|
|
|
|
+ }
|
|
|
|
+ .to_string();
|
|
}
|
|
}
|
|
FieldType::SingleSelect | FieldType::MultiSelect => {
|
|
FieldType::SingleSelect | FieldType::MultiSelect => {
|
|
- let _ = SelectOptionCondition::try_from(condition)?;
|
|
|
|
|
|
+ let filter = SelectOptionFilterPB::try_from(bytes).map_err(|_| ErrorCode::ProtobufSerde)?;
|
|
|
|
+ condition = filter.condition as u8;
|
|
|
|
+ content = SelectOptionIds::from(filter.option_ids).to_string();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -137,7 +172,7 @@ impl TryInto<CreateFilterParams> for CreateFilterPayloadPB {
|
|
field_id,
|
|
field_id,
|
|
field_type_rev: self.field_type.into(),
|
|
field_type_rev: self.field_type.into(),
|
|
condition,
|
|
condition,
|
|
- content: self.content,
|
|
|
|
|
|
+ content,
|
|
})
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|