user_repo.dart 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import 'dart:async';
  2. import 'package:dartz/dartz.dart';
  3. import 'package:flowy_sdk/dispatch/dispatch.dart';
  4. import 'package:flowy_sdk/protobuf/flowy-folder-data-model/workspace.pb.dart';
  5. import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
  6. import 'dart:typed_data';
  7. import 'package:app_flowy/workspace/infrastructure/repos/helper.dart';
  8. import 'package:flowy_infra/notifier.dart';
  9. import 'package:flowy_sdk/protobuf/dart-notify/protobuf.dart';
  10. import 'package:flowy_sdk/protobuf/flowy-folder/dart_notification.pb.dart';
  11. import 'package:flowy_sdk/protobuf/flowy-user-data-model/errors.pb.dart';
  12. import 'package:flowy_sdk/protobuf/flowy-user-data-model/user_profile.pb.dart';
  13. // import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart' as user_error;
  14. import 'package:flowy_sdk/protobuf/flowy-user/dart_notification.pb.dart' as user;
  15. import 'package:flowy_sdk/rust_stream.dart';
  16. class UserRepo {
  17. final UserProfile user;
  18. UserRepo({
  19. required this.user,
  20. });
  21. Future<Either<UserProfile, FlowyError>> fetchUserProfile({required String userId}) {
  22. return UserEventGetUserProfile().send();
  23. }
  24. Future<Either<Unit, FlowyError>> deleteWorkspace({required String workspaceId}) {
  25. throw UnimplementedError();
  26. }
  27. Future<Either<Unit, FlowyError>> signOut() {
  28. return UserEventSignOut().send();
  29. }
  30. Future<Either<Unit, FlowyError>> initUser() async {
  31. return UserEventInitUser().send();
  32. }
  33. Future<Either<List<Workspace>, FlowyError>> getWorkspaces() {
  34. final request = WorkspaceId.create();
  35. return FolderEventReadWorkspaces(request).send().then((result) {
  36. return result.fold(
  37. (workspaces) => left(workspaces.items),
  38. (error) => right(error),
  39. );
  40. });
  41. }
  42. Future<Either<Workspace, FlowyError>> openWorkspace(String workspaceId) {
  43. final request = WorkspaceId.create()..value = workspaceId;
  44. return FolderEventOpenWorkspace(request).send().then((result) {
  45. return result.fold(
  46. (workspace) => left(workspace),
  47. (error) => right(error),
  48. );
  49. });
  50. }
  51. Future<Either<Workspace, FlowyError>> createWorkspace(String name, String desc) {
  52. final request = CreateWorkspacePayload.create()
  53. ..name = name
  54. ..desc = desc;
  55. return FolderEventCreateWorkspace(request).send().then((result) {
  56. return result.fold(
  57. (workspace) => left(workspace),
  58. (error) => right(error),
  59. );
  60. });
  61. }
  62. }
  63. typedef UserProfileUpdatedNotifierValue = Either<UserProfile, FlowyError>;
  64. typedef AuthNotifierValue = Either<Unit, FlowyError>;
  65. typedef WorkspaceUpdatedNotifierValue = Either<List<Workspace>, FlowyError>;
  66. class UserListener {
  67. StreamSubscription<SubscribeObject>? _subscription;
  68. final profileUpdatedNotifier = PublishNotifier<UserProfileUpdatedNotifierValue>();
  69. final authDidChangedNotifier = PublishNotifier<AuthNotifierValue>();
  70. final workspaceUpdatedNotifier = PublishNotifier<WorkspaceUpdatedNotifierValue>();
  71. late FolderNotificationParser _workspaceParser;
  72. late UserNotificationParser _userParser;
  73. late UserProfile _user;
  74. UserListener({
  75. required UserProfile user,
  76. }) {
  77. _user = user;
  78. }
  79. void start() {
  80. _workspaceParser = FolderNotificationParser(id: _user.token, callback: _notificationCallback);
  81. _userParser = UserNotificationParser(id: _user.token, callback: _userNotificationCallback);
  82. _subscription = RustStreamReceiver.listen((observable) {
  83. _workspaceParser.parse(observable);
  84. _userParser.parse(observable);
  85. });
  86. }
  87. Future<void> stop() async {
  88. await _subscription?.cancel();
  89. profileUpdatedNotifier.dispose();
  90. authDidChangedNotifier.dispose();
  91. workspaceUpdatedNotifier.dispose();
  92. }
  93. void _notificationCallback(FolderNotification ty, Either<Uint8List, FlowyError> result) {
  94. switch (ty) {
  95. case FolderNotification.UserCreateWorkspace:
  96. case FolderNotification.UserDeleteWorkspace:
  97. case FolderNotification.WorkspaceListUpdated:
  98. result.fold(
  99. (payload) => workspaceUpdatedNotifier.value = left(RepeatedWorkspace.fromBuffer(payload).items),
  100. (error) => workspaceUpdatedNotifier.value = right(error),
  101. );
  102. break;
  103. case FolderNotification.UserUnauthorized:
  104. result.fold(
  105. (_) {},
  106. (error) => authDidChangedNotifier.value = right(FlowyError.create()..code = ErrorCode.UserUnauthorized.value),
  107. );
  108. break;
  109. default:
  110. break;
  111. }
  112. }
  113. void _userNotificationCallback(user.UserNotification ty, Either<Uint8List, FlowyError> result) {
  114. switch (ty) {
  115. case user.UserNotification.UserUnauthorized:
  116. result.fold(
  117. (payload) => profileUpdatedNotifier.value = left(UserProfile.fromBuffer(payload)),
  118. (error) => profileUpdatedNotifier.value = right(error),
  119. );
  120. break;
  121. default:
  122. break;
  123. }
  124. }
  125. }