mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
add middleware to handle user unauthorized
This commit is contained in:
parent
916c2eee97
commit
47851b3024
@ -1,6 +1,6 @@
|
||||
import 'package:app_flowy/startup/startup.dart';
|
||||
import 'package:app_flowy/user/presentation/sign_up_screen.dart';
|
||||
import 'package:app_flowy/welcome/domain/i_welcome.dart';
|
||||
import 'package:app_flowy/welcome/domain/i_splash.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_infra_ui/widget/route/animation.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart';
|
||||
@ -40,7 +40,7 @@ class AuthRouterImpl extends IAuthRouter {
|
||||
|
||||
@override
|
||||
void pushWelcomeScreen(BuildContext context, UserProfile userProfile) {
|
||||
getIt<IWelcomeRoute>().pushWelcomeScreen(context, userProfile);
|
||||
getIt<ISplashRoute>().pushWelcomeScreen(context, userProfile);
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -1,12 +1,12 @@
|
||||
import 'package:app_flowy/welcome/domain/auth_state.dart';
|
||||
import 'package:app_flowy/welcome/domain/i_welcome.dart';
|
||||
import 'package:app_flowy/welcome/domain/i_splash.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
||||
part 'splash_bloc.freezed.dart';
|
||||
|
||||
class SplashBloc extends Bloc<SplashEvent, SplashState> {
|
||||
final ISplashAuth authImpl;
|
||||
final ISplashUser authImpl;
|
||||
SplashBloc(this.authImpl) : super(SplashState.initial());
|
||||
|
||||
@override
|
||||
|
@ -3,11 +3,19 @@ import 'package:flutter/widgets.dart';
|
||||
|
||||
import 'auth_state.dart';
|
||||
|
||||
abstract class ISplashAuth {
|
||||
abstract class ISplashUser {
|
||||
Future<AuthState> currentUserProfile();
|
||||
}
|
||||
|
||||
abstract class IWelcomeRoute {
|
||||
abstract class ISplashUserWatch {
|
||||
void startWatching({
|
||||
void Function(AuthState)? authStateCallback,
|
||||
});
|
||||
|
||||
Future<void> stopWatching();
|
||||
}
|
||||
|
||||
abstract class ISplashRoute {
|
||||
void pushSignInScreen(BuildContext context);
|
||||
Future<void> pushWelcomeScreen(BuildContext context, UserProfile profile);
|
||||
void pushHomeScreen(
|
@ -1,18 +1,18 @@
|
||||
import 'package:app_flowy/workspace/application/edit_pannel/edit_pannel_bloc.dart';
|
||||
import 'package:app_flowy/welcome/application/splash_bloc.dart';
|
||||
import 'package:app_flowy/welcome/infrastructure/i_welcome_impl.dart';
|
||||
import 'package:app_flowy/welcome/infrastructure/i_splash_impl.dart';
|
||||
import 'package:app_flowy/workspace/application/home/home_bloc.dart';
|
||||
import 'package:app_flowy/workspace/application/home/home_watcher_bloc.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
|
||||
class WelcomeDepsResolver {
|
||||
static Future<void> resolve(GetIt getIt) async {
|
||||
getIt.registerFactory<ISplashAuth>(() => WelcomeAuthImpl());
|
||||
getIt.registerFactory<IWelcomeRoute>(() => WelcomeRoute());
|
||||
getIt.registerFactory<ISplashUser>(() => SplashUserImpl());
|
||||
getIt.registerFactory<ISplashRoute>(() => SplashRoute());
|
||||
getIt.registerFactory<HomeBloc>(() => HomeBloc());
|
||||
getIt.registerFactory<HomeWatcherBloc>(() => HomeWatcherBloc());
|
||||
getIt.registerFactory<EditPannelBloc>(() => EditPannelBloc());
|
||||
|
||||
getIt.registerFactory<SplashBloc>(() => SplashBloc(getIt<ISplashAuth>()));
|
||||
getIt.registerFactory<SplashBloc>(() => SplashBloc(getIt<ISplashUser>()));
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,7 @@ import 'package:app_flowy/startup/startup.dart';
|
||||
import 'package:app_flowy/user/domain/i_auth.dart';
|
||||
import 'package:app_flowy/user/presentation/sign_in_screen.dart';
|
||||
import 'package:app_flowy/welcome/domain/auth_state.dart';
|
||||
import 'package:app_flowy/welcome/domain/i_welcome.dart';
|
||||
import 'package:app_flowy/welcome/domain/i_splash.dart';
|
||||
import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';
|
||||
import 'package:app_flowy/workspace/presentation/home/home_screen.dart';
|
||||
import 'package:app_flowy/welcome/presentation/welcome_screen.dart';
|
||||
@ -13,9 +13,9 @@ import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
export 'package:app_flowy/welcome/domain/i_welcome.dart';
|
||||
export 'package:app_flowy/welcome/domain/i_splash.dart';
|
||||
|
||||
class WelcomeAuthImpl implements ISplashAuth {
|
||||
class SplashUserImpl implements ISplashUser {
|
||||
@override
|
||||
Future<AuthState> currentUserProfile() {
|
||||
final result = UserEventGetUserProfile().send();
|
||||
@ -32,7 +32,8 @@ class WelcomeAuthImpl implements ISplashAuth {
|
||||
}
|
||||
}
|
||||
|
||||
class WelcomeRoute implements IWelcomeRoute {
|
||||
|
||||
class SplashRoute implements ISplashRoute {
|
||||
@override
|
||||
Future<void> pushWelcomeScreen(BuildContext context, UserProfile user) async {
|
||||
final repo = UserRepo(user: user);
|
@ -1,4 +1,4 @@
|
||||
import 'package:app_flowy/welcome/domain/i_welcome.dart';
|
||||
import 'package:app_flowy/welcome/domain/i_splash.dart';
|
||||
import 'package:app_flowy/welcome/domain/auth_state.dart';
|
||||
import 'package:app_flowy/startup/startup.dart';
|
||||
import 'package:app_flowy/welcome/application/splash_bloc.dart';
|
||||
@ -37,11 +37,11 @@ class SplashScreen extends StatelessWidget {
|
||||
WorkspaceEventReadCurWorkspace().send().then(
|
||||
(result) {
|
||||
return result.fold(
|
||||
(workspace) => getIt<IWelcomeRoute>()
|
||||
(workspace) => getIt<ISplashRoute>()
|
||||
.pushHomeScreen(context, userProfile, workspace.id),
|
||||
(error) async {
|
||||
assert(error.code == workspace.ErrorCode.CurrentWorkspaceNotFound);
|
||||
getIt<IWelcomeRoute>().pushWelcomeScreen(context, userProfile);
|
||||
getIt<ISplashRoute>().pushWelcomeScreen(context, userProfile);
|
||||
},
|
||||
);
|
||||
},
|
||||
@ -50,7 +50,7 @@ class SplashScreen extends StatelessWidget {
|
||||
|
||||
void _handleUnauthenticated(BuildContext context, Unauthenticated result) {
|
||||
Log.error(result.error);
|
||||
getIt<IWelcomeRoute>().pushSignInScreen(context);
|
||||
getIt<ISplashRoute>().pushSignInScreen(context);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -11,7 +11,7 @@ part 'welcome_bloc.freezed.dart';
|
||||
|
||||
class WelcomeBloc extends Bloc<WelcomeEvent, WelcomeState> {
|
||||
UserRepo repo;
|
||||
IUserWorkspaceListWatch watcher;
|
||||
IUserWatch watcher;
|
||||
WelcomeBloc({required this.repo, required this.watcher})
|
||||
: super(WelcomeState.initial());
|
||||
|
||||
@ -20,10 +20,9 @@ class WelcomeBloc extends Bloc<WelcomeEvent, WelcomeState> {
|
||||
WelcomeEvent event,
|
||||
) async* {
|
||||
yield* event.map(initial: (e) async* {
|
||||
watcher.startWatching(
|
||||
workspaceListUpdatedCallback: (workspacesOrFail) =>
|
||||
_handleWorkspaceListUpdated(workspacesOrFail),
|
||||
);
|
||||
watcher.setWorkspacesCallback(_workspacesUpdated);
|
||||
watcher.startWatching();
|
||||
//
|
||||
yield* _fetchWorkspaces();
|
||||
}, openWorkspace: (e) async* {
|
||||
yield* _openWorkspace(e.workspace);
|
||||
@ -75,7 +74,7 @@ class WelcomeBloc extends Bloc<WelcomeEvent, WelcomeState> {
|
||||
);
|
||||
}
|
||||
|
||||
void _handleWorkspaceListUpdated(
|
||||
void _workspacesUpdated(
|
||||
Either<List<Workspace>, WorkspaceError> workspacesOrFail) {
|
||||
add(WelcomeEvent.workspacesReveived(workspacesOrFail));
|
||||
}
|
||||
|
@ -8,9 +8,6 @@ export 'package:flowy_sdk/protobuf/flowy-workspace/workspace_create.pb.dart';
|
||||
export 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart';
|
||||
export 'package:flowy_sdk/protobuf/flowy-user/user_profile.pb.dart';
|
||||
|
||||
typedef WorkspaceListUpdatedCallback = void Function(
|
||||
Either<List<Workspace>, WorkspaceError> workspacesOrFailed);
|
||||
|
||||
abstract class IUser {
|
||||
UserProfile get user;
|
||||
Future<Either<UserProfile, UserError>> fetchUserProfile(String userId);
|
||||
@ -19,9 +16,18 @@ abstract class IUser {
|
||||
Future<Either<Unit, UserError>> signOut();
|
||||
}
|
||||
|
||||
abstract class IUserWorkspaceListWatch {
|
||||
void startWatching(
|
||||
{WorkspaceListUpdatedCallback? workspaceListUpdatedCallback});
|
||||
typedef UserProfileUpdateCallback = void Function(
|
||||
Either<UserProfile, UserError>);
|
||||
|
||||
typedef AuthChangedCallback = void Function(Either<Unit, UserError>);
|
||||
typedef WorkspacesUpdatedCallback = void Function(
|
||||
Either<List<Workspace>, WorkspaceError> workspacesOrFailed);
|
||||
|
||||
abstract class IUserWatch {
|
||||
void startWatching();
|
||||
void setProfileCallback(UserProfileUpdateCallback profileCallback);
|
||||
void setAuthCallback(AuthChangedCallback authCallback);
|
||||
void setWorkspacesCallback(WorkspacesUpdatedCallback workspacesCallback);
|
||||
|
||||
Future<void> stopWatching();
|
||||
}
|
||||
|
@ -58,9 +58,8 @@ class HomeDepsResolver {
|
||||
// User
|
||||
getIt.registerFactoryParam<IUser, UserProfile, void>(
|
||||
(user, _) => IUserImpl(repo: UserRepo(user: user)));
|
||||
getIt.registerFactoryParam<IUserWorkspaceListWatch, UserProfile, void>(
|
||||
(user, _) =>
|
||||
IUserWorkspaceListWatchImpl(repo: UserWatchRepo(user: user)));
|
||||
getIt.registerFactoryParam<IUserWatch, UserProfile, void>(
|
||||
(user, _) => IUserWatchImpl(user: user));
|
||||
|
||||
//Menu Bloc
|
||||
getIt.registerFactoryParam<MenuBloc, UserProfile, String>(
|
||||
@ -98,7 +97,7 @@ class HomeDepsResolver {
|
||||
getIt.registerFactoryParam<WelcomeBloc, UserProfile, void>(
|
||||
(user, _) => WelcomeBloc(
|
||||
repo: UserRepo(user: user),
|
||||
watcher: getIt<IUserWorkspaceListWatch>(param1: user),
|
||||
watcher: getIt<IUserWatch>(param1: user),
|
||||
),
|
||||
);
|
||||
|
||||
|
@ -1,9 +1,18 @@
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:app_flowy/workspace/infrastructure/repos/helper.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:app_flowy/workspace/domain/i_user.dart';
|
||||
import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-observable/protobuf.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart' as user_error;
|
||||
import 'package:flowy_sdk/protobuf/flowy-user/observable.pb.dart' as user;
|
||||
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-workspace/observable.pb.dart';
|
||||
export 'package:app_flowy/workspace/domain/i_user.dart';
|
||||
export 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';
|
||||
import 'package:flowy_sdk/rust_stream.dart';
|
||||
import 'dart:async';
|
||||
|
||||
class IUserImpl extends IUser {
|
||||
UserRepo repo;
|
||||
@ -35,20 +44,103 @@ class IUserImpl extends IUser {
|
||||
}
|
||||
}
|
||||
|
||||
class IUserWorkspaceListWatchImpl extends IUserWorkspaceListWatch {
|
||||
UserWatchRepo repo;
|
||||
IUserWorkspaceListWatchImpl({
|
||||
required this.repo,
|
||||
});
|
||||
@override
|
||||
void startWatching({
|
||||
WorkspaceListUpdatedCallback? workspaceListUpdatedCallback,
|
||||
class IUserWatchImpl extends IUserWatch {
|
||||
StreamSubscription<ObservableSubject>? _subscription;
|
||||
WorkspacesUpdatedCallback? _workspacesUpdated;
|
||||
AuthChangedCallback? _authChanged;
|
||||
UserProfileUpdateCallback? _profileUpdated;
|
||||
|
||||
late WorkspaceObservableParser _workspaceParser;
|
||||
late UserObservableParser _userParser;
|
||||
late UserProfile _user;
|
||||
IUserWatchImpl({
|
||||
required UserProfile user,
|
||||
}) {
|
||||
repo.startWatching(workspaceListUpdated: workspaceListUpdatedCallback);
|
||||
_user = user;
|
||||
}
|
||||
|
||||
@override
|
||||
void startWatching() {
|
||||
_workspaceParser = WorkspaceObservableParser(
|
||||
id: _user.id, callback: _workspaceObservableCallback);
|
||||
|
||||
_userParser =
|
||||
UserObservableParser(id: _user.id, callback: _userObservableCallback);
|
||||
|
||||
_subscription = RustStreamReceiver.listen((observable) {
|
||||
_workspaceParser.parse(observable);
|
||||
_userParser.parse(observable);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> stopWatching() async {
|
||||
await repo.close();
|
||||
await _subscription?.cancel();
|
||||
}
|
||||
|
||||
@override
|
||||
void setAuthCallback(AuthChangedCallback authCallback) {
|
||||
_authChanged = authCallback;
|
||||
}
|
||||
|
||||
@override
|
||||
void setProfileCallback(UserProfileUpdateCallback profileCallback) {
|
||||
_profileUpdated = profileCallback;
|
||||
}
|
||||
|
||||
@override
|
||||
void setWorkspacesCallback(WorkspacesUpdatedCallback workspacesCallback) {
|
||||
_workspacesUpdated = workspacesCallback;
|
||||
}
|
||||
|
||||
void _workspaceObservableCallback(
|
||||
WorkspaceObservable ty, Either<Uint8List, WorkspaceError> result) {
|
||||
switch (ty) {
|
||||
case WorkspaceObservable.UserCreateWorkspace:
|
||||
case WorkspaceObservable.UserDeleteWorkspace:
|
||||
case WorkspaceObservable.WorkspaceListUpdated:
|
||||
if (_workspacesUpdated != null) {
|
||||
result.fold(
|
||||
(payload) {
|
||||
final workspaces = RepeatedWorkspace.fromBuffer(payload);
|
||||
_workspacesUpdated!(left(workspaces.items));
|
||||
},
|
||||
(error) => _workspacesUpdated!(right(error)),
|
||||
);
|
||||
}
|
||||
break;
|
||||
case WorkspaceObservable.UserUnauthorized:
|
||||
if (_authChanged != null) {
|
||||
result.fold(
|
||||
(_) {},
|
||||
(error) => {
|
||||
_authChanged!(right(UserError.create()
|
||||
..code = user_error.ErrorCode.UserUnauthorized))
|
||||
},
|
||||
);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void _userObservableCallback(
|
||||
user.UserObservable ty, Either<Uint8List, UserError> result) {
|
||||
switch (ty) {
|
||||
case user.UserObservable.UserUnauthorized:
|
||||
if (_profileUpdated != null) {
|
||||
result.fold(
|
||||
(payload) {
|
||||
final userProfile = UserProfile.fromBuffer(payload);
|
||||
_profileUpdated!(left(userProfile));
|
||||
},
|
||||
(error) => _profileUpdated!(right(error)),
|
||||
);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -58,7 +58,7 @@ class AppWatchRepository {
|
||||
AppCreateViewCallback? _createView;
|
||||
AppDeleteViewCallback? _deleteView;
|
||||
AppUpdatedCallback? _update;
|
||||
late ObservableExtractor _extractor;
|
||||
late WorkspaceObservableParser _extractor;
|
||||
String appId;
|
||||
|
||||
AppWatchRepository({
|
||||
@ -72,15 +72,13 @@ class AppWatchRepository {
|
||||
_createView = createView;
|
||||
_deleteView = deleteView;
|
||||
_update = update;
|
||||
_extractor = ObservableExtractor(
|
||||
id: appId,
|
||||
callback: (ty, result) => _handleObservableType(ty, result),
|
||||
);
|
||||
_extractor =
|
||||
WorkspaceObservableParser(id: appId, callback: _bservableCallback);
|
||||
_subscription =
|
||||
RustStreamReceiver.listen((observable) => _extractor.parse(observable));
|
||||
}
|
||||
|
||||
void _handleObservableType(
|
||||
void _bservableCallback(
|
||||
WorkspaceObservable ty, Either<Uint8List, WorkspaceError> result) {
|
||||
switch (ty) {
|
||||
case WorkspaceObservable.AppCreateView:
|
||||
|
@ -1,22 +1,86 @@
|
||||
import 'dart:typed_data';
|
||||
import 'package:flowy_sdk/protobuf/flowy-observable/protobuf.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-workspace/observable.pb.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
|
||||
class ObservableExtractor {
|
||||
// class WorkspaceObservableParser {
|
||||
// String id;
|
||||
// void Function(WorkspaceObservable, Either<Uint8List, WorkspaceError>)
|
||||
// callback;
|
||||
|
||||
// WorkspaceObservableParser({required this.id, required this.callback});
|
||||
// void parse(ObservableSubject subject) {
|
||||
// if (subject.id != id) {
|
||||
// return;
|
||||
// }
|
||||
|
||||
// final ty = WorkspaceObservable.valueOf(subject.ty);
|
||||
// if (ty == null) {
|
||||
// return;
|
||||
// }
|
||||
|
||||
// if (subject.hasPayload()) {
|
||||
// final bytes = Uint8List.fromList(subject.error);
|
||||
// callback(ty, left(bytes));
|
||||
// } else if (subject.hasError()) {
|
||||
// final bytes = Uint8List.fromList(subject.error);
|
||||
// final error = WorkspaceError.fromBuffer(bytes);
|
||||
// callback(ty, right(error));
|
||||
// } else {
|
||||
// // do nothing
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
typedef UserObservableCallback = void Function(
|
||||
UserObservable, Either<Uint8List, UserError>);
|
||||
|
||||
class UserObservableParser extends ObservableParser<UserObservable, UserError> {
|
||||
UserObservableParser(
|
||||
{required String id, required UserObservableCallback callback})
|
||||
: super(
|
||||
id: id,
|
||||
callback: callback,
|
||||
tyParser: (ty) => UserObservable.valueOf(ty),
|
||||
errorParser: (bytes) => UserError.fromBuffer(bytes),
|
||||
);
|
||||
}
|
||||
|
||||
typedef WorkspaceObservableCallback = void Function(
|
||||
WorkspaceObservable, Either<Uint8List, WorkspaceError>);
|
||||
|
||||
class WorkspaceObservableParser
|
||||
extends ObservableParser<WorkspaceObservable, WorkspaceError> {
|
||||
WorkspaceObservableParser(
|
||||
{required String id, required WorkspaceObservableCallback callback})
|
||||
: super(
|
||||
id: id,
|
||||
callback: callback,
|
||||
tyParser: (ty) => WorkspaceObservable.valueOf(ty),
|
||||
errorParser: (bytes) => WorkspaceError.fromBuffer(bytes),
|
||||
);
|
||||
}
|
||||
|
||||
class ObservableParser<T, E> {
|
||||
String id;
|
||||
void Function(WorkspaceObservable, Either<Uint8List, WorkspaceError>)
|
||||
callback;
|
||||
void Function(T, Either<Uint8List, E>) callback;
|
||||
|
||||
ObservableExtractor({required this.id, required this.callback});
|
||||
T? Function(int) tyParser;
|
||||
E Function(Uint8List) errorParser;
|
||||
|
||||
ObservableParser(
|
||||
{required this.id,
|
||||
required this.callback,
|
||||
required this.errorParser,
|
||||
required this.tyParser});
|
||||
void parse(ObservableSubject subject) {
|
||||
if (subject.id != id) {
|
||||
return;
|
||||
}
|
||||
|
||||
final ty = WorkspaceObservable.valueOf(subject.ty);
|
||||
final ty = tyParser(subject.ty);
|
||||
if (ty == null) {
|
||||
return;
|
||||
}
|
||||
@ -26,7 +90,7 @@ class ObservableExtractor {
|
||||
callback(ty, left(bytes));
|
||||
} else if (subject.hasError()) {
|
||||
final bytes = Uint8List.fromList(subject.error);
|
||||
final error = WorkspaceError.fromBuffer(bytes);
|
||||
final error = errorParser(bytes);
|
||||
callback(ty, right(error));
|
||||
} else {
|
||||
// do nothing
|
||||
|
@ -1,16 +1,11 @@
|
||||
import 'dart:async';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_sdk/dispatch/dispatch.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-observable/subject.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-user/user_profile.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-workspace/observable.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-workspace/workspace_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-workspace/workspace_query.pb.dart';
|
||||
import 'package:flowy_sdk/rust_stream.dart';
|
||||
import 'package:app_flowy/workspace/domain/i_user.dart';
|
||||
|
||||
class UserRepo {
|
||||
@ -67,54 +62,3 @@ class UserRepo {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class UserWatchRepo {
|
||||
StreamSubscription<ObservableSubject>? _subscription;
|
||||
WorkspaceListUpdatedCallback? _workspaceListUpdated;
|
||||
late UserRepo _repo;
|
||||
UserWatchRepo({
|
||||
required UserProfile user,
|
||||
}) {
|
||||
_repo = UserRepo(user: user);
|
||||
}
|
||||
|
||||
void startWatching({WorkspaceListUpdatedCallback? workspaceListUpdated}) {
|
||||
_workspaceListUpdated = workspaceListUpdated;
|
||||
_subscription = RustStreamReceiver.listen((observable) {
|
||||
if (observable.id != _repo.user.id) {
|
||||
return;
|
||||
}
|
||||
|
||||
final ty = WorkspaceObservable.valueOf(observable.ty);
|
||||
if (ty != null) {
|
||||
_handleObservableType(ty, Uint8List.fromList(observable.payload));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> close() async {
|
||||
await _subscription?.cancel();
|
||||
}
|
||||
|
||||
void _handleObservableType(WorkspaceObservable ty, Uint8List payload) {
|
||||
if (_workspaceListUpdated == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (ty) {
|
||||
case WorkspaceObservable.UserCreateWorkspace:
|
||||
case WorkspaceObservable.UserDeleteWorkspace:
|
||||
case WorkspaceObservable.WorkspaceListUpdated:
|
||||
if (_workspaceListUpdated == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
final workspaces = RepeatedWorkspace.fromBuffer(payload);
|
||||
_workspaceListUpdated!(left(workspaces.items));
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ class ViewRepository {
|
||||
class ViewWatchRepository {
|
||||
StreamSubscription<ObservableSubject>? _subscription;
|
||||
ViewUpdatedCallback? _update;
|
||||
late ObservableExtractor _extractor;
|
||||
late WorkspaceObservableParser _extractor;
|
||||
View view;
|
||||
|
||||
ViewWatchRepository({
|
||||
@ -41,7 +41,7 @@ class ViewWatchRepository {
|
||||
ViewUpdatedCallback? update,
|
||||
}) {
|
||||
_update = update;
|
||||
_extractor = ObservableExtractor(
|
||||
_extractor = WorkspaceObservableParser(
|
||||
id: view.id,
|
||||
callback: (ty, result) {
|
||||
_handleObservableType(ty, result);
|
||||
|
@ -67,7 +67,7 @@ class WorkspaceWatchRepo {
|
||||
WorkspaceCreateAppCallback? _createApp;
|
||||
WorkspaceDeleteAppCallback? _deleteApp;
|
||||
WorkspaceUpdatedCallback? _update;
|
||||
late ObservableExtractor _extractor;
|
||||
late WorkspaceObservableParser _extractor;
|
||||
final UserProfile user;
|
||||
final String workspaceId;
|
||||
|
||||
@ -85,7 +85,7 @@ class WorkspaceWatchRepo {
|
||||
_deleteApp = deleteApp;
|
||||
_update = update;
|
||||
|
||||
_extractor = ObservableExtractor(
|
||||
_extractor = WorkspaceObservableParser(
|
||||
id: workspaceId,
|
||||
callback: (ty, result) {
|
||||
_handleObservableType(ty, result);
|
||||
|
@ -31,7 +31,7 @@ class ObservableSubject extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ObservableSubject', createEmptyInstance: create)
|
||||
..oo(0, [4])
|
||||
..oo(1, [5])
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'category')
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'source')
|
||||
..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ty', $pb.PbFieldType.O3)
|
||||
..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id')
|
||||
..a<$core.List<$core.int>>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'payload', $pb.PbFieldType.OY)
|
||||
@ -41,15 +41,15 @@ class ObservableSubject extends $pb.GeneratedMessage {
|
||||
|
||||
ObservableSubject._() : super();
|
||||
factory ObservableSubject({
|
||||
$core.String? category,
|
||||
$core.String? source,
|
||||
$core.int? ty,
|
||||
$core.String? id,
|
||||
$core.List<$core.int>? payload,
|
||||
$core.List<$core.int>? error,
|
||||
}) {
|
||||
final _result = create();
|
||||
if (category != null) {
|
||||
_result.category = category;
|
||||
if (source != null) {
|
||||
_result.source = source;
|
||||
}
|
||||
if (ty != null) {
|
||||
_result.ty = ty;
|
||||
@ -93,13 +93,13 @@ class ObservableSubject extends $pb.GeneratedMessage {
|
||||
void clearOneOfError() => clearField($_whichOneof(1));
|
||||
|
||||
@$pb.TagNumber(1)
|
||||
$core.String get category => $_getSZ(0);
|
||||
$core.String get source => $_getSZ(0);
|
||||
@$pb.TagNumber(1)
|
||||
set category($core.String v) { $_setString(0, v); }
|
||||
set source($core.String v) { $_setString(0, v); }
|
||||
@$pb.TagNumber(1)
|
||||
$core.bool hasCategory() => $_has(0);
|
||||
$core.bool hasSource() => $_has(0);
|
||||
@$pb.TagNumber(1)
|
||||
void clearCategory() => clearField(1);
|
||||
void clearSource() => clearField(1);
|
||||
|
||||
@$pb.TagNumber(2)
|
||||
$core.int get ty => $_getIZ(1);
|
||||
|
@ -12,7 +12,7 @@ import 'dart:typed_data' as $typed_data;
|
||||
const ObservableSubject$json = const {
|
||||
'1': 'ObservableSubject',
|
||||
'2': const [
|
||||
const {'1': 'category', '3': 1, '4': 1, '5': 9, '10': 'category'},
|
||||
const {'1': 'source', '3': 1, '4': 1, '5': 9, '10': 'source'},
|
||||
const {'1': 'ty', '3': 2, '4': 1, '5': 5, '10': 'ty'},
|
||||
const {'1': 'id', '3': 3, '4': 1, '5': 9, '10': 'id'},
|
||||
const {'1': 'payload', '3': 4, '4': 1, '5': 12, '9': 0, '10': 'payload'},
|
||||
@ -25,4 +25,4 @@ const ObservableSubject$json = const {
|
||||
};
|
||||
|
||||
/// Descriptor for `ObservableSubject`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List observableSubjectDescriptor = $convert.base64Decode('ChFPYnNlcnZhYmxlU3ViamVjdBIaCghjYXRlZ29yeRgBIAEoCVIIY2F0ZWdvcnkSDgoCdHkYAiABKAVSAnR5Eg4KAmlkGAMgASgJUgJpZBIaCgdwYXlsb2FkGAQgASgMSABSB3BheWxvYWQSFgoFZXJyb3IYBSABKAxIAVIFZXJyb3JCEAoOb25lX29mX3BheWxvYWRCDgoMb25lX29mX2Vycm9y');
|
||||
final $typed_data.Uint8List observableSubjectDescriptor = $convert.base64Decode('ChFPYnNlcnZhYmxlU3ViamVjdBIWCgZzb3VyY2UYASABKAlSBnNvdXJjZRIOCgJ0eRgCIAEoBVICdHkSDgoCaWQYAyABKAlSAmlkEhoKB3BheWxvYWQYBCABKAxIAFIHcGF5bG9hZBIWCgVlcnJvchgFIAEoDEgBUgVlcnJvckIQCg5vbmVfb2ZfcGF5bG9hZEIOCgxvbmVfb2ZfZXJyb3I=');
|
||||
|
@ -15,12 +15,6 @@ class ErrorCode extends $pb.ProtobufEnum {
|
||||
static const ErrorCode AcquireWriteLockedFailed = ErrorCode._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'AcquireWriteLockedFailed');
|
||||
static const ErrorCode AcquireReadLockedFailed = ErrorCode._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'AcquireReadLockedFailed');
|
||||
static const ErrorCode UserDatabaseDidNotMatch = ErrorCode._(4, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserDatabaseDidNotMatch');
|
||||
static const ErrorCode UserDatabaseInternalError = ErrorCode._(5, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserDatabaseInternalError');
|
||||
static const ErrorCode SqlInternalError = ErrorCode._(6, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SqlInternalError');
|
||||
static const ErrorCode DatabaseConnectError = ErrorCode._(7, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DatabaseConnectError');
|
||||
static const ErrorCode UserNotLoginYet = ErrorCode._(10, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserNotLoginYet');
|
||||
static const ErrorCode ReadCurrentIdFailed = ErrorCode._(11, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ReadCurrentIdFailed');
|
||||
static const ErrorCode WriteCurrentIdFailed = ErrorCode._(12, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'WriteCurrentIdFailed');
|
||||
static const ErrorCode EmailIsEmpty = ErrorCode._(20, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'EmailIsEmpty');
|
||||
static const ErrorCode EmailFormatInvalid = ErrorCode._(21, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'EmailFormatInvalid');
|
||||
static const ErrorCode EmailAlreadyExists = ErrorCode._(22, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'EmailAlreadyExists');
|
||||
@ -30,15 +24,13 @@ class ErrorCode extends $pb.ProtobufEnum {
|
||||
static const ErrorCode PasswordFormatInvalid = ErrorCode._(33, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'PasswordFormatInvalid');
|
||||
static const ErrorCode PasswordNotMatch = ErrorCode._(34, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'PasswordNotMatch');
|
||||
static const ErrorCode UserNameTooLong = ErrorCode._(40, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserNameTooLong');
|
||||
static const ErrorCode UserNameContainsForbiddenCharacters = ErrorCode._(41, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserNameContainsForbiddenCharacters');
|
||||
static const ErrorCode ContainForbiddenCharacters = ErrorCode._(41, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ContainForbiddenCharacters');
|
||||
static const ErrorCode UserNameIsEmpty = ErrorCode._(42, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserNameIsEmpty');
|
||||
static const ErrorCode UserWorkspaceInvalid = ErrorCode._(50, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserWorkspaceInvalid');
|
||||
static const ErrorCode UserIdInvalid = ErrorCode._(51, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserIdInvalid');
|
||||
static const ErrorCode UserTokenInvalid = ErrorCode._(54, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserTokenInvalid');
|
||||
static const ErrorCode UserUnauthorized = ErrorCode._(54, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserUnauthorized');
|
||||
static const ErrorCode UserNotExist = ErrorCode._(55, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserNotExist');
|
||||
static const ErrorCode CreateDefaultWorkspaceFailed = ErrorCode._(60, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CreateDefaultWorkspaceFailed');
|
||||
static const ErrorCode DefaultWorkspaceAlreadyExist = ErrorCode._(61, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DefaultWorkspaceAlreadyExist');
|
||||
static const ErrorCode ServerError = ErrorCode._(100, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ServerError');
|
||||
static const ErrorCode InternalError = ErrorCode._(100, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'InternalError');
|
||||
|
||||
static const $core.List<ErrorCode> values = <ErrorCode> [
|
||||
Unknown,
|
||||
@ -46,12 +38,6 @@ class ErrorCode extends $pb.ProtobufEnum {
|
||||
AcquireWriteLockedFailed,
|
||||
AcquireReadLockedFailed,
|
||||
UserDatabaseDidNotMatch,
|
||||
UserDatabaseInternalError,
|
||||
SqlInternalError,
|
||||
DatabaseConnectError,
|
||||
UserNotLoginYet,
|
||||
ReadCurrentIdFailed,
|
||||
WriteCurrentIdFailed,
|
||||
EmailIsEmpty,
|
||||
EmailFormatInvalid,
|
||||
EmailAlreadyExists,
|
||||
@ -61,15 +47,13 @@ class ErrorCode extends $pb.ProtobufEnum {
|
||||
PasswordFormatInvalid,
|
||||
PasswordNotMatch,
|
||||
UserNameTooLong,
|
||||
UserNameContainsForbiddenCharacters,
|
||||
ContainForbiddenCharacters,
|
||||
UserNameIsEmpty,
|
||||
UserWorkspaceInvalid,
|
||||
UserIdInvalid,
|
||||
UserTokenInvalid,
|
||||
UserUnauthorized,
|
||||
UserNotExist,
|
||||
CreateDefaultWorkspaceFailed,
|
||||
DefaultWorkspaceAlreadyExist,
|
||||
ServerError,
|
||||
InternalError,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, ErrorCode> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
|
@ -17,12 +17,6 @@ const ErrorCode$json = const {
|
||||
const {'1': 'AcquireWriteLockedFailed', '2': 2},
|
||||
const {'1': 'AcquireReadLockedFailed', '2': 3},
|
||||
const {'1': 'UserDatabaseDidNotMatch', '2': 4},
|
||||
const {'1': 'UserDatabaseInternalError', '2': 5},
|
||||
const {'1': 'SqlInternalError', '2': 6},
|
||||
const {'1': 'DatabaseConnectError', '2': 7},
|
||||
const {'1': 'UserNotLoginYet', '2': 10},
|
||||
const {'1': 'ReadCurrentIdFailed', '2': 11},
|
||||
const {'1': 'WriteCurrentIdFailed', '2': 12},
|
||||
const {'1': 'EmailIsEmpty', '2': 20},
|
||||
const {'1': 'EmailFormatInvalid', '2': 21},
|
||||
const {'1': 'EmailAlreadyExists', '2': 22},
|
||||
@ -32,20 +26,18 @@ const ErrorCode$json = const {
|
||||
const {'1': 'PasswordFormatInvalid', '2': 33},
|
||||
const {'1': 'PasswordNotMatch', '2': 34},
|
||||
const {'1': 'UserNameTooLong', '2': 40},
|
||||
const {'1': 'UserNameContainsForbiddenCharacters', '2': 41},
|
||||
const {'1': 'ContainForbiddenCharacters', '2': 41},
|
||||
const {'1': 'UserNameIsEmpty', '2': 42},
|
||||
const {'1': 'UserWorkspaceInvalid', '2': 50},
|
||||
const {'1': 'UserIdInvalid', '2': 51},
|
||||
const {'1': 'UserTokenInvalid', '2': 54},
|
||||
const {'1': 'UserUnauthorized', '2': 54},
|
||||
const {'1': 'UserNotExist', '2': 55},
|
||||
const {'1': 'CreateDefaultWorkspaceFailed', '2': 60},
|
||||
const {'1': 'DefaultWorkspaceAlreadyExist', '2': 61},
|
||||
const {'1': 'ServerError', '2': 100},
|
||||
const {'1': 'InternalError', '2': 100},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `ErrorCode`. Decode as a `google.protobuf.EnumDescriptorProto`.
|
||||
final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode('CglFcnJvckNvZGUSCwoHVW5rbm93bhAAEhoKFlVzZXJEYXRhYmFzZUluaXRGYWlsZWQQARIcChhBY3F1aXJlV3JpdGVMb2NrZWRGYWlsZWQQAhIbChdBY3F1aXJlUmVhZExvY2tlZEZhaWxlZBADEhsKF1VzZXJEYXRhYmFzZURpZE5vdE1hdGNoEAQSHQoZVXNlckRhdGFiYXNlSW50ZXJuYWxFcnJvchAFEhQKEFNxbEludGVybmFsRXJyb3IQBhIYChREYXRhYmFzZUNvbm5lY3RFcnJvchAHEhMKD1VzZXJOb3RMb2dpbllldBAKEhcKE1JlYWRDdXJyZW50SWRGYWlsZWQQCxIYChRXcml0ZUN1cnJlbnRJZEZhaWxlZBAMEhAKDEVtYWlsSXNFbXB0eRAUEhYKEkVtYWlsRm9ybWF0SW52YWxpZBAVEhYKEkVtYWlsQWxyZWFkeUV4aXN0cxAWEhMKD1Bhc3N3b3JkSXNFbXB0eRAeEhMKD1Bhc3N3b3JkVG9vTG9uZxAfEiQKIFBhc3N3b3JkQ29udGFpbnNGb3JiaWRDaGFyYWN0ZXJzECASGQoVUGFzc3dvcmRGb3JtYXRJbnZhbGlkECESFAoQUGFzc3dvcmROb3RNYXRjaBAiEhMKD1VzZXJOYW1lVG9vTG9uZxAoEicKI1VzZXJOYW1lQ29udGFpbnNGb3JiaWRkZW5DaGFyYWN0ZXJzECkSEwoPVXNlck5hbWVJc0VtcHR5ECoSGAoUVXNlcldvcmtzcGFjZUludmFsaWQQMhIRCg1Vc2VySWRJbnZhbGlkEDMSFAoQVXNlclRva2VuSW52YWxpZBA2EhAKDFVzZXJOb3RFeGlzdBA3EiAKHENyZWF0ZURlZmF1bHRXb3Jrc3BhY2VGYWlsZWQQPBIgChxEZWZhdWx0V29ya3NwYWNlQWxyZWFkeUV4aXN0ED0SDwoLU2VydmVyRXJyb3IQZA==');
|
||||
final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode('CglFcnJvckNvZGUSCwoHVW5rbm93bhAAEhoKFlVzZXJEYXRhYmFzZUluaXRGYWlsZWQQARIcChhBY3F1aXJlV3JpdGVMb2NrZWRGYWlsZWQQAhIbChdBY3F1aXJlUmVhZExvY2tlZEZhaWxlZBADEhsKF1VzZXJEYXRhYmFzZURpZE5vdE1hdGNoEAQSEAoMRW1haWxJc0VtcHR5EBQSFgoSRW1haWxGb3JtYXRJbnZhbGlkEBUSFgoSRW1haWxBbHJlYWR5RXhpc3RzEBYSEwoPUGFzc3dvcmRJc0VtcHR5EB4SEwoPUGFzc3dvcmRUb29Mb25nEB8SJAogUGFzc3dvcmRDb250YWluc0ZvcmJpZENoYXJhY3RlcnMQIBIZChVQYXNzd29yZEZvcm1hdEludmFsaWQQIRIUChBQYXNzd29yZE5vdE1hdGNoECISEwoPVXNlck5hbWVUb29Mb25nECgSHgoaQ29udGFpbkZvcmJpZGRlbkNoYXJhY3RlcnMQKRITCg9Vc2VyTmFtZUlzRW1wdHkQKhIYChRVc2VyV29ya3NwYWNlSW52YWxpZBAyEhEKDVVzZXJJZEludmFsaWQQMxIUChBVc2VyVW5hdXRob3JpemVkEDYSEAoMVXNlck5vdEV4aXN0EDcSEQoNSW50ZXJuYWxFcnJvchBk');
|
||||
@$core.Deprecated('Use userErrorDescriptor instead')
|
||||
const UserError$json = const {
|
||||
'1': 'UserError',
|
||||
|
@ -13,11 +13,13 @@ class UserObservable extends $pb.ProtobufEnum {
|
||||
static const UserObservable Unknown = UserObservable._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Unknown');
|
||||
static const UserObservable UserAuthChanged = UserObservable._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserAuthChanged');
|
||||
static const UserObservable UserProfileUpdated = UserObservable._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserProfileUpdated');
|
||||
static const UserObservable UserUnauthorized = UserObservable._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserUnauthorized');
|
||||
|
||||
static const $core.List<UserObservable> values = <UserObservable> [
|
||||
Unknown,
|
||||
UserAuthChanged,
|
||||
UserProfileUpdated,
|
||||
UserUnauthorized,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, UserObservable> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
|
@ -15,8 +15,9 @@ const UserObservable$json = const {
|
||||
const {'1': 'Unknown', '2': 0},
|
||||
const {'1': 'UserAuthChanged', '2': 1},
|
||||
const {'1': 'UserProfileUpdated', '2': 2},
|
||||
const {'1': 'UserUnauthorized', '2': 3},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `UserObservable`. Decode as a `google.protobuf.EnumDescriptorProto`.
|
||||
final $typed_data.Uint8List userObservableDescriptor = $convert.base64Decode('Cg5Vc2VyT2JzZXJ2YWJsZRILCgdVbmtub3duEAASEwoPVXNlckF1dGhDaGFuZ2VkEAESFgoSVXNlclByb2ZpbGVVcGRhdGVkEAI=');
|
||||
final $typed_data.Uint8List userObservableDescriptor = $convert.base64Decode('Cg5Vc2VyT2JzZXJ2YWJsZRILCgdVbmtub3duEAASEwoPVXNlckF1dGhDaGFuZ2VkEAESFgoSVXNlclByb2ZpbGVVcGRhdGVkEAISFAoQVXNlclVuYXV0aG9yaXplZBAD');
|
||||
|
@ -24,10 +24,9 @@ class ErrorCode extends $pb.ProtobufEnum {
|
||||
static const ErrorCode ViewDescInvalid = ErrorCode._(23, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ViewDescInvalid');
|
||||
static const ErrorCode DatabaseConnectionFail = ErrorCode._(100, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'DatabaseConnectionFail');
|
||||
static const ErrorCode WorkspaceDatabaseError = ErrorCode._(101, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'WorkspaceDatabaseError');
|
||||
static const ErrorCode UserInternalError = ErrorCode._(102, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserInternalError');
|
||||
static const ErrorCode UserNotLoginYet = ErrorCode._(103, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserNotLoginYet');
|
||||
static const ErrorCode UserIdIsEmpty = ErrorCode._(104, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserIdIsEmpty');
|
||||
static const ErrorCode ServerError = ErrorCode._(1000, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ServerError');
|
||||
static const ErrorCode UserIdIsEmpty = ErrorCode._(102, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserIdIsEmpty');
|
||||
static const ErrorCode UserUnauthorized = ErrorCode._(103, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserUnauthorized');
|
||||
static const ErrorCode InternalError = ErrorCode._(1000, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'InternalError');
|
||||
static const ErrorCode RecordNotFound = ErrorCode._(1001, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RecordNotFound');
|
||||
|
||||
static const $core.List<ErrorCode> values = <ErrorCode> [
|
||||
@ -45,10 +44,9 @@ class ErrorCode extends $pb.ProtobufEnum {
|
||||
ViewDescInvalid,
|
||||
DatabaseConnectionFail,
|
||||
WorkspaceDatabaseError,
|
||||
UserInternalError,
|
||||
UserNotLoginYet,
|
||||
UserIdIsEmpty,
|
||||
ServerError,
|
||||
UserUnauthorized,
|
||||
InternalError,
|
||||
RecordNotFound,
|
||||
];
|
||||
|
||||
|
@ -26,16 +26,15 @@ const ErrorCode$json = const {
|
||||
const {'1': 'ViewDescInvalid', '2': 23},
|
||||
const {'1': 'DatabaseConnectionFail', '2': 100},
|
||||
const {'1': 'WorkspaceDatabaseError', '2': 101},
|
||||
const {'1': 'UserInternalError', '2': 102},
|
||||
const {'1': 'UserNotLoginYet', '2': 103},
|
||||
const {'1': 'UserIdIsEmpty', '2': 104},
|
||||
const {'1': 'ServerError', '2': 1000},
|
||||
const {'1': 'UserIdIsEmpty', '2': 102},
|
||||
const {'1': 'UserUnauthorized', '2': 103},
|
||||
const {'1': 'InternalError', '2': 1000},
|
||||
const {'1': 'RecordNotFound', '2': 1001},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `ErrorCode`. Decode as a `google.protobuf.EnumDescriptorProto`.
|
||||
final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode('CglFcnJvckNvZGUSCwoHVW5rbm93bhAAEhgKFFdvcmtzcGFjZU5hbWVJbnZhbGlkEAESFgoSV29ya3NwYWNlSWRJbnZhbGlkEAISGAoUQXBwQ29sb3JTdHlsZUludmFsaWQQAxIYChRXb3Jrc3BhY2VEZXNjSW52YWxpZBAEEhwKGEN1cnJlbnRXb3Jrc3BhY2VOb3RGb3VuZBAFEhAKDEFwcElkSW52YWxpZBAKEhIKDkFwcE5hbWVJbnZhbGlkEAsSEwoPVmlld05hbWVJbnZhbGlkEBQSGAoUVmlld1RodW1ibmFpbEludmFsaWQQFRIRCg1WaWV3SWRJbnZhbGlkEBYSEwoPVmlld0Rlc2NJbnZhbGlkEBcSGgoWRGF0YWJhc2VDb25uZWN0aW9uRmFpbBBkEhoKFldvcmtzcGFjZURhdGFiYXNlRXJyb3IQZRIVChFVc2VySW50ZXJuYWxFcnJvchBmEhMKD1VzZXJOb3RMb2dpbllldBBnEhEKDVVzZXJJZElzRW1wdHkQaBIQCgtTZXJ2ZXJFcnJvchDoBxITCg5SZWNvcmROb3RGb3VuZBDpBw==');
|
||||
final $typed_data.Uint8List errorCodeDescriptor = $convert.base64Decode('CglFcnJvckNvZGUSCwoHVW5rbm93bhAAEhgKFFdvcmtzcGFjZU5hbWVJbnZhbGlkEAESFgoSV29ya3NwYWNlSWRJbnZhbGlkEAISGAoUQXBwQ29sb3JTdHlsZUludmFsaWQQAxIYChRXb3Jrc3BhY2VEZXNjSW52YWxpZBAEEhwKGEN1cnJlbnRXb3Jrc3BhY2VOb3RGb3VuZBAFEhAKDEFwcElkSW52YWxpZBAKEhIKDkFwcE5hbWVJbnZhbGlkEAsSEwoPVmlld05hbWVJbnZhbGlkEBQSGAoUVmlld1RodW1ibmFpbEludmFsaWQQFRIRCg1WaWV3SWRJbnZhbGlkEBYSEwoPVmlld0Rlc2NJbnZhbGlkEBcSGgoWRGF0YWJhc2VDb25uZWN0aW9uRmFpbBBkEhoKFldvcmtzcGFjZURhdGFiYXNlRXJyb3IQZRIRCg1Vc2VySWRJc0VtcHR5EGYSFAoQVXNlclVuYXV0aG9yaXplZBBnEhIKDUludGVybmFsRXJyb3IQ6AcSEwoOUmVjb3JkTm90Rm91bmQQ6Qc=');
|
||||
@$core.Deprecated('Use workspaceErrorDescriptor instead')
|
||||
const WorkspaceError$json = const {
|
||||
'1': 'WorkspaceError',
|
||||
|
@ -21,6 +21,7 @@ class WorkspaceObservable extends $pb.ProtobufEnum {
|
||||
static const WorkspaceObservable AppCreateView = WorkspaceObservable._(23, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'AppCreateView');
|
||||
static const WorkspaceObservable AppDeleteView = WorkspaceObservable._(24, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'AppDeleteView');
|
||||
static const WorkspaceObservable ViewUpdated = WorkspaceObservable._(31, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ViewUpdated');
|
||||
static const WorkspaceObservable UserUnauthorized = WorkspaceObservable._(100, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserUnauthorized');
|
||||
|
||||
static const $core.List<WorkspaceObservable> values = <WorkspaceObservable> [
|
||||
Unknown,
|
||||
@ -34,6 +35,7 @@ class WorkspaceObservable extends $pb.ProtobufEnum {
|
||||
AppCreateView,
|
||||
AppDeleteView,
|
||||
ViewUpdated,
|
||||
UserUnauthorized,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, WorkspaceObservable> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
|
@ -23,8 +23,9 @@ const WorkspaceObservable$json = const {
|
||||
const {'1': 'AppCreateView', '2': 23},
|
||||
const {'1': 'AppDeleteView', '2': 24},
|
||||
const {'1': 'ViewUpdated', '2': 31},
|
||||
const {'1': 'UserUnauthorized', '2': 100},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `WorkspaceObservable`. Decode as a `google.protobuf.EnumDescriptorProto`.
|
||||
final $typed_data.Uint8List workspaceObservableDescriptor = $convert.base64Decode('ChNXb3Jrc3BhY2VPYnNlcnZhYmxlEgsKB1Vua25vd24QABIXChNVc2VyQ3JlYXRlV29ya3NwYWNlEAoSFwoTVXNlckRlbGV0ZVdvcmtzcGFjZRALEhQKEFdvcmtzcGFjZVVwZGF0ZWQQDBIWChJXb3Jrc3BhY2VDcmVhdGVBcHAQDRIWChJXb3Jrc3BhY2VEZWxldGVBcHAQDhIYChRXb3Jrc3BhY2VMaXN0VXBkYXRlZBAPEg4KCkFwcFVwZGF0ZWQQFRIRCg1BcHBDcmVhdGVWaWV3EBcSEQoNQXBwRGVsZXRlVmlldxAYEg8KC1ZpZXdVcGRhdGVkEB8=');
|
||||
final $typed_data.Uint8List workspaceObservableDescriptor = $convert.base64Decode('ChNXb3Jrc3BhY2VPYnNlcnZhYmxlEgsKB1Vua25vd24QABIXChNVc2VyQ3JlYXRlV29ya3NwYWNlEAoSFwoTVXNlckRlbGV0ZVdvcmtzcGFjZRALEhQKEFdvcmtzcGFjZVVwZGF0ZWQQDBIWChJXb3Jrc3BhY2VDcmVhdGVBcHAQDRIWChJXb3Jrc3BhY2VEZWxldGVBcHAQDhIYChRXb3Jrc3BhY2VMaXN0VXBkYXRlZBAPEg4KCkFwcFVwZGF0ZWQQFRIRCg1BcHBDcmVhdGVWaWV3EBcSEQoNQXBwRGVsZXRlVmlldxAYEg8KC1ZpZXdVcGRhdGVkEB8SFAoQVXNlclVuYXV0aG9yaXplZBBk');
|
||||
|
@ -45,7 +45,7 @@ tokio = { version = "1", features = ["full"] }
|
||||
flowy-log = { path = "../rust-lib/flowy-log" }
|
||||
flowy-user = { path = "../rust-lib/flowy-user" }
|
||||
flowy-workspace = { path = "../rust-lib/flowy-workspace" }
|
||||
flowy-net = { path = "../rust-lib/flowy-net", features = ["http"] }
|
||||
flowy-net = { path = "../rust-lib/flowy-net", features = ["http_server"] }
|
||||
|
||||
ormx = { version = "0.7", features = ["postgres"]}
|
||||
[dependencies.sqlx]
|
||||
|
@ -27,4 +27,5 @@ thiserror = "1.0.24"
|
||||
uuid = { version = "0.8", features = ["v4"] }
|
||||
|
||||
[features]
|
||||
http = ["actix-web"]
|
||||
http_server = ["actix-web"]
|
||||
flowy_request = []
|
@ -43,6 +43,8 @@ impl ServerError {
|
||||
}
|
||||
|
||||
pub fn is_not_found(&self) -> bool { self.code == ErrorCode::RecordNotFound }
|
||||
|
||||
pub fn is_unauthorized(&self) -> bool { self.code == ErrorCode::Unauthorized }
|
||||
}
|
||||
|
||||
pub fn invalid_params<T: Debug>(e: T) -> ServerError { ServerError::params_invalid().context(e) }
|
||||
@ -66,18 +68,16 @@ impl std::convert::From<&ServerError> for FlowyResponse {
|
||||
#[derive(Serialize_repr, Deserialize_repr, PartialEq, Debug, Clone, derive_more::Display)]
|
||||
#[repr(u16)]
|
||||
pub enum ErrorCode {
|
||||
#[display(fmt = "Token is invalid")]
|
||||
InvalidToken = 1,
|
||||
#[display(fmt = "Unauthorized")]
|
||||
Unauthorized = 2,
|
||||
Unauthorized = 1,
|
||||
#[display(fmt = "Payload too large")]
|
||||
PayloadOverflow = 3,
|
||||
PayloadOverflow = 2,
|
||||
#[display(fmt = "Payload deserialize failed")]
|
||||
PayloadSerdeFail = 4,
|
||||
PayloadSerdeFail = 3,
|
||||
#[display(fmt = "Unexpected empty payload")]
|
||||
PayloadUnexpectedNone = 5,
|
||||
PayloadUnexpectedNone = 4,
|
||||
#[display(fmt = "Params is invalid")]
|
||||
ParamsInvalid = 6,
|
||||
ParamsInvalid = 5,
|
||||
|
||||
#[display(fmt = "Protobuf serde error")]
|
||||
ProtobufError = 10,
|
||||
|
@ -1,4 +1,5 @@
|
||||
pub mod config;
|
||||
pub mod errors;
|
||||
#[cfg(feature = "flowy_request")]
|
||||
pub mod request;
|
||||
pub mod response;
|
||||
|
@ -1,55 +1,73 @@
|
||||
use crate::{errors::ServerError, response::FlowyResponse};
|
||||
use crate::{
|
||||
errors::{ErrorCode, ServerError},
|
||||
response::FlowyResponse,
|
||||
};
|
||||
use bytes::Bytes;
|
||||
use hyper::http;
|
||||
use protobuf::ProtobufError;
|
||||
use reqwest::{header::HeaderMap, Client, Method, Response};
|
||||
use std::{
|
||||
convert::{TryFrom, TryInto},
|
||||
sync::Arc,
|
||||
time::Duration,
|
||||
};
|
||||
use tokio::sync::oneshot;
|
||||
|
||||
pub trait ResponseMiddleware {
|
||||
fn receive_response(&self, response: &FlowyResponse);
|
||||
}
|
||||
|
||||
pub struct HttpRequestBuilder {
|
||||
url: String,
|
||||
body: Option<Bytes>,
|
||||
response: Option<Bytes>,
|
||||
headers: HeaderMap,
|
||||
method: Method,
|
||||
middleware: Vec<Arc<dyn ResponseMiddleware + Send + Sync>>,
|
||||
}
|
||||
|
||||
impl HttpRequestBuilder {
|
||||
fn new(url: &str) -> Self {
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
url: url.to_owned(),
|
||||
url: "".to_owned(),
|
||||
body: None,
|
||||
response: None,
|
||||
headers: HeaderMap::new(),
|
||||
method: Method::GET,
|
||||
middleware: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get(url: &str) -> Self {
|
||||
let mut builder = Self::new(url);
|
||||
builder.method = Method::GET;
|
||||
builder
|
||||
pub fn middleware<T>(mut self, middleware: Arc<T>) -> Self
|
||||
where
|
||||
T: 'static + ResponseMiddleware + Send + Sync,
|
||||
{
|
||||
self.middleware.push(middleware);
|
||||
self
|
||||
}
|
||||
|
||||
pub fn post(url: &str) -> Self {
|
||||
let mut builder = Self::new(url);
|
||||
builder.method = Method::POST;
|
||||
builder
|
||||
pub fn get(mut self, url: &str) -> Self {
|
||||
self.url = url.to_owned();
|
||||
self.method = Method::GET;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn patch(url: &str) -> Self {
|
||||
let mut builder = Self::new(url);
|
||||
builder.method = Method::PATCH;
|
||||
builder
|
||||
pub fn post(mut self, url: &str) -> Self {
|
||||
self.url = url.to_owned();
|
||||
self.method = Method::POST;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn delete(url: &str) -> Self {
|
||||
let mut builder = Self::new(url);
|
||||
builder.method = Method::DELETE;
|
||||
builder
|
||||
pub fn patch(mut self, url: &str) -> Self {
|
||||
self.url = url.to_owned();
|
||||
self.method = Method::PATCH;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn delete(mut self, url: &str) -> Self {
|
||||
self.url = url.to_owned();
|
||||
self.method = Method::DELETE;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn header(mut self, key: &'static str, value: &str) -> Self {
|
||||
@ -57,9 +75,9 @@ impl HttpRequestBuilder {
|
||||
self
|
||||
}
|
||||
|
||||
pub fn protobuf<T1>(self, body: T1) -> Result<Self, ServerError>
|
||||
pub fn protobuf<T>(self, body: T) -> Result<Self, ServerError>
|
||||
where
|
||||
T1: TryInto<Bytes, Error = ProtobufError>,
|
||||
T: TryInto<Bytes, Error = ProtobufError>,
|
||||
{
|
||||
let body: Bytes = body.try_into()?;
|
||||
self.bytes(body)
|
||||
@ -95,13 +113,16 @@ impl HttpRequestBuilder {
|
||||
});
|
||||
|
||||
let response = rx.await??;
|
||||
|
||||
match get_response_data(response).await {
|
||||
Ok(bytes) => {
|
||||
self.response = Some(bytes);
|
||||
let flowy_response = flowy_response_from(response).await?;
|
||||
self.middleware.iter().for_each(|middleware| {
|
||||
middleware.receive_response(&flowy_response);
|
||||
});
|
||||
match flowy_response.error {
|
||||
None => {
|
||||
self.response = Some(flowy_response.data);
|
||||
Ok(self)
|
||||
},
|
||||
Err(error) => Err(error),
|
||||
Some(error) => Err(error),
|
||||
}
|
||||
}
|
||||
|
||||
@ -119,6 +140,13 @@ impl HttpRequestBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
async fn flowy_response_from(original: Response) -> Result<FlowyResponse, ServerError> {
|
||||
let bytes = original.bytes().await?;
|
||||
let response: FlowyResponse = serde_json::from_slice(&bytes)?;
|
||||
Ok(response)
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
async fn get_response_data(original: Response) -> Result<Bytes, ServerError> {
|
||||
if original.status() == http::StatusCode::OK {
|
||||
let bytes = original.bytes().await?;
|
||||
|
@ -1,7 +1,7 @@
|
||||
mod response;
|
||||
mod response_serde;
|
||||
|
||||
#[cfg(feature = "http")]
|
||||
#[cfg(feature = "http_server")]
|
||||
mod response_http;
|
||||
|
||||
pub use response::*;
|
||||
|
@ -3,7 +3,7 @@ use flowy_derive::ProtoBuf;
|
||||
#[derive(Debug, Clone, ProtoBuf)]
|
||||
pub struct ObservableSubject {
|
||||
#[pb(index = 1)]
|
||||
pub category: String,
|
||||
pub source: String,
|
||||
|
||||
#[pb(index = 2)]
|
||||
pub ty: i32,
|
||||
@ -21,7 +21,7 @@ pub struct ObservableSubject {
|
||||
impl std::default::Default for ObservableSubject {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
category: "".to_string(),
|
||||
source: "".to_string(),
|
||||
ty: 0,
|
||||
id: "".to_string(),
|
||||
payload: None,
|
||||
|
@ -11,18 +11,18 @@ pub struct ObservableBuilder {
|
||||
id: String,
|
||||
payload: Option<Bytes>,
|
||||
error: Option<Bytes>,
|
||||
source: String,
|
||||
ty: i32,
|
||||
category: String,
|
||||
}
|
||||
|
||||
impl ObservableBuilder {
|
||||
pub fn new<T: Into<i32>>(id: &str, ty: T, category: &str) -> Self {
|
||||
pub fn new<T: Into<i32>>(id: &str, ty: T, source: &str) -> Self {
|
||||
Self {
|
||||
id: id.to_owned(),
|
||||
ty: ty.into(),
|
||||
payload: None,
|
||||
error: None,
|
||||
category: category.to_owned(),
|
||||
source: source.to_owned(),
|
||||
}
|
||||
}
|
||||
|
||||
@ -65,7 +65,7 @@ impl ObservableBuilder {
|
||||
};
|
||||
|
||||
let subject = ObservableSubject {
|
||||
category: self.category,
|
||||
source: self.source,
|
||||
ty: self.ty,
|
||||
id: self.id,
|
||||
payload,
|
||||
|
@ -26,7 +26,7 @@
|
||||
#[derive(PartialEq,Clone,Default)]
|
||||
pub struct ObservableSubject {
|
||||
// message fields
|
||||
pub category: ::std::string::String,
|
||||
pub source: ::std::string::String,
|
||||
pub ty: i32,
|
||||
pub id: ::std::string::String,
|
||||
// message oneof groups
|
||||
@ -58,30 +58,30 @@ impl ObservableSubject {
|
||||
::std::default::Default::default()
|
||||
}
|
||||
|
||||
// string category = 1;
|
||||
// string source = 1;
|
||||
|
||||
|
||||
pub fn get_category(&self) -> &str {
|
||||
&self.category
|
||||
pub fn get_source(&self) -> &str {
|
||||
&self.source
|
||||
}
|
||||
pub fn clear_category(&mut self) {
|
||||
self.category.clear();
|
||||
pub fn clear_source(&mut self) {
|
||||
self.source.clear();
|
||||
}
|
||||
|
||||
// Param is passed by value, moved
|
||||
pub fn set_category(&mut self, v: ::std::string::String) {
|
||||
self.category = v;
|
||||
pub fn set_source(&mut self, v: ::std::string::String) {
|
||||
self.source = v;
|
||||
}
|
||||
|
||||
// Mutable pointer to the field.
|
||||
// If field is not initialized, it is initialized with default value first.
|
||||
pub fn mut_category(&mut self) -> &mut ::std::string::String {
|
||||
&mut self.category
|
||||
pub fn mut_source(&mut self) -> &mut ::std::string::String {
|
||||
&mut self.source
|
||||
}
|
||||
|
||||
// Take field
|
||||
pub fn take_category(&mut self) -> ::std::string::String {
|
||||
::std::mem::replace(&mut self.category, ::std::string::String::new())
|
||||
pub fn take_source(&mut self) -> ::std::string::String {
|
||||
::std::mem::replace(&mut self.source, ::std::string::String::new())
|
||||
}
|
||||
|
||||
// int32 ty = 2;
|
||||
@ -234,7 +234,7 @@ impl ::protobuf::Message for ObservableSubject {
|
||||
let (field_number, wire_type) = is.read_tag_unpack()?;
|
||||
match field_number {
|
||||
1 => {
|
||||
::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.category)?;
|
||||
::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.source)?;
|
||||
},
|
||||
2 => {
|
||||
if wire_type != ::protobuf::wire_format::WireTypeVarint {
|
||||
@ -270,8 +270,8 @@ impl ::protobuf::Message for ObservableSubject {
|
||||
#[allow(unused_variables)]
|
||||
fn compute_size(&self) -> u32 {
|
||||
let mut my_size = 0;
|
||||
if !self.category.is_empty() {
|
||||
my_size += ::protobuf::rt::string_size(1, &self.category);
|
||||
if !self.source.is_empty() {
|
||||
my_size += ::protobuf::rt::string_size(1, &self.source);
|
||||
}
|
||||
if self.ty != 0 {
|
||||
my_size += ::protobuf::rt::value_size(2, self.ty, ::protobuf::wire_format::WireTypeVarint);
|
||||
@ -299,8 +299,8 @@ impl ::protobuf::Message for ObservableSubject {
|
||||
}
|
||||
|
||||
fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
|
||||
if !self.category.is_empty() {
|
||||
os.write_string(1, &self.category)?;
|
||||
if !self.source.is_empty() {
|
||||
os.write_string(1, &self.source)?;
|
||||
}
|
||||
if self.ty != 0 {
|
||||
os.write_int32(2, self.ty)?;
|
||||
@ -361,9 +361,9 @@ impl ::protobuf::Message for ObservableSubject {
|
||||
descriptor.get(|| {
|
||||
let mut fields = ::std::vec::Vec::new();
|
||||
fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
|
||||
"category",
|
||||
|m: &ObservableSubject| { &m.category },
|
||||
|m: &mut ObservableSubject| { &mut m.category },
|
||||
"source",
|
||||
|m: &ObservableSubject| { &m.source },
|
||||
|m: &mut ObservableSubject| { &mut m.source },
|
||||
));
|
||||
fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt32>(
|
||||
"ty",
|
||||
@ -401,7 +401,7 @@ impl ::protobuf::Message for ObservableSubject {
|
||||
|
||||
impl ::protobuf::Clear for ObservableSubject {
|
||||
fn clear(&mut self) {
|
||||
self.category.clear();
|
||||
self.source.clear();
|
||||
self.ty = 0;
|
||||
self.id.clear();
|
||||
self.one_of_payload = ::std::option::Option::None;
|
||||
@ -423,20 +423,20 @@ impl ::protobuf::reflect::ProtobufValue for ObservableSubject {
|
||||
}
|
||||
|
||||
static file_descriptor_proto_data: &'static [u8] = b"\
|
||||
\n\rsubject.proto\"\xa5\x01\n\x11ObservableSubject\x12\x1a\n\x08category\
|
||||
\x18\x01\x20\x01(\tR\x08category\x12\x0e\n\x02ty\x18\x02\x20\x01(\x05R\
|
||||
\x02ty\x12\x0e\n\x02id\x18\x03\x20\x01(\tR\x02id\x12\x1a\n\x07payload\
|
||||
\x18\x04\x20\x01(\x0cH\0R\x07payload\x12\x16\n\x05error\x18\x05\x20\x01(\
|
||||
\x0cH\x01R\x05errorB\x10\n\x0eone_of_payloadB\x0e\n\x0cone_of_errorJ\xf3\
|
||||
\x02\n\x06\x12\x04\0\0\x08\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\n\n\x02\
|
||||
\x04\0\x12\x04\x02\0\x08\x01\n\n\n\x03\x04\0\x01\x12\x03\x02\x08\x19\n\
|
||||
\x0b\n\x04\x04\0\x02\0\x12\x03\x03\x04\x18\n\x0c\n\x05\x04\0\x02\0\x05\
|
||||
\x12\x03\x03\x04\n\n\x0c\n\x05\x04\0\x02\0\x01\x12\x03\x03\x0b\x13\n\x0c\
|
||||
\n\x05\x04\0\x02\0\x03\x12\x03\x03\x16\x17\n\x0b\n\x04\x04\0\x02\x01\x12\
|
||||
\x03\x04\x04\x11\n\x0c\n\x05\x04\0\x02\x01\x05\x12\x03\x04\x04\t\n\x0c\n\
|
||||
\x05\x04\0\x02\x01\x01\x12\x03\x04\n\x0c\n\x0c\n\x05\x04\0\x02\x01\x03\
|
||||
\x12\x03\x04\x0f\x10\n\x0b\n\x04\x04\0\x02\x02\x12\x03\x05\x04\x12\n\x0c\
|
||||
\n\x05\x04\0\x02\x02\x05\x12\x03\x05\x04\n\n\x0c\n\x05\x04\0\x02\x02\x01\
|
||||
\n\rsubject.proto\"\xa1\x01\n\x11ObservableSubject\x12\x16\n\x06source\
|
||||
\x18\x01\x20\x01(\tR\x06source\x12\x0e\n\x02ty\x18\x02\x20\x01(\x05R\x02\
|
||||
ty\x12\x0e\n\x02id\x18\x03\x20\x01(\tR\x02id\x12\x1a\n\x07payload\x18\
|
||||
\x04\x20\x01(\x0cH\0R\x07payload\x12\x16\n\x05error\x18\x05\x20\x01(\x0c\
|
||||
H\x01R\x05errorB\x10\n\x0eone_of_payloadB\x0e\n\x0cone_of_errorJ\xf3\x02\
|
||||
\n\x06\x12\x04\0\0\x08\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\n\n\x02\x04\
|
||||
\0\x12\x04\x02\0\x08\x01\n\n\n\x03\x04\0\x01\x12\x03\x02\x08\x19\n\x0b\n\
|
||||
\x04\x04\0\x02\0\x12\x03\x03\x04\x16\n\x0c\n\x05\x04\0\x02\0\x05\x12\x03\
|
||||
\x03\x04\n\n\x0c\n\x05\x04\0\x02\0\x01\x12\x03\x03\x0b\x11\n\x0c\n\x05\
|
||||
\x04\0\x02\0\x03\x12\x03\x03\x14\x15\n\x0b\n\x04\x04\0\x02\x01\x12\x03\
|
||||
\x04\x04\x11\n\x0c\n\x05\x04\0\x02\x01\x05\x12\x03\x04\x04\t\n\x0c\n\x05\
|
||||
\x04\0\x02\x01\x01\x12\x03\x04\n\x0c\n\x0c\n\x05\x04\0\x02\x01\x03\x12\
|
||||
\x03\x04\x0f\x10\n\x0b\n\x04\x04\0\x02\x02\x12\x03\x05\x04\x12\n\x0c\n\
|
||||
\x05\x04\0\x02\x02\x05\x12\x03\x05\x04\n\n\x0c\n\x05\x04\0\x02\x02\x01\
|
||||
\x12\x03\x05\x0b\r\n\x0c\n\x05\x04\0\x02\x02\x03\x12\x03\x05\x10\x11\n\
|
||||
\x0b\n\x04\x04\0\x08\0\x12\x03\x06\x04/\n\x0c\n\x05\x04\0\x08\0\x01\x12\
|
||||
\x03\x06\n\x18\n\x0b\n\x04\x04\0\x02\x03\x12\x03\x06\x1b-\n\x0c\n\x05\
|
||||
|
@ -1,7 +1,7 @@
|
||||
syntax = "proto3";
|
||||
|
||||
message ObservableSubject {
|
||||
string category = 1;
|
||||
string source = 1;
|
||||
int32 ty = 2;
|
||||
string id = 3;
|
||||
oneof one_of_payload { bytes payload = 4; };
|
||||
|
@ -15,13 +15,13 @@ impl WorkspaceUser for WorkspaceUserImpl {
|
||||
fn user_id(&self) -> Result<String, WorkspaceError> {
|
||||
self.user_session
|
||||
.user_id()
|
||||
.map_err(|e| ErrorBuilder::new(ErrorCode::UserInternalError).error(e).build())
|
||||
.map_err(|e| ErrorBuilder::new(ErrorCode::InternalError).error(e).build())
|
||||
}
|
||||
|
||||
fn token(&self) -> Result<String, WorkspaceError> {
|
||||
self.user_session
|
||||
.token()
|
||||
.map_err(|e| ErrorBuilder::new(ErrorCode::UserInternalError).error(e).build())
|
||||
.map_err(|e| ErrorBuilder::new(ErrorCode::InternalError).error(e).build())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -43,7 +43,7 @@ const DEFAULT_WORKSPACE: &'static str = "Default_Workspace";
|
||||
pub(crate) fn create_default_workspace_if_need(dispatch: Arc<EventDispatch>, user_id: &str) -> Result<(), UserError> {
|
||||
let key = format!("{}{}", user_id, DEFAULT_WORKSPACE);
|
||||
if KV::get_bool(&key).unwrap_or(false) {
|
||||
return Err(ErrorBuilder::new(ErrorCode::DefaultWorkspaceAlreadyExist).build());
|
||||
return Err(ErrorBuilder::new(ErrorCode::InternalError).build());
|
||||
}
|
||||
KV::set_bool(&key, true);
|
||||
|
||||
@ -57,9 +57,9 @@ pub(crate) fn create_default_workspace_if_need(dispatch: Arc<EventDispatch>, use
|
||||
let request = ModuleRequest::new(CreateWorkspace).payload(payload);
|
||||
let result = EventDispatch::sync_send(dispatch.clone(), request)
|
||||
.parse::<Workspace, WorkspaceError>()
|
||||
.map_err(|e| ErrorBuilder::new(ErrorCode::CreateDefaultWorkspaceFailed).error(e).build())?;
|
||||
.map_err(|e| ErrorBuilder::new(ErrorCode::InternalError).error(e).build())?;
|
||||
|
||||
let workspace = result.map_err(|e| ErrorBuilder::new(ErrorCode::CreateDefaultWorkspaceFailed).error(e).build())?;
|
||||
let workspace = result.map_err(|e| ErrorBuilder::new(ErrorCode::InternalError).error(e).build())?;
|
||||
let query: Bytes = QueryWorkspaceRequest {
|
||||
workspace_id: Some(workspace.id.clone()),
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ flowy-derive = { path = "../flowy-derive" }
|
||||
flowy-database = { path = "../flowy-database" }
|
||||
flowy-sqlite = { path = "../flowy-sqlite" }
|
||||
flowy-infra = { path = "../flowy-infra" }
|
||||
flowy-net = { path = "../flowy-net" }
|
||||
flowy-net = { path = "../flowy-net", features = ["flowy_request"] }
|
||||
flowy-observable = { path = "../flowy-observable" }
|
||||
|
||||
tracing = { version = "0.1", features = ["log"] }
|
||||
|
@ -26,7 +26,7 @@ impl UserName {
|
||||
let contains_forbidden_characters = s.chars().any(|g| forbidden_characters.contains(&g));
|
||||
|
||||
if contains_forbidden_characters {
|
||||
return Err(ErrorCode::UserNameContainsForbiddenCharacters);
|
||||
return Err(ErrorCode::ContainForbiddenCharacters);
|
||||
}
|
||||
|
||||
Ok(Self(s))
|
||||
|
@ -33,21 +33,6 @@ pub enum ErrorCode {
|
||||
AcquireReadLockedFailed = 3,
|
||||
#[display(fmt = "Opening database is not belonging to the current user")]
|
||||
UserDatabaseDidNotMatch = 4,
|
||||
#[display(fmt = "Database internal error")]
|
||||
UserDatabaseInternalError = 5,
|
||||
|
||||
#[display(fmt = "Sql internal error")]
|
||||
SqlInternalError = 6,
|
||||
|
||||
#[display(fmt = "r2d2 connection error")]
|
||||
DatabaseConnectError = 7,
|
||||
|
||||
#[display(fmt = "User not login yet")]
|
||||
UserNotLoginYet = 10,
|
||||
#[display(fmt = "Get current id read lock failed")]
|
||||
ReadCurrentIdFailed = 11,
|
||||
#[display(fmt = "Get current id write lock failed")]
|
||||
WriteCurrentIdFailed = 12,
|
||||
|
||||
#[display(fmt = "Email can not be empty or whitespace")]
|
||||
EmailIsEmpty = 20,
|
||||
@ -69,7 +54,7 @@ pub enum ErrorCode {
|
||||
#[display(fmt = "User name is too long")]
|
||||
UserNameTooLong = 40,
|
||||
#[display(fmt = "User name contain forbidden characters")]
|
||||
UserNameContainsForbiddenCharacters = 41,
|
||||
ContainForbiddenCharacters = 41,
|
||||
#[display(fmt = "User name can not be empty or whitespace")]
|
||||
UserNameIsEmpty = 42,
|
||||
#[display(fmt = "User workspace is invalid")]
|
||||
@ -77,18 +62,12 @@ pub enum ErrorCode {
|
||||
#[display(fmt = "User id is invalid")]
|
||||
UserIdInvalid = 51,
|
||||
#[display(fmt = "User token is invalid")]
|
||||
UserTokenInvalid = 54,
|
||||
UserUnauthorized = 54,
|
||||
#[display(fmt = "User not exist")]
|
||||
UserNotExist = 55,
|
||||
|
||||
#[display(fmt = "Create user default workspace failed")]
|
||||
CreateDefaultWorkspaceFailed = 60,
|
||||
|
||||
#[display(fmt = "User default workspace already exists")]
|
||||
DefaultWorkspaceAlreadyExist = 61,
|
||||
|
||||
#[display(fmt = "Server error")]
|
||||
ServerError = 100,
|
||||
#[display(fmt = "Internal error")]
|
||||
InternalError = 100,
|
||||
}
|
||||
|
||||
impl Debug for ErrorCode {
|
||||
@ -104,17 +83,17 @@ impl std::default::Default for ErrorCode {
|
||||
}
|
||||
|
||||
impl std::convert::From<flowy_database::Error> for UserError {
|
||||
fn from(error: flowy_database::Error) -> Self { ErrorBuilder::new(ErrorCode::UserDatabaseInternalError).error(error).build() }
|
||||
fn from(error: flowy_database::Error) -> Self { ErrorBuilder::new(ErrorCode::InternalError).error(error).build() }
|
||||
}
|
||||
|
||||
impl std::convert::From<::r2d2::Error> for UserError {
|
||||
fn from(error: r2d2::Error) -> Self { ErrorBuilder::new(ErrorCode::DatabaseConnectError).error(error).build() }
|
||||
fn from(error: r2d2::Error) -> Self { ErrorBuilder::new(ErrorCode::InternalError).error(error).build() }
|
||||
}
|
||||
|
||||
// use diesel::result::{Error, DatabaseErrorKind};
|
||||
// use flowy_sqlite::ErrorKind;
|
||||
impl std::convert::From<flowy_sqlite::Error> for UserError {
|
||||
fn from(error: flowy_sqlite::Error) -> Self { ErrorBuilder::new(ErrorCode::SqlInternalError).error(error).build() }
|
||||
fn from(error: flowy_sqlite::Error) -> Self { ErrorBuilder::new(ErrorCode::InternalError).error(error).build() }
|
||||
}
|
||||
|
||||
impl std::convert::From<flowy_net::errors::ServerError> for UserError {
|
||||
@ -127,24 +106,10 @@ impl std::convert::From<flowy_net::errors::ServerError> for UserError {
|
||||
use flowy_net::errors::ErrorCode as ServerErrorCode;
|
||||
fn server_error_to_user_error(code: ServerErrorCode) -> ErrorCode {
|
||||
match code {
|
||||
ServerErrorCode::InvalidToken => ErrorCode::UserTokenInvalid,
|
||||
ServerErrorCode::Unauthorized => ErrorCode::UserTokenInvalid,
|
||||
ServerErrorCode::PayloadOverflow => ErrorCode::ServerError,
|
||||
ServerErrorCode::PayloadSerdeFail => ErrorCode::ServerError,
|
||||
ServerErrorCode::PayloadUnexpectedNone => ErrorCode::ServerError,
|
||||
ServerErrorCode::ParamsInvalid => ErrorCode::ServerError,
|
||||
ServerErrorCode::ProtobufError => ErrorCode::ServerError,
|
||||
ServerErrorCode::SerdeError => ErrorCode::ServerError,
|
||||
ServerErrorCode::EmailAlreadyExists => ErrorCode::ServerError,
|
||||
ServerErrorCode::Unauthorized => ErrorCode::UserUnauthorized,
|
||||
ServerErrorCode::PasswordNotMatch => ErrorCode::PasswordNotMatch,
|
||||
ServerErrorCode::ConnectRefused => ErrorCode::ServerError,
|
||||
ServerErrorCode::ConnectTimeout => ErrorCode::ServerError,
|
||||
ServerErrorCode::ConnectClose => ErrorCode::ServerError,
|
||||
ServerErrorCode::ConnectCancel => ErrorCode::ServerError,
|
||||
ServerErrorCode::SqlError => ErrorCode::ServerError,
|
||||
ServerErrorCode::RecordNotFound => ErrorCode::UserNotExist,
|
||||
ServerErrorCode::HttpError => ErrorCode::ServerError,
|
||||
ServerErrorCode::InternalError => ErrorCode::ServerError,
|
||||
_ => ErrorCode::InternalError,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@ use flowy_dispatch::prelude::*;
|
||||
|
||||
use std::{convert::TryInto, sync::Arc};
|
||||
|
||||
#[tracing::instrument(name = "get_user_status", skip(session))]
|
||||
#[tracing::instrument(name = "get_profile", skip(session))]
|
||||
pub async fn user_profile_handler(session: Unit<Arc<UserSession>>) -> DataResult<UserProfile, UserError> {
|
||||
let user_profile = session.user_profile().await?;
|
||||
data_result(user_profile)
|
||||
|
@ -1,7 +1,6 @@
|
||||
use bytes::Bytes;
|
||||
use flowy_derive::ProtoBuf_Enum;
|
||||
use flowy_dispatch::prelude::ToBytes;
|
||||
use flowy_observable::{dart::RustStreamSender, entities::ObservableSubject, ObservableBuilder};
|
||||
|
||||
use flowy_observable::ObservableBuilder;
|
||||
|
||||
const OBSERVABLE_CATEGORY: &'static str = "User";
|
||||
|
||||
@ -10,6 +9,7 @@ pub(crate) enum UserObservable {
|
||||
Unknown = 0,
|
||||
UserAuthChanged = 1,
|
||||
UserProfileUpdated = 2,
|
||||
UserUnauthorized = 3,
|
||||
}
|
||||
|
||||
impl std::default::Default for UserObservable {
|
||||
|
@ -220,12 +220,6 @@ pub enum ErrorCode {
|
||||
AcquireWriteLockedFailed = 2,
|
||||
AcquireReadLockedFailed = 3,
|
||||
UserDatabaseDidNotMatch = 4,
|
||||
UserDatabaseInternalError = 5,
|
||||
SqlInternalError = 6,
|
||||
DatabaseConnectError = 7,
|
||||
UserNotLoginYet = 10,
|
||||
ReadCurrentIdFailed = 11,
|
||||
WriteCurrentIdFailed = 12,
|
||||
EmailIsEmpty = 20,
|
||||
EmailFormatInvalid = 21,
|
||||
EmailAlreadyExists = 22,
|
||||
@ -235,15 +229,13 @@ pub enum ErrorCode {
|
||||
PasswordFormatInvalid = 33,
|
||||
PasswordNotMatch = 34,
|
||||
UserNameTooLong = 40,
|
||||
UserNameContainsForbiddenCharacters = 41,
|
||||
ContainForbiddenCharacters = 41,
|
||||
UserNameIsEmpty = 42,
|
||||
UserWorkspaceInvalid = 50,
|
||||
UserIdInvalid = 51,
|
||||
UserTokenInvalid = 54,
|
||||
UserUnauthorized = 54,
|
||||
UserNotExist = 55,
|
||||
CreateDefaultWorkspaceFailed = 60,
|
||||
DefaultWorkspaceAlreadyExist = 61,
|
||||
ServerError = 100,
|
||||
InternalError = 100,
|
||||
}
|
||||
|
||||
impl ::protobuf::ProtobufEnum for ErrorCode {
|
||||
@ -258,12 +250,6 @@ impl ::protobuf::ProtobufEnum for ErrorCode {
|
||||
2 => ::std::option::Option::Some(ErrorCode::AcquireWriteLockedFailed),
|
||||
3 => ::std::option::Option::Some(ErrorCode::AcquireReadLockedFailed),
|
||||
4 => ::std::option::Option::Some(ErrorCode::UserDatabaseDidNotMatch),
|
||||
5 => ::std::option::Option::Some(ErrorCode::UserDatabaseInternalError),
|
||||
6 => ::std::option::Option::Some(ErrorCode::SqlInternalError),
|
||||
7 => ::std::option::Option::Some(ErrorCode::DatabaseConnectError),
|
||||
10 => ::std::option::Option::Some(ErrorCode::UserNotLoginYet),
|
||||
11 => ::std::option::Option::Some(ErrorCode::ReadCurrentIdFailed),
|
||||
12 => ::std::option::Option::Some(ErrorCode::WriteCurrentIdFailed),
|
||||
20 => ::std::option::Option::Some(ErrorCode::EmailIsEmpty),
|
||||
21 => ::std::option::Option::Some(ErrorCode::EmailFormatInvalid),
|
||||
22 => ::std::option::Option::Some(ErrorCode::EmailAlreadyExists),
|
||||
@ -273,15 +259,13 @@ impl ::protobuf::ProtobufEnum for ErrorCode {
|
||||
33 => ::std::option::Option::Some(ErrorCode::PasswordFormatInvalid),
|
||||
34 => ::std::option::Option::Some(ErrorCode::PasswordNotMatch),
|
||||
40 => ::std::option::Option::Some(ErrorCode::UserNameTooLong),
|
||||
41 => ::std::option::Option::Some(ErrorCode::UserNameContainsForbiddenCharacters),
|
||||
41 => ::std::option::Option::Some(ErrorCode::ContainForbiddenCharacters),
|
||||
42 => ::std::option::Option::Some(ErrorCode::UserNameIsEmpty),
|
||||
50 => ::std::option::Option::Some(ErrorCode::UserWorkspaceInvalid),
|
||||
51 => ::std::option::Option::Some(ErrorCode::UserIdInvalid),
|
||||
54 => ::std::option::Option::Some(ErrorCode::UserTokenInvalid),
|
||||
54 => ::std::option::Option::Some(ErrorCode::UserUnauthorized),
|
||||
55 => ::std::option::Option::Some(ErrorCode::UserNotExist),
|
||||
60 => ::std::option::Option::Some(ErrorCode::CreateDefaultWorkspaceFailed),
|
||||
61 => ::std::option::Option::Some(ErrorCode::DefaultWorkspaceAlreadyExist),
|
||||
100 => ::std::option::Option::Some(ErrorCode::ServerError),
|
||||
100 => ::std::option::Option::Some(ErrorCode::InternalError),
|
||||
_ => ::std::option::Option::None
|
||||
}
|
||||
}
|
||||
@ -293,12 +277,6 @@ impl ::protobuf::ProtobufEnum for ErrorCode {
|
||||
ErrorCode::AcquireWriteLockedFailed,
|
||||
ErrorCode::AcquireReadLockedFailed,
|
||||
ErrorCode::UserDatabaseDidNotMatch,
|
||||
ErrorCode::UserDatabaseInternalError,
|
||||
ErrorCode::SqlInternalError,
|
||||
ErrorCode::DatabaseConnectError,
|
||||
ErrorCode::UserNotLoginYet,
|
||||
ErrorCode::ReadCurrentIdFailed,
|
||||
ErrorCode::WriteCurrentIdFailed,
|
||||
ErrorCode::EmailIsEmpty,
|
||||
ErrorCode::EmailFormatInvalid,
|
||||
ErrorCode::EmailAlreadyExists,
|
||||
@ -308,15 +286,13 @@ impl ::protobuf::ProtobufEnum for ErrorCode {
|
||||
ErrorCode::PasswordFormatInvalid,
|
||||
ErrorCode::PasswordNotMatch,
|
||||
ErrorCode::UserNameTooLong,
|
||||
ErrorCode::UserNameContainsForbiddenCharacters,
|
||||
ErrorCode::ContainForbiddenCharacters,
|
||||
ErrorCode::UserNameIsEmpty,
|
||||
ErrorCode::UserWorkspaceInvalid,
|
||||
ErrorCode::UserIdInvalid,
|
||||
ErrorCode::UserTokenInvalid,
|
||||
ErrorCode::UserUnauthorized,
|
||||
ErrorCode::UserNotExist,
|
||||
ErrorCode::CreateDefaultWorkspaceFailed,
|
||||
ErrorCode::DefaultWorkspaceAlreadyExist,
|
||||
ErrorCode::ServerError,
|
||||
ErrorCode::InternalError,
|
||||
];
|
||||
values
|
||||
}
|
||||
@ -347,89 +323,69 @@ impl ::protobuf::reflect::ProtobufValue for ErrorCode {
|
||||
static file_descriptor_proto_data: &'static [u8] = b"\
|
||||
\n\x0cerrors.proto\"=\n\tUserError\x12\x1e\n\x04code\x18\x01\x20\x01(\
|
||||
\x0e2\n.ErrorCodeR\x04code\x12\x10\n\x03msg\x18\x02\x20\x01(\tR\x03msg*\
|
||||
\xe3\x05\n\tErrorCode\x12\x0b\n\x07Unknown\x10\0\x12\x1a\n\x16UserDataba\
|
||||
\x81\x04\n\tErrorCode\x12\x0b\n\x07Unknown\x10\0\x12\x1a\n\x16UserDataba\
|
||||
seInitFailed\x10\x01\x12\x1c\n\x18AcquireWriteLockedFailed\x10\x02\x12\
|
||||
\x1b\n\x17AcquireReadLockedFailed\x10\x03\x12\x1b\n\x17UserDatabaseDidNo\
|
||||
tMatch\x10\x04\x12\x1d\n\x19UserDatabaseInternalError\x10\x05\x12\x14\n\
|
||||
\x10SqlInternalError\x10\x06\x12\x18\n\x14DatabaseConnectError\x10\x07\
|
||||
\x12\x13\n\x0fUserNotLoginYet\x10\n\x12\x17\n\x13ReadCurrentIdFailed\x10\
|
||||
\x0b\x12\x18\n\x14WriteCurrentIdFailed\x10\x0c\x12\x10\n\x0cEmailIsEmpty\
|
||||
\x10\x14\x12\x16\n\x12EmailFormatInvalid\x10\x15\x12\x16\n\x12EmailAlrea\
|
||||
dyExists\x10\x16\x12\x13\n\x0fPasswordIsEmpty\x10\x1e\x12\x13\n\x0fPassw\
|
||||
ordTooLong\x10\x1f\x12$\n\x20PasswordContainsForbidCharacters\x10\x20\
|
||||
\x12\x19\n\x15PasswordFormatInvalid\x10!\x12\x14\n\x10PasswordNotMatch\
|
||||
\x10\"\x12\x13\n\x0fUserNameTooLong\x10(\x12'\n#UserNameContainsForbidde\
|
||||
nCharacters\x10)\x12\x13\n\x0fUserNameIsEmpty\x10*\x12\x18\n\x14UserWork\
|
||||
spaceInvalid\x102\x12\x11\n\rUserIdInvalid\x103\x12\x14\n\x10UserTokenIn\
|
||||
valid\x106\x12\x10\n\x0cUserNotExist\x107\x12\x20\n\x1cCreateDefaultWork\
|
||||
spaceFailed\x10<\x12\x20\n\x1cDefaultWorkspaceAlreadyExist\x10=\x12\x0f\
|
||||
\n\x0bServerError\x10dJ\xd5\n\n\x06\x12\x04\0\0$\x01\n\x08\n\x01\x0c\x12\
|
||||
\x03\0\0\x12\n\n\n\x02\x04\0\x12\x04\x02\0\x05\x01\n\n\n\x03\x04\0\x01\
|
||||
\x12\x03\x02\x08\x11\n\x0b\n\x04\x04\0\x02\0\x12\x03\x03\x04\x17\n\x0c\n\
|
||||
\x05\x04\0\x02\0\x06\x12\x03\x03\x04\r\n\x0c\n\x05\x04\0\x02\0\x01\x12\
|
||||
\x03\x03\x0e\x12\n\x0c\n\x05\x04\0\x02\0\x03\x12\x03\x03\x15\x16\n\x0b\n\
|
||||
\x04\x04\0\x02\x01\x12\x03\x04\x04\x13\n\x0c\n\x05\x04\0\x02\x01\x05\x12\
|
||||
\x03\x04\x04\n\n\x0c\n\x05\x04\0\x02\x01\x01\x12\x03\x04\x0b\x0e\n\x0c\n\
|
||||
\x05\x04\0\x02\x01\x03\x12\x03\x04\x11\x12\n\n\n\x02\x05\0\x12\x04\x06\0\
|
||||
$\x01\n\n\n\x03\x05\0\x01\x12\x03\x06\x05\x0e\n\x0b\n\x04\x05\0\x02\0\
|
||||
\x12\x03\x07\x04\x10\n\x0c\n\x05\x05\0\x02\0\x01\x12\x03\x07\x04\x0b\n\
|
||||
\x0c\n\x05\x05\0\x02\0\x02\x12\x03\x07\x0e\x0f\n\x0b\n\x04\x05\0\x02\x01\
|
||||
\x12\x03\x08\x04\x1f\n\x0c\n\x05\x05\0\x02\x01\x01\x12\x03\x08\x04\x1a\n\
|
||||
\x0c\n\x05\x05\0\x02\x01\x02\x12\x03\x08\x1d\x1e\n\x0b\n\x04\x05\0\x02\
|
||||
\x02\x12\x03\t\x04!\n\x0c\n\x05\x05\0\x02\x02\x01\x12\x03\t\x04\x1c\n\
|
||||
\x0c\n\x05\x05\0\x02\x02\x02\x12\x03\t\x1f\x20\n\x0b\n\x04\x05\0\x02\x03\
|
||||
\x12\x03\n\x04\x20\n\x0c\n\x05\x05\0\x02\x03\x01\x12\x03\n\x04\x1b\n\x0c\
|
||||
\n\x05\x05\0\x02\x03\x02\x12\x03\n\x1e\x1f\n\x0b\n\x04\x05\0\x02\x04\x12\
|
||||
\x03\x0b\x04\x20\n\x0c\n\x05\x05\0\x02\x04\x01\x12\x03\x0b\x04\x1b\n\x0c\
|
||||
\n\x05\x05\0\x02\x04\x02\x12\x03\x0b\x1e\x1f\n\x0b\n\x04\x05\0\x02\x05\
|
||||
\x12\x03\x0c\x04\"\n\x0c\n\x05\x05\0\x02\x05\x01\x12\x03\x0c\x04\x1d\n\
|
||||
\x0c\n\x05\x05\0\x02\x05\x02\x12\x03\x0c\x20!\n\x0b\n\x04\x05\0\x02\x06\
|
||||
\x12\x03\r\x04\x19\n\x0c\n\x05\x05\0\x02\x06\x01\x12\x03\r\x04\x14\n\x0c\
|
||||
\n\x05\x05\0\x02\x06\x02\x12\x03\r\x17\x18\n\x0b\n\x04\x05\0\x02\x07\x12\
|
||||
\x03\x0e\x04\x1d\n\x0c\n\x05\x05\0\x02\x07\x01\x12\x03\x0e\x04\x18\n\x0c\
|
||||
\n\x05\x05\0\x02\x07\x02\x12\x03\x0e\x1b\x1c\n\x0b\n\x04\x05\0\x02\x08\
|
||||
\x12\x03\x0f\x04\x19\n\x0c\n\x05\x05\0\x02\x08\x01\x12\x03\x0f\x04\x13\n\
|
||||
\x0c\n\x05\x05\0\x02\x08\x02\x12\x03\x0f\x16\x18\n\x0b\n\x04\x05\0\x02\t\
|
||||
\x12\x03\x10\x04\x1d\n\x0c\n\x05\x05\0\x02\t\x01\x12\x03\x10\x04\x17\n\
|
||||
\x0c\n\x05\x05\0\x02\t\x02\x12\x03\x10\x1a\x1c\n\x0b\n\x04\x05\0\x02\n\
|
||||
\x12\x03\x11\x04\x1e\n\x0c\n\x05\x05\0\x02\n\x01\x12\x03\x11\x04\x18\n\
|
||||
\x0c\n\x05\x05\0\x02\n\x02\x12\x03\x11\x1b\x1d\n\x0b\n\x04\x05\0\x02\x0b\
|
||||
\x12\x03\x12\x04\x16\n\x0c\n\x05\x05\0\x02\x0b\x01\x12\x03\x12\x04\x10\n\
|
||||
\x0c\n\x05\x05\0\x02\x0b\x02\x12\x03\x12\x13\x15\n\x0b\n\x04\x05\0\x02\
|
||||
\x0c\x12\x03\x13\x04\x1c\n\x0c\n\x05\x05\0\x02\x0c\x01\x12\x03\x13\x04\
|
||||
\x16\n\x0c\n\x05\x05\0\x02\x0c\x02\x12\x03\x13\x19\x1b\n\x0b\n\x04\x05\0\
|
||||
\x02\r\x12\x03\x14\x04\x1c\n\x0c\n\x05\x05\0\x02\r\x01\x12\x03\x14\x04\
|
||||
\x16\n\x0c\n\x05\x05\0\x02\r\x02\x12\x03\x14\x19\x1b\n\x0b\n\x04\x05\0\
|
||||
\x02\x0e\x12\x03\x15\x04\x19\n\x0c\n\x05\x05\0\x02\x0e\x01\x12\x03\x15\
|
||||
\x04\x13\n\x0c\n\x05\x05\0\x02\x0e\x02\x12\x03\x15\x16\x18\n\x0b\n\x04\
|
||||
\x05\0\x02\x0f\x12\x03\x16\x04\x19\n\x0c\n\x05\x05\0\x02\x0f\x01\x12\x03\
|
||||
\x16\x04\x13\n\x0c\n\x05\x05\0\x02\x0f\x02\x12\x03\x16\x16\x18\n\x0b\n\
|
||||
\x04\x05\0\x02\x10\x12\x03\x17\x04*\n\x0c\n\x05\x05\0\x02\x10\x01\x12\
|
||||
\x03\x17\x04$\n\x0c\n\x05\x05\0\x02\x10\x02\x12\x03\x17')\n\x0b\n\x04\
|
||||
\x05\0\x02\x11\x12\x03\x18\x04\x1f\n\x0c\n\x05\x05\0\x02\x11\x01\x12\x03\
|
||||
\x18\x04\x19\n\x0c\n\x05\x05\0\x02\x11\x02\x12\x03\x18\x1c\x1e\n\x0b\n\
|
||||
\x04\x05\0\x02\x12\x12\x03\x19\x04\x1a\n\x0c\n\x05\x05\0\x02\x12\x01\x12\
|
||||
\x03\x19\x04\x14\n\x0c\n\x05\x05\0\x02\x12\x02\x12\x03\x19\x17\x19\n\x0b\
|
||||
\n\x04\x05\0\x02\x13\x12\x03\x1a\x04\x19\n\x0c\n\x05\x05\0\x02\x13\x01\
|
||||
\x12\x03\x1a\x04\x13\n\x0c\n\x05\x05\0\x02\x13\x02\x12\x03\x1a\x16\x18\n\
|
||||
\x0b\n\x04\x05\0\x02\x14\x12\x03\x1b\x04-\n\x0c\n\x05\x05\0\x02\x14\x01\
|
||||
\x12\x03\x1b\x04'\n\x0c\n\x05\x05\0\x02\x14\x02\x12\x03\x1b*,\n\x0b\n\
|
||||
\x04\x05\0\x02\x15\x12\x03\x1c\x04\x19\n\x0c\n\x05\x05\0\x02\x15\x01\x12\
|
||||
\x03\x1c\x04\x13\n\x0c\n\x05\x05\0\x02\x15\x02\x12\x03\x1c\x16\x18\n\x0b\
|
||||
\n\x04\x05\0\x02\x16\x12\x03\x1d\x04\x1e\n\x0c\n\x05\x05\0\x02\x16\x01\
|
||||
\x12\x03\x1d\x04\x18\n\x0c\n\x05\x05\0\x02\x16\x02\x12\x03\x1d\x1b\x1d\n\
|
||||
\x0b\n\x04\x05\0\x02\x17\x12\x03\x1e\x04\x17\n\x0c\n\x05\x05\0\x02\x17\
|
||||
\x01\x12\x03\x1e\x04\x11\n\x0c\n\x05\x05\0\x02\x17\x02\x12\x03\x1e\x14\
|
||||
\x16\n\x0b\n\x04\x05\0\x02\x18\x12\x03\x1f\x04\x1a\n\x0c\n\x05\x05\0\x02\
|
||||
\x18\x01\x12\x03\x1f\x04\x14\n\x0c\n\x05\x05\0\x02\x18\x02\x12\x03\x1f\
|
||||
\x17\x19\n\x0b\n\x04\x05\0\x02\x19\x12\x03\x20\x04\x16\n\x0c\n\x05\x05\0\
|
||||
\x02\x19\x01\x12\x03\x20\x04\x10\n\x0c\n\x05\x05\0\x02\x19\x02\x12\x03\
|
||||
\x20\x13\x15\n\x0b\n\x04\x05\0\x02\x1a\x12\x03!\x04&\n\x0c\n\x05\x05\0\
|
||||
\x02\x1a\x01\x12\x03!\x04\x20\n\x0c\n\x05\x05\0\x02\x1a\x02\x12\x03!#%\n\
|
||||
\x0b\n\x04\x05\0\x02\x1b\x12\x03\"\x04&\n\x0c\n\x05\x05\0\x02\x1b\x01\
|
||||
\x12\x03\"\x04\x20\n\x0c\n\x05\x05\0\x02\x1b\x02\x12\x03\"#%\n\x0b\n\x04\
|
||||
\x05\0\x02\x1c\x12\x03#\x04\x16\n\x0c\n\x05\x05\0\x02\x1c\x01\x12\x03#\
|
||||
\x04\x0f\n\x0c\n\x05\x05\0\x02\x1c\x02\x12\x03#\x12\x15b\x06proto3\
|
||||
tMatch\x10\x04\x12\x10\n\x0cEmailIsEmpty\x10\x14\x12\x16\n\x12EmailForma\
|
||||
tInvalid\x10\x15\x12\x16\n\x12EmailAlreadyExists\x10\x16\x12\x13\n\x0fPa\
|
||||
sswordIsEmpty\x10\x1e\x12\x13\n\x0fPasswordTooLong\x10\x1f\x12$\n\x20Pas\
|
||||
swordContainsForbidCharacters\x10\x20\x12\x19\n\x15PasswordFormatInvalid\
|
||||
\x10!\x12\x14\n\x10PasswordNotMatch\x10\"\x12\x13\n\x0fUserNameTooLong\
|
||||
\x10(\x12\x1e\n\x1aContainForbiddenCharacters\x10)\x12\x13\n\x0fUserName\
|
||||
IsEmpty\x10*\x12\x18\n\x14UserWorkspaceInvalid\x102\x12\x11\n\rUserIdInv\
|
||||
alid\x103\x12\x14\n\x10UserUnauthorized\x106\x12\x10\n\x0cUserNotExist\
|
||||
\x107\x12\x11\n\rInternalError\x10dJ\x8d\x08\n\x06\x12\x04\0\0\x1c\x01\n\
|
||||
\x08\n\x01\x0c\x12\x03\0\0\x12\n\n\n\x02\x04\0\x12\x04\x02\0\x05\x01\n\n\
|
||||
\n\x03\x04\0\x01\x12\x03\x02\x08\x11\n\x0b\n\x04\x04\0\x02\0\x12\x03\x03\
|
||||
\x04\x17\n\x0c\n\x05\x04\0\x02\0\x06\x12\x03\x03\x04\r\n\x0c\n\x05\x04\0\
|
||||
\x02\0\x01\x12\x03\x03\x0e\x12\n\x0c\n\x05\x04\0\x02\0\x03\x12\x03\x03\
|
||||
\x15\x16\n\x0b\n\x04\x04\0\x02\x01\x12\x03\x04\x04\x13\n\x0c\n\x05\x04\0\
|
||||
\x02\x01\x05\x12\x03\x04\x04\n\n\x0c\n\x05\x04\0\x02\x01\x01\x12\x03\x04\
|
||||
\x0b\x0e\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x03\x04\x11\x12\n\n\n\x02\x05\
|
||||
\0\x12\x04\x06\0\x1c\x01\n\n\n\x03\x05\0\x01\x12\x03\x06\x05\x0e\n\x0b\n\
|
||||
\x04\x05\0\x02\0\x12\x03\x07\x04\x10\n\x0c\n\x05\x05\0\x02\0\x01\x12\x03\
|
||||
\x07\x04\x0b\n\x0c\n\x05\x05\0\x02\0\x02\x12\x03\x07\x0e\x0f\n\x0b\n\x04\
|
||||
\x05\0\x02\x01\x12\x03\x08\x04\x1f\n\x0c\n\x05\x05\0\x02\x01\x01\x12\x03\
|
||||
\x08\x04\x1a\n\x0c\n\x05\x05\0\x02\x01\x02\x12\x03\x08\x1d\x1e\n\x0b\n\
|
||||
\x04\x05\0\x02\x02\x12\x03\t\x04!\n\x0c\n\x05\x05\0\x02\x02\x01\x12\x03\
|
||||
\t\x04\x1c\n\x0c\n\x05\x05\0\x02\x02\x02\x12\x03\t\x1f\x20\n\x0b\n\x04\
|
||||
\x05\0\x02\x03\x12\x03\n\x04\x20\n\x0c\n\x05\x05\0\x02\x03\x01\x12\x03\n\
|
||||
\x04\x1b\n\x0c\n\x05\x05\0\x02\x03\x02\x12\x03\n\x1e\x1f\n\x0b\n\x04\x05\
|
||||
\0\x02\x04\x12\x03\x0b\x04\x20\n\x0c\n\x05\x05\0\x02\x04\x01\x12\x03\x0b\
|
||||
\x04\x1b\n\x0c\n\x05\x05\0\x02\x04\x02\x12\x03\x0b\x1e\x1f\n\x0b\n\x04\
|
||||
\x05\0\x02\x05\x12\x03\x0c\x04\x16\n\x0c\n\x05\x05\0\x02\x05\x01\x12\x03\
|
||||
\x0c\x04\x10\n\x0c\n\x05\x05\0\x02\x05\x02\x12\x03\x0c\x13\x15\n\x0b\n\
|
||||
\x04\x05\0\x02\x06\x12\x03\r\x04\x1c\n\x0c\n\x05\x05\0\x02\x06\x01\x12\
|
||||
\x03\r\x04\x16\n\x0c\n\x05\x05\0\x02\x06\x02\x12\x03\r\x19\x1b\n\x0b\n\
|
||||
\x04\x05\0\x02\x07\x12\x03\x0e\x04\x1c\n\x0c\n\x05\x05\0\x02\x07\x01\x12\
|
||||
\x03\x0e\x04\x16\n\x0c\n\x05\x05\0\x02\x07\x02\x12\x03\x0e\x19\x1b\n\x0b\
|
||||
\n\x04\x05\0\x02\x08\x12\x03\x0f\x04\x19\n\x0c\n\x05\x05\0\x02\x08\x01\
|
||||
\x12\x03\x0f\x04\x13\n\x0c\n\x05\x05\0\x02\x08\x02\x12\x03\x0f\x16\x18\n\
|
||||
\x0b\n\x04\x05\0\x02\t\x12\x03\x10\x04\x19\n\x0c\n\x05\x05\0\x02\t\x01\
|
||||
\x12\x03\x10\x04\x13\n\x0c\n\x05\x05\0\x02\t\x02\x12\x03\x10\x16\x18\n\
|
||||
\x0b\n\x04\x05\0\x02\n\x12\x03\x11\x04*\n\x0c\n\x05\x05\0\x02\n\x01\x12\
|
||||
\x03\x11\x04$\n\x0c\n\x05\x05\0\x02\n\x02\x12\x03\x11')\n\x0b\n\x04\x05\
|
||||
\0\x02\x0b\x12\x03\x12\x04\x1f\n\x0c\n\x05\x05\0\x02\x0b\x01\x12\x03\x12\
|
||||
\x04\x19\n\x0c\n\x05\x05\0\x02\x0b\x02\x12\x03\x12\x1c\x1e\n\x0b\n\x04\
|
||||
\x05\0\x02\x0c\x12\x03\x13\x04\x1a\n\x0c\n\x05\x05\0\x02\x0c\x01\x12\x03\
|
||||
\x13\x04\x14\n\x0c\n\x05\x05\0\x02\x0c\x02\x12\x03\x13\x17\x19\n\x0b\n\
|
||||
\x04\x05\0\x02\r\x12\x03\x14\x04\x19\n\x0c\n\x05\x05\0\x02\r\x01\x12\x03\
|
||||
\x14\x04\x13\n\x0c\n\x05\x05\0\x02\r\x02\x12\x03\x14\x16\x18\n\x0b\n\x04\
|
||||
\x05\0\x02\x0e\x12\x03\x15\x04$\n\x0c\n\x05\x05\0\x02\x0e\x01\x12\x03\
|
||||
\x15\x04\x1e\n\x0c\n\x05\x05\0\x02\x0e\x02\x12\x03\x15!#\n\x0b\n\x04\x05\
|
||||
\0\x02\x0f\x12\x03\x16\x04\x19\n\x0c\n\x05\x05\0\x02\x0f\x01\x12\x03\x16\
|
||||
\x04\x13\n\x0c\n\x05\x05\0\x02\x0f\x02\x12\x03\x16\x16\x18\n\x0b\n\x04\
|
||||
\x05\0\x02\x10\x12\x03\x17\x04\x1e\n\x0c\n\x05\x05\0\x02\x10\x01\x12\x03\
|
||||
\x17\x04\x18\n\x0c\n\x05\x05\0\x02\x10\x02\x12\x03\x17\x1b\x1d\n\x0b\n\
|
||||
\x04\x05\0\x02\x11\x12\x03\x18\x04\x17\n\x0c\n\x05\x05\0\x02\x11\x01\x12\
|
||||
\x03\x18\x04\x11\n\x0c\n\x05\x05\0\x02\x11\x02\x12\x03\x18\x14\x16\n\x0b\
|
||||
\n\x04\x05\0\x02\x12\x12\x03\x19\x04\x1a\n\x0c\n\x05\x05\0\x02\x12\x01\
|
||||
\x12\x03\x19\x04\x14\n\x0c\n\x05\x05\0\x02\x12\x02\x12\x03\x19\x17\x19\n\
|
||||
\x0b\n\x04\x05\0\x02\x13\x12\x03\x1a\x04\x16\n\x0c\n\x05\x05\0\x02\x13\
|
||||
\x01\x12\x03\x1a\x04\x10\n\x0c\n\x05\x05\0\x02\x13\x02\x12\x03\x1a\x13\
|
||||
\x15\n\x0b\n\x04\x05\0\x02\x14\x12\x03\x1b\x04\x18\n\x0c\n\x05\x05\0\x02\
|
||||
\x14\x01\x12\x03\x1b\x04\x11\n\x0c\n\x05\x05\0\x02\x14\x02\x12\x03\x1b\
|
||||
\x14\x17b\x06proto3\
|
||||
";
|
||||
|
||||
static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
|
||||
|
@ -28,6 +28,7 @@ pub enum UserObservable {
|
||||
Unknown = 0,
|
||||
UserAuthChanged = 1,
|
||||
UserProfileUpdated = 2,
|
||||
UserUnauthorized = 3,
|
||||
}
|
||||
|
||||
impl ::protobuf::ProtobufEnum for UserObservable {
|
||||
@ -40,6 +41,7 @@ impl ::protobuf::ProtobufEnum for UserObservable {
|
||||
0 => ::std::option::Option::Some(UserObservable::Unknown),
|
||||
1 => ::std::option::Option::Some(UserObservable::UserAuthChanged),
|
||||
2 => ::std::option::Option::Some(UserObservable::UserProfileUpdated),
|
||||
3 => ::std::option::Option::Some(UserObservable::UserUnauthorized),
|
||||
_ => ::std::option::Option::None
|
||||
}
|
||||
}
|
||||
@ -49,6 +51,7 @@ impl ::protobuf::ProtobufEnum for UserObservable {
|
||||
UserObservable::Unknown,
|
||||
UserObservable::UserAuthChanged,
|
||||
UserObservable::UserProfileUpdated,
|
||||
UserObservable::UserUnauthorized,
|
||||
];
|
||||
values
|
||||
}
|
||||
@ -77,17 +80,19 @@ impl ::protobuf::reflect::ProtobufValue for UserObservable {
|
||||
}
|
||||
|
||||
static file_descriptor_proto_data: &'static [u8] = b"\
|
||||
\n\x10observable.proto*J\n\x0eUserObservable\x12\x0b\n\x07Unknown\x10\0\
|
||||
\n\x10observable.proto*`\n\x0eUserObservable\x12\x0b\n\x07Unknown\x10\0\
|
||||
\x12\x13\n\x0fUserAuthChanged\x10\x01\x12\x16\n\x12UserProfileUpdated\
|
||||
\x10\x02J\xa5\x01\n\x06\x12\x04\0\0\x05\x01\n\x08\n\x01\x0c\x12\x03\0\0\
|
||||
\x12\n\n\n\x02\x05\0\x12\x04\x01\0\x05\x01\n\n\n\x03\x05\0\x01\x12\x03\
|
||||
\x01\x05\x13\n\x0b\n\x04\x05\0\x02\0\x12\x03\x02\x04\x10\n\x0c\n\x05\x05\
|
||||
\0\x02\0\x01\x12\x03\x02\x04\x0b\n\x0c\n\x05\x05\0\x02\0\x02\x12\x03\x02\
|
||||
\x0e\x0f\n\x0b\n\x04\x05\0\x02\x01\x12\x03\x03\x04\x18\n\x0c\n\x05\x05\0\
|
||||
\x02\x01\x01\x12\x03\x03\x04\x13\n\x0c\n\x05\x05\0\x02\x01\x02\x12\x03\
|
||||
\x03\x16\x17\n\x0b\n\x04\x05\0\x02\x02\x12\x03\x04\x04\x1b\n\x0c\n\x05\
|
||||
\x05\0\x02\x02\x01\x12\x03\x04\x04\x16\n\x0c\n\x05\x05\0\x02\x02\x02\x12\
|
||||
\x03\x04\x19\x1ab\x06proto3\
|
||||
\x10\x02\x12\x14\n\x10UserUnauthorized\x10\x03J\xce\x01\n\x06\x12\x04\0\
|
||||
\0\x07\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\n\n\x02\x05\0\x12\x04\x02\0\
|
||||
\x07\x01\n\n\n\x03\x05\0\x01\x12\x03\x02\x05\x13\n\x0b\n\x04\x05\0\x02\0\
|
||||
\x12\x03\x03\x04\x10\n\x0c\n\x05\x05\0\x02\0\x01\x12\x03\x03\x04\x0b\n\
|
||||
\x0c\n\x05\x05\0\x02\0\x02\x12\x03\x03\x0e\x0f\n\x0b\n\x04\x05\0\x02\x01\
|
||||
\x12\x03\x04\x04\x18\n\x0c\n\x05\x05\0\x02\x01\x01\x12\x03\x04\x04\x13\n\
|
||||
\x0c\n\x05\x05\0\x02\x01\x02\x12\x03\x04\x16\x17\n\x0b\n\x04\x05\0\x02\
|
||||
\x02\x12\x03\x05\x04\x1b\n\x0c\n\x05\x05\0\x02\x02\x01\x12\x03\x05\x04\
|
||||
\x16\n\x0c\n\x05\x05\0\x02\x02\x02\x12\x03\x05\x19\x1a\n\x0b\n\x04\x05\0\
|
||||
\x02\x03\x12\x03\x06\x04\x19\n\x0c\n\x05\x05\0\x02\x03\x01\x12\x03\x06\
|
||||
\x04\x14\n\x0c\n\x05\x05\0\x02\x03\x02\x12\x03\x06\x17\x18b\x06proto3\
|
||||
";
|
||||
|
||||
static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
|
||||
|
@ -10,12 +10,6 @@ enum ErrorCode {
|
||||
AcquireWriteLockedFailed = 2;
|
||||
AcquireReadLockedFailed = 3;
|
||||
UserDatabaseDidNotMatch = 4;
|
||||
UserDatabaseInternalError = 5;
|
||||
SqlInternalError = 6;
|
||||
DatabaseConnectError = 7;
|
||||
UserNotLoginYet = 10;
|
||||
ReadCurrentIdFailed = 11;
|
||||
WriteCurrentIdFailed = 12;
|
||||
EmailIsEmpty = 20;
|
||||
EmailFormatInvalid = 21;
|
||||
EmailAlreadyExists = 22;
|
||||
@ -25,13 +19,11 @@ enum ErrorCode {
|
||||
PasswordFormatInvalid = 33;
|
||||
PasswordNotMatch = 34;
|
||||
UserNameTooLong = 40;
|
||||
UserNameContainsForbiddenCharacters = 41;
|
||||
ContainForbiddenCharacters = 41;
|
||||
UserNameIsEmpty = 42;
|
||||
UserWorkspaceInvalid = 50;
|
||||
UserIdInvalid = 51;
|
||||
UserTokenInvalid = 54;
|
||||
UserUnauthorized = 54;
|
||||
UserNotExist = 55;
|
||||
CreateDefaultWorkspaceFailed = 60;
|
||||
DefaultWorkspaceAlreadyExist = 61;
|
||||
ServerError = 100;
|
||||
InternalError = 100;
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
syntax = "proto3";
|
||||
|
||||
enum UserObservable {
|
||||
Unknown = 0;
|
||||
UserAuthChanged = 1;
|
||||
UserProfileUpdated = 2;
|
||||
UserUnauthorized = 3;
|
||||
}
|
||||
|
@ -5,7 +5,10 @@ use crate::{
|
||||
|
||||
use crate::{entities::UpdateUserParams, services::server::UserServerAPI};
|
||||
use flowy_infra::future::ResultFuture;
|
||||
use flowy_net::{config::*, request::HttpRequestBuilder};
|
||||
use flowy_net::{
|
||||
config::*,
|
||||
request::{HttpRequestBuilder, ResponseMiddleware},
|
||||
};
|
||||
|
||||
pub struct UserServer {}
|
||||
impl UserServer {
|
||||
@ -40,8 +43,32 @@ impl UserServerAPI for UserServer {
|
||||
}
|
||||
}
|
||||
|
||||
use crate::{errors::ErrorCode, observable::*};
|
||||
use flowy_net::response::FlowyResponse;
|
||||
use lazy_static::lazy_static;
|
||||
use std::sync::Arc;
|
||||
lazy_static! {
|
||||
static ref IDDLEWARE: Arc<Middleware> = Arc::new(Middleware {});
|
||||
}
|
||||
|
||||
struct Middleware {}
|
||||
impl ResponseMiddleware for Middleware {
|
||||
fn receive_response(&self, response: &FlowyResponse) {
|
||||
if let Some(error) = &response.error {
|
||||
if error.is_unauthorized() {
|
||||
log::error!("user unauthorized");
|
||||
let error = UserError::new(ErrorCode::UserUnauthorized, "");
|
||||
observable("", UserObservable::UserUnauthorized).error(error).build()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn request_builder() -> HttpRequestBuilder { HttpRequestBuilder::new().middleware(IDDLEWARE.clone()) }
|
||||
|
||||
pub async fn user_sign_up_request(params: SignUpParams, url: &str) -> Result<SignUpResponse, UserError> {
|
||||
let response = HttpRequestBuilder::post(&url.to_owned())
|
||||
let response = request_builder()
|
||||
.post(&url.to_owned())
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
.await?
|
||||
@ -51,7 +78,8 @@ pub async fn user_sign_up_request(params: SignUpParams, url: &str) -> Result<Sig
|
||||
}
|
||||
|
||||
pub async fn user_sign_in_request(params: SignInParams, url: &str) -> Result<SignInResponse, UserError> {
|
||||
let response = HttpRequestBuilder::post(&url.to_owned())
|
||||
let response = request_builder()
|
||||
.post(&url.to_owned())
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
.await?
|
||||
@ -61,15 +89,13 @@ pub async fn user_sign_in_request(params: SignInParams, url: &str) -> Result<Sig
|
||||
}
|
||||
|
||||
pub async fn user_sign_out_request(token: &str, url: &str) -> Result<(), UserError> {
|
||||
let _ = HttpRequestBuilder::delete(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.send()
|
||||
.await?;
|
||||
let _ = request_builder().delete(&url.to_owned()).header(HEADER_TOKEN, token).send().await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn get_user_profile_request(token: &str, url: &str) -> Result<UserProfile, UserError> {
|
||||
let user_profile = HttpRequestBuilder::get(&url.to_owned())
|
||||
let user_profile = request_builder()
|
||||
.get(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.send()
|
||||
.await?
|
||||
@ -79,7 +105,8 @@ pub async fn get_user_profile_request(token: &str, url: &str) -> Result<UserProf
|
||||
}
|
||||
|
||||
pub async fn update_user_profile_request(token: &str, params: UpdateUserParams, url: &str) -> Result<(), UserError> {
|
||||
let _ = HttpRequestBuilder::patch(&url.to_owned())
|
||||
let _ = request_builder()
|
||||
.patch(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
|
@ -193,7 +193,7 @@ impl UserSession {
|
||||
fn set_session(&self, session: Option<Session>) -> Result<(), UserError> {
|
||||
log::debug!("Set user session: {:?}", session);
|
||||
match &session {
|
||||
None => KV::remove(SESSION_CACHE_KEY).map_err(|e| UserError::new(ErrorCode::SqlInternalError, &e))?,
|
||||
None => KV::remove(SESSION_CACHE_KEY).map_err(|e| UserError::new(ErrorCode::InternalError, &e))?,
|
||||
Some(session) => KV::set_str(SESSION_CACHE_KEY, session.clone().into()),
|
||||
}
|
||||
*self.session.write() = session;
|
||||
@ -213,7 +213,7 @@ impl UserSession {
|
||||
}
|
||||
|
||||
match session {
|
||||
None => Err(ErrorBuilder::new(ErrorCode::UserNotLoginYet).build()),
|
||||
None => Err(ErrorBuilder::new(ErrorCode::UserUnauthorized).build()),
|
||||
Some(session) => Ok(session),
|
||||
}
|
||||
}
|
||||
@ -255,7 +255,7 @@ impl Session {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn into_part(mut self) -> (String, String) { (self.user_id, self.token) }
|
||||
pub fn into_part(self) -> (String, String) { (self.user_id, self.token) }
|
||||
}
|
||||
|
||||
impl std::convert::From<String> for Session {
|
||||
|
@ -13,7 +13,7 @@ flowy-database = { path = "../flowy-database" }
|
||||
flowy-sqlite = { path = "../flowy-sqlite" }
|
||||
flowy-infra = { path = "../flowy-infra" }
|
||||
flowy-observable = { path = "../flowy-observable" }
|
||||
flowy-net = { path = "../flowy-net" }
|
||||
flowy-net = { path = "../flowy-net", features = ["flowy_request"] }
|
||||
|
||||
protobuf = {version = "2.18.0"}
|
||||
log = "0.4.14"
|
||||
|
@ -2,7 +2,7 @@ use bytes::Bytes;
|
||||
use derive_more::Display;
|
||||
use flowy_derive::{ProtoBuf, ProtoBuf_Enum};
|
||||
use flowy_dispatch::prelude::{EventResponse, ResponseBuilder};
|
||||
use flowy_net::errors::ErrorCode as NetworkErrorCode;
|
||||
|
||||
use std::{convert::TryInto, fmt};
|
||||
|
||||
#[derive(Debug, Default, Clone, ProtoBuf)]
|
||||
@ -62,17 +62,14 @@ pub enum ErrorCode {
|
||||
#[display(fmt = "Database internal error")]
|
||||
WorkspaceDatabaseError = 101,
|
||||
|
||||
#[display(fmt = "User internal error")]
|
||||
UserInternalError = 102,
|
||||
|
||||
#[display(fmt = "User not login yet")]
|
||||
UserNotLoginYet = 103,
|
||||
|
||||
#[display(fmt = "UserIn is empty")]
|
||||
UserIdIsEmpty = 104,
|
||||
UserIdIsEmpty = 102,
|
||||
|
||||
#[display(fmt = "User unauthorized")]
|
||||
UserUnauthorized = 103,
|
||||
|
||||
#[display(fmt = "Server error")]
|
||||
ServerError = 1000,
|
||||
InternalError = 1000,
|
||||
#[display(fmt = "Record not found")]
|
||||
RecordNotFound = 1001,
|
||||
}
|
||||
@ -83,11 +80,8 @@ impl std::default::Default for ErrorCode {
|
||||
|
||||
impl std::convert::From<flowy_net::errors::ServerError> for WorkspaceError {
|
||||
fn from(error: flowy_net::errors::ServerError) -> Self {
|
||||
match error.code {
|
||||
NetworkErrorCode::RecordNotFound => ErrorBuilder::new(ErrorCode::RecordNotFound).error(error.msg).build(),
|
||||
|
||||
_ => ErrorBuilder::new(ErrorCode::ServerError).error(error.msg).build(),
|
||||
}
|
||||
let code = server_error_to_workspace_error(error.code);
|
||||
ErrorBuilder::new(code).error(error.msg).build()
|
||||
}
|
||||
}
|
||||
|
||||
@ -111,3 +105,12 @@ pub type ErrorBuilder = flowy_infra::errors::Builder<ErrorCode, WorkspaceError>;
|
||||
impl flowy_infra::errors::Build<ErrorCode> for WorkspaceError {
|
||||
fn build(code: ErrorCode, msg: String) -> Self { WorkspaceError::new(code, &msg) }
|
||||
}
|
||||
|
||||
use flowy_net::errors::ErrorCode as ServerErrorCode;
|
||||
fn server_error_to_workspace_error(code: ServerErrorCode) -> ErrorCode {
|
||||
match code {
|
||||
ServerErrorCode::Unauthorized => ErrorCode::UserUnauthorized,
|
||||
ServerErrorCode::RecordNotFound => ErrorCode::RecordNotFound,
|
||||
_ => ErrorCode::InternalError,
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
use bytes::Bytes;
|
||||
use flowy_derive::ProtoBuf_Enum;
|
||||
use flowy_dispatch::prelude::ToBytes;
|
||||
use flowy_observable::{dart::RustStreamSender, entities::ObservableSubject, ObservableBuilder};
|
||||
|
||||
use flowy_observable::ObservableBuilder;
|
||||
|
||||
const OBSERVABLE_CATEGORY: &'static str = "Workspace";
|
||||
|
||||
@ -22,6 +21,8 @@ pub(crate) enum WorkspaceObservable {
|
||||
AppDeleteView = 24,
|
||||
|
||||
ViewUpdated = 31,
|
||||
|
||||
UserUnauthorized = 100,
|
||||
}
|
||||
|
||||
impl std::default::Default for WorkspaceObservable {
|
||||
|
@ -229,10 +229,9 @@ pub enum ErrorCode {
|
||||
ViewDescInvalid = 23,
|
||||
DatabaseConnectionFail = 100,
|
||||
WorkspaceDatabaseError = 101,
|
||||
UserInternalError = 102,
|
||||
UserNotLoginYet = 103,
|
||||
UserIdIsEmpty = 104,
|
||||
ServerError = 1000,
|
||||
UserIdIsEmpty = 102,
|
||||
UserUnauthorized = 103,
|
||||
InternalError = 1000,
|
||||
RecordNotFound = 1001,
|
||||
}
|
||||
|
||||
@ -257,10 +256,9 @@ impl ::protobuf::ProtobufEnum for ErrorCode {
|
||||
23 => ::std::option::Option::Some(ErrorCode::ViewDescInvalid),
|
||||
100 => ::std::option::Option::Some(ErrorCode::DatabaseConnectionFail),
|
||||
101 => ::std::option::Option::Some(ErrorCode::WorkspaceDatabaseError),
|
||||
102 => ::std::option::Option::Some(ErrorCode::UserInternalError),
|
||||
103 => ::std::option::Option::Some(ErrorCode::UserNotLoginYet),
|
||||
104 => ::std::option::Option::Some(ErrorCode::UserIdIsEmpty),
|
||||
1000 => ::std::option::Option::Some(ErrorCode::ServerError),
|
||||
102 => ::std::option::Option::Some(ErrorCode::UserIdIsEmpty),
|
||||
103 => ::std::option::Option::Some(ErrorCode::UserUnauthorized),
|
||||
1000 => ::std::option::Option::Some(ErrorCode::InternalError),
|
||||
1001 => ::std::option::Option::Some(ErrorCode::RecordNotFound),
|
||||
_ => ::std::option::Option::None
|
||||
}
|
||||
@ -282,10 +280,9 @@ impl ::protobuf::ProtobufEnum for ErrorCode {
|
||||
ErrorCode::ViewDescInvalid,
|
||||
ErrorCode::DatabaseConnectionFail,
|
||||
ErrorCode::WorkspaceDatabaseError,
|
||||
ErrorCode::UserInternalError,
|
||||
ErrorCode::UserNotLoginYet,
|
||||
ErrorCode::UserIdIsEmpty,
|
||||
ErrorCode::ServerError,
|
||||
ErrorCode::UserUnauthorized,
|
||||
ErrorCode::InternalError,
|
||||
ErrorCode::RecordNotFound,
|
||||
];
|
||||
values
|
||||
@ -317,64 +314,61 @@ impl ::protobuf::reflect::ProtobufValue for ErrorCode {
|
||||
static file_descriptor_proto_data: &'static [u8] = b"\
|
||||
\n\x0cerrors.proto\"B\n\x0eWorkspaceError\x12\x1e\n\x04code\x18\x01\x20\
|
||||
\x01(\x0e2\n.ErrorCodeR\x04code\x12\x10\n\x03msg\x18\x02\x20\x01(\tR\x03\
|
||||
msg*\xb7\x03\n\tErrorCode\x12\x0b\n\x07Unknown\x10\0\x12\x18\n\x14Worksp\
|
||||
msg*\xa3\x03\n\tErrorCode\x12\x0b\n\x07Unknown\x10\0\x12\x18\n\x14Worksp\
|
||||
aceNameInvalid\x10\x01\x12\x16\n\x12WorkspaceIdInvalid\x10\x02\x12\x18\n\
|
||||
\x14AppColorStyleInvalid\x10\x03\x12\x18\n\x14WorkspaceDescInvalid\x10\
|
||||
\x04\x12\x1c\n\x18CurrentWorkspaceNotFound\x10\x05\x12\x10\n\x0cAppIdInv\
|
||||
alid\x10\n\x12\x12\n\x0eAppNameInvalid\x10\x0b\x12\x13\n\x0fViewNameInva\
|
||||
lid\x10\x14\x12\x18\n\x14ViewThumbnailInvalid\x10\x15\x12\x11\n\rViewIdI\
|
||||
nvalid\x10\x16\x12\x13\n\x0fViewDescInvalid\x10\x17\x12\x1a\n\x16Databas\
|
||||
eConnectionFail\x10d\x12\x1a\n\x16WorkspaceDatabaseError\x10e\x12\x15\n\
|
||||
\x11UserInternalError\x10f\x12\x13\n\x0fUserNotLoginYet\x10g\x12\x11\n\r\
|
||||
UserIdIsEmpty\x10h\x12\x10\n\x0bServerError\x10\xe8\x07\x12\x13\n\x0eRec\
|
||||
ordNotFound\x10\xe9\x07J\xbb\x07\n\x06\x12\x04\0\0\x1a\x01\n\x08\n\x01\
|
||||
\x0c\x12\x03\0\0\x12\n\n\n\x02\x04\0\x12\x04\x02\0\x05\x01\n\n\n\x03\x04\
|
||||
\0\x01\x12\x03\x02\x08\x16\n\x0b\n\x04\x04\0\x02\0\x12\x03\x03\x04\x17\n\
|
||||
\x0c\n\x05\x04\0\x02\0\x06\x12\x03\x03\x04\r\n\x0c\n\x05\x04\0\x02\0\x01\
|
||||
\x12\x03\x03\x0e\x12\n\x0c\n\x05\x04\0\x02\0\x03\x12\x03\x03\x15\x16\n\
|
||||
\x0b\n\x04\x04\0\x02\x01\x12\x03\x04\x04\x13\n\x0c\n\x05\x04\0\x02\x01\
|
||||
\x05\x12\x03\x04\x04\n\n\x0c\n\x05\x04\0\x02\x01\x01\x12\x03\x04\x0b\x0e\
|
||||
\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x03\x04\x11\x12\n\n\n\x02\x05\0\x12\
|
||||
\x04\x06\0\x1a\x01\n\n\n\x03\x05\0\x01\x12\x03\x06\x05\x0e\n\x0b\n\x04\
|
||||
\x05\0\x02\0\x12\x03\x07\x04\x10\n\x0c\n\x05\x05\0\x02\0\x01\x12\x03\x07\
|
||||
\x04\x0b\n\x0c\n\x05\x05\0\x02\0\x02\x12\x03\x07\x0e\x0f\n\x0b\n\x04\x05\
|
||||
\0\x02\x01\x12\x03\x08\x04\x1d\n\x0c\n\x05\x05\0\x02\x01\x01\x12\x03\x08\
|
||||
\x04\x18\n\x0c\n\x05\x05\0\x02\x01\x02\x12\x03\x08\x1b\x1c\n\x0b\n\x04\
|
||||
\x05\0\x02\x02\x12\x03\t\x04\x1b\n\x0c\n\x05\x05\0\x02\x02\x01\x12\x03\t\
|
||||
\x04\x16\n\x0c\n\x05\x05\0\x02\x02\x02\x12\x03\t\x19\x1a\n\x0b\n\x04\x05\
|
||||
\0\x02\x03\x12\x03\n\x04\x1d\n\x0c\n\x05\x05\0\x02\x03\x01\x12\x03\n\x04\
|
||||
\x18\n\x0c\n\x05\x05\0\x02\x03\x02\x12\x03\n\x1b\x1c\n\x0b\n\x04\x05\0\
|
||||
\x02\x04\x12\x03\x0b\x04\x1d\n\x0c\n\x05\x05\0\x02\x04\x01\x12\x03\x0b\
|
||||
\x04\x18\n\x0c\n\x05\x05\0\x02\x04\x02\x12\x03\x0b\x1b\x1c\n\x0b\n\x04\
|
||||
\x05\0\x02\x05\x12\x03\x0c\x04!\n\x0c\n\x05\x05\0\x02\x05\x01\x12\x03\
|
||||
\x0c\x04\x1c\n\x0c\n\x05\x05\0\x02\x05\x02\x12\x03\x0c\x1f\x20\n\x0b\n\
|
||||
\x04\x05\0\x02\x06\x12\x03\r\x04\x16\n\x0c\n\x05\x05\0\x02\x06\x01\x12\
|
||||
\x03\r\x04\x10\n\x0c\n\x05\x05\0\x02\x06\x02\x12\x03\r\x13\x15\n\x0b\n\
|
||||
\x04\x05\0\x02\x07\x12\x03\x0e\x04\x18\n\x0c\n\x05\x05\0\x02\x07\x01\x12\
|
||||
\x03\x0e\x04\x12\n\x0c\n\x05\x05\0\x02\x07\x02\x12\x03\x0e\x15\x17\n\x0b\
|
||||
\n\x04\x05\0\x02\x08\x12\x03\x0f\x04\x19\n\x0c\n\x05\x05\0\x02\x08\x01\
|
||||
\x12\x03\x0f\x04\x13\n\x0c\n\x05\x05\0\x02\x08\x02\x12\x03\x0f\x16\x18\n\
|
||||
\x0b\n\x04\x05\0\x02\t\x12\x03\x10\x04\x1e\n\x0c\n\x05\x05\0\x02\t\x01\
|
||||
\x12\x03\x10\x04\x18\n\x0c\n\x05\x05\0\x02\t\x02\x12\x03\x10\x1b\x1d\n\
|
||||
\x0b\n\x04\x05\0\x02\n\x12\x03\x11\x04\x17\n\x0c\n\x05\x05\0\x02\n\x01\
|
||||
\x12\x03\x11\x04\x11\n\x0c\n\x05\x05\0\x02\n\x02\x12\x03\x11\x14\x16\n\
|
||||
\x0b\n\x04\x05\0\x02\x0b\x12\x03\x12\x04\x19\n\x0c\n\x05\x05\0\x02\x0b\
|
||||
\x01\x12\x03\x12\x04\x13\n\x0c\n\x05\x05\0\x02\x0b\x02\x12\x03\x12\x16\
|
||||
\x18\n\x0b\n\x04\x05\0\x02\x0c\x12\x03\x13\x04!\n\x0c\n\x05\x05\0\x02\
|
||||
\x0c\x01\x12\x03\x13\x04\x1a\n\x0c\n\x05\x05\0\x02\x0c\x02\x12\x03\x13\
|
||||
\x1d\x20\n\x0b\n\x04\x05\0\x02\r\x12\x03\x14\x04!\n\x0c\n\x05\x05\0\x02\
|
||||
\r\x01\x12\x03\x14\x04\x1a\n\x0c\n\x05\x05\0\x02\r\x02\x12\x03\x14\x1d\
|
||||
\x20\n\x0b\n\x04\x05\0\x02\x0e\x12\x03\x15\x04\x1c\n\x0c\n\x05\x05\0\x02\
|
||||
\x0e\x01\x12\x03\x15\x04\x15\n\x0c\n\x05\x05\0\x02\x0e\x02\x12\x03\x15\
|
||||
\x18\x1b\n\x0b\n\x04\x05\0\x02\x0f\x12\x03\x16\x04\x1a\n\x0c\n\x05\x05\0\
|
||||
\x02\x0f\x01\x12\x03\x16\x04\x13\n\x0c\n\x05\x05\0\x02\x0f\x02\x12\x03\
|
||||
\x16\x16\x19\n\x0b\n\x04\x05\0\x02\x10\x12\x03\x17\x04\x18\n\x0c\n\x05\
|
||||
\x05\0\x02\x10\x01\x12\x03\x17\x04\x11\n\x0c\n\x05\x05\0\x02\x10\x02\x12\
|
||||
\x03\x17\x14\x17\n\x0b\n\x04\x05\0\x02\x11\x12\x03\x18\x04\x17\n\x0c\n\
|
||||
\x05\x05\0\x02\x11\x01\x12\x03\x18\x04\x0f\n\x0c\n\x05\x05\0\x02\x11\x02\
|
||||
\x12\x03\x18\x12\x16\n\x0b\n\x04\x05\0\x02\x12\x12\x03\x19\x04\x1a\n\x0c\
|
||||
\n\x05\x05\0\x02\x12\x01\x12\x03\x19\x04\x12\n\x0c\n\x05\x05\0\x02\x12\
|
||||
\x02\x12\x03\x19\x15\x19b\x06proto3\
|
||||
eConnectionFail\x10d\x12\x1a\n\x16WorkspaceDatabaseError\x10e\x12\x11\n\
|
||||
\rUserIdIsEmpty\x10f\x12\x14\n\x10UserUnauthorized\x10g\x12\x12\n\rInter\
|
||||
nalError\x10\xe8\x07\x12\x13\n\x0eRecordNotFound\x10\xe9\x07J\x92\x07\n\
|
||||
\x06\x12\x04\0\0\x19\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\n\n\x02\x04\0\
|
||||
\x12\x04\x02\0\x05\x01\n\n\n\x03\x04\0\x01\x12\x03\x02\x08\x16\n\x0b\n\
|
||||
\x04\x04\0\x02\0\x12\x03\x03\x04\x17\n\x0c\n\x05\x04\0\x02\0\x06\x12\x03\
|
||||
\x03\x04\r\n\x0c\n\x05\x04\0\x02\0\x01\x12\x03\x03\x0e\x12\n\x0c\n\x05\
|
||||
\x04\0\x02\0\x03\x12\x03\x03\x15\x16\n\x0b\n\x04\x04\0\x02\x01\x12\x03\
|
||||
\x04\x04\x13\n\x0c\n\x05\x04\0\x02\x01\x05\x12\x03\x04\x04\n\n\x0c\n\x05\
|
||||
\x04\0\x02\x01\x01\x12\x03\x04\x0b\x0e\n\x0c\n\x05\x04\0\x02\x01\x03\x12\
|
||||
\x03\x04\x11\x12\n\n\n\x02\x05\0\x12\x04\x06\0\x19\x01\n\n\n\x03\x05\0\
|
||||
\x01\x12\x03\x06\x05\x0e\n\x0b\n\x04\x05\0\x02\0\x12\x03\x07\x04\x10\n\
|
||||
\x0c\n\x05\x05\0\x02\0\x01\x12\x03\x07\x04\x0b\n\x0c\n\x05\x05\0\x02\0\
|
||||
\x02\x12\x03\x07\x0e\x0f\n\x0b\n\x04\x05\0\x02\x01\x12\x03\x08\x04\x1d\n\
|
||||
\x0c\n\x05\x05\0\x02\x01\x01\x12\x03\x08\x04\x18\n\x0c\n\x05\x05\0\x02\
|
||||
\x01\x02\x12\x03\x08\x1b\x1c\n\x0b\n\x04\x05\0\x02\x02\x12\x03\t\x04\x1b\
|
||||
\n\x0c\n\x05\x05\0\x02\x02\x01\x12\x03\t\x04\x16\n\x0c\n\x05\x05\0\x02\
|
||||
\x02\x02\x12\x03\t\x19\x1a\n\x0b\n\x04\x05\0\x02\x03\x12\x03\n\x04\x1d\n\
|
||||
\x0c\n\x05\x05\0\x02\x03\x01\x12\x03\n\x04\x18\n\x0c\n\x05\x05\0\x02\x03\
|
||||
\x02\x12\x03\n\x1b\x1c\n\x0b\n\x04\x05\0\x02\x04\x12\x03\x0b\x04\x1d\n\
|
||||
\x0c\n\x05\x05\0\x02\x04\x01\x12\x03\x0b\x04\x18\n\x0c\n\x05\x05\0\x02\
|
||||
\x04\x02\x12\x03\x0b\x1b\x1c\n\x0b\n\x04\x05\0\x02\x05\x12\x03\x0c\x04!\
|
||||
\n\x0c\n\x05\x05\0\x02\x05\x01\x12\x03\x0c\x04\x1c\n\x0c\n\x05\x05\0\x02\
|
||||
\x05\x02\x12\x03\x0c\x1f\x20\n\x0b\n\x04\x05\0\x02\x06\x12\x03\r\x04\x16\
|
||||
\n\x0c\n\x05\x05\0\x02\x06\x01\x12\x03\r\x04\x10\n\x0c\n\x05\x05\0\x02\
|
||||
\x06\x02\x12\x03\r\x13\x15\n\x0b\n\x04\x05\0\x02\x07\x12\x03\x0e\x04\x18\
|
||||
\n\x0c\n\x05\x05\0\x02\x07\x01\x12\x03\x0e\x04\x12\n\x0c\n\x05\x05\0\x02\
|
||||
\x07\x02\x12\x03\x0e\x15\x17\n\x0b\n\x04\x05\0\x02\x08\x12\x03\x0f\x04\
|
||||
\x19\n\x0c\n\x05\x05\0\x02\x08\x01\x12\x03\x0f\x04\x13\n\x0c\n\x05\x05\0\
|
||||
\x02\x08\x02\x12\x03\x0f\x16\x18\n\x0b\n\x04\x05\0\x02\t\x12\x03\x10\x04\
|
||||
\x1e\n\x0c\n\x05\x05\0\x02\t\x01\x12\x03\x10\x04\x18\n\x0c\n\x05\x05\0\
|
||||
\x02\t\x02\x12\x03\x10\x1b\x1d\n\x0b\n\x04\x05\0\x02\n\x12\x03\x11\x04\
|
||||
\x17\n\x0c\n\x05\x05\0\x02\n\x01\x12\x03\x11\x04\x11\n\x0c\n\x05\x05\0\
|
||||
\x02\n\x02\x12\x03\x11\x14\x16\n\x0b\n\x04\x05\0\x02\x0b\x12\x03\x12\x04\
|
||||
\x19\n\x0c\n\x05\x05\0\x02\x0b\x01\x12\x03\x12\x04\x13\n\x0c\n\x05\x05\0\
|
||||
\x02\x0b\x02\x12\x03\x12\x16\x18\n\x0b\n\x04\x05\0\x02\x0c\x12\x03\x13\
|
||||
\x04!\n\x0c\n\x05\x05\0\x02\x0c\x01\x12\x03\x13\x04\x1a\n\x0c\n\x05\x05\
|
||||
\0\x02\x0c\x02\x12\x03\x13\x1d\x20\n\x0b\n\x04\x05\0\x02\r\x12\x03\x14\
|
||||
\x04!\n\x0c\n\x05\x05\0\x02\r\x01\x12\x03\x14\x04\x1a\n\x0c\n\x05\x05\0\
|
||||
\x02\r\x02\x12\x03\x14\x1d\x20\n\x0b\n\x04\x05\0\x02\x0e\x12\x03\x15\x04\
|
||||
\x18\n\x0c\n\x05\x05\0\x02\x0e\x01\x12\x03\x15\x04\x11\n\x0c\n\x05\x05\0\
|
||||
\x02\x0e\x02\x12\x03\x15\x14\x17\n\x0b\n\x04\x05\0\x02\x0f\x12\x03\x16\
|
||||
\x04\x1b\n\x0c\n\x05\x05\0\x02\x0f\x01\x12\x03\x16\x04\x14\n\x0c\n\x05\
|
||||
\x05\0\x02\x0f\x02\x12\x03\x16\x17\x1a\n\x0b\n\x04\x05\0\x02\x10\x12\x03\
|
||||
\x17\x04\x19\n\x0c\n\x05\x05\0\x02\x10\x01\x12\x03\x17\x04\x11\n\x0c\n\
|
||||
\x05\x05\0\x02\x10\x02\x12\x03\x17\x14\x18\n\x0b\n\x04\x05\0\x02\x11\x12\
|
||||
\x03\x18\x04\x1a\n\x0c\n\x05\x05\0\x02\x11\x01\x12\x03\x18\x04\x12\n\x0c\
|
||||
\n\x05\x05\0\x02\x11\x02\x12\x03\x18\x15\x19b\x06proto3\
|
||||
";
|
||||
|
||||
static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
|
||||
|
@ -36,6 +36,7 @@ pub enum WorkspaceObservable {
|
||||
AppCreateView = 23,
|
||||
AppDeleteView = 24,
|
||||
ViewUpdated = 31,
|
||||
UserUnauthorized = 100,
|
||||
}
|
||||
|
||||
impl ::protobuf::ProtobufEnum for WorkspaceObservable {
|
||||
@ -56,6 +57,7 @@ impl ::protobuf::ProtobufEnum for WorkspaceObservable {
|
||||
23 => ::std::option::Option::Some(WorkspaceObservable::AppCreateView),
|
||||
24 => ::std::option::Option::Some(WorkspaceObservable::AppDeleteView),
|
||||
31 => ::std::option::Option::Some(WorkspaceObservable::ViewUpdated),
|
||||
100 => ::std::option::Option::Some(WorkspaceObservable::UserUnauthorized),
|
||||
_ => ::std::option::Option::None
|
||||
}
|
||||
}
|
||||
@ -73,6 +75,7 @@ impl ::protobuf::ProtobufEnum for WorkspaceObservable {
|
||||
WorkspaceObservable::AppCreateView,
|
||||
WorkspaceObservable::AppDeleteView,
|
||||
WorkspaceObservable::ViewUpdated,
|
||||
WorkspaceObservable::UserUnauthorized,
|
||||
];
|
||||
values
|
||||
}
|
||||
@ -101,37 +104,40 @@ impl ::protobuf::reflect::ProtobufValue for WorkspaceObservable {
|
||||
}
|
||||
|
||||
static file_descriptor_proto_data: &'static [u8] = b"\
|
||||
\n\x10observable.proto*\xfb\x01\n\x13WorkspaceObservable\x12\x0b\n\x07Un\
|
||||
\n\x10observable.proto*\x91\x02\n\x13WorkspaceObservable\x12\x0b\n\x07Un\
|
||||
known\x10\0\x12\x17\n\x13UserCreateWorkspace\x10\n\x12\x17\n\x13UserDele\
|
||||
teWorkspace\x10\x0b\x12\x14\n\x10WorkspaceUpdated\x10\x0c\x12\x16\n\x12W\
|
||||
orkspaceCreateApp\x10\r\x12\x16\n\x12WorkspaceDeleteApp\x10\x0e\x12\x18\
|
||||
\n\x14WorkspaceListUpdated\x10\x0f\x12\x0e\n\nAppUpdated\x10\x15\x12\x11\
|
||||
\n\rAppCreateView\x10\x17\x12\x11\n\rAppDeleteView\x10\x18\x12\x0f\n\x0b\
|
||||
ViewUpdated\x10\x1fJ\xed\x03\n\x06\x12\x04\0\0\x0e\x01\n\x08\n\x01\x0c\
|
||||
\x12\x03\0\0\x12\n\n\n\x02\x05\0\x12\x04\x02\0\x0e\x01\n\n\n\x03\x05\0\
|
||||
\x01\x12\x03\x02\x05\x18\n\x0b\n\x04\x05\0\x02\0\x12\x03\x03\x04\x10\n\
|
||||
\x0c\n\x05\x05\0\x02\0\x01\x12\x03\x03\x04\x0b\n\x0c\n\x05\x05\0\x02\0\
|
||||
\x02\x12\x03\x03\x0e\x0f\n\x0b\n\x04\x05\0\x02\x01\x12\x03\x04\x04\x1d\n\
|
||||
\x0c\n\x05\x05\0\x02\x01\x01\x12\x03\x04\x04\x17\n\x0c\n\x05\x05\0\x02\
|
||||
\x01\x02\x12\x03\x04\x1a\x1c\n\x0b\n\x04\x05\0\x02\x02\x12\x03\x05\x04\
|
||||
\x1d\n\x0c\n\x05\x05\0\x02\x02\x01\x12\x03\x05\x04\x17\n\x0c\n\x05\x05\0\
|
||||
\x02\x02\x02\x12\x03\x05\x1a\x1c\n\x0b\n\x04\x05\0\x02\x03\x12\x03\x06\
|
||||
\x04\x1a\n\x0c\n\x05\x05\0\x02\x03\x01\x12\x03\x06\x04\x14\n\x0c\n\x05\
|
||||
\x05\0\x02\x03\x02\x12\x03\x06\x17\x19\n\x0b\n\x04\x05\0\x02\x04\x12\x03\
|
||||
\x07\x04\x1c\n\x0c\n\x05\x05\0\x02\x04\x01\x12\x03\x07\x04\x16\n\x0c\n\
|
||||
\x05\x05\0\x02\x04\x02\x12\x03\x07\x19\x1b\n\x0b\n\x04\x05\0\x02\x05\x12\
|
||||
\x03\x08\x04\x1c\n\x0c\n\x05\x05\0\x02\x05\x01\x12\x03\x08\x04\x16\n\x0c\
|
||||
\n\x05\x05\0\x02\x05\x02\x12\x03\x08\x19\x1b\n\x0b\n\x04\x05\0\x02\x06\
|
||||
\x12\x03\t\x04\x1e\n\x0c\n\x05\x05\0\x02\x06\x01\x12\x03\t\x04\x18\n\x0c\
|
||||
\n\x05\x05\0\x02\x06\x02\x12\x03\t\x1b\x1d\n\x0b\n\x04\x05\0\x02\x07\x12\
|
||||
\x03\n\x04\x14\n\x0c\n\x05\x05\0\x02\x07\x01\x12\x03\n\x04\x0e\n\x0c\n\
|
||||
\x05\x05\0\x02\x07\x02\x12\x03\n\x11\x13\n\x0b\n\x04\x05\0\x02\x08\x12\
|
||||
\x03\x0b\x04\x17\n\x0c\n\x05\x05\0\x02\x08\x01\x12\x03\x0b\x04\x11\n\x0c\
|
||||
\n\x05\x05\0\x02\x08\x02\x12\x03\x0b\x14\x16\n\x0b\n\x04\x05\0\x02\t\x12\
|
||||
\x03\x0c\x04\x17\n\x0c\n\x05\x05\0\x02\t\x01\x12\x03\x0c\x04\x11\n\x0c\n\
|
||||
\x05\x05\0\x02\t\x02\x12\x03\x0c\x14\x16\n\x0b\n\x04\x05\0\x02\n\x12\x03\
|
||||
\r\x04\x15\n\x0c\n\x05\x05\0\x02\n\x01\x12\x03\r\x04\x0f\n\x0c\n\x05\x05\
|
||||
\0\x02\n\x02\x12\x03\r\x12\x14b\x06proto3\
|
||||
ViewUpdated\x10\x1f\x12\x14\n\x10UserUnauthorized\x10dJ\x96\x04\n\x06\
|
||||
\x12\x04\0\0\x0f\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\n\n\x02\x05\0\x12\
|
||||
\x04\x02\0\x0f\x01\n\n\n\x03\x05\0\x01\x12\x03\x02\x05\x18\n\x0b\n\x04\
|
||||
\x05\0\x02\0\x12\x03\x03\x04\x10\n\x0c\n\x05\x05\0\x02\0\x01\x12\x03\x03\
|
||||
\x04\x0b\n\x0c\n\x05\x05\0\x02\0\x02\x12\x03\x03\x0e\x0f\n\x0b\n\x04\x05\
|
||||
\0\x02\x01\x12\x03\x04\x04\x1d\n\x0c\n\x05\x05\0\x02\x01\x01\x12\x03\x04\
|
||||
\x04\x17\n\x0c\n\x05\x05\0\x02\x01\x02\x12\x03\x04\x1a\x1c\n\x0b\n\x04\
|
||||
\x05\0\x02\x02\x12\x03\x05\x04\x1d\n\x0c\n\x05\x05\0\x02\x02\x01\x12\x03\
|
||||
\x05\x04\x17\n\x0c\n\x05\x05\0\x02\x02\x02\x12\x03\x05\x1a\x1c\n\x0b\n\
|
||||
\x04\x05\0\x02\x03\x12\x03\x06\x04\x1a\n\x0c\n\x05\x05\0\x02\x03\x01\x12\
|
||||
\x03\x06\x04\x14\n\x0c\n\x05\x05\0\x02\x03\x02\x12\x03\x06\x17\x19\n\x0b\
|
||||
\n\x04\x05\0\x02\x04\x12\x03\x07\x04\x1c\n\x0c\n\x05\x05\0\x02\x04\x01\
|
||||
\x12\x03\x07\x04\x16\n\x0c\n\x05\x05\0\x02\x04\x02\x12\x03\x07\x19\x1b\n\
|
||||
\x0b\n\x04\x05\0\x02\x05\x12\x03\x08\x04\x1c\n\x0c\n\x05\x05\0\x02\x05\
|
||||
\x01\x12\x03\x08\x04\x16\n\x0c\n\x05\x05\0\x02\x05\x02\x12\x03\x08\x19\
|
||||
\x1b\n\x0b\n\x04\x05\0\x02\x06\x12\x03\t\x04\x1e\n\x0c\n\x05\x05\0\x02\
|
||||
\x06\x01\x12\x03\t\x04\x18\n\x0c\n\x05\x05\0\x02\x06\x02\x12\x03\t\x1b\
|
||||
\x1d\n\x0b\n\x04\x05\0\x02\x07\x12\x03\n\x04\x14\n\x0c\n\x05\x05\0\x02\
|
||||
\x07\x01\x12\x03\n\x04\x0e\n\x0c\n\x05\x05\0\x02\x07\x02\x12\x03\n\x11\
|
||||
\x13\n\x0b\n\x04\x05\0\x02\x08\x12\x03\x0b\x04\x17\n\x0c\n\x05\x05\0\x02\
|
||||
\x08\x01\x12\x03\x0b\x04\x11\n\x0c\n\x05\x05\0\x02\x08\x02\x12\x03\x0b\
|
||||
\x14\x16\n\x0b\n\x04\x05\0\x02\t\x12\x03\x0c\x04\x17\n\x0c\n\x05\x05\0\
|
||||
\x02\t\x01\x12\x03\x0c\x04\x11\n\x0c\n\x05\x05\0\x02\t\x02\x12\x03\x0c\
|
||||
\x14\x16\n\x0b\n\x04\x05\0\x02\n\x12\x03\r\x04\x15\n\x0c\n\x05\x05\0\x02\
|
||||
\n\x01\x12\x03\r\x04\x0f\n\x0c\n\x05\x05\0\x02\n\x02\x12\x03\r\x12\x14\n\
|
||||
\x0b\n\x04\x05\0\x02\x0b\x12\x03\x0e\x04\x1b\n\x0c\n\x05\x05\0\x02\x0b\
|
||||
\x01\x12\x03\x0e\x04\x14\n\x0c\n\x05\x05\0\x02\x0b\x02\x12\x03\x0e\x17\
|
||||
\x1ab\x06proto3\
|
||||
";
|
||||
|
||||
static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
|
||||
|
@ -19,9 +19,8 @@ enum ErrorCode {
|
||||
ViewDescInvalid = 23;
|
||||
DatabaseConnectionFail = 100;
|
||||
WorkspaceDatabaseError = 101;
|
||||
UserInternalError = 102;
|
||||
UserNotLoginYet = 103;
|
||||
UserIdIsEmpty = 104;
|
||||
ServerError = 1000;
|
||||
UserIdIsEmpty = 102;
|
||||
UserUnauthorized = 103;
|
||||
InternalError = 1000;
|
||||
RecordNotFound = 1001;
|
||||
}
|
||||
|
@ -12,4 +12,5 @@ enum WorkspaceObservable {
|
||||
AppCreateView = 23;
|
||||
AppDeleteView = 24;
|
||||
ViewUpdated = 31;
|
||||
UserUnauthorized = 100;
|
||||
}
|
||||
|
@ -15,7 +15,14 @@ use crate::{
|
||||
services::server::WorkspaceServerAPI,
|
||||
};
|
||||
use flowy_infra::future::ResultFuture;
|
||||
use flowy_net::{config::*, request::HttpRequestBuilder};
|
||||
use flowy_net::{
|
||||
config::*,
|
||||
request::{HttpRequestBuilder, ResponseMiddleware},
|
||||
response::FlowyResponse,
|
||||
};
|
||||
use lazy_static::lazy_static;
|
||||
use std::sync::Arc;
|
||||
|
||||
pub struct WorkspaceServer {}
|
||||
|
||||
impl WorkspaceServerAPI for WorkspaceServer {
|
||||
@ -80,8 +87,30 @@ impl WorkspaceServerAPI for WorkspaceServer {
|
||||
}
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
static ref MIDDLEWARE: Arc<WorkspaceMiddleware> = Arc::new(WorkspaceMiddleware {});
|
||||
}
|
||||
|
||||
use crate::{errors::ErrorCode, observable::*};
|
||||
|
||||
struct WorkspaceMiddleware {}
|
||||
impl ResponseMiddleware for WorkspaceMiddleware {
|
||||
fn receive_response(&self, response: &FlowyResponse) {
|
||||
if let Some(error) = &response.error {
|
||||
if error.is_unauthorized() {
|
||||
log::error!("workspace user is unauthorized");
|
||||
let error = WorkspaceError::new(ErrorCode::UserUnauthorized, "");
|
||||
observable("", WorkspaceObservable::UserUnauthorized).error(error).build()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn request_builder() -> HttpRequestBuilder { HttpRequestBuilder::new().middleware(MIDDLEWARE.clone()) }
|
||||
|
||||
pub async fn create_workspace_request(token: &str, params: CreateWorkspaceParams, url: &str) -> Result<Workspace, WorkspaceError> {
|
||||
let workspace = HttpRequestBuilder::post(&url.to_owned())
|
||||
let workspace = request_builder()
|
||||
.post(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
@ -92,7 +121,8 @@ pub async fn create_workspace_request(token: &str, params: CreateWorkspaceParams
|
||||
}
|
||||
|
||||
pub async fn read_workspaces_request(token: &str, params: QueryWorkspaceParams, url: &str) -> Result<RepeatedWorkspace, WorkspaceError> {
|
||||
let result = HttpRequestBuilder::get(&url.to_owned())
|
||||
let result = request_builder()
|
||||
.get(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
@ -107,7 +137,8 @@ pub async fn read_workspaces_request(token: &str, params: QueryWorkspaceParams,
|
||||
}
|
||||
|
||||
pub async fn update_workspace_request(token: &str, params: UpdateWorkspaceParams, url: &str) -> Result<(), WorkspaceError> {
|
||||
let _ = HttpRequestBuilder::patch(&url.to_owned())
|
||||
let _ = request_builder()
|
||||
.patch(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
@ -116,7 +147,8 @@ pub async fn update_workspace_request(token: &str, params: UpdateWorkspaceParams
|
||||
}
|
||||
|
||||
pub async fn delete_workspace_request(token: &str, params: DeleteWorkspaceParams, url: &str) -> Result<(), WorkspaceError> {
|
||||
let _ = HttpRequestBuilder::delete(url)
|
||||
let _ = request_builder()
|
||||
.delete(url)
|
||||
.header(HEADER_TOKEN, token)
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
@ -126,7 +158,8 @@ pub async fn delete_workspace_request(token: &str, params: DeleteWorkspaceParams
|
||||
|
||||
// App
|
||||
pub async fn create_app_request(token: &str, params: CreateAppParams, url: &str) -> Result<App, WorkspaceError> {
|
||||
let app = HttpRequestBuilder::post(&url.to_owned())
|
||||
let app = request_builder()
|
||||
.post(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
@ -137,7 +170,8 @@ pub async fn create_app_request(token: &str, params: CreateAppParams, url: &str)
|
||||
}
|
||||
|
||||
pub async fn read_app_request(token: &str, params: QueryAppParams, url: &str) -> Result<Option<App>, WorkspaceError> {
|
||||
let result = HttpRequestBuilder::get(&url.to_owned())
|
||||
let result = request_builder()
|
||||
.get(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
@ -156,7 +190,8 @@ pub async fn read_app_request(token: &str, params: QueryAppParams, url: &str) ->
|
||||
}
|
||||
|
||||
pub async fn update_app_request(token: &str, params: UpdateAppParams, url: &str) -> Result<(), WorkspaceError> {
|
||||
let _ = HttpRequestBuilder::patch(&url.to_owned())
|
||||
let _ = request_builder()
|
||||
.patch(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
@ -165,7 +200,8 @@ pub async fn update_app_request(token: &str, params: UpdateAppParams, url: &str)
|
||||
}
|
||||
|
||||
pub async fn delete_app_request(token: &str, params: DeleteAppParams, url: &str) -> Result<(), WorkspaceError> {
|
||||
let _ = HttpRequestBuilder::delete(&url.to_owned())
|
||||
let _ = request_builder()
|
||||
.delete(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
@ -175,7 +211,8 @@ pub async fn delete_app_request(token: &str, params: DeleteAppParams, url: &str)
|
||||
|
||||
// View
|
||||
pub async fn create_view_request(token: &str, params: CreateViewParams, url: &str) -> Result<View, WorkspaceError> {
|
||||
let view = HttpRequestBuilder::post(&url.to_owned())
|
||||
let view = request_builder()
|
||||
.post(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
@ -186,7 +223,8 @@ pub async fn create_view_request(token: &str, params: CreateViewParams, url: &st
|
||||
}
|
||||
|
||||
pub async fn read_view_request(token: &str, params: QueryViewParams, url: &str) -> Result<Option<View>, WorkspaceError> {
|
||||
let result = HttpRequestBuilder::get(&url.to_owned())
|
||||
let result = request_builder()
|
||||
.get(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
@ -208,7 +246,8 @@ pub async fn read_view_request(token: &str, params: QueryViewParams, url: &str)
|
||||
}
|
||||
|
||||
pub async fn update_view_request(token: &str, params: UpdateViewParams, url: &str) -> Result<(), WorkspaceError> {
|
||||
let _ = HttpRequestBuilder::patch(&url.to_owned())
|
||||
let _ = request_builder()
|
||||
.patch(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
@ -217,7 +256,8 @@ pub async fn update_view_request(token: &str, params: UpdateViewParams, url: &st
|
||||
}
|
||||
|
||||
pub async fn delete_view_request(token: &str, params: DeleteViewParams, url: &str) -> Result<(), WorkspaceError> {
|
||||
let _ = HttpRequestBuilder::delete(&url.to_owned())
|
||||
let _ = request_builder()
|
||||
.delete(&url.to_owned())
|
||||
.header(HEADER_TOKEN, token)
|
||||
.protobuf(params)?
|
||||
.send()
|
||||
|
@ -263,6 +263,8 @@ impl WorkspaceController {
|
||||
spawn(async move {
|
||||
// Opti: retry?
|
||||
let workspaces = server.read_workspace(&token, params).await?;
|
||||
|
||||
// TODO: rollback if fail
|
||||
let _ = (&*conn).immediate_transaction::<_, WorkspaceError, _>(|| {
|
||||
log::debug!("Save {} workspace", workspaces.len());
|
||||
for workspace in &workspaces.items {
|
||||
@ -274,11 +276,17 @@ impl WorkspaceController {
|
||||
log::debug!("Save {} apps", apps.len());
|
||||
for mut app in apps {
|
||||
let views = app.belongings.take_items();
|
||||
app_sql.create_app(AppTable::new(app), &*conn);
|
||||
match app_sql.create_app(AppTable::new(app), &*conn) {
|
||||
Ok(_) => {},
|
||||
Err(e) => log::error!("create app failed: {:?}", e),
|
||||
}
|
||||
|
||||
log::debug!("Save {} views", views.len());
|
||||
for view in views {
|
||||
view_sql.create_view(ViewTable::new(view), &*conn);
|
||||
match view_sql.create_view(ViewTable::new(view), &*conn) {
|
||||
Ok(_) => {},
|
||||
Err(e) => log::error!("create view failed: {:?}", e),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user