use collab::core::collab_state::SyncState; use collab_database::rows::RowId; use collab_database::views::DatabaseLayout; use flowy_derive::{ProtoBuf, ProtoBuf_Enum}; use flowy_error::{ErrorCode, FlowyError}; use lib_infra::validator_fn::required_not_empty_str; use validator::Validate; use crate::entities::parser::NotEmptyStr; use crate::entities::{DatabaseLayoutPB, FieldIdPB, RowMetaPB}; use crate::services::database::CreateDatabaseViewParams; /// [DatabasePB] describes how many fields and blocks the grid has #[derive(Debug, Clone, Default, ProtoBuf)] pub struct DatabasePB { #[pb(index = 1)] pub id: String, #[pb(index = 2)] pub fields: Vec, #[pb(index = 3)] pub rows: Vec, #[pb(index = 4)] pub layout_type: DatabaseLayoutPB, #[pb(index = 5)] pub is_linked: bool, } #[derive(ProtoBuf, Default)] pub struct CreateDatabaseViewPayloadPB { #[pb(index = 1)] pub name: String, #[pb(index = 2)] pub view_id: String, #[pb(index = 3)] pub layout_type: DatabaseLayoutPB, } impl TryInto for CreateDatabaseViewPayloadPB { type Error = FlowyError; fn try_into(self) -> Result { let view_id = NotEmptyStr::parse(self.view_id).map_err(|_| ErrorCode::DatabaseViewIdIsEmpty)?; Ok(CreateDatabaseViewParams { name: self.name, view_id: view_id.0, layout_type: self.layout_type.into(), }) } } #[derive(Clone, ProtoBuf, Default, Debug)] pub struct DatabaseIdPB { #[pb(index = 1)] pub value: String, } impl AsRef for DatabaseIdPB { fn as_ref(&self) -> &str { &self.value } } #[derive(Clone, ProtoBuf, Default, Debug)] pub struct RepeatedDatabaseIdPB { #[pb(index = 1)] pub value: Vec, } #[derive(Clone, ProtoBuf, Default, Debug, Validate)] pub struct DatabaseViewIdPB { #[pb(index = 1)] #[validate(custom(function = "required_not_empty_str"))] pub value: String, } impl AsRef for DatabaseViewIdPB { fn as_ref(&self) -> &str { &self.value } } #[derive(Debug, Clone, Default, ProtoBuf)] pub struct MoveFieldPayloadPB { #[pb(index = 1)] pub view_id: String, #[pb(index = 2)] pub from_field_id: String, #[pb(index = 3)] pub to_field_id: String, } #[derive(Clone)] pub struct MoveFieldParams { pub view_id: String, pub from_field_id: String, pub to_field_id: String, } impl TryInto for MoveFieldPayloadPB { type Error = ErrorCode; fn try_into(self) -> Result { let view_id = NotEmptyStr::parse(self.view_id).map_err(|_| ErrorCode::DatabaseViewIdIsEmpty)?; let from_field_id = NotEmptyStr::parse(self.from_field_id).map_err(|_| ErrorCode::InvalidParams)?; let to_field_id = NotEmptyStr::parse(self.to_field_id).map_err(|_| ErrorCode::InvalidParams)?; Ok(MoveFieldParams { view_id: view_id.0, from_field_id: from_field_id.0, to_field_id: to_field_id.0, }) } } #[derive(Debug, Clone, Default, ProtoBuf)] pub struct MoveRowPayloadPB { #[pb(index = 1)] pub view_id: String, #[pb(index = 2)] pub from_row_id: String, #[pb(index = 3)] pub to_row_id: String, } pub struct MoveRowParams { pub view_id: String, pub from_row_id: RowId, pub to_row_id: RowId, } impl TryInto for MoveRowPayloadPB { type Error = ErrorCode; fn try_into(self) -> Result { let view_id = NotEmptyStr::parse(self.view_id).map_err(|_| ErrorCode::DatabaseViewIdIsEmpty)?; let from_row_id = NotEmptyStr::parse(self.from_row_id).map_err(|_| ErrorCode::RowIdIsEmpty)?; let to_row_id = NotEmptyStr::parse(self.to_row_id).map_err(|_| ErrorCode::RowIdIsEmpty)?; Ok(MoveRowParams { view_id: view_id.0, from_row_id: RowId::from(from_row_id.0), to_row_id: RowId::from(to_row_id.0), }) } } #[derive(Debug, Clone, Default, ProtoBuf)] pub struct MoveGroupRowPayloadPB { #[pb(index = 1)] pub view_id: String, #[pb(index = 2)] pub from_row_id: String, #[pb(index = 3)] pub to_group_id: String, #[pb(index = 4, one_of)] pub to_row_id: Option, #[pb(index = 5)] pub from_group_id: String, } pub struct MoveGroupRowParams { pub view_id: String, pub from_row_id: RowId, pub from_group_id: String, pub to_group_id: String, pub to_row_id: Option, } impl TryInto for MoveGroupRowPayloadPB { type Error = ErrorCode; fn try_into(self) -> Result { let view_id = NotEmptyStr::parse(self.view_id).map_err(|_| ErrorCode::DatabaseViewIdIsEmpty)?; let from_group_id = NotEmptyStr::parse(self.from_group_id).map_err(|_| ErrorCode::GroupIdIsEmpty)?; let to_group_id = NotEmptyStr::parse(self.to_group_id).map_err(|_| ErrorCode::GroupIdIsEmpty)?; Ok(MoveGroupRowParams { view_id: view_id.0, to_group_id: to_group_id.0, from_group_id: from_group_id.0, from_row_id: RowId::from(self.from_row_id), to_row_id: self.to_row_id.map(RowId::from), }) } } #[derive(Debug, Default, ProtoBuf)] pub struct DatabaseMetaPB { #[pb(index = 1)] pub database_id: String, #[pb(index = 2)] pub inline_view_id: String, } #[derive(Debug, Default, ProtoBuf)] pub struct RepeatedDatabaseDescriptionPB { #[pb(index = 1)] pub items: Vec, } #[derive(Debug, Clone, Default, ProtoBuf)] pub struct DatabaseGroupIdPB { #[pb(index = 1)] pub view_id: String, #[pb(index = 2)] pub group_id: String, } pub struct DatabaseGroupIdParams { pub view_id: String, pub group_id: String, } impl TryInto for DatabaseGroupIdPB { type Error = ErrorCode; fn try_into(self) -> Result { let view_id = NotEmptyStr::parse(self.view_id).map_err(|_| ErrorCode::DatabaseViewIdIsEmpty)?; let group_id = NotEmptyStr::parse(self.group_id).map_err(|_| ErrorCode::GroupIdIsEmpty)?; Ok(DatabaseGroupIdParams { view_id: view_id.0, group_id: group_id.0, }) } } #[derive(Clone, ProtoBuf, Default, Debug)] pub struct DatabaseLayoutMetaPB { #[pb(index = 1)] pub view_id: String, #[pb(index = 2)] pub layout: DatabaseLayoutPB, } #[derive(Clone, Debug)] pub struct DatabaseLayoutMeta { pub view_id: String, pub layout: DatabaseLayout, } impl TryInto for DatabaseLayoutMetaPB { type Error = ErrorCode; fn try_into(self) -> Result { let view_id = NotEmptyStr::parse(self.view_id).map_err(|_| ErrorCode::DatabaseViewIdIsEmpty)?; let layout = self.layout.into(); Ok(DatabaseLayoutMeta { view_id: view_id.0, layout, }) } } #[derive(Debug, Default, ProtoBuf)] pub struct DatabaseSyncStatePB { #[pb(index = 1)] pub value: DatabaseSyncState, } #[derive(Debug, Default, ProtoBuf_Enum, PartialEq, Eq, Clone, Copy)] pub enum DatabaseSyncState { #[default] InitSyncBegin = 0, InitSyncEnd = 1, Syncing = 2, SyncFinished = 3, } impl From for DatabaseSyncStatePB { fn from(value: SyncState) -> Self { let value = match value { SyncState::InitSyncBegin => DatabaseSyncState::InitSyncBegin, SyncState::InitSyncEnd => DatabaseSyncState::InitSyncEnd, SyncState::Syncing => DatabaseSyncState::Syncing, SyncState::SyncFinished => DatabaseSyncState::SyncFinished, }; Self { value } } } #[derive(Debug, Default, ProtoBuf)] pub struct DatabaseSnapshotStatePB { #[pb(index = 1)] pub new_snapshot_id: i64, } #[derive(Debug, Default, ProtoBuf)] pub struct RepeatedDatabaseSnapshotPB { #[pb(index = 1)] pub items: Vec, } #[derive(Debug, Default, ProtoBuf)] pub struct DatabaseSnapshotPB { #[pb(index = 1)] pub snapshot_id: i64, #[pb(index = 2)] pub snapshot_desc: String, #[pb(index = 3)] pub created_at: i64, #[pb(index = 4)] pub data: Vec, } #[derive(Debug, Clone, Default, ProtoBuf)] pub struct RemoveCoverPayloadPB { #[pb(index = 1)] pub view_id: String, #[pb(index = 2)] pub row_id: String, } pub struct RemoveCoverParams { pub view_id: String, pub row_id: RowId, } impl TryInto for RemoveCoverPayloadPB { type Error = ErrorCode; fn try_into(self) -> Result { let view_id = NotEmptyStr::parse(self.view_id).map_err(|_| ErrorCode::DatabaseViewIdIsEmpty)?; let row_id = NotEmptyStr::parse(self.row_id).map_err(|_| ErrorCode::RowIdIsEmpty)?; Ok(RemoveCoverParams { view_id: view_id.0, row_id: RowId::from(row_id.0), }) } }