feat: Implement session management with SessionListener and integrate krow_data_connect

This commit is contained in:
Achintha Isuru
2026-02-17 15:19:08 -05:00
parent 8ce37d2306
commit 5b78f339a1
5 changed files with 209 additions and 84 deletions

View File

@@ -17,9 +17,8 @@ class AuthRepositoryImpl implements AuthRepositoryInterface {
Completer<String?>? _pendingVerification;
@override
Stream<domain.User?> get currentUser => _service.auth
.authStateChanges()
.map((User? firebaseUser) {
Stream<domain.User?> get currentUser =>
_service.auth.authStateChanges().map((User? firebaseUser) {
if (firebaseUser == null) {
return null;
}
@@ -49,20 +48,24 @@ class AuthRepositoryImpl implements AuthRepositoryInterface {
// For real numbers, we can support auto-verification if desired.
// But since this method returns a verificationId for manual OTP entry,
// we might not handle direct sign-in here unless the architecture changes.
// Currently, we just ignore it for the completer flow,
// Currently, we just ignore it for the completer flow,
// or we could sign in directly if the credential is provided.
},
verificationFailed: (FirebaseAuthException e) {
if (!completer.isCompleted) {
// Map Firebase network errors to NetworkException
if (e.code == 'network-request-failed' ||
if (e.code == 'network-request-failed' ||
e.message?.contains('Unable to resolve host') == true) {
completer.completeError(
const domain.NetworkException(technicalMessage: 'Auth network failure'),
const domain.NetworkException(
technicalMessage: 'Auth network failure',
),
);
} else {
completer.completeError(
domain.SignInFailedException(technicalMessage: 'Firebase ${e.code}: ${e.message}'),
domain.SignInFailedException(
technicalMessage: 'Firebase ${e.code}: ${e.message}',
),
);
}
}
@@ -110,21 +113,18 @@ class AuthRepositoryImpl implements AuthRepositoryInterface {
verificationId: verificationId,
smsCode: smsCode,
);
final UserCredential userCredential = await _service.run(
() async {
try {
return await _service.auth.signInWithCredential(credential);
} on FirebaseAuthException catch (e) {
if (e.code == 'invalid-verification-code') {
throw const domain.InvalidCredentialsException(
technicalMessage: 'Invalid OTP code entered.',
);
}
rethrow;
final UserCredential userCredential = await _service.run(() async {
try {
return await _service.auth.signInWithCredential(credential);
} on FirebaseAuthException catch (e) {
if (e.code == 'invalid-verification-code') {
throw const domain.InvalidCredentialsException(
technicalMessage: 'Invalid OTP code entered.',
);
}
},
requiresAuthentication: false,
);
rethrow;
}
}, requiresAuthentication: false);
final User? firebaseUser = userCredential.user;
if (firebaseUser == null) {
throw const domain.SignInFailedException(
@@ -135,13 +135,9 @@ class AuthRepositoryImpl implements AuthRepositoryInterface {
final QueryResult<GetUserByIdData, GetUserByIdVariables> response =
await _service.run(
() => _service.connector
.getUserById(
id: firebaseUser.uid,
)
.execute(),
requiresAuthentication: false,
);
() => _service.connector.getUserById(id: firebaseUser.uid).execute(),
requiresAuthentication: false,
);
final GetUserByIdUser? user = response.data.user;
GetStaffByUserIdStaffs? staffRecord;
@@ -150,10 +146,7 @@ class AuthRepositoryImpl implements AuthRepositoryInterface {
if (user == null) {
await _service.run(
() => _service.connector
.createUser(
id: firebaseUser.uid,
role: UserBaseRole.USER,
)
.createUser(id: firebaseUser.uid, role: UserBaseRole.USER)
.userRole('STAFF')
.execute(),
requiresAuthentication: false,
@@ -161,11 +154,9 @@ class AuthRepositoryImpl implements AuthRepositoryInterface {
} else {
// User exists in PostgreSQL. Check if they have a STAFF profile.
final QueryResult<GetStaffByUserIdData, GetStaffByUserIdVariables>
staffResponse = await _service.run(
staffResponse = await _service.run(
() => _service.connector
.getStaffByUserId(
userId: firebaseUser.uid,
)
.getStaffByUserId(userId: firebaseUser.uid)
.execute(),
requiresAuthentication: false,
);
@@ -208,11 +199,9 @@ class AuthRepositoryImpl implements AuthRepositoryInterface {
}
final QueryResult<GetStaffByUserIdData, GetStaffByUserIdVariables>
staffResponse = await _service.run(
staffResponse = await _service.run(
() => _service.connector
.getStaffByUserId(
userId: firebaseUser.uid,
)
.getStaffByUserId(userId: firebaseUser.uid)
.execute(),
requiresAuthentication: false,
);