1
1
import 'package:path/path.dart' as p;
2
+ import 'package:sembast/timestamp.dart' ;
2
3
import 'package:tekartik_app_cv_sembast/app_cv_sembast.dart' ;
3
4
import 'package:tekartik_common_utils/common_utils_import.dart' ;
4
5
import 'package:tekartik_firebase/firebase_mixin.dart' ;
@@ -16,8 +17,13 @@ abstract class FirebaseAuthServiceSembast implements FirebaseAuthService {
16
17
}) => FirebaseAuthServiceSembastImpl (databaseFactory: databaseFactory);
17
18
}
18
19
19
- var _cvInitialized = () {
20
+ /// Init db builders
21
+ void firebaseAuthSembastInitDbBuilders () {
20
22
cvAddConstructors ([DbUser .new , DbCurrentUser .new ]);
23
+ }
24
+
25
+ var _cvInitialized = () {
26
+ firebaseAuthSembastInitDbBuilders ();
21
27
}();
22
28
23
29
/// Firebase auth Sembast implementation
@@ -56,6 +62,9 @@ abstract class FirebaseAuthSembast
56
62
57
63
/// User record
58
64
class DbUser extends DbStringRecordBase {
65
+ /// Creation date
66
+ final created = CvField <Timestamp >('created' );
67
+
59
68
/// Name
60
69
final name = CvField <String >('name' );
61
70
@@ -69,7 +78,7 @@ class DbUser extends DbStringRecordBase {
69
78
final isAnonymous = CvField <bool >('isAnonymous' );
70
79
71
80
@override
72
- CvFields get fields => [name, email, emailVerified, isAnonymous];
81
+ CvFields get fields => [created, name, email, emailVerified, isAnonymous];
73
82
}
74
83
75
84
/// User mode
@@ -92,7 +101,10 @@ var _userStore = cvStringStoreFactory.store<DbUser>('user');
92
101
93
102
/// Firebase auth Sembast implementation
94
103
class FirebaseAuthSembastImpl
95
- with FirebaseAppProductMixin <FirebaseAuth >, FirebaseAuthMixin
104
+ with
105
+ FirebaseAppProductMixin <FirebaseAuth >,
106
+ FirebaseAuthMixin ,
107
+ FirebaseAuthLocalAdminDefaultMixin
96
108
implements FirebaseAuthSembast {
97
109
StreamSubscription ? _currentUserRecordSubscription;
98
110
StreamSubscription ? _currentUserSubscription;
@@ -211,11 +223,11 @@ class FirebaseAuthSembastImpl
211
223
}) async {
212
224
await _ready;
213
225
var dbUser = await _database.transaction ((txn) async {
214
- var dbUser = await _userStore. findFirst (
226
+ var dbUser = await _txnGetSignInWithEmailAndPasswordUserCredential (
215
227
txn,
216
- finder: Finder (filter: Filter .equals (dbUserModel.email.name, email)),
228
+ email: email,
229
+ password: password,
217
230
);
218
- dbUser ?? = await _userStore.add (txn, DbUser ()..email.v = email);
219
231
await firebaseAuthCurrentUserRecord.put (
220
232
txn,
221
233
DbCurrentUser ()..uid.v = dbUser.id,
@@ -228,23 +240,70 @@ class FirebaseAuthSembastImpl
228
240
return _FirebaseUserCredentialSembast (dbUser);
229
241
}
230
242
243
+ Future <DbUser > _txnGetSignInWithEmailAndPasswordUserCredential (
244
+ Transaction txn, {
245
+ required String email,
246
+ required String password,
247
+ }) async {
248
+ var dbUser = await _userStore.findFirst (
249
+ txn,
250
+ finder: Finder (filter: Filter .equals (dbUserModel.email.name, email)),
251
+ );
252
+ dbUser ?? = await _userStore.add (txn, DbUser ()..email.v = email);
253
+ return dbUser;
254
+ }
255
+
231
256
@override
232
- Future <UserCredential > signInAnonymously () async {
257
+ Future <UserCredential > getSignInWithEmailAndPasswordUserCredential ({
258
+ required String email,
259
+ required String password,
260
+ }) async {
233
261
await _ready;
234
262
var dbUser = await _database.transaction ((txn) async {
235
- /// Delete existing
236
- await _userStore.delete (
263
+ var dbUser = await _txnGetSignInWithEmailAndPasswordUserCredential (
237
264
txn,
238
- finder: Finder (
239
- filter: Filter .equals (dbUserModel.isAnonymous.name, true ),
240
- ),
241
- );
242
- var dbUser = await _userStore.add (
243
- txn,
244
- DbUser ()
245
- ..name.v = 'Anonymous'
246
- ..isAnonymous.v = true ,
265
+ email: email,
266
+ password: password,
247
267
);
268
+ return dbUser;
269
+ });
270
+
271
+ return _FirebaseUserCredentialSembast (dbUser);
272
+ }
273
+
274
+ Future <DbUser > _txnGetSignInAnonymouslyUserCredential (Transaction txn) async {
275
+ /// Delete old existing
276
+ await _userStore.delete (
277
+ txn,
278
+ finder: Finder (
279
+ filter: Filter .and ([
280
+ Filter .equals (dbUserModel.isAnonymous.name, true ),
281
+ Filter .or ([
282
+ Filter .isNull (dbUserModel.created.name),
283
+ Filter .lessThan (
284
+ dbUserModel.created.name,
285
+ Timestamp .now ().addDuration (const Duration (days: 30 )),
286
+ ),
287
+ ]),
288
+ ]),
289
+ ),
290
+ );
291
+ var created = Timestamp .now ();
292
+ var dbUser = await _userStore.add (
293
+ txn,
294
+ DbUser ()
295
+ ..created.v = created
296
+ ..name.v = 'Anonymous ${created .toIso8601String ()}'
297
+ ..isAnonymous.v = true ,
298
+ );
299
+ return dbUser;
300
+ }
301
+
302
+ @override
303
+ Future <UserCredential > signInAnonymously () async {
304
+ await _ready;
305
+ var dbUser = await _database.transaction ((txn) async {
306
+ var dbUser = await _txnGetSignInAnonymouslyUserCredential (txn);
248
307
await firebaseAuthCurrentUserRecord.put (
249
308
txn,
250
309
DbCurrentUser ()..uid.v = dbUser.id,
@@ -257,11 +316,37 @@ class FirebaseAuthSembastImpl
257
316
return _FirebaseUserCredentialSembast (dbUser);
258
317
}
259
318
319
+ @override
320
+ Future <UserCredential > getSignInAnonymouslyUserCredential () async {
321
+ await _ready;
322
+ var dbUser = await _database.transaction ((txn) async {
323
+ var dbUser = await _txnGetSignInAnonymouslyUserCredential (txn);
324
+ return dbUser;
325
+ });
326
+
327
+ return _FirebaseUserCredentialSembast (dbUser);
328
+ }
329
+
260
330
@override
261
331
Future <void > signOut () async {
262
332
// ignore: unnecessary_statements
263
333
await _ready;
264
- await firebaseAuthCurrentUserRecord.delete (_database);
334
+
335
+ await _database.transaction ((txn) async {
336
+ var currentUser = await firebaseAuthCurrentUserRecord.get (txn);
337
+ if (currentUser != null ) {
338
+ var id = currentUser.uid.v! ;
339
+
340
+ var record = _userStore.record (id);
341
+ var dbUser = await record.get (txn);
342
+ if (dbUser? .isAnonymous.v == true ) {
343
+ await record.delete (txn);
344
+ }
345
+
346
+ await firebaseAuthCurrentUserRecord.delete (txn);
347
+ }
348
+ });
349
+
265
350
currentUserAdd (null );
266
351
}
267
352
0 commit comments