2023-12-21 09:14:40 +00:00
|
|
|
|
import 'package:firebase_auth/firebase_auth.dart';
|
2024-03-07 03:46:50 +00:00
|
|
|
|
import 'package:guru_app/account/account_manager.dart';
|
2023-12-21 09:14:40 +00:00
|
|
|
|
import 'package:guru_app/account/model/account_profile.dart';
|
|
|
|
|
|
import 'package:guru_app/account/model/user.dart';
|
2024-03-07 03:46:50 +00:00
|
|
|
|
import 'package:guru_utils/auth/auth_credential_manager.dart';
|
2023-12-21 09:14:40 +00:00
|
|
|
|
import 'package:guru_utils/device/device_info.dart';
|
2024-03-07 03:46:50 +00:00
|
|
|
|
import 'package:guru_utils/property/app_property.dart';
|
2023-12-21 09:14:40 +00:00
|
|
|
|
|
|
|
|
|
|
/// Created by Haoyi on 6/3/21
|
|
|
|
|
|
|
|
|
|
|
|
class Account {
|
2024-03-07 03:46:50 +00:00
|
|
|
|
final GuruUser? guruUser;
|
2023-12-21 09:14:40 +00:00
|
|
|
|
final DeviceInfo? device;
|
|
|
|
|
|
final AccountProfile? accountProfile;
|
|
|
|
|
|
final User? firebaseUser;
|
2024-03-07 03:46:50 +00:00
|
|
|
|
final Map<AuthType, Credential> credentials; // facebook, google, apple, anonymous
|
|
|
|
|
|
|
|
|
|
|
|
@Deprecated("use guruUser instead")
|
|
|
|
|
|
SaasUser? get saasUser => guruUser;
|
2023-12-21 09:14:40 +00:00
|
|
|
|
|
2024-03-07 03:46:50 +00:00
|
|
|
|
String? get uid => guruUser?.uid;
|
2023-12-21 09:14:40 +00:00
|
|
|
|
|
|
|
|
|
|
String? get nickname => accountProfile?.nickname;
|
|
|
|
|
|
|
2024-03-07 03:46:50 +00:00
|
|
|
|
Account.restore(
|
|
|
|
|
|
{this.guruUser,
|
|
|
|
|
|
this.device,
|
|
|
|
|
|
this.accountProfile,
|
|
|
|
|
|
this.firebaseUser,
|
|
|
|
|
|
this.credentials = const {}});
|
2023-12-21 09:14:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class AccountAuth {
|
2024-03-07 03:46:50 +00:00
|
|
|
|
final GuruUser user;
|
|
|
|
|
|
final Credential? credential;
|
|
|
|
|
|
|
|
|
|
|
|
AccountAuth(this.user, {this.credential});
|
|
|
|
|
|
|
|
|
|
|
|
bool get isValid => uid != null && uid != "";
|
|
|
|
|
|
|
|
|
|
|
|
String? get saasToken => user.token;
|
|
|
|
|
|
|
|
|
|
|
|
String? get uid => user.uid;
|
|
|
|
|
|
|
|
|
|
|
|
// bool get existsFirebaseUser => firebaseUser != null;
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
|
String toString() {
|
|
|
|
|
|
return 'AccountAuth{user: $user}';
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class FirebaseAccountAuth {
|
|
|
|
|
|
final GuruUser user;
|
2023-12-21 09:14:40 +00:00
|
|
|
|
final User? firebaseUser;
|
|
|
|
|
|
|
2024-03-07 03:46:50 +00:00
|
|
|
|
FirebaseAccountAuth(this.user, {this.firebaseUser});
|
2023-12-21 09:14:40 +00:00
|
|
|
|
|
|
|
|
|
|
bool get isValid => uid != null && uid != "";
|
|
|
|
|
|
|
2024-03-07 03:46:50 +00:00
|
|
|
|
String? get guruToken => user.token;
|
2023-12-21 09:14:40 +00:00
|
|
|
|
|
2024-03-07 03:46:50 +00:00
|
|
|
|
String? get uid => user.uid;
|
2023-12-21 09:14:40 +00:00
|
|
|
|
|
|
|
|
|
|
bool get existsFirebaseUser => firebaseUser != null;
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
|
String toString() {
|
2024-03-07 03:46:50 +00:00
|
|
|
|
return 'AccountAuth{user: $user}';
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
abstract class IAccountAuthDelegate {
|
|
|
|
|
|
/// 支持登陆的代理,这块不管返回不返回都会支持匿名登陆
|
|
|
|
|
|
List<AuthCredentialDelegate> get supportedAuthCredentialDelegates =>
|
|
|
|
|
|
AccountManager.defaultSupportedAuthCredentialDelegates;
|
|
|
|
|
|
|
|
|
|
|
|
/// 返回设备共享的用户属性,在帐号切换的时候会保证这些 KEY,会保留下来
|
|
|
|
|
|
/// 注意,这里尽量不要把用户相关的属性设到这里面,否则会出现不必要的问题
|
|
|
|
|
|
Set<PropertyKey> get deviceSharedProperties => {};
|
|
|
|
|
|
|
|
|
|
|
|
/// 这个方法调用时,中台会确保当前的数据系统是切换后的数据系统
|
|
|
|
|
|
/// 因此可以放心使用模板的数据,当 processor 返回后,对应的数据系统将会被切换
|
|
|
|
|
|
/// 因此确保 processor 返回后,数据系统已经切换到新用户的数据系统
|
|
|
|
|
|
Future<bool> onLogin(GuruUser loginUser, Credential credential);
|
|
|
|
|
|
|
|
|
|
|
|
/// 这个方法调用时,中台会确保当前的数据系统是切换前的数据系统
|
|
|
|
|
|
/// 因此可以放心使用模板的数据,当 processor返回后,对应的数据系统将会被切换
|
|
|
|
|
|
/// 因此确保 processor 返回前,数据系统已经完成老用户数据的迁移
|
|
|
|
|
|
Future<bool> onLogout(GuruUser logoutUser);
|
|
|
|
|
|
|
|
|
|
|
|
/// 当出现登陆冲突时,有可能当前是匿名帐号,而这时,中台模板会静默登入到新的帐号中
|
|
|
|
|
|
/// 与此同时,中台会调用 onAnonymousLogout
|
|
|
|
|
|
Future<bool> onAnonymousLogout(GuruUser logoutUser) async {
|
|
|
|
|
|
return true;
|
2023-12-21 09:14:40 +00:00
|
|
|
|
}
|
2024-03-07 03:46:50 +00:00
|
|
|
|
|
|
|
|
|
|
/// 当 APP首次匿名登陆时,或当登陆一个没有绑定匿名Credential的帐号时,会在登出时重新登陆一个新的匿名帐号
|
|
|
|
|
|
/// 中台在这种情况下会调用 onAnonymousLogin
|
|
|
|
|
|
Future<bool> onAnonymousLogin(GuruUser loginUser, Credential credential) async {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// 当登陆时,有可能会出现帐号冲突,因此针对冲突可以选择切换帐号或者忽略
|
|
|
|
|
|
/// 如果你选择切换帐号,那么你需要提供 onLogout 方法,用于处理老用户的数据迁移
|
|
|
|
|
|
/// 返回值为是否继续
|
|
|
|
|
|
Future<bool> onConflict();
|
2023-12-21 09:14:40 +00:00
|
|
|
|
}
|