workspace_repo.dart 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import 'dart:async';
  2. import 'dart:typed_data';
  3. import 'package:dartz/dartz.dart';
  4. import 'package:flowy_log/flowy_log.dart';
  5. import 'package:flowy_sdk/dispatch/dispatch.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-dart-notify/subject.pb.dart';
  7. import 'package:flowy_sdk/protobuf/flowy-user/user_profile.pb.dart';
  8. import 'package:flowy_sdk/protobuf/flowy-workspace-infra/app_create.pb.dart';
  9. import 'package:flowy_sdk/protobuf/flowy-workspace-infra/workspace_create.pb.dart';
  10. import 'package:flowy_sdk/protobuf/flowy-workspace-infra/workspace_query.pb.dart';
  11. import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
  12. import 'package:flowy_sdk/protobuf/flowy-workspace/observable.pb.dart';
  13. import 'package:flowy_sdk/rust_stream.dart';
  14. import 'package:app_flowy/workspace/domain/i_workspace.dart';
  15. import 'helper.dart';
  16. class WorkspaceRepo {
  17. UserProfile user;
  18. String workspaceId;
  19. WorkspaceRepo({
  20. required this.user,
  21. required this.workspaceId,
  22. });
  23. Future<Either<App, WorkspaceError>> createApp(String appName, String desc) {
  24. final request = CreateAppRequest.create()
  25. ..name = appName
  26. ..workspaceId = workspaceId
  27. ..desc = desc;
  28. return WorkspaceEventCreateApp(request).send();
  29. }
  30. Future<Either<Workspace, WorkspaceError>> getWorkspace() {
  31. final request = QueryWorkspaceRequest.create()..workspaceId = workspaceId;
  32. return WorkspaceEventReadWorkspaces(request).send().then((result) {
  33. return result.fold(
  34. (workspaces) {
  35. assert(workspaces.items.length == 1);
  36. if (workspaces.items.isEmpty) {
  37. return right(WorkspaceError.create()..msg = "Workspace not found");
  38. } else {
  39. return left(workspaces.items[0]);
  40. }
  41. },
  42. (error) => right(error),
  43. );
  44. });
  45. }
  46. Future<Either<List<App>, WorkspaceError>> getApps() {
  47. final request = QueryWorkspaceRequest.create()..workspaceId = workspaceId;
  48. return WorkspaceEventReadWorkspaceApps(request).send().then((result) {
  49. return result.fold(
  50. (apps) => left(apps.items),
  51. (error) => right(error),
  52. );
  53. });
  54. }
  55. }
  56. class WorkspaceListenerRepo {
  57. StreamSubscription<SubscribeObject>? _subscription;
  58. WorkspaceAppsChangedCallback? _appsChanged;
  59. WorkspaceUpdatedCallback? _update;
  60. late WorkspaceNotificationParser _parser;
  61. final UserProfile user;
  62. final String workspaceId;
  63. WorkspaceListenerRepo({
  64. required this.user,
  65. required this.workspaceId,
  66. });
  67. void startListening({
  68. WorkspaceAppsChangedCallback? appsChanged,
  69. WorkspaceUpdatedCallback? update,
  70. }) {
  71. _appsChanged = appsChanged;
  72. _update = update;
  73. _parser = WorkspaceNotificationParser(
  74. id: workspaceId,
  75. callback: (ty, result) {
  76. _handleObservableType(ty, result);
  77. },
  78. );
  79. _subscription = RustStreamReceiver.listen((observable) => _parser.parse(observable));
  80. }
  81. void _handleObservableType(WorkspaceNotification ty, Either<Uint8List, WorkspaceError> result) {
  82. switch (ty) {
  83. case WorkspaceNotification.WorkspaceUpdated:
  84. if (_update != null) {
  85. result.fold(
  86. (payload) {
  87. final workspace = Workspace.fromBuffer(payload);
  88. _update!(workspace.name, workspace.desc);
  89. },
  90. (error) => Log.error(error),
  91. );
  92. }
  93. break;
  94. case WorkspaceNotification.WorkspaceAppsChanged:
  95. if (_appsChanged != null) {
  96. result.fold(
  97. (payload) => _appsChanged!(
  98. left(RepeatedApp.fromBuffer(payload).items),
  99. ),
  100. (error) => _appsChanged!(right(error)),
  101. );
  102. }
  103. break;
  104. default:
  105. break;
  106. }
  107. }
  108. Future<void> close() async {
  109. await _subscription?.cancel();
  110. }
  111. }