docs/update database documentation (#1824)

* chore: update event name

* chore: add events and notifications documentation & remove unused code
This commit is contained in:
Nathan.fooo 2023-02-08 10:40:40 +08:00 committed by GitHub
parent 781f0ab88b
commit e157c19174
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
56 changed files with 253 additions and 411 deletions

View File

@ -8,7 +8,7 @@ import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/protobuf/flowy-database/group.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database/group_changeset.pb.dart';
typedef GroupUpdateValue = Either<GroupViewChangesetPB, FlowyError>;
typedef GroupUpdateValue = Either<GroupChangesetPB, FlowyError>;
typedef GroupByNewFieldValue = Either<List<GroupPB>, FlowyError>;
class BoardListener {
@ -36,17 +36,17 @@ class BoardListener {
Either<Uint8List, FlowyError> result,
) {
switch (ty) {
case DatabaseNotification.DidUpdateGroupView:
case DatabaseNotification.DidUpdateGroups:
result.fold(
(payload) => _groupUpdateNotifier?.value =
left(GroupViewChangesetPB.fromBuffer(payload)),
left(GroupChangesetPB.fromBuffer(payload)),
(error) => _groupUpdateNotifier?.value = right(error),
);
break;
case DatabaseNotification.DidGroupByNewField:
case DatabaseNotification.DidGroupByField:
result.fold(
(payload) => _groupByNewFieldNotifier?.value =
left(GroupViewChangesetPB.fromBuffer(payload).initialGroups),
left(GroupChangesetPB.fromBuffer(payload).initialGroups),
(error) => _groupByNewFieldNotifier?.value = right(error),
);
break;

View File

@ -31,7 +31,7 @@ class GroupListener {
Either<Uint8List, FlowyError> result,
) {
switch (ty) {
case DatabaseNotification.DidUpdateGroup:
case DatabaseNotification.DidUpdateGroupRow:
result.fold(
(payload) => _groupNotifier?.value =
left(GroupRowsNotificationPB.fromBuffer(payload)),

View File

@ -60,8 +60,8 @@ class DateCellDataPersistence implements GridCellDataPersistence<CalendarData> {
}
}
CellPathPB _makeCellPath(GridCellIdentifier cellId) {
return CellPathPB.create()
CellIdPB _makeCellPath(GridCellIdentifier cellId) {
return CellIdPB.create()
..databaseId = cellId.databaseId
..fieldId = cellId.fieldId
..rowId = cellId.rowId;

View File

@ -45,7 +45,7 @@ class CellService {
Future<Either<CellPB, FlowyError>> getCell({
required GridCellIdentifier cellId,
}) {
final payload = CellPathPB.create()
final payload = CellIdPB.create()
..databaseId = cellId.databaseId
..fieldId = cellId.fieldId
..rowId = cellId.rowId;

View File

@ -22,7 +22,7 @@ class SelectOptionFFIService {
(result) {
return result.fold(
(option) {
final cellIdentifier = CellPathPB.create()
final cellIdentifier = CellIdPB.create()
..databaseId = databaseId
..fieldId = fieldId
..rowId = rowId;
@ -61,7 +61,7 @@ class SelectOptionFFIService {
}
Future<Either<SelectOptionCellDataPB, FlowyError>> getOptionContext() {
final payload = CellPathPB.create()
final payload = CellIdPB.create()
..databaseId = databaseId
..fieldId = fieldId
..rowId = rowId;
@ -85,8 +85,8 @@ class SelectOptionFFIService {
return DatabaseEventUpdateSelectOptionCell(payload).send();
}
CellPathPB _cellIdentifier() {
return CellPathPB.create()
CellIdPB _cellIdentifier() {
return CellIdPB.create()
..databaseId = databaseId
..fieldId = fieldId
..rowId = rowId;

View File

@ -97,7 +97,7 @@ class FieldService {
..databaseId = databaseId
..fieldId = fieldId
..fieldType = fieldType;
return DatabaseEventGetFieldTypeOption(payload).send().then((result) {
return DatabaseEventGetTypeOption(payload).send().then((result) {
return result.fold(
(data) => left(data),
(err) => right(err),

View File

@ -27,7 +27,7 @@ class DatabaseFieldsListener {
void _handler(DatabaseNotification ty, Either<Uint8List, FlowyError> result) {
switch (ty) {
case DatabaseNotification.DidUpdateDatabaseFields:
case DatabaseNotification.DidUpdateFields:
result.fold(
(payload) => updateFieldsNotifier?.value =
left(DatabaseFieldChangesetPB.fromBuffer(payload)),

View File

@ -160,12 +160,12 @@ abstract class IFieldTypeOptionLoader {
Future<Either<Unit, FlowyError>> switchToField(
String fieldId, FieldType fieldType) {
final payload = EditFieldChangesetPB.create()
final payload = UpdateFieldTypePayloadPB.create()
..databaseId = databaseId
..fieldId = fieldId
..fieldType = fieldType;
return DatabaseEventSwitchToField(payload).send();
return DatabaseEventUpdateFieldType(payload).send();
}
}
@ -189,13 +189,13 @@ class NewFieldTypeOptionLoader extends IFieldTypeOptionLoader {
..fieldId = fieldTypeOption!.field_2.id
..fieldType = fieldTypeOption!.field_2.fieldType;
return DatabaseEventGetFieldTypeOption(payload).send();
return DatabaseEventGetTypeOption(payload).send();
} else {
final payload = CreateFieldPayloadPB.create()
..databaseId = databaseId
..fieldType = FieldType.RichText;
return DatabaseEventCreateFieldTypeOption(payload).send().then((result) {
return DatabaseEventCreateTypeOption(payload).send().then((result) {
return result.fold(
(newFieldTypeOption) {
fieldTypeOption = newFieldTypeOption;
@ -226,6 +226,6 @@ class FieldTypeOptionLoader extends IFieldTypeOptionLoader {
..fieldId = field.id
..fieldType = field.fieldType;
return DatabaseEventGetFieldTypeOption(payload).send();
return DatabaseEventGetTypeOption(payload).send();
}
}

View File

@ -21,6 +21,6 @@ class TypeOptionFFIService {
..databaseId = databaseId
..fieldId = fieldId;
return DatabaseEventNewSelectOption(payload).send();
return DatabaseEventCreateSelectOption(payload).send();
}
}

View File

@ -21,9 +21,9 @@ class DatabaseFFIService {
}
Future<Either<RowPB, FlowyError>> createRow({Option<String>? startRowId}) {
var payload = CreateTableRowPayloadPB.create()..databaseId = databaseId;
var payload = CreateRowPayloadPB.create()..databaseId = databaseId;
startRowId?.fold(() => null, (id) => payload.startRowId = id);
return DatabaseEventCreateTableRow(payload).send();
return DatabaseEventCreateRow(payload).send();
}
Future<Either<RowPB, FlowyError>> createBoardCard(

View File

@ -1,46 +0,0 @@
import 'package:app_flowy/core/grid_notification.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database/notification.pb.dart';
import 'package:flowy_infra/notifier.dart';
import 'dart:async';
import 'dart:typed_data';
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/protobuf/flowy-database/field_entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-database/row_entities.pb.dart';
typedef UpdateRowNotifiedValue = Either<RowPB, FlowyError>;
typedef UpdateFieldNotifiedValue = Either<List<FieldPB>, FlowyError>;
class RowListener {
final String rowId;
PublishNotifier<UpdateRowNotifiedValue>? updateRowNotifier =
PublishNotifier();
DatabaseNotificationListener? _listener;
RowListener({required this.rowId});
void start() {
_listener =
DatabaseNotificationListener(objectId: rowId, handler: _handler);
}
void _handler(DatabaseNotification ty, Either<Uint8List, FlowyError> result) {
switch (ty) {
case DatabaseNotification.DidUpdateRow:
result.fold(
(payload) =>
updateRowNotifier?.value = left(RowPB.fromBuffer(payload)),
(error) => updateRowNotifier?.value = right(error),
);
break;
default:
break;
}
}
Future<void> stop() async {
await _listener?.stop();
updateRowNotifier?.dispose();
updateRowNotifier = null;
}
}

View File

@ -13,11 +13,11 @@ class RowFFIService {
});
Future<Either<RowPB, FlowyError>> createRow(String rowId) {
final payload = CreateTableRowPayloadPB.create()
final payload = CreateRowPayloadPB.create()
..databaseId = databaseId
..startRowId = rowId;
return DatabaseEventCreateTableRow(payload).send();
return DatabaseEventCreateRow(payload).send();
}
Future<Either<OptionalRowPB, FlowyError>> getRow(String rowId) {

View File

@ -27,7 +27,7 @@ class DatabaseSettingListener {
void _handler(DatabaseNotification ty, Either<Uint8List, FlowyError> result) {
switch (ty) {
case DatabaseNotification.DidUpdateDatabaseSetting:
case DatabaseNotification.DidUpdateSettings:
result.fold(
(payload) => _updateSettingNotifier?.value = left(
DatabaseViewSettingPB.fromBuffer(payload),

View File

@ -53,14 +53,14 @@ class GridViewListener {
void _handler(DatabaseNotification ty, Either<Uint8List, FlowyError> result) {
switch (ty) {
case DatabaseNotification.DidUpdateDatabaseViewRowsVisibility:
case DatabaseNotification.DidUpdateViewRowsVisibility:
result.fold(
(payload) => _rowsVisibility?.value =
left(ViewRowsVisibilityChangesetPB.fromBuffer(payload)),
(error) => _rowsVisibility?.value = right(error),
);
break;
case DatabaseNotification.DidUpdateDatabaseViewRows:
case DatabaseNotification.DidUpdateViewRows:
result.fold(
(payload) => _rowsNotifier?.value =
left(ViewRowsChangesetPB.fromBuffer(payload)),

View File

@ -29,7 +29,7 @@ class TrashListener {
Either<Uint8List, FlowyError> result,
) {
switch (ty) {
case FolderNotification.TrashUpdated:
case FolderNotification.DidUpdateTrash:
if (_trashUpdated != null) {
result.fold(
(payload) {

View File

@ -2,7 +2,6 @@ import 'dart:async';
import 'package:app_flowy/core/folder_notification.dart';
import 'package:app_flowy/core/user_notification.dart';
import 'package:dartz/dartz.dart';
import 'package:appflowy_backend/protobuf/flowy-error/code.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-folder/workspace.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
import 'dart:typed_data';
@ -122,29 +121,21 @@ class UserWorkspaceListener {
void _handleObservableType(
FolderNotification ty, Either<Uint8List, FlowyError> result) {
switch (ty) {
case FolderNotification.UserCreateWorkspace:
case FolderNotification.UserDeleteWorkspace:
case FolderNotification.WorkspaceListUpdated:
case FolderNotification.DidCreateWorkspace:
case FolderNotification.DidDeleteWorkspace:
result.fold(
(payload) => _workspacesChangedNotifier?.value =
left(RepeatedWorkspacePB.fromBuffer(payload).items),
(error) => _workspacesChangedNotifier?.value = right(error),
);
break;
case FolderNotification.WorkspaceSetting:
case FolderNotification.DidUpdateWorkspaceSetting:
result.fold(
(payload) => _settingChangedNotifier?.value =
left(WorkspaceSettingPB.fromBuffer(payload)),
(error) => _settingChangedNotifier?.value = right(error),
);
break;
case FolderNotification.UserUnauthorized:
result.fold(
(_) {},
(error) => _authNotifier?.value = right(
FlowyError.create()..code = ErrorCode.UserUnauthorized.value),
);
break;
default:
break;
}

View File

@ -34,7 +34,7 @@ class AppListener {
void _handleCallback(
FolderNotification ty, Either<Uint8List, FlowyError> result) {
switch (ty) {
case FolderNotification.AppUpdated:
case FolderNotification.DidUpdateApp:
if (_updated != null) {
result.fold(
(payload) {

View File

@ -75,28 +75,28 @@ class ViewListener {
void _handleObservableType(
FolderNotification ty, Either<Uint8List, FlowyError> result) {
switch (ty) {
case FolderNotification.ViewUpdated:
case FolderNotification.DidUpdateView:
result.fold(
(payload) =>
_updatedViewNotifier.value = left(ViewPB.fromBuffer(payload)),
(error) => _updatedViewNotifier.value = right(error),
);
break;
case FolderNotification.ViewDeleted:
case FolderNotification.DidDeleteView:
result.fold(
(payload) =>
_deletedNotifier.value = left(ViewPB.fromBuffer(payload)),
(error) => _deletedNotifier.value = right(error),
);
break;
case FolderNotification.ViewRestored:
case FolderNotification.DidRestoreView:
result.fold(
(payload) =>
_restoredNotifier.value = left(ViewPB.fromBuffer(payload)),
(error) => _restoredNotifier.value = right(error),
);
break;
case FolderNotification.ViewMoveToTrash:
case FolderNotification.DidMoveViewToTrash:
result.fold(
(payload) => _moveToTrashNotifier.value =
left(DeletedViewPB.fromBuffer(payload)),

View File

@ -48,14 +48,14 @@ class WorkspaceListener {
void _handleObservableType(
FolderNotification ty, Either<Uint8List, FlowyError> result) {
switch (ty) {
case FolderNotification.WorkspaceUpdated:
case FolderNotification.DidUpdateWorkspace:
result.fold(
(payload) => _workspaceUpdatedNotifier?.value =
left(WorkspacePB.fromBuffer(payload)),
(error) => _workspaceUpdatedNotifier?.value = right(error),
);
break;
case FolderNotification.WorkspaceAppsChanged:
case FolderNotification.DidUpdateWorkspaceApps:
result.fold(
(payload) => _appsChangedNotifier?.value =
left(RepeatedAppPB.fromBuffer(payload).items),

View File

@ -2,7 +2,7 @@ use bytes::Bytes;
use flowy_sqlite::ConnectionPool;
use flowy_client_ws::FlowyWebSocketConnect;
use flowy_database::entities::DatabaseViewLayout;
use flowy_database::entities::LayoutTypePB;
use flowy_database::manager::{make_database_view_data, DatabaseManager};
use flowy_database::util::{make_default_board, make_default_calendar, make_default_grid};
use flowy_document::DocumentManager;
@ -261,9 +261,9 @@ impl ViewDataProcessor for GridViewDataProcessor {
) -> FutureResult<Bytes, FlowyError> {
debug_assert_eq!(data_format, ViewDataFormatPB::DatabaseFormat);
let (build_context, layout) = match layout {
ViewLayoutTypePB::Grid => (make_default_grid(), DatabaseViewLayout::Grid),
ViewLayoutTypePB::Board => (make_default_board(), DatabaseViewLayout::Board),
ViewLayoutTypePB::Calendar => (make_default_calendar(), DatabaseViewLayout::Calendar),
ViewLayoutTypePB::Grid => (make_default_grid(), LayoutTypePB::Grid),
ViewLayoutTypePB::Board => (make_default_board(), LayoutTypePB::Board),
ViewLayoutTypePB::Calendar => (make_default_calendar(), LayoutTypePB::Calendar),
ViewLayoutTypePB::Document => {
return FutureResult::new(async move {
Err(FlowyError::internal().context(format!("Can't handle {:?} layout type", layout)))
@ -291,9 +291,9 @@ impl ViewDataProcessor for GridViewDataProcessor {
let grid_manager = self.0.clone();
let layout = match layout {
ViewLayoutTypePB::Grid => DatabaseViewLayout::Grid,
ViewLayoutTypePB::Board => DatabaseViewLayout::Board,
ViewLayoutTypePB::Calendar => DatabaseViewLayout::Calendar,
ViewLayoutTypePB::Grid => LayoutTypePB::Grid,
ViewLayoutTypePB::Board => LayoutTypePB::Board,
ViewLayoutTypePB::Calendar => LayoutTypePB::Calendar,
ViewLayoutTypePB::Document => {
return FutureResult::new(async move {
Err(FlowyError::internal().context(format!("Can't handle {:?} layout type", layout)))

View File

@ -39,7 +39,7 @@ impl TryInto<CreateSelectOptionParams> for CreateSelectOptionPayloadPB {
}
#[derive(Debug, Clone, Default, ProtoBuf)]
pub struct CellPathPB {
pub struct CellIdPB {
#[pb(index = 1)]
pub database_id: String,
@ -52,20 +52,20 @@ pub struct CellPathPB {
/// Represents as the cell identifier. It's used to locate the cell in corresponding
/// view's row with the field id.
pub struct CellPathParams {
pub struct CellIdParams {
pub database_id: String,
pub field_id: String,
pub row_id: String,
}
impl TryInto<CellPathParams> for CellPathPB {
impl TryInto<CellIdParams> for CellIdPB {
type Error = ErrorCode;
fn try_into(self) -> Result<CellPathParams, Self::Error> {
fn try_into(self) -> Result<CellIdParams, Self::Error> {
let database_id = NotEmptyStr::parse(self.database_id).map_err(|_| ErrorCode::DatabaseIdIsEmpty)?;
let field_id = NotEmptyStr::parse(self.field_id).map_err(|_| ErrorCode::FieldIdIsEmpty)?;
let row_id = NotEmptyStr::parse(self.row_id).map_err(|_| ErrorCode::RowIdIsEmpty)?;
Ok(CellPathParams {
Ok(CellIdParams {
database_id: database_id.0,
field_id: field_id.0,
row_id: row_id.0,

View File

@ -178,7 +178,7 @@ impl TryInto<CreateFieldParams> for CreateFieldPayloadPB {
}
#[derive(Debug, Default, ProtoBuf)]
pub struct EditFieldChangesetPB {
pub struct UpdateFieldTypePayloadPB {
#[pb(index = 1)]
pub database_id: String,
@ -198,7 +198,7 @@ pub struct EditFieldParams {
pub field_type: FieldType,
}
impl TryInto<EditFieldParams> for EditFieldChangesetPB {
impl TryInto<EditFieldParams> for UpdateFieldTypePayloadPB {
type Error = ErrorCode;
fn try_into(self) -> Result<EditFieldParams, Self::Error> {

View File

@ -1,5 +1,5 @@
use crate::entities::parser::NotEmptyStr;
use crate::entities::{CreateRowParams, DatabaseViewLayout, FieldType, RowPB};
use crate::entities::{CreateRowParams, FieldType, LayoutTypePB, RowPB};
use crate::services::group::Group;
use flowy_derive::ProtoBuf;
use flowy_error::ErrorCode;
@ -33,7 +33,7 @@ impl TryInto<CreateRowParams> for CreateBoardCardPayloadPB {
database_id: database_id.0,
start_row_id,
group_id: Some(group_id.0),
layout: DatabaseViewLayout::Board,
layout: LayoutTypePB::Board,
})
}
}

View File

@ -127,7 +127,7 @@ impl TryInto<MoveGroupParams> for MoveGroupPayloadPB {
}
#[derive(Debug, Default, ProtoBuf)]
pub struct GroupViewChangesetPB {
pub struct GroupChangesetPB {
#[pb(index = 1)]
pub view_id: String,
@ -144,7 +144,7 @@ pub struct GroupViewChangesetPB {
pub update_groups: Vec<GroupPB>,
}
impl GroupViewChangesetPB {
impl GroupChangesetPB {
pub fn is_empty(&self) -> bool {
self.initial_groups.is_empty()
&& self.inserted_groups.is_empty()

View File

@ -1,5 +1,5 @@
use crate::entities::parser::NotEmptyStr;
use crate::entities::DatabaseViewLayout;
use crate::entities::LayoutTypePB;
use flowy_derive::ProtoBuf;
use flowy_error::ErrorCode;
use grid_model::RowRevision;
@ -171,7 +171,7 @@ pub struct BlockRowIdPB {
}
#[derive(ProtoBuf, Default)]
pub struct CreateTableRowPayloadPB {
pub struct CreateRowPayloadPB {
#[pb(index = 1)]
pub database_id: String,
@ -184,10 +184,10 @@ pub struct CreateRowParams {
pub database_id: String,
pub start_row_id: Option<String>,
pub group_id: Option<String>,
pub layout: DatabaseViewLayout,
pub layout: LayoutTypePB,
}
impl TryInto<CreateRowParams> for CreateTableRowPayloadPB {
impl TryInto<CreateRowParams> for CreateRowPayloadPB {
type Error = ErrorCode;
fn try_into(self) -> Result<CreateRowParams, Self::Error> {
@ -197,7 +197,7 @@ impl TryInto<CreateRowParams> for CreateTableRowPayloadPB {
database_id: database_id.0,
start_row_id: self.start_row_id,
group_id: None,
layout: DatabaseViewLayout::Grid,
layout: LayoutTypePB::Grid,
})
}
}

View File

@ -15,10 +15,10 @@ use strum_macros::EnumIter;
#[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)]
pub struct DatabaseViewSettingPB {
#[pb(index = 1)]
pub layouts: Vec<ViewLayoutConfigPB>,
pub support_layouts: Vec<ViewLayoutPB>,
#[pb(index = 2)]
pub layout_type: DatabaseViewLayout,
pub current_layout: LayoutTypePB,
#[pb(index = 3)]
pub filters: RepeatedFilterPB,
@ -31,16 +31,16 @@ pub struct DatabaseViewSettingPB {
}
#[derive(Eq, PartialEq, ProtoBuf, Debug, Default, Clone)]
pub struct ViewLayoutConfigPB {
pub struct ViewLayoutPB {
#[pb(index = 1)]
ty: DatabaseViewLayout,
ty: LayoutTypePB,
}
impl ViewLayoutConfigPB {
pub fn all() -> Vec<ViewLayoutConfigPB> {
impl ViewLayoutPB {
pub fn all() -> Vec<ViewLayoutPB> {
let mut layouts = vec![];
for layout_ty in DatabaseViewLayout::iter() {
layouts.push(ViewLayoutConfigPB { ty: layout_ty })
for layout_ty in LayoutTypePB::iter() {
layouts.push(ViewLayoutPB { ty: layout_ty })
}
layouts
@ -49,34 +49,34 @@ impl ViewLayoutConfigPB {
#[derive(Debug, Clone, PartialEq, Eq, ProtoBuf_Enum, EnumIter)]
#[repr(u8)]
pub enum DatabaseViewLayout {
pub enum LayoutTypePB {
Grid = 0,
Board = 1,
Calendar = 2,
}
impl std::default::Default for DatabaseViewLayout {
impl std::default::Default for LayoutTypePB {
fn default() -> Self {
DatabaseViewLayout::Grid
LayoutTypePB::Grid
}
}
impl std::convert::From<LayoutRevision> for DatabaseViewLayout {
impl std::convert::From<LayoutRevision> for LayoutTypePB {
fn from(rev: LayoutRevision) -> Self {
match rev {
LayoutRevision::Grid => DatabaseViewLayout::Grid,
LayoutRevision::Board => DatabaseViewLayout::Board,
LayoutRevision::Calendar => DatabaseViewLayout::Calendar,
LayoutRevision::Grid => LayoutTypePB::Grid,
LayoutRevision::Board => LayoutTypePB::Board,
LayoutRevision::Calendar => LayoutTypePB::Calendar,
}
}
}
impl std::convert::From<DatabaseViewLayout> for LayoutRevision {
fn from(layout: DatabaseViewLayout) -> Self {
impl std::convert::From<LayoutTypePB> for LayoutRevision {
fn from(layout: LayoutTypePB) -> Self {
match layout {
DatabaseViewLayout::Grid => LayoutRevision::Grid,
DatabaseViewLayout::Board => LayoutRevision::Board,
DatabaseViewLayout::Calendar => LayoutRevision::Calendar,
LayoutTypePB::Grid => LayoutRevision::Grid,
LayoutTypePB::Board => LayoutRevision::Board,
LayoutTypePB::Calendar => LayoutRevision::Calendar,
}
}
}
@ -87,7 +87,7 @@ pub struct DatabaseSettingChangesetPB {
pub database_id: String,
#[pb(index = 2)]
pub layout_type: DatabaseViewLayout,
pub layout_type: LayoutTypePB,
#[pb(index = 3, one_of)]
pub alter_filter: Option<AlterFilterPayloadPB>,

View File

@ -160,7 +160,7 @@ pub(crate) async fn delete_field_handler(
#[tracing::instrument(level = "trace", skip(data, manager), err)]
pub(crate) async fn switch_to_field_handler(
data: AFPluginData<EditFieldChangesetPB>,
data: AFPluginData<UpdateFieldTypePayloadPB>,
manager: AFPluginState<Arc<DatabaseManager>>,
) -> Result<(), FlowyError> {
let params: EditFieldParams = data.into_inner().try_into()?;
@ -315,7 +315,7 @@ pub(crate) async fn move_row_handler(
#[tracing::instrument(level = "debug", skip(data, manager), err)]
pub(crate) async fn create_table_row_handler(
data: AFPluginData<CreateTableRowPayloadPB>,
data: AFPluginData<CreateRowPayloadPB>,
manager: AFPluginState<Arc<DatabaseManager>>,
) -> DataResult<RowPB, FlowyError> {
let params: CreateRowParams = data.into_inner().try_into()?;
@ -326,10 +326,10 @@ pub(crate) async fn create_table_row_handler(
#[tracing::instrument(level = "trace", skip_all, err)]
pub(crate) async fn get_cell_handler(
data: AFPluginData<CellPathPB>,
data: AFPluginData<CellIdPB>,
manager: AFPluginState<Arc<DatabaseManager>>,
) -> DataResult<CellPB, FlowyError> {
let params: CellPathParams = data.into_inner().try_into()?;
let params: CellIdParams = data.into_inner().try_into()?;
let editor = manager.get_database_editor(&params.database_id).await?;
match editor.get_cell(&params).await {
None => data_result(CellPB::empty(&params.field_id, &params.row_id)),
@ -427,10 +427,10 @@ pub(crate) async fn update_select_option_handler(
#[tracing::instrument(level = "trace", skip(data, manager), err)]
pub(crate) async fn get_select_option_handler(
data: AFPluginData<CellPathPB>,
data: AFPluginData<CellIdPB>,
manager: AFPluginState<Arc<DatabaseManager>>,
) -> DataResult<SelectOptionCellDataPB, FlowyError> {
let params: CellPathParams = data.into_inner().try_into()?;
let params: CellIdParams = data.into_inner().try_into()?;
let editor = manager.get_database_editor(&params.database_id).await?;
match editor.get_field_rev(&params.field_id).await {
None => {
@ -483,7 +483,7 @@ pub(crate) async fn update_date_cell_handler(
manager: AFPluginState<Arc<DatabaseManager>>,
) -> Result<(), FlowyError> {
let data = data.into_inner();
let cell_path: CellPathParams = data.cell_path.try_into()?;
let cell_path: CellIdParams = data.cell_path.try_into()?;
let cell_changeset = DateCellChangeset {
date: data.date,
time: data.time,

View File

@ -20,16 +20,13 @@ pub fn init(database_manager: Arc<DatabaseManager>) -> AFPlugin {
.event(DatabaseEvent::UpdateField, update_field_handler)
.event(DatabaseEvent::UpdateFieldTypeOption, update_field_type_option_handler)
.event(DatabaseEvent::DeleteField, delete_field_handler)
.event(DatabaseEvent::SwitchToField, switch_to_field_handler)
.event(DatabaseEvent::UpdateFieldType, switch_to_field_handler)
.event(DatabaseEvent::DuplicateField, duplicate_field_handler)
.event(DatabaseEvent::MoveField, move_field_handler)
.event(DatabaseEvent::GetFieldTypeOption, get_field_type_option_data_handler)
.event(
DatabaseEvent::CreateFieldTypeOption,
create_field_type_option_data_handler,
)
.event(DatabaseEvent::GetTypeOption, get_field_type_option_data_handler)
.event(DatabaseEvent::CreateTypeOption, create_field_type_option_data_handler)
// Row
.event(DatabaseEvent::CreateTableRow, create_table_row_handler)
.event(DatabaseEvent::CreateRow, create_table_row_handler)
.event(DatabaseEvent::GetRow, get_row_handler)
.event(DatabaseEvent::DeleteRow, delete_row_handler)
.event(DatabaseEvent::DuplicateRow, duplicate_row_handler)
@ -38,7 +35,7 @@ pub fn init(database_manager: Arc<DatabaseManager>) -> AFPlugin {
.event(DatabaseEvent::GetCell, get_cell_handler)
.event(DatabaseEvent::UpdateCell, update_cell_handler)
// SelectOption
.event(DatabaseEvent::NewSelectOption, new_select_option_handler)
.event(DatabaseEvent::CreateSelectOption, new_select_option_handler)
.event(DatabaseEvent::UpdateSelectOption, update_select_option_handler)
.event(DatabaseEvent::GetSelectOptionCellData, get_select_option_handler)
.event(DatabaseEvent::UpdateSelectOptionCell, update_select_option_cell_handler)
@ -118,11 +115,11 @@ pub enum DatabaseEvent {
#[event(input = "DeleteFieldPayloadPB")]
DeleteField = 14,
/// [SwitchToField] event is used to update the current Field's type.
/// [UpdateFieldType] event is used to update the current Field's type.
/// It will insert a new FieldTypeOptionData if the new FieldType doesn't exist before, otherwise
/// reuse the existing FieldTypeOptionData. You could check the [DatabaseRevisionPad] for more details.
#[event(input = "EditFieldChangesetPB")]
SwitchToField = 20,
#[event(input = "UpdateFieldTypePayloadPB")]
UpdateFieldType = 20,
/// [DuplicateField] event is used to duplicate a Field. The duplicated field data is kind of
/// deep copy of the target field. The passed in [DuplicateFieldPayloadPB] is the context that is
@ -145,21 +142,21 @@ pub enum DatabaseEvent {
///
/// Return the [TypeOptionPB] if there are no errors.
#[event(input = "TypeOptionPathPB", output = "TypeOptionPB")]
GetFieldTypeOption = 23,
GetTypeOption = 23,
/// [CreateFieldTypeOption] event is used to create a new FieldTypeOptionData.
/// [CreateTypeOption] event is used to create a new FieldTypeOptionData.
#[event(input = "CreateFieldPayloadPB", output = "TypeOptionPB")]
CreateFieldTypeOption = 24,
CreateTypeOption = 24,
/// [NewSelectOption] event is used to create a new select option. Returns a [SelectOptionPB] if
/// [CreateSelectOption] event is used to create a new select option. Returns a [SelectOptionPB] if
/// there are no errors.
#[event(input = "CreateSelectOptionPayloadPB", output = "SelectOptionPB")]
NewSelectOption = 30,
CreateSelectOption = 30,
/// [GetSelectOptionCellData] event is used to get the select option data for cell editing.
/// [CellPathPB] locate which cell data that will be read from. The return value, [SelectOptionCellDataPB]
/// [CellIdPB] locate which cell data that will be read from. The return value, [SelectOptionCellDataPB]
/// contains the available options and the currently selected options.
#[event(input = "CellPathPB", output = "SelectOptionCellDataPB")]
#[event(input = "CellIdPB", output = "SelectOptionCellDataPB")]
GetSelectOptionCellData = 31,
/// [UpdateSelectOption] event is used to update a FieldTypeOptionData whose field_type is
@ -171,8 +168,8 @@ pub enum DatabaseEvent {
#[event(input = "SelectOptionChangesetPB")]
UpdateSelectOption = 32,
#[event(input = "CreateTableRowPayloadPB", output = "RowPB")]
CreateTableRow = 50,
#[event(input = "CreateRowPayloadPB", output = "RowPB")]
CreateRow = 50,
/// [GetRow] event is used to get the row data,[RowPB]. [OptionalRowPB] is a wrapper that enables
/// to return a nullable row data.
@ -188,7 +185,7 @@ pub enum DatabaseEvent {
#[event(input = "MoveRowPayloadPB")]
MoveRow = 54,
#[event(input = "CellPathPB", output = "CellPB")]
#[event(input = "CellIdPB", output = "CellPB")]
GetCell = 70,
/// [UpdateCell] event is used to update the cell content. The passed in data, [CellChangesetPB],

View File

@ -1,4 +1,4 @@
use crate::entities::DatabaseViewLayout;
use crate::entities::LayoutTypePB;
use crate::services::grid_editor::{
DatabaseRevisionEditor, GridRevisionCloudService, GridRevisionMergeable, GridRevisionSerde,
};
@ -196,7 +196,7 @@ impl DatabaseManager {
pub async fn make_database_view_data(
_user_id: &str,
view_id: &str,
layout: DatabaseViewLayout,
layout: LayoutTypePB,
database_manager: Arc<DatabaseManager>,
build_context: BuildDatabaseContext,
) -> FlowyResult<Bytes> {

View File

@ -5,21 +5,32 @@ const OBSERVABLE_CATEGORY: &str = "Grid";
#[derive(ProtoBuf_Enum, Debug)]
pub enum DatabaseNotification {
Unknown = 0,
DidCreateBlock = 11,
DidUpdateDatabaseViewRows = 20,
DidUpdateDatabaseViewRowsVisibility = 21,
DidUpdateDatabaseFields = 22,
DidUpdateRow = 30,
/// Trigger after inserting/deleting/updating a row
DidUpdateViewRows = 20,
/// Trigger when the visibility of the row was changed. For example, updating the filter will trigger the notification
DidUpdateViewRowsVisibility = 21,
/// Trigger after inserting/deleting/updating a field
DidUpdateFields = 22,
/// Trigger after editing a cell
DidUpdateCell = 40,
/// Trigger after editing a field properties including rename,update type option, etc
DidUpdateField = 50,
DidUpdateGroupView = 60,
DidUpdateGroup = 61,
DidGroupByNewField = 62,
/// Trigger after the number of groups is changed
DidUpdateGroups = 60,
/// Trigger after inserting/deleting/updating/moving a row
DidUpdateGroupRow = 61,
/// Trigger when setting a new grouping field
DidGroupByField = 62,
/// Trigger after inserting/deleting/updating a filter
DidUpdateFilter = 63,
/// Trigger after inserting/deleting/updating a sort
DidUpdateSort = 64,
/// Trigger after the sort configurations are changed
DidReorderRows = 65,
/// Trigger after editing the row that hit the sort rule
DidReorderSingleRow = 66,
DidUpdateDatabaseSetting = 70,
/// Trigger when the settings of the database are changed
DidUpdateSettings = 70,
}
impl std::default::Default for DatabaseNotification {

View File

@ -1,4 +1,4 @@
use crate::entities::CellPathPB;
use crate::entities::CellIdPB;
use crate::services::cell::{
CellProtobufBlobParser, DecodedCellData, FromCellChangesetString, FromCellString, ToCellChangesetString,
};
@ -23,7 +23,7 @@ pub struct DateCellDataPB {
#[derive(Clone, Debug, Default, ProtoBuf)]
pub struct DateChangesetPB {
#[pb(index = 1)]
pub cell_path: CellPathPB,
pub cell_path: CellIdPB,
#[pb(index = 2, one_of)]
pub date: Option<String>,

View File

@ -1,5 +1,5 @@
use crate::entities::parser::NotEmptyStr;
use crate::entities::{CellPathPB, CellPathParams, FieldType};
use crate::entities::{CellIdPB, CellIdParams, FieldType};
use crate::services::cell::{
CellDataDecoder, CellProtobufBlobParser, DecodedCellData, FromCellChangesetString, FromCellString,
ToCellChangesetString,
@ -366,7 +366,7 @@ impl CellProtobufBlobParser for SelectOptionCellDataParser {
#[derive(Clone, Debug, Default, ProtoBuf)]
pub struct SelectOptionCellChangesetPB {
#[pb(index = 1)]
pub cell_identifier: CellPathPB,
pub cell_identifier: CellIdPB,
#[pb(index = 2)]
pub insert_option_ids: Vec<String>,
@ -376,7 +376,7 @@ pub struct SelectOptionCellChangesetPB {
}
pub struct SelectOptionCellChangesetParams {
pub cell_identifier: CellPathParams,
pub cell_identifier: CellIdParams,
pub insert_option_ids: Vec<String>,
pub delete_option_ids: Vec<String>,
}
@ -385,7 +385,7 @@ impl TryInto<SelectOptionCellChangesetParams> for SelectOptionCellChangesetPB {
type Error = ErrorCode;
fn try_into(self) -> Result<SelectOptionCellChangesetParams, Self::Error> {
let cell_identifier: CellPathParams = self.cell_identifier.try_into()?;
let cell_identifier: CellIdParams = self.cell_identifier.try_into()?;
let insert_option_ids = self
.insert_option_ids
.into_iter()
@ -487,7 +487,7 @@ pub struct SelectOptionCellDataPB {
#[derive(Clone, Debug, Default, ProtoBuf)]
pub struct SelectOptionChangesetPB {
#[pb(index = 1)]
pub cell_identifier: CellPathPB,
pub cell_identifier: CellIdPB,
#[pb(index = 2)]
pub insert_options: Vec<SelectOptionPB>,
@ -500,7 +500,7 @@ pub struct SelectOptionChangesetPB {
}
pub struct SelectOptionChangeset {
pub cell_path: CellPathParams,
pub cell_path: CellIdParams,
pub insert_options: Vec<SelectOptionPB>,
pub update_options: Vec<SelectOptionPB>,
pub delete_options: Vec<SelectOptionPB>,

View File

@ -4,7 +4,7 @@ use crate::services::cell::{AnyTypeCache, AtomicCellDataCache, AtomicCellFilterC
use crate::services::field::*;
use crate::services::filter::{FilterChangeset, FilterResult, FilterResultNotification, FilterType};
use crate::services::row::DatabaseBlockRowRevision;
use crate::services::view_editor::{GridViewChanged, GridViewChangedNotifier};
use crate::services::view_editor::{DatabaseViewChanged, GridViewChangedNotifier};
use dashmap::DashMap;
use flowy_error::FlowyResult;
use flowy_task::{QualityOfService, Task, TaskContent, TaskDispatcher};
@ -149,7 +149,9 @@ impl FilterController {
}
}
let _ = self.notifier.send(GridViewChanged::FilterNotification(notification));
let _ = self
.notifier
.send(DatabaseViewChanged::FilterNotification(notification));
}
Ok(())
}
@ -185,7 +187,9 @@ impl FilterController {
visible_rows,
};
tracing::Span::current().record("filter_result", format!("{:?}", &notification).as_str());
let _ = self.notifier.send(GridViewChanged::FilterNotification(notification));
let _ = self
.notifier
.send(DatabaseViewChanged::FilterNotification(notification));
}
Ok(())
}

View File

@ -1,4 +1,4 @@
use crate::entities::CellPathParams;
use crate::entities::CellIdParams;
use crate::entities::*;
use crate::manager::DatabaseUser;
use crate::notification::{send_notification, DatabaseNotification};
@ -16,7 +16,7 @@ use crate::services::filter::FilterType;
use crate::services::grid_editor_trait_impl::GridViewEditorDelegateImpl;
use crate::services::persistence::block_index::BlockIndexCache;
use crate::services::row::{DatabaseBlockRow, DatabaseBlockRowRevision, RowRevisionBuilder};
use crate::services::view_editor::{DatabaseViewManager, GridViewChanged};
use crate::services::view_editor::{DatabaseViewChanged, DatabaseViewManager};
use bytes::Bytes;
use flowy_client_sync::client_database::{DatabaseRevisionChangeset, DatabaseRevisionPad, JsonDeserializer};
use flowy_client_sync::errors::{SyncError, SyncResult};
@ -428,7 +428,7 @@ impl DatabaseRevisionEditor {
Ok(())
}
pub async fn subscribe_view_changed(&self, view_id: &str) -> FlowyResult<broadcast::Receiver<GridViewChanged>> {
pub async fn subscribe_view_changed(&self, view_id: &str) -> FlowyResult<broadcast::Receiver<DatabaseViewChanged>> {
self.view_manager.subscribe_view_changed(view_id).await
}
@ -437,7 +437,7 @@ impl DatabaseRevisionEditor {
}
/// Returns the cell data that encoded in protobuf.
pub async fn get_cell(&self, params: &CellPathParams) -> Option<CellPB> {
pub async fn get_cell(&self, params: &CellIdParams) -> Option<CellPB> {
let (field_type, cell_bytes) = self.get_type_cell_protobuf(params).await?;
Some(CellPB::new(
&params.field_id,
@ -453,7 +453,7 @@ impl DatabaseRevisionEditor {
/// Number: 123 => $123 if the currency set.
/// Date: 1653609600 => May 27,2022
///
pub async fn get_cell_display_str(&self, params: &CellPathParams) -> String {
pub async fn get_cell_display_str(&self, params: &CellIdParams) -> String {
let display_str = || async {
let field_rev = self.get_field_rev(&params.field_id).await?;
let field_type: FieldType = field_rev.ty.into();
@ -470,12 +470,12 @@ impl DatabaseRevisionEditor {
display_str().await.unwrap_or_default()
}
pub async fn get_cell_protobuf(&self, params: &CellPathParams) -> Option<CellProtobufBlob> {
pub async fn get_cell_protobuf(&self, params: &CellIdParams) -> Option<CellProtobufBlob> {
let (_, cell_data) = self.get_type_cell_protobuf(params).await?;
Some(cell_data)
}
async fn get_type_cell_protobuf(&self, params: &CellPathParams) -> Option<(FieldType, CellProtobufBlob)> {
async fn get_type_cell_protobuf(&self, params: &CellIdParams) -> Option<(FieldType, CellProtobufBlob)> {
let field_rev = self.get_field_rev(&params.field_id).await?;
let (_, row_rev) = self.block_manager.get_row_rev(&params.row_id).await.ok()??;
let cell_rev = row_rev.cells.get(&params.field_id)?.clone();
@ -861,7 +861,7 @@ impl DatabaseRevisionEditor {
}
async fn notify_did_update_grid(&self, changeset: DatabaseFieldChangesetPB) -> FlowyResult<()> {
send_notification(&self.database_id, DatabaseNotification::DidUpdateDatabaseFields)
send_notification(&self.database_id, DatabaseNotification::DidUpdateFields)
.payload(changeset)
.send();
Ok(())

View File

@ -1,4 +1,4 @@
use crate::entities::{GroupPB, GroupRowsNotificationPB, GroupViewChangesetPB, InsertedGroupPB};
use crate::entities::{GroupChangesetPB, GroupPB, GroupRowsNotificationPB, InsertedGroupPB};
use crate::services::cell::DecodedCellData;
use crate::services::group::controller::MoveGroupRowContext;
use crate::services::group::Group;
@ -91,7 +91,7 @@ pub trait GroupControllerActions: Send + Sync {
fn move_group_row(&mut self, context: MoveGroupRowContext) -> FlowyResult<DidMoveGroupRowResult>;
/// Update the group if the corresponding field is changed
fn did_update_group_field(&mut self, field_rev: &FieldRevision) -> FlowyResult<Option<GroupViewChangesetPB>>;
fn did_update_group_field(&mut self, field_rev: &FieldRevision) -> FlowyResult<Option<GroupChangesetPB>>;
}
#[derive(Debug)]

View File

@ -1,4 +1,4 @@
use crate::entities::{GroupPB, GroupViewChangesetPB, InsertedGroupPB};
use crate::entities::{GroupChangesetPB, GroupPB, InsertedGroupPB};
use crate::services::field::RowSingleCellData;
use crate::services::group::{default_group_configuration, GeneratedGroupContext, Group};
use flowy_error::{FlowyError, FlowyResult};
@ -223,7 +223,7 @@ where
pub(crate) fn init_groups(
&mut self,
generated_group_context: GeneratedGroupContext,
) -> FlowyResult<Option<GroupViewChangesetPB>> {
) -> FlowyResult<Option<GroupChangesetPB>> {
let GeneratedGroupContext {
no_status_group,
group_configs,
@ -312,7 +312,7 @@ where
})
.collect();
let changeset = GroupViewChangesetPB {
let changeset = GroupChangesetPB {
view_id: self.view_id.clone(),
initial_groups,
deleted_groups: deleted_group_ids,

View File

@ -1,4 +1,4 @@
use crate::entities::{GroupRowsNotificationPB, GroupViewChangesetPB, InsertedRowPB, RowPB};
use crate::entities::{GroupChangesetPB, GroupRowsNotificationPB, InsertedRowPB, RowPB};
use crate::services::cell::{get_type_cell_protobuf, CellProtobufBlobParser, DecodedCellData};
use crate::services::group::action::{
@ -319,7 +319,7 @@ where
Ok(result)
}
fn did_update_group_field(&mut self, _field_rev: &FieldRevision) -> FlowyResult<Option<GroupViewChangesetPB>> {
fn did_update_group_field(&mut self, _field_rev: &FieldRevision) -> FlowyResult<Option<GroupChangesetPB>> {
Ok(None)
}
}

View File

@ -1,4 +1,4 @@
use crate::entities::{GroupViewChangesetPB, RowPB};
use crate::entities::{GroupChangesetPB, RowPB};
use crate::services::group::action::{DidMoveGroupRowResult, DidUpdateGroupRowResult, GroupControllerActions};
use crate::services::group::{Group, GroupController, MoveGroupRowContext};
use flowy_error::FlowyResult;
@ -86,7 +86,7 @@ impl GroupControllerActions for DefaultGroupController {
})
}
fn did_update_group_field(&mut self, _field_rev: &FieldRevision) -> FlowyResult<Option<GroupViewChangesetPB>> {
fn did_update_group_field(&mut self, _field_rev: &FieldRevision) -> FlowyResult<Option<GroupChangesetPB>> {
Ok(None)
}
}

View File

@ -1,11 +1,11 @@
use crate::entities::{AlterFilterParams, DatabaseSettingChangesetParams, DatabaseViewLayout, DeleteFilterParams};
use crate::entities::{AlterFilterParams, DatabaseSettingChangesetParams, DeleteFilterParams, LayoutTypePB};
pub struct GridSettingChangesetBuilder {
params: DatabaseSettingChangesetParams,
}
impl GridSettingChangesetBuilder {
pub fn new(grid_id: &str, layout_type: &DatabaseViewLayout) -> Self {
pub fn new(grid_id: &str, layout_type: &LayoutTypePB) -> Self {
let params = DatabaseSettingChangesetParams {
database_id: grid_id.to_string(),
layout_type: layout_type.clone().into(),

View File

@ -3,7 +3,7 @@ use crate::entities::SortChangesetNotificationPB;
use crate::services::cell::{AtomicCellDataCache, TypeCellData};
use crate::services::field::{default_order, TypeOptionCellExt};
use crate::services::sort::{ReorderAllRowsResult, ReorderSingleRowResult, SortChangeset, SortType};
use crate::services::view_editor::{GridViewChanged, GridViewChangedNotifier};
use crate::services::view_editor::{DatabaseViewChanged, GridViewChangedNotifier};
use flowy_error::FlowyResult;
use flowy_task::{QualityOfService, Task, TaskContent, TaskDispatcher};
use grid_model::{CellRevision, FieldRevision, RowRevision, SortCondition, SortRevision};
@ -92,7 +92,7 @@ impl SortController {
let _ = self
.notifier
.send(GridViewChanged::ReorderAllRowsNotification(notification));
.send(DatabaseViewChanged::ReorderAllRowsNotification(notification));
}
SortEvent::RowDidChanged(row_id) => {
let old_row_index = self.row_index_cache.get(&row_id).cloned();
@ -111,7 +111,7 @@ impl SortController {
};
let _ = self
.notifier
.send(GridViewChanged::ReorderSingleRowNotification(notification));
.send(DatabaseViewChanged::ReorderSingleRowNotification(notification));
}
_ => tracing::trace!("The row index cache is outdated"),
}

View File

@ -7,15 +7,15 @@ use futures::stream::StreamExt;
use tokio::sync::broadcast;
#[derive(Clone)]
pub enum GridViewChanged {
pub enum DatabaseViewChanged {
FilterNotification(FilterResultNotification),
ReorderAllRowsNotification(ReorderAllRowsResult),
ReorderSingleRowNotification(ReorderSingleRowResult),
}
pub type GridViewChangedNotifier = broadcast::Sender<GridViewChanged>;
pub type GridViewChangedNotifier = broadcast::Sender<DatabaseViewChanged>;
pub(crate) struct GridViewChangedReceiverRunner(pub(crate) Option<broadcast::Receiver<GridViewChanged>>);
pub(crate) struct GridViewChangedReceiverRunner(pub(crate) Option<broadcast::Receiver<DatabaseViewChanged>>);
impl GridViewChangedReceiverRunner {
pub(crate) async fn run(mut self) {
let mut receiver = self.0.take().expect("Only take once");
@ -30,21 +30,18 @@ impl GridViewChangedReceiverRunner {
stream
.for_each(|changed| async {
match changed {
GridViewChanged::FilterNotification(notification) => {
DatabaseViewChanged::FilterNotification(notification) => {
let changeset = ViewRowsVisibilityChangesetPB {
view_id: notification.view_id,
visible_rows: notification.visible_rows,
invisible_rows: notification.invisible_rows,
};
send_notification(
&changeset.view_id,
DatabaseNotification::DidUpdateDatabaseViewRowsVisibility,
)
.payload(changeset)
.send()
send_notification(&changeset.view_id, DatabaseNotification::DidUpdateViewRowsVisibility)
.payload(changeset)
.send()
}
GridViewChanged::ReorderAllRowsNotification(notification) => {
DatabaseViewChanged::ReorderAllRowsNotification(notification) => {
let row_orders = ReorderAllRowsPB {
row_orders: notification.row_orders,
};
@ -52,7 +49,7 @@ impl GridViewChangedReceiverRunner {
.payload(row_orders)
.send()
}
GridViewChanged::ReorderSingleRowNotification(notification) => {
DatabaseViewChanged::ReorderSingleRowNotification(notification) => {
let reorder_row = ReorderSingleRowPB {
row_id: notification.row_id,
old_index: notification.old_index as i32,

View File

@ -184,7 +184,7 @@ impl DatabaseViewRevisionEditor {
}
};
send_notification(&self.view_id, DatabaseNotification::DidUpdateDatabaseViewRows)
send_notification(&self.view_id, DatabaseNotification::DidUpdateViewRows)
.payload(changeset)
.send();
}
@ -262,7 +262,7 @@ impl DatabaseViewRevisionEditor {
.await;
if let Some(Ok(result)) = result {
let mut changeset = GroupViewChangesetPB {
let mut changeset = GroupChangesetPB {
view_id: self.view_id.clone(),
..Default::default()
};
@ -274,7 +274,7 @@ impl DatabaseViewRevisionEditor {
tracing::trace!("Delete group after editing the row: {:?}", delete_group);
changeset.deleted_groups.push(delete_group.group_id);
}
self.notify_did_update_view(changeset).await;
self.notify_did_update_groups(changeset).await;
tracing::trace!("Group changesets after editing the row: {:?}", result.row_changesets);
for changeset in result.row_changesets {
@ -312,7 +312,7 @@ impl DatabaseViewRevisionEditor {
.await;
if let Some(result) = result {
let mut changeset = GroupViewChangesetPB {
let mut changeset = GroupChangesetPB {
view_id: self.view_id.clone(),
..Default::default()
};
@ -320,7 +320,7 @@ impl DatabaseViewRevisionEditor {
tracing::info!("Delete group after moving the row: {:?}", delete_group);
changeset.deleted_groups.push(delete_group.group_id);
}
self.notify_did_update_view(changeset).await;
self.notify_did_update_groups(changeset).await;
for changeset in result.row_changesets {
self.notify_did_update_group_rows(changeset).await;
@ -356,7 +356,7 @@ impl DatabaseViewRevisionEditor {
index: index as i32,
};
let changeset = GroupViewChangesetPB {
let changeset = GroupChangesetPB {
view_id: self.view_id.clone(),
inserted_groups: vec![inserted_group],
deleted_groups: vec![params.from_group_id.clone()],
@ -364,7 +364,7 @@ impl DatabaseViewRevisionEditor {
initial_groups: vec![],
};
self.notify_did_update_view(changeset).await;
self.notify_did_update_groups(changeset).await;
}
}
Ok(())
@ -632,7 +632,7 @@ impl DatabaseViewRevisionEditor {
.collect();
*self.group_controller.write().await = new_group_controller;
let changeset = GroupViewChangesetPB {
let changeset = GroupChangesetPB {
view_id: self.view_id.clone(),
initial_groups: new_groups,
..Default::default()
@ -640,7 +640,7 @@ impl DatabaseViewRevisionEditor {
debug_assert!(!changeset.is_empty());
if !changeset.is_empty() {
send_notification(&changeset.view_id, DatabaseNotification::DidGroupByNewField)
send_notification(&changeset.view_id, DatabaseNotification::DidGroupByField)
.payload(changeset)
.send();
}
@ -654,13 +654,13 @@ impl DatabaseViewRevisionEditor {
async fn notify_did_update_setting(&self) {
let setting = self.get_view_setting().await;
send_notification(&self.view_id, DatabaseNotification::DidUpdateDatabaseSetting)
send_notification(&self.view_id, DatabaseNotification::DidUpdateSettings)
.payload(setting)
.send();
}
pub async fn notify_did_update_group_rows(&self, payload: GroupRowsNotificationPB) {
send_notification(&payload.group_id, DatabaseNotification::DidUpdateGroup)
send_notification(&payload.group_id, DatabaseNotification::DidUpdateGroupRow)
.payload(payload)
.send();
}
@ -679,8 +679,8 @@ impl DatabaseViewRevisionEditor {
}
}
async fn notify_did_update_view(&self, changeset: GroupViewChangesetPB) {
send_notification(&self.view_id, DatabaseNotification::DidUpdateGroupView)
async fn notify_did_update_groups(&self, changeset: GroupChangesetPB) {
send_notification(&self.view_id, DatabaseNotification::DidUpdateGroups)
.payload(changeset)
.send();
}

View File

@ -53,7 +53,7 @@ impl DatabaseViewManager {
self.view_editors.write().await.remove(view_id).await;
}
pub async fn subscribe_view_changed(&self, view_id: &str) -> FlowyResult<broadcast::Receiver<GridViewChanged>> {
pub async fn subscribe_view_changed(&self, view_id: &str) -> FlowyResult<broadcast::Receiver<DatabaseViewChanged>> {
Ok(self.get_view_editor(view_id).await?.notifier.subscribe())
}

View File

@ -1,4 +1,4 @@
use crate::entities::{DatabaseViewLayout, DatabaseViewSettingPB, ViewLayoutConfigPB};
use crate::entities::{DatabaseViewSettingPB, LayoutTypePB, ViewLayoutPB};
use crate::services::field::RowSingleCellData;
use crate::services::filter::{FilterController, FilterDelegate, FilterType};
use crate::services::group::{GroupConfigurationReader, GroupConfigurationWriter};
@ -132,13 +132,13 @@ pub(crate) async fn apply_change(
}
pub fn make_grid_setting(view_pad: &GridViewRevisionPad, field_revs: &[Arc<FieldRevision>]) -> DatabaseViewSettingPB {
let layout_type: DatabaseViewLayout = view_pad.layout.clone().into();
let layout_type: LayoutTypePB = view_pad.layout.clone().into();
let filters = view_pad.get_all_filters(field_revs);
let group_configurations = view_pad.get_groups_by_field_revs(field_revs);
let sorts = view_pad.get_all_sorts(field_revs);
DatabaseViewSettingPB {
layouts: ViewLayoutConfigPB::all(),
layout_type,
support_layouts: ViewLayoutPB::all(),
current_layout: layout_type,
filters: filters.into(),
sorts: sorts.into(),
group_configurations: group_configurations.into(),

View File

@ -1,7 +1,7 @@
use crate::grid::block_test::script::RowScript::{AssertCell, CreateRow};
use crate::grid::block_test::util::GridRowTestBuilder;
use crate::grid::database_editor::DatabaseEditorTest;
use flowy_database::entities::{CellPathParams, CreateRowParams, DatabaseViewLayout, FieldType, RowPB};
use flowy_database::entities::{CellIdParams, CreateRowParams, FieldType, LayoutTypePB, RowPB};
use flowy_database::services::field::*;
use flowy_database::services::row::DatabaseBlockRow;
use grid_model::{GridBlockMetaRevision, GridBlockMetaRevisionChangeset, RowChangeset, RowRevision};
@ -79,7 +79,7 @@ impl DatabaseRowTest {
database_id: self.editor.database_id.clone(),
start_row_id: None,
group_id: None,
layout: DatabaseViewLayout::Grid,
layout: LayoutTypePB::Grid,
};
let row_order = self.editor.create_row(params).await.unwrap();
self.row_by_row_id.insert(row_order.row_id().to_owned(), row_order);
@ -112,7 +112,7 @@ impl DatabaseRowTest {
field_type,
expected,
} => {
let id = CellPathParams {
let id = CellIdParams {
database_id: self.view_id.clone(),
field_id,
row_id,
@ -157,7 +157,7 @@ impl DatabaseRowTest {
}
}
async fn compare_cell_content(&self, cell_id: CellPathParams, field_type: FieldType, expected: String) {
async fn compare_cell_content(&self, cell_id: CellIdParams, field_type: FieldType, expected: String) {
match field_type {
FieldType::RichText => {
let cell_data = self

View File

@ -25,28 +25,28 @@ pub struct DatabaseEditorTest {
impl DatabaseEditorTest {
pub async fn new_table() -> Self {
Self::new(DatabaseViewLayout::Grid).await
Self::new(LayoutTypePB::Grid).await
}
pub async fn new_board() -> Self {
Self::new(DatabaseViewLayout::Board).await
Self::new(LayoutTypePB::Board).await
}
pub async fn new(layout: DatabaseViewLayout) -> Self {
pub async fn new(layout: LayoutTypePB) -> Self {
let sdk = FlowySDKTest::default();
let _ = sdk.init_user().await;
let test = match layout {
DatabaseViewLayout::Grid => {
LayoutTypePB::Grid => {
let build_context = make_test_grid();
let view_data: Bytes = build_context.into();
ViewTest::new_grid_view(&sdk, view_data.to_vec()).await
}
DatabaseViewLayout::Board => {
LayoutTypePB::Board => {
let build_context = make_test_board();
let view_data: Bytes = build_context.into();
ViewTest::new_board_view(&sdk, view_data.to_vec()).await
}
DatabaseViewLayout::Calendar => {
LayoutTypePB::Calendar => {
let build_context = make_test_calendar();
let view_data: Bytes = build_context.into();
ViewTest::new_calendar_view(&sdk, view_data.to_vec()).await

View File

@ -7,14 +7,14 @@ use std::time::Duration;
use bytes::Bytes;
use futures::TryFutureExt;
use tokio::sync::broadcast::Receiver;
use flowy_database::entities::{AlterFilterParams, AlterFilterPayloadPB, DeleteFilterParams, DatabaseViewLayout, DatabaseSettingChangesetParams, DatabaseViewSettingPB, RowPB, TextFilterConditionPB, FieldType, NumberFilterConditionPB, CheckboxFilterConditionPB, DateFilterConditionPB, DateFilterContentPB, SelectOptionConditionPB, TextFilterPB, NumberFilterPB, CheckboxFilterPB, DateFilterPB, SelectOptionFilterPB, CellChangesetPB, FilterPB, ChecklistFilterConditionPB, ChecklistFilterPB};
use flowy_database::entities::{AlterFilterParams, AlterFilterPayloadPB, DeleteFilterParams, LayoutTypePB, DatabaseSettingChangesetParams, DatabaseViewSettingPB, RowPB, TextFilterConditionPB, FieldType, NumberFilterConditionPB, CheckboxFilterConditionPB, DateFilterConditionPB, DateFilterContentPB, SelectOptionConditionPB, TextFilterPB, NumberFilterPB, CheckboxFilterPB, DateFilterPB, SelectOptionFilterPB, CellChangesetPB, FilterPB, ChecklistFilterConditionPB, ChecklistFilterPB};
use flowy_database::services::field::{SelectOptionCellChangeset, SelectOptionIds};
use flowy_database::services::setting::GridSettingChangesetBuilder;
use grid_model::{FieldRevision, FieldTypeRevision};
use flowy_sqlite::schema::view_table::dsl::view_table;
use flowy_database::services::cell::insert_select_option_cell;
use flowy_database::services::filter::FilterType;
use flowy_database::services::view_editor::GridViewChanged;
use flowy_database::services::view_editor::DatabaseViewChanged;
use crate::grid::database_editor::DatabaseEditorTest;
pub struct FilterRowChanged {
@ -101,7 +101,7 @@ pub enum FilterScript {
pub struct DatabaseFilterTest {
inner: DatabaseEditorTest,
recv: Option<Receiver<GridViewChanged>>,
recv: Option<Receiver<DatabaseViewChanged>>,
}
impl DatabaseFilterTest {
@ -274,7 +274,7 @@ impl DatabaseFilterTest {
tokio::spawn(async move {
match tokio::time::timeout(Duration::from_secs(2), receiver.recv()).await {
Ok(changed) => {
match changed.unwrap() { GridViewChanged::FilterNotification(notification) => {
match changed.unwrap() { DatabaseViewChanged::FilterNotification(notification) => {
assert_eq!(notification.visible_rows.len(), change.showing_num_of_rows, "visible rows not match");
assert_eq!(notification.invisible_rows.len(), change.hiding_num_of_rows, "invisible rows not match");
}

View File

@ -1,6 +1,6 @@
use crate::grid::database_editor::DatabaseEditorTest;
use flowy_database::entities::{
CreateRowParams, DatabaseViewLayout, FieldType, GroupPB, MoveGroupParams, MoveGroupRowParams, RowPB,
CreateRowParams, FieldType, GroupPB, LayoutTypePB, MoveGroupParams, MoveGroupRowParams, RowPB,
};
use flowy_database::services::cell::{delete_select_option_cell, insert_select_option_cell, insert_url_cell};
use flowy_database::services::field::{
@ -119,7 +119,7 @@ impl DatabaseGroupTest {
database_id: self.editor.database_id.clone(),
start_row_id: None,
group_id: Some(group.group_id.clone()),
layout: DatabaseViewLayout::Board,
layout: LayoutTypePB::Board,
};
let _ = self.editor.create_row(params).await.unwrap();
}

View File

@ -1,8 +1,8 @@
use crate::grid::database_editor::DatabaseEditorTest;
use async_stream::stream;
use flowy_database::entities::{AlterSortParams, CellPathParams, DeleteSortParams};
use flowy_database::entities::{AlterSortParams, CellIdParams, DeleteSortParams};
use flowy_database::services::sort::SortType;
use flowy_database::services::view_editor::GridViewChanged;
use flowy_database::services::view_editor::DatabaseViewChanged;
use futures::stream::StreamExt;
use grid_model::{FieldRevision, SortCondition, SortRevision};
use std::cmp::min;
@ -39,7 +39,7 @@ pub enum SortScript {
pub struct DatabaseSortTest {
inner: DatabaseEditorTest,
pub current_sort_rev: Option<SortRevision>,
recv: Option<Receiver<GridViewChanged>>,
recv: Option<Receiver<DatabaseViewChanged>>,
}
impl DatabaseSortTest {
@ -85,7 +85,7 @@ impl DatabaseSortTest {
let mut cells = vec![];
let rows = self.editor.get_database(&self.view_id).await.unwrap().rows;
for row in rows {
let params = CellPathParams {
let params = CellIdParams {
database_id: self.view_id.clone(),
field_id: field_id.clone(),
row_id: row.id,
@ -125,7 +125,7 @@ impl DatabaseSortTest {
}
async fn assert_sort_changed(
mut receiver: Receiver<GridViewChanged>,
mut receiver: Receiver<DatabaseViewChanged>,
new_row_orders: Vec<String>,
old_row_orders: Vec<String>,
) {
@ -141,8 +141,8 @@ async fn assert_sort_changed(
stream
.for_each(|changed| async {
match changed {
GridViewChanged::ReorderAllRowsNotification(_changed) => {}
GridViewChanged::ReorderSingleRowNotification(changed) => {
DatabaseViewChanged::ReorderAllRowsNotification(_changed) => {}
DatabaseViewChanged::ReorderSingleRowNotification(changed) => {
let mut old_row_orders = old_row_orders.clone();
let old = old_row_orders.remove(changed.old_index);
old_row_orders.insert(changed.new_index, old);

View File

@ -61,7 +61,6 @@ impl AsRef<str> for FolderId {
pub struct FolderManager {
pub user: Arc<dyn WorkspaceUser>,
pub(crate) cloud_service: Arc<dyn FolderCouldServiceV1>,
pub(crate) persistence: Arc<FolderPersistence>,
pub(crate) workspace_controller: Arc<WorkspaceController>,
pub(crate) app_controller: Arc<AppController>,
@ -118,7 +117,6 @@ impl FolderManager {
Self {
user,
cloud_service,
persistence,
workspace_controller,
app_controller,
@ -249,7 +247,7 @@ impl DefaultFolderBuilder {
let repeated_workspace = RepeatedWorkspacePB {
items: vec![workspace_rev.into()],
};
send_notification(token, FolderNotification::UserCreateWorkspace)
send_notification(token, FolderNotification::DidCreateWorkspace)
.payload(repeated_workspace)
.send();
Ok(())

View File

@ -5,19 +5,28 @@ const OBSERVABLE_CATEGORY: &str = "Workspace";
#[derive(ProtoBuf_Enum, Debug)]
pub(crate) enum FolderNotification {
Unknown = 0,
UserCreateWorkspace = 10,
UserDeleteWorkspace = 11,
WorkspaceUpdated = 12,
WorkspaceListUpdated = 13,
WorkspaceAppsChanged = 14,
WorkspaceSetting = 15,
AppUpdated = 21,
ViewUpdated = 31,
ViewDeleted = 32,
ViewRestored = 33,
ViewMoveToTrash = 34,
UserUnauthorized = 100,
TrashUpdated = 1000,
/// Trigger after creating a workspace
DidCreateWorkspace = 1,
/// Trigger after deleting a workspace
DidDeleteWorkspace = 2,
/// Trigger after updating a workspace
DidUpdateWorkspace = 3,
/// Trigger when the number of apps of the workspace is changed
DidUpdateWorkspaceApps = 4,
/// Trigger when the settings of the workspace are changed. The changes including the latest visiting view, etc
DidUpdateWorkspaceSetting = 5,
/// Trigger when the properties including rename,update description of the app are changed
DidUpdateApp = 20,
/// Trigger when the properties including rename,update description of the view are changed
DidUpdateView = 30,
/// Trigger after deleting the view
DidDeleteView = 31,
/// Trigger when restore the view from trash
DidRestoreView = 32,
/// Trigger after moving the view to trash
DidMoveViewToTrash = 33,
/// Trigger when the number of trash is changed
DidUpdateTrash = 34,
}
impl std::default::Default for FolderNotification {

View File

@ -72,7 +72,6 @@ impl AppController {
Ok(Some(app))
})
.await?;
self.read_app_on_server(params)?;
Ok(app)
}
@ -89,7 +88,7 @@ impl AppController {
})
.await?
.into();
send_notification(&app_id, FolderNotification::AppUpdated)
send_notification(&app_id, FolderNotification::DidUpdateApp)
.payload(app)
.send();
self.update_app_on_server(params)?;
@ -147,34 +146,6 @@ impl AppController {
Ok(())
}
#[tracing::instrument(level = "trace", skip(self), err)]
fn read_app_on_server(&self, params: AppIdPB) -> Result<(), FlowyError> {
let token = self.user.token()?;
let server = self.cloud_service.clone();
let persistence = self.persistence.clone();
tokio::spawn(async move {
match server.read_app(&token, params).await {
Ok(Some(app_rev)) => {
match persistence
.begin_transaction(|transaction| transaction.create_app(app_rev.clone()))
.await
{
Ok(_) => {
let app: AppPB = app_rev.into();
send_notification(&app.id, FolderNotification::AppUpdated)
.payload(app)
.send();
}
Err(e) => log::error!("Save app failed: {:?}", e),
}
}
Ok(None) => {}
Err(e) => log::error!("Read app failed: {:?}", e),
}
});
Ok(())
}
fn listen_trash_controller_event(&self) {
let mut rx = self.trash_controller.subscribe();
let persistence = self.persistence.clone();
@ -246,7 +217,7 @@ fn notify_apps_changed<'a>(
.map(|app_rev| app_rev.into())
.collect();
let repeated_app = RepeatedAppPB { items };
send_notification(workspace_id, FolderNotification::WorkspaceAppsChanged)
send_notification(workspace_id, FolderNotification::DidUpdateWorkspaceApps)
.payload(repeated_app)
.send();
Ok(())

View File

@ -206,7 +206,7 @@ impl TrashController {
fn notify_trash_changed<T: Into<RepeatedTrashPB>>(repeated_trash: T) {
let repeated_trash = repeated_trash.into();
tracing::Span::current().record("n_trash", repeated_trash.len());
send_anonymous_notification(FolderNotification::TrashUpdated)
send_anonymous_notification(FolderNotification::DidUpdateTrash)
.payload(repeated_trash)
.send();
}

View File

@ -4,7 +4,7 @@ use crate::manager::{ViewDataProcessor, ViewDataProcessorMap};
use crate::{
entities::{
trash::{RepeatedTrashIdPB, TrashType},
view::{CreateViewParams, UpdateViewParams, ViewIdPB, ViewPB},
view::{CreateViewParams, UpdateViewParams, ViewPB},
},
errors::{FlowyError, FlowyResult},
event_map::{FolderCouldServiceV1, WorkspaceUser},
@ -194,7 +194,7 @@ impl ViewController {
})
.await?;
send_notification(view_id, FolderNotification::ViewMoveToTrash)
send_notification(view_id, FolderNotification::DidMoveViewToTrash)
.payload(deleted_view)
.send();
@ -260,7 +260,7 @@ impl ViewController {
transaction.update_view(changeset)?;
let view_rev = transaction.read_view(&view_id)?;
let view: ViewPB = view_rev.clone().into();
send_notification(&view_id, FolderNotification::ViewUpdated)
send_notification(&view_id, FolderNotification::DidUpdateView)
.payload(view)
.send();
notify_views_changed(&view_rev.app_id, self.trash_controller.clone(), &transaction)?;
@ -310,35 +310,6 @@ impl ViewController {
Ok(())
}
#[tracing::instrument(level = "debug", skip(self), err)]
fn read_view_on_server(&self, params: ViewIdPB) -> Result<(), FlowyError> {
let token = self.user.token()?;
let server = self.cloud_service.clone();
let persistence = self.persistence.clone();
// TODO: Retry with RetryAction?
tokio::spawn(async move {
match server.read_view(&token, params).await {
Ok(Some(view_rev)) => {
match persistence
.begin_transaction(|transaction| transaction.create_view(view_rev.clone()))
.await
{
Ok(_) => {
let view: ViewPB = view_rev.into();
send_notification(&view.id, FolderNotification::ViewUpdated)
.payload(view)
.send();
}
Err(e) => log::error!("Save view failed: {:?}", e),
}
}
Ok(None) => {}
Err(e) => log::error!("Read view failed: {:?}", e),
}
});
Ok(())
}
fn listen_trash_can_event(&self) {
let mut rx = self.trash_controller.subscribe();
let persistence = self.persistence.clone();
@ -407,7 +378,7 @@ async fn handle_trash_event(
let view_revs = read_local_views_with_transaction(identifiers, &transaction)?;
for view_rev in view_revs {
notify_views_changed(&view_rev.app_id, trash_can.clone(), &transaction)?;
notify_dart(view_rev.into(), FolderNotification::ViewDeleted);
notify_dart(view_rev.into(), FolderNotification::DidDeleteView);
}
Ok(())
})
@ -420,7 +391,7 @@ async fn handle_trash_event(
let view_revs = read_local_views_with_transaction(identifiers, &transaction)?;
for view_rev in view_revs {
notify_views_changed(&view_rev.app_id, trash_can.clone(), &transaction)?;
notify_dart(view_rev.into(), FolderNotification::ViewRestored);
notify_dart(view_rev.into(), FolderNotification::DidRestoreView);
}
Ok(())
})
@ -506,7 +477,7 @@ fn notify_views_changed<'a>(
app_rev.belongings.retain(|view| !trash_ids.contains(&view.id));
let app: AppPB = app_rev.into();
send_notification(belong_to_id, FolderNotification::AppUpdated)
send_notification(belong_to_id, FolderNotification::DidUpdateApp)
.payload(app)
.send();

View File

@ -53,7 +53,7 @@ impl WorkspaceController {
.map(|workspace_rev| workspace_rev.into())
.collect();
let repeated_workspace = RepeatedWorkspacePB { items: workspaces };
send_notification(&token, FolderNotification::UserCreateWorkspace)
send_notification(&token, FolderNotification::DidCreateWorkspace)
.payload(repeated_workspace)
.send();
set_current_workspace(&user_id, &workspace.id);
@ -73,7 +73,7 @@ impl WorkspaceController {
})
.await?;
send_notification(&workspace_id, FolderNotification::WorkspaceUpdated)
send_notification(&workspace_id, FolderNotification::DidUpdateWorkspace)
.payload(workspace)
.send();
self.update_workspace_on_server(params)?;
@ -92,7 +92,7 @@ impl WorkspaceController {
self.read_workspaces(None, &user_id, &transaction)
})
.await?;
send_notification(&token, FolderNotification::UserDeleteWorkspace)
send_notification(&token, FolderNotification::DidDeleteWorkspace)
.payload(repeated_workspace)
.send();
self.delete_workspace_on_server(workspace_id)?;
@ -236,7 +236,7 @@ pub async fn notify_workspace_setting_did_change(
})
.await?;
send_notification(&token, FolderNotification::WorkspaceSetting)
send_notification(&token, FolderNotification::DidUpdateWorkspaceSetting)
.payload(workspace_setting)
.send();
Ok(())

View File

@ -6,7 +6,6 @@ use crate::entities::{
use crate::{
errors::FlowyError,
manager::FolderManager,
notification::{send_notification, FolderNotification},
services::{get_current_workspace, read_workspace_apps, WorkspaceController},
};
use lib_dispatch::prelude::{data_result, AFPluginData, AFPluginState, DataResult};
@ -71,7 +70,6 @@ pub(crate) async fn read_workspaces_handler(
Ok(workspaces)
})
.await?;
let _ = read_workspaces_on_server(folder, user_id, params);
data_result(workspaces)
}
@ -81,10 +79,6 @@ pub async fn read_cur_workspace_handler(
) -> DataResult<WorkspaceSettingPB, FlowyError> {
let user_id = folder.user.user_id()?;
let workspace_id = get_current_workspace(&user_id)?;
let params = WorkspaceIdPB {
value: Some(workspace_id.clone()),
};
let workspace = folder
.persistence
.begin_transaction(|transaction| {
@ -101,60 +95,5 @@ pub async fn read_cur_workspace_handler(
.unwrap_or(None)
.map(|view_rev| view_rev.into());
let setting = WorkspaceSettingPB { workspace, latest_view };
let _ = read_workspaces_on_server(folder, user_id, params);
data_result(setting)
}
#[tracing::instrument(level = "trace", skip(folder_manager), err)]
fn read_workspaces_on_server(
folder_manager: AFPluginState<Arc<FolderManager>>,
user_id: String,
params: WorkspaceIdPB,
) -> Result<(), FlowyError> {
let (token, server) = (folder_manager.user.token()?, folder_manager.cloud_service.clone());
let persistence = folder_manager.persistence.clone();
tokio::spawn(async move {
let workspace_revs = server.read_workspace(&token, params).await?;
persistence
.begin_transaction(|transaction| {
for workspace_rev in &workspace_revs {
let m_workspace = workspace_rev.clone();
let app_revs = m_workspace.apps.clone();
transaction.create_workspace(&user_id, m_workspace)?;
tracing::trace!("Save {} apps", app_revs.len());
for app_rev in app_revs {
let view_revs = app_rev.belongings.clone();
match transaction.create_app(app_rev) {
Ok(_) => {}
Err(e) => log::error!("create app failed: {:?}", e),
}
tracing::trace!("Save {} views", view_revs.len());
for view_rev in view_revs {
match transaction.create_view(view_rev) {
Ok(_) => {}
Err(e) => log::error!("create view failed: {:?}", e),
}
}
}
}
Ok(())
})
.await?;
let repeated_workspace = RepeatedWorkspacePB {
items: workspace_revs
.into_iter()
.map(|workspace_rev| workspace_rev.into())
.collect(),
};
send_notification(&token, FolderNotification::WorkspaceListUpdated)
.payload(repeated_workspace)
.send();
Result::<(), FlowyError>::Ok(())
});
Ok(())
}