From ad5213cfad52b2cc06850658864de6ed3810b588 Mon Sep 17 00:00:00 2001 From: "Nathan.fooo" <86001920+appflowy@users.noreply.github.com> Date: Tue, 14 Mar 2023 01:02:54 +0800 Subject: [PATCH] feat: get all databases (#1983) --- .../application/database_controller.dart | 22 ++-- .../application/database_service.dart | 118 +---------------- .../application/database_view_service.dart | 121 ++++++++++++++++++ .../application/field/field_controller.dart | 8 +- .../plugins/base/built_in_page_widget.dart | 2 +- .../plugins/base/link_to_page_widget.dart | 2 +- .../workspace/application/app/app_bloc.dart | 4 +- .../application/app/app_service.dart | 15 ++- .../menu/menu_view_section_bloc.dart | 4 +- .../test/bloc_test/board_test/util.dart | 2 +- .../grid_test/filter/filter_util.dart | 2 +- .../test/bloc_test/grid_test/util.dart | 2 +- .../src/entities/database_entities.rs | 6 +- .../flowy-database/src/event_handler.rs | 8 +- .../rust-lib/flowy-database/src/event_map.rs | 3 +- .../rust-lib/flowy-database/src/manager.rs | 13 +- .../src/services/database/database_editor.rs | 4 +- .../src/services/persistence/database_ref.rs | 9 +- .../database/database_ref_test/script.rs | 28 ++-- .../tests/database/database_ref_test/test.rs | 50 +++++--- 20 files changed, 234 insertions(+), 189 deletions(-) create mode 100644 frontend/appflowy_flutter/lib/plugins/database_view/application/database_view_service.dart diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/database_controller.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/database_controller.dart index 5f3fe587b5..e075cf5b92 100644 --- a/frontend/appflowy_flutter/lib/plugins/database_view/application/database_controller.dart +++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/database_controller.dart @@ -12,7 +12,7 @@ import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'; import 'package:collection/collection.dart'; import 'dart:async'; import 'package:dartz/dartz.dart'; -import 'database_service.dart'; +import 'database_view_service.dart'; import 'defines.dart'; import 'layout/layout_setting_listener.dart'; import 'row/row_cache.dart'; @@ -67,7 +67,7 @@ class DatabaseCallbacks { class DatabaseController { final String viewId; - final DatabaseBackendService _databaseBackendSvc; + final DatabaseViewBackendService _databaseViewBackendSvc; final FieldController fieldController; late DatabaseViewCache _viewCache; final LayoutTypePB layoutType; @@ -87,7 +87,7 @@ class DatabaseController { DatabaseController({required ViewPB view, required this.layoutType}) : viewId = view.id, - _databaseBackendSvc = DatabaseBackendService(viewId: view.id), + _databaseViewBackendSvc = DatabaseViewBackendService(viewId: view.id), fieldController = FieldController(viewId: view.id), groupListener = DatabaseGroupListener(view.id), layoutListener = DatabaseLayoutListener(view.id) { @@ -112,7 +112,7 @@ class DatabaseController { } Future> open() async { - return _databaseBackendSvc.openGrid().then((result) { + return _databaseViewBackendSvc.openGrid().then((result) { return result.fold( (database) async { _databaseCallbacks?.onDatabaseChanged?.call(database); @@ -152,7 +152,7 @@ class DatabaseController { cellDataByFieldId = rowBuilder.build(); } - return _databaseBackendSvc.createRow( + return _databaseViewBackendSvc.createRow( startRowId: startRowId, groupId: groupId, cellDataByFieldId: cellDataByFieldId, @@ -161,7 +161,7 @@ class DatabaseController { Future> moveRow(RowPB fromRow, {RowPB? toRow, String? groupId}) { - return _databaseBackendSvc.moveRow( + return _databaseViewBackendSvc.moveRow( fromRowId: fromRow.id, toGroupId: groupId, toRowId: toRow?.id, @@ -170,7 +170,7 @@ class DatabaseController { Future> moveGroup( {required String fromGroupId, required String toGroupId}) { - return _databaseBackendSvc.moveGroup( + return _databaseViewBackendSvc.moveGroup( fromGroupId: fromGroupId, toGroupId: toGroupId, ); @@ -178,7 +178,7 @@ class DatabaseController { Future updateCalenderLayoutSetting( CalendarLayoutSettingsPB layoutSetting) async { - await _databaseBackendSvc + await _databaseViewBackendSvc .updateLayoutSetting(calendarLayoutSetting: layoutSetting) .then((result) { result.fold((l) => null, (r) => Log.error(r)); @@ -186,13 +186,13 @@ class DatabaseController { } Future dispose() async { - await _databaseBackendSvc.closeView(); + await _databaseViewBackendSvc.closeView(); await fieldController.dispose(); await groupListener.stop(); } Future _loadGroups() async { - final result = await _databaseBackendSvc.loadGroups(); + final result = await _databaseViewBackendSvc.loadGroups(); return Future( () => result.fold( (groups) { @@ -204,7 +204,7 @@ class DatabaseController { } Future _loadLayoutSetting() async { - _databaseBackendSvc.getLayoutSetting(layoutType).then((result) { + _databaseViewBackendSvc.getLayoutSetting(layoutType).then((result) { result.fold( (l) { _layoutCallbacks?.onLoadLayout(l); diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/database_service.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/database_service.dart index 0d7fdd543f..4d12cae839 100644 --- a/frontend/appflowy_flutter/lib/plugins/database_view/application/database_service.dart +++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/database_service.dart @@ -1,121 +1,13 @@ -import 'package:appflowy_backend/protobuf/flowy-database/calendar_entities.pb.dart'; -import 'package:appflowy_backend/protobuf/flowy-database/database_entities.pb.dart'; -import 'package:appflowy_backend/protobuf/flowy-database/group_changeset.pb.dart'; -import 'package:appflowy_backend/protobuf/flowy-database/setting_entities.pb.dart'; -import 'package:dartz/dartz.dart'; import 'package:appflowy_backend/dispatch/dispatch.dart'; +import 'package:appflowy_backend/protobuf/flowy-database/database_entities.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart'; -import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'; -import 'package:appflowy_backend/protobuf/flowy-database/field_entities.pb.dart'; -import 'package:appflowy_backend/protobuf/flowy-database/group.pb.dart'; -import 'package:appflowy_backend/protobuf/flowy-database/row_entities.pb.dart'; +import 'package:dartz/dartz.dart'; class DatabaseBackendService { - final String viewId; - DatabaseBackendService({ - required this.viewId, - }); - - Future> openGrid() async { - await FolderEventSetLatestView(ViewIdPB(value: viewId)).send(); - - final payload = DatabaseViewIdPB(value: viewId); - return DatabaseEventGetDatabase(payload).send(); - } - - Future> createRow({ - String? startRowId, - String? groupId, - Map? cellDataByFieldId, - }) { - var payload = CreateRowPayloadPB.create()..viewId = viewId; - if (startRowId != null) { - payload.startRowId = startRowId; - } - - if (groupId != null) { - payload.groupId = groupId; - } - - if (cellDataByFieldId != null && cellDataByFieldId.isNotEmpty) { - payload.data = RowDataPB(cellDataByFieldId: cellDataByFieldId); - } - - return DatabaseEventCreateRow(payload).send(); - } - - Future> moveRow({ - required String fromRowId, - required String? toGroupId, - required String? toRowId, - }) { - var payload = MoveGroupRowPayloadPB.create() - ..viewId = viewId - ..fromRowId = fromRowId; - if (toGroupId != null) { - payload.toGroupId = toGroupId; - } - - if (toRowId != null) { - payload.toRowId = toRowId; - } - - return DatabaseEventMoveGroupRow(payload).send(); - } - - Future> moveGroup({ - required String fromGroupId, - required String toGroupId, - }) { - final payload = MoveGroupPayloadPB.create() - ..viewId = viewId - ..fromGroupId = fromGroupId - ..toGroupId = toGroupId; - - return DatabaseEventMoveGroup(payload).send(); - } - - Future, FlowyError>> getFields( - {List? fieldIds}) { - var payload = GetFieldPayloadPB.create()..viewId = viewId; - - if (fieldIds != null) { - payload.fieldIds = RepeatedFieldIdPB(items: fieldIds); - } - return DatabaseEventGetFields(payload).send().then((result) { + static Future, FlowyError>> + getAllDatabase() { + return DatabaseEventGetDatabases().send().then((result) { return result.fold((l) => left(l.items), (r) => right(r)); }); } - - Future> getLayoutSetting( - LayoutTypePB layoutType) { - final payload = DatabaseLayoutIdPB.create() - ..viewId = viewId - ..layout = layoutType; - return DatabaseEventGetLayoutSetting(payload).send(); - } - - Future> updateLayoutSetting( - {CalendarLayoutSettingsPB? calendarLayoutSetting}) { - final layoutSetting = LayoutSettingPB.create(); - if (calendarLayoutSetting != null) { - layoutSetting.calendar = calendarLayoutSetting; - } - - final payload = UpdateLayoutSettingPB.create() - ..viewId = viewId - ..layoutSetting = layoutSetting; - - return DatabaseEventSetLayoutSetting(payload).send(); - } - - Future> closeView() { - final request = ViewIdPB(value: viewId); - return FolderEventCloseView(request).send(); - } - - Future> loadGroups() { - final payload = DatabaseViewIdPB(value: viewId); - return DatabaseEventGetGroups(payload).send(); - } } diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/database_view_service.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/database_view_service.dart new file mode 100644 index 0000000000..842eeac90c --- /dev/null +++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/database_view_service.dart @@ -0,0 +1,121 @@ +import 'package:appflowy_backend/protobuf/flowy-database/calendar_entities.pb.dart'; +import 'package:appflowy_backend/protobuf/flowy-database/database_entities.pb.dart'; +import 'package:appflowy_backend/protobuf/flowy-database/group_changeset.pb.dart'; +import 'package:appflowy_backend/protobuf/flowy-database/setting_entities.pb.dart'; +import 'package:dartz/dartz.dart'; +import 'package:appflowy_backend/dispatch/dispatch.dart'; +import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart'; +import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'; +import 'package:appflowy_backend/protobuf/flowy-database/field_entities.pb.dart'; +import 'package:appflowy_backend/protobuf/flowy-database/group.pb.dart'; +import 'package:appflowy_backend/protobuf/flowy-database/row_entities.pb.dart'; + +class DatabaseViewBackendService { + final String viewId; + DatabaseViewBackendService({ + required this.viewId, + }); + + Future> openGrid() async { + await FolderEventSetLatestView(ViewIdPB(value: viewId)).send(); + + final payload = DatabaseViewIdPB(value: viewId); + return DatabaseEventGetDatabase(payload).send(); + } + + Future> createRow({ + String? startRowId, + String? groupId, + Map? cellDataByFieldId, + }) { + var payload = CreateRowPayloadPB.create()..viewId = viewId; + if (startRowId != null) { + payload.startRowId = startRowId; + } + + if (groupId != null) { + payload.groupId = groupId; + } + + if (cellDataByFieldId != null && cellDataByFieldId.isNotEmpty) { + payload.data = RowDataPB(cellDataByFieldId: cellDataByFieldId); + } + + return DatabaseEventCreateRow(payload).send(); + } + + Future> moveRow({ + required String fromRowId, + required String? toGroupId, + required String? toRowId, + }) { + var payload = MoveGroupRowPayloadPB.create() + ..viewId = viewId + ..fromRowId = fromRowId; + if (toGroupId != null) { + payload.toGroupId = toGroupId; + } + + if (toRowId != null) { + payload.toRowId = toRowId; + } + + return DatabaseEventMoveGroupRow(payload).send(); + } + + Future> moveGroup({ + required String fromGroupId, + required String toGroupId, + }) { + final payload = MoveGroupPayloadPB.create() + ..viewId = viewId + ..fromGroupId = fromGroupId + ..toGroupId = toGroupId; + + return DatabaseEventMoveGroup(payload).send(); + } + + Future, FlowyError>> getFields( + {List? fieldIds}) { + var payload = GetFieldPayloadPB.create()..viewId = viewId; + + if (fieldIds != null) { + payload.fieldIds = RepeatedFieldIdPB(items: fieldIds); + } + return DatabaseEventGetFields(payload).send().then((result) { + return result.fold((l) => left(l.items), (r) => right(r)); + }); + } + + Future> getLayoutSetting( + LayoutTypePB layoutType) { + final payload = DatabaseLayoutIdPB.create() + ..viewId = viewId + ..layout = layoutType; + return DatabaseEventGetLayoutSetting(payload).send(); + } + + Future> updateLayoutSetting( + {CalendarLayoutSettingsPB? calendarLayoutSetting}) { + final layoutSetting = LayoutSettingPB.create(); + if (calendarLayoutSetting != null) { + layoutSetting.calendar = calendarLayoutSetting; + } + + final payload = UpdateLayoutSettingPB.create() + ..viewId = viewId + ..layoutSetting = layoutSetting; + + return DatabaseEventSetLayoutSetting(payload).send(); + } + + Future> closeView() { + final request = ViewIdPB(value: viewId); + return FolderEventCloseView(request).send(); + } + + Future> loadGroups() { + final payload = DatabaseViewIdPB(value: viewId); + return DatabaseEventGetGroups(payload).send(); + } +} diff --git a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_controller.dart b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_controller.dart index 7e169cde09..6904835b24 100644 --- a/frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_controller.dart +++ b/frontend/appflowy_flutter/lib/plugins/database_view/application/field/field_controller.dart @@ -11,7 +11,7 @@ import 'package:appflowy_backend/protobuf/flowy-database/util.pb.dart'; import 'package:flutter/foundation.dart'; import '../../grid/presentation/widgets/filter/filter_info.dart'; import '../../grid/presentation/widgets/sort/sort_info.dart'; -import '../database_service.dart'; +import '../database_view_service.dart'; import '../filter/filter_listener.dart'; import '../filter/filter_service.dart'; import '../row/row_cache.dart'; @@ -80,7 +80,7 @@ class FieldController { final SortsListener _sortsListener; // FFI services - final DatabaseBackendService _databaseBackendSvc; + final DatabaseViewBackendService _databaseViewBackendSvc; final SettingBackendService _settingBackendSvc; final FilterBackendService _filterBackendSvc; final SortBackendService _sortBackendSvc; @@ -152,7 +152,7 @@ class FieldController { _settingListener = DatabaseSettingListener(viewId: viewId), _filterBackendSvc = FilterBackendService(viewId: viewId), _filtersListener = FiltersListener(viewId: viewId), - _databaseBackendSvc = DatabaseBackendService(viewId: viewId), + _databaseViewBackendSvc = DatabaseViewBackendService(viewId: viewId), _sortBackendSvc = SortBackendService(viewId: viewId), _sortsListener = SortsListener(viewId: viewId), _settingBackendSvc = SettingBackendService(viewId: viewId) { @@ -448,7 +448,7 @@ class FieldController { Future> loadFields({ required List fieldIds, }) async { - final result = await _databaseBackendSvc.getFields(fieldIds: fieldIds); + final result = await _databaseViewBackendSvc.getFields(fieldIds: fieldIds); return Future( () => result.fold( (newFields) { diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/built_in_page_widget.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/built_in_page_widget.dart index a940e4d712..3aa729d051 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/built_in_page_widget.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/built_in_page_widget.dart @@ -59,7 +59,7 @@ class _BuiltInPageWidgetState extends State { child: CircularProgressIndicator(), ); }, - future: AppService().getView(appID, gridID), + future: AppBackendService().getView(appID, gridID), ); } diff --git a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/link_to_page_widget.dart b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/link_to_page_widget.dart index c30b7ddc16..ebce76461e 100644 --- a/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/link_to_page_widget.dart +++ b/frontend/appflowy_flutter/lib/plugins/document/presentation/plugins/base/link_to_page_widget.dart @@ -169,7 +169,7 @@ class _LinkToPageMenuState extends State { ); } }, - future: AppService().fetchViews(widget.layoutType), + future: AppBackendService().fetchViews(widget.layoutType), ); } diff --git a/frontend/appflowy_flutter/lib/workspace/application/app/app_bloc.dart b/frontend/appflowy_flutter/lib/workspace/application/app/app_bloc.dart index 97a7d3f645..2515750718 100644 --- a/frontend/appflowy_flutter/lib/workspace/application/app/app_bloc.dart +++ b/frontend/appflowy_flutter/lib/workspace/application/app/app_bloc.dart @@ -18,11 +18,11 @@ import 'package:dartz/dartz.dart'; part 'app_bloc.freezed.dart'; class AppBloc extends Bloc { - final AppService appService; + final AppBackendService appService; final AppListener appListener; AppBloc({required AppPB app}) - : appService = AppService(), + : appService = AppBackendService(), appListener = AppListener(appId: app.id), super(AppState.initial(app)) { on((event, emit) async { diff --git a/frontend/appflowy_flutter/lib/workspace/application/app/app_service.dart b/frontend/appflowy_flutter/lib/workspace/application/app/app_service.dart index 3be08aa78c..c54d2ad602 100644 --- a/frontend/appflowy_flutter/lib/workspace/application/app/app_service.dart +++ b/frontend/appflowy_flutter/lib/workspace/application/app/app_service.dart @@ -8,7 +8,7 @@ import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-folder/app.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'; -class AppService { +class AppBackendService { Future> readApp({required String appId}) { final payload = AppIdPB.create()..value = appId; @@ -21,9 +21,18 @@ class AppService { String? desc, required ViewLayoutTypePB layoutType, - /// The initial data should be the JSON of the doucment - /// For example: {"document":{"type":"editor","children":[]}} + /// The initial data should be the JSON of the document. + /// Currently, only support create document with initial data. + /// + /// The initial data must be follow this format as shown below. + /// {"document":{"type":"editor","children":[]}} String? initialData, + + /// The [ext] is used to pass through the custom configuration + /// to the backend. + /// Linking the view to the existing database, it needs to pass + /// the database id. For example: "database_id": "xxx" + /// Map ext = const {}, }) { final payload = CreateViewPayloadPB.create() diff --git a/frontend/appflowy_flutter/lib/workspace/application/menu/menu_view_section_bloc.dart b/frontend/appflowy_flutter/lib/workspace/application/menu/menu_view_section_bloc.dart index 42fdc4c361..fdf82a91a2 100644 --- a/frontend/appflowy_flutter/lib/workspace/application/menu/menu_view_section_bloc.dart +++ b/frontend/appflowy_flutter/lib/workspace/application/menu/menu_view_section_bloc.dart @@ -13,11 +13,11 @@ class ViewSectionBloc extends Bloc { void Function()? _viewsListener; void Function()? _selectedViewlistener; final AppViewDataContext _appViewData; - late final AppService _appService; + late final AppBackendService _appService; ViewSectionBloc({ required AppViewDataContext appViewData, - }) : _appService = AppService(), + }) : _appService = AppBackendService(), _appViewData = appViewData, super(ViewSectionState.initial(appViewData)) { on((event, emit) async { diff --git a/frontend/appflowy_flutter/test/bloc_test/board_test/util.dart b/frontend/appflowy_flutter/test/bloc_test/board_test/util.dart index 64d7fd785d..88638912db 100644 --- a/frontend/appflowy_flutter/test/bloc_test/board_test/util.dart +++ b/frontend/appflowy_flutter/test/bloc_test/board_test/util.dart @@ -30,7 +30,7 @@ class AppFlowyBoardTest { Future createTestBoard() async { final app = await unitTest.createTestApp(); final builder = BoardPluginBuilder(); - return AppService() + return AppBackendService() .createView( appId: app.id, name: "Test Board", diff --git a/frontend/appflowy_flutter/test/bloc_test/grid_test/filter/filter_util.dart b/frontend/appflowy_flutter/test/bloc_test/grid_test/filter/filter_util.dart index 92a1da6e8f..b7b409f0e5 100644 --- a/frontend/appflowy_flutter/test/bloc_test/grid_test/filter/filter_util.dart +++ b/frontend/appflowy_flutter/test/bloc_test/grid_test/filter/filter_util.dart @@ -8,7 +8,7 @@ import '../util.dart'; Future createTestFilterGrid(AppFlowyGridTest gridTest) async { final app = await gridTest.unitTest.createTestApp(); final builder = GridPluginBuilder(); - final context = await AppService() + final context = await AppBackendService() .createView( appId: app.id, name: "Filter Grid", diff --git a/frontend/appflowy_flutter/test/bloc_test/grid_test/util.dart b/frontend/appflowy_flutter/test/bloc_test/grid_test/util.dart index fe1ec655a9..c68dffb976 100644 --- a/frontend/appflowy_flutter/test/bloc_test/grid_test/util.dart +++ b/frontend/appflowy_flutter/test/bloc_test/grid_test/util.dart @@ -165,7 +165,7 @@ class AppFlowyGridTest { Future createTestGrid() async { final app = await unitTest.createTestApp(); final builder = GridPluginBuilder(); - final context = await AppService() + final context = await AppBackendService() .createView( appId: app.id, name: "Test Grid", diff --git a/frontend/rust-lib/flowy-database/src/entities/database_entities.rs b/frontend/rust-lib/flowy-database/src/entities/database_entities.rs index 5a43c188fe..998b1db9b0 100644 --- a/frontend/rust-lib/flowy-database/src/entities/database_entities.rs +++ b/frontend/rust-lib/flowy-database/src/entities/database_entities.rs @@ -155,7 +155,7 @@ impl TryInto for MoveGroupRowPayloadPB { } #[derive(Debug, Default, ProtoBuf)] -pub struct DatabaseDescPB { +pub struct DatabaseDescriptionPB { #[pb(index = 1)] pub name: String, @@ -164,9 +164,9 @@ pub struct DatabaseDescPB { } #[derive(Debug, Default, ProtoBuf)] -pub struct RepeatedDatabaseDescPB { +pub struct RepeatedDatabaseDescriptionPB { #[pb(index = 1)] - pub items: Vec, + pub items: Vec, } #[derive(Debug, Clone, Default, ProtoBuf)] diff --git a/frontend/rust-lib/flowy-database/src/event_handler.rs b/frontend/rust-lib/flowy-database/src/event_handler.rs index 3e73790bb9..331d093024 100644 --- a/frontend/rust-lib/flowy-database/src/event_handler.rs +++ b/frontend/rust-lib/flowy-database/src/event_handler.rs @@ -575,17 +575,17 @@ pub(crate) async fn move_group_row_handler( #[tracing::instrument(level = "debug", skip(manager), err)] pub(crate) async fn get_databases_handler( manager: AFPluginState>, -) -> DataResult { +) -> DataResult { let items = manager .get_databases() .await? .into_iter() - .map(|database_info| DatabaseDescPB { + .map(|database_info| DatabaseDescriptionPB { name: database_info.name, database_id: database_info.database_id, }) - .collect::>(); - data_result_ok(RepeatedDatabaseDescPB { items }) + .collect::>(); + data_result_ok(RepeatedDatabaseDescriptionPB { items }) } #[tracing::instrument(level = "debug", skip(data, manager), err)] diff --git a/frontend/rust-lib/flowy-database/src/event_map.rs b/frontend/rust-lib/flowy-database/src/event_map.rs index 6eb9b02218..401bcc3b19 100644 --- a/frontend/rust-lib/flowy-database/src/event_map.rs +++ b/frontend/rust-lib/flowy-database/src/event_map.rs @@ -238,7 +238,8 @@ pub enum DatabaseEvent { #[event(input = "MoveGroupRowPayloadPB")] GroupByField = 113, - #[event(output = "RepeatedDatabaseDescPB")] + /// Returns all the databases + #[event(output = "RepeatedDatabaseDescriptionPB")] GetDatabases = 114, #[event(input = "UpdateLayoutSettingPB")] diff --git a/frontend/rust-lib/flowy-database/src/manager.rs b/frontend/rust-lib/flowy-database/src/manager.rs index 013208923f..650dc3ec64 100644 --- a/frontend/rust-lib/flowy-database/src/manager.rs +++ b/frontend/rust-lib/flowy-database/src/manager.rs @@ -7,7 +7,9 @@ use crate::services::database_view::{ make_database_view_rev_manager, make_database_view_revision_pad, DatabaseViewEditor, }; use crate::services::persistence::block_index::BlockRowIndexer; -use crate::services::persistence::database_ref::{DatabaseInfo, DatabaseRef, DatabaseRefIndexer}; +use crate::services::persistence::database_ref::{ + DatabaseInfo, DatabaseRefIndexer, DatabaseViewRef, +}; use crate::services::persistence::kv::DatabaseKVPersistence; use crate::services::persistence::migration::DatabaseMigration; use crate::services::persistence::rev_sqlite::{ @@ -192,7 +194,10 @@ impl DatabaseManager { self.database_ref_indexer.get_all_databases() } - pub async fn get_database_ref_views(&self, database_id: &str) -> FlowyResult> { + pub async fn get_database_ref_views( + &self, + database_id: &str, + ) -> FlowyResult> { self .database_ref_indexer .get_ref_views_with_database(database_id) @@ -425,13 +430,13 @@ pub async fn create_new_database( } impl DatabaseRefIndexerQuery for DatabaseRefIndexer { - fn get_ref_views(&self, database_id: &str) -> FlowyResult> { + fn get_ref_views(&self, database_id: &str) -> FlowyResult> { self.get_ref_views_with_database(database_id) } } impl DatabaseRefIndexerQuery for Arc { - fn get_ref_views(&self, database_id: &str) -> FlowyResult> { + fn get_ref_views(&self, database_id: &str) -> FlowyResult> { (**self).get_ref_views(database_id) } } diff --git a/frontend/rust-lib/flowy-database/src/services/database/database_editor.rs b/frontend/rust-lib/flowy-database/src/services/database/database_editor.rs index 7af6cdc44a..fa19ced144 100644 --- a/frontend/rust-lib/flowy-database/src/services/database/database_editor.rs +++ b/frontend/rust-lib/flowy-database/src/services/database/database_editor.rs @@ -18,7 +18,7 @@ use crate::services::database_view::{ }; use crate::services::filter::FilterType; use crate::services::persistence::block_index::BlockRowIndexer; -use crate::services::persistence::database_ref::DatabaseRef; +use crate::services::persistence::database_ref::DatabaseViewRef; use crate::services::row::{DatabaseBlockRow, DatabaseBlockRowRevision, RowRevisionBuilder}; use bytes::Bytes; use database_model::*; @@ -42,7 +42,7 @@ use std::sync::Arc; use tokio::sync::{broadcast, RwLock}; pub trait DatabaseRefIndexerQuery: Send + Sync + 'static { - fn get_ref_views(&self, database_id: &str) -> FlowyResult>; + fn get_ref_views(&self, database_id: &str) -> FlowyResult>; } pub struct DatabaseEditor { diff --git a/frontend/rust-lib/flowy-database/src/services/persistence/database_ref.rs b/frontend/rust-lib/flowy-database/src/services/persistence/database_ref.rs index 32fc4a8675..6ba13b8e1a 100644 --- a/frontend/rust-lib/flowy-database/src/services/persistence/database_ref.rs +++ b/frontend/rust-lib/flowy-database/src/services/persistence/database_ref.rs @@ -45,7 +45,10 @@ impl DatabaseRefIndexer { Ok(()) } - pub fn get_ref_views_with_database(&self, database_id: &str) -> FlowyResult> { + pub fn get_ref_views_with_database( + &self, + database_id: &str, + ) -> FlowyResult> { let conn = self.database.get_db_connection()?; let views = dsl::database_refs .filter(database_refs::database_id.like(database_id)) @@ -93,12 +96,12 @@ struct DatabaseRefRecord { database_id: String, } -pub struct DatabaseRef { +pub struct DatabaseViewRef { pub view_id: String, pub name: String, pub database_id: String, } -impl std::convert::From for DatabaseRef { +impl std::convert::From for DatabaseViewRef { fn from(record: DatabaseRefRecord) -> Self { Self { view_id: record.view_id, diff --git a/frontend/rust-lib/flowy-database/tests/database/database_ref_test/script.rs b/frontend/rust-lib/flowy-database/tests/database/database_ref_test/script.rs index bf5984a288..9e01ced934 100644 --- a/frontend/rust-lib/flowy-database/tests/database/database_ref_test/script.rs +++ b/frontend/rust-lib/flowy-database/tests/database/database_ref_test/script.rs @@ -2,12 +2,12 @@ use crate::database::block_test::util::DatabaseRowTestBuilder; use crate::database::database_editor::DatabaseEditorTest; use database_model::RowRevision; use flowy_database::services::database::DatabaseEditor; -use flowy_database::services::persistence::database_ref::{DatabaseInfo, DatabaseRef}; +use flowy_database::services::persistence::database_ref::{DatabaseInfo, DatabaseViewRef}; use std::collections::HashMap; use std::sync::Arc; -pub enum DatabaseRefScript { - LinkGridToDatabase { +pub enum LinkDatabaseTestScript { + CreateGridViewAndLinkToDatabase { database_id: String, }, #[allow(dead_code)] @@ -28,17 +28,17 @@ pub enum DatabaseRefScript { }, } -pub struct DatabaseRefTest { +pub struct LinkDatabaseTest { inner: DatabaseEditorTest, } -impl DatabaseRefTest { +impl LinkDatabaseTest { pub async fn new() -> Self { let inner = DatabaseEditorTest::new_grid().await; Self { inner } } - pub async fn run_scripts(&mut self, scripts: Vec) { + pub async fn run_scripts(&mut self, scripts: Vec) { for script in scripts { self.run_script(script).await; } @@ -61,7 +61,7 @@ impl DatabaseRefTest { .unwrap() } - pub async fn all_database_ref_views(&self, database_id: &str) -> Vec { + pub async fn all_database_ref_views(&self, database_id: &str) -> Vec { self .inner .sdk @@ -87,9 +87,9 @@ impl DatabaseRefTest { DatabaseRowTestBuilder::new(self.block_id(view_id).await, field_revs) } - pub async fn run_script(&mut self, script: DatabaseRefScript) { + pub async fn run_script(&mut self, script: LinkDatabaseTestScript) { match script { - DatabaseRefScript::LinkGridToDatabase { database_id } => { + LinkDatabaseTestScript::CreateGridViewAndLinkToDatabase { database_id } => { let mut ext = HashMap::new(); ext.insert("database_id".to_owned(), database_id); self @@ -99,7 +99,7 @@ impl DatabaseRefTest { .create_test_grid_view(&self.inner.app_id, "test link grid", ext) .await; }, - DatabaseRefScript::LinkBoardToDatabase { database_id } => { + LinkDatabaseTestScript::LinkBoardToDatabase { database_id } => { let mut ext = HashMap::new(); ext.insert("database_id".to_owned(), database_id); self @@ -109,7 +109,7 @@ impl DatabaseRefTest { .create_test_board_view(&self.inner.app_id, "test link board", ext) .await; }, - DatabaseRefScript::CreateNewGrid => { + LinkDatabaseTestScript::CreateNewGrid => { self .inner .sdk @@ -117,15 +117,15 @@ impl DatabaseRefTest { .create_test_grid_view(&self.inner.app_id, "Create test grid", HashMap::new()) .await; }, - DatabaseRefScript::AssertNumberOfDatabase { expected } => { + LinkDatabaseTestScript::AssertNumberOfDatabase { expected } => { let databases = self.all_databases().await; assert_eq!(databases.len(), expected); }, - DatabaseRefScript::CreateRow { view_id, row_rev } => { + LinkDatabaseTestScript::CreateRow { view_id, row_rev } => { let editor = self.get_database_editor(&view_id).await; let _ = editor.insert_rows(vec![row_rev]).await.unwrap(); }, - DatabaseRefScript::AssertNumberOfRows { view_id, expected } => { + LinkDatabaseTestScript::AssertNumberOfRows { view_id, expected } => { let editor = self.get_database_editor(&view_id).await; let rows = editor.get_all_row_revs(&view_id).await.unwrap(); assert_eq!(rows.len(), expected); diff --git a/frontend/rust-lib/flowy-database/tests/database/database_ref_test/test.rs b/frontend/rust-lib/flowy-database/tests/database/database_ref_test/test.rs index aec0451b47..3c07017cb3 100644 --- a/frontend/rust-lib/flowy-database/tests/database/database_ref_test/test.rs +++ b/frontend/rust-lib/flowy-database/tests/database/database_ref_test/test.rs @@ -1,11 +1,12 @@ -use crate::database::database_ref_test::script::DatabaseRefScript::*; -use crate::database::database_ref_test::script::DatabaseRefTest; +use crate::database::database_ref_test::script::LinkDatabaseTest; +use crate::database::database_ref_test::script::LinkDatabaseTestScript::*; #[tokio::test] -async fn database_ref_number_of_database_test() { - let mut test = DatabaseRefTest::new().await; +async fn number_of_database_test() { + let mut test = LinkDatabaseTest::new().await; test .run_scripts(vec![ + // After the LinkDatabaseTest initialize, it will create a grid. AssertNumberOfDatabase { expected: 1 }, CreateNewGrid, AssertNumberOfDatabase { expected: 2 }, @@ -14,12 +15,12 @@ async fn database_ref_number_of_database_test() { } #[tokio::test] -async fn database_ref_link_with_existing_database_test() { - let mut test = DatabaseRefTest::new().await; +async fn database_view_link_with_existing_database_test() { + let mut test = LinkDatabaseTest::new().await; let database = test.all_databases().await.pop().unwrap(); test .run_scripts(vec![ - LinkGridToDatabase { + CreateGridViewAndLinkToDatabase { database_id: database.database_id, }, AssertNumberOfDatabase { expected: 1 }, @@ -28,36 +29,48 @@ async fn database_ref_link_with_existing_database_test() { } #[tokio::test] -async fn database_ref_link_with_existing_database_row_test() { - let mut test = DatabaseRefTest::new().await; +async fn check_number_of_rows_in_linked_database_view() { + let mut test = LinkDatabaseTest::new().await; let database = test.all_databases().await.pop().unwrap(); + let view = test + .all_database_ref_views(&database.database_id) + .await + .remove(0); + test .run_scripts(vec![ - LinkGridToDatabase { + CreateGridViewAndLinkToDatabase { database_id: database.database_id, }, - AssertNumberOfDatabase { expected: 1 }, + // The initial number of rows is 6 + AssertNumberOfRows { + view_id: view.view_id.clone(), + expected: 6, + }, ]) .await; } #[tokio::test] -async fn database_ref_create_new_row_test() { - let mut test = DatabaseRefTest::new().await; +async fn multiple_views_share_database_rows() { + let mut test = LinkDatabaseTest::new().await; + + // After the LinkDatabaseTest initialize, it will create a default database + // with Grid layout. let database = test.all_databases().await.pop().unwrap(); - let database_views = test.all_database_ref_views(&database.database_id).await; + let mut database_views = test.all_database_ref_views(&database.database_id).await; assert_eq!(database_views.len(), 1); - let view_id_1 = database_views.get(0).unwrap().view_id.clone(); + let view = database_views.remove(0); + test .run_scripts(vec![ AssertNumberOfRows { - view_id: view_id_1.clone(), + view_id: view.view_id.clone(), expected: 6, }, - LinkGridToDatabase { + CreateGridViewAndLinkToDatabase { database_id: database.database_id.clone(), }, - AssertNumberOfDatabase { expected: 1 }, ]) .await; @@ -84,6 +97,7 @@ async fn database_ref_create_new_row_test() { view_id: view_id_2, expected: 7, }, + AssertNumberOfDatabase { expected: 1 }, ]) .await; }