Merge branch '208-p0-auth-05-get-started-screen' of github.com:Oloodi/krow-workforce into 208-p0-auth-05-get-started-screen

This commit is contained in:
José Salazar
2026-01-22 16:03:35 -05:00
73 changed files with 22009 additions and 20426 deletions

View File

@@ -1,5 +1,5 @@
import 'package:firebase_auth/firebase_auth.dart' as firebase;
import 'package:krow_data_connect/krow_data_connect.dart' as dc;
import 'package:firebase_auth/firebase_auth.dart';
import 'package:krow_data_connect/krow_data_connect.dart';
import 'package:krow_domain/krow_domain.dart' as domain;
import '../../domain/repositories/auth_repository_interface.dart';
@@ -8,15 +8,15 @@ import '../../domain/repositories/auth_repository_interface.dart';
/// This implementation integrates with Firebase Authentication for user
/// identity management and Krow's Data Connect SDK for storing user profile data.
class AuthRepositoryImpl implements AuthRepositoryInterface {
final firebase.FirebaseAuth _firebaseAuth;
final dc.ExampleConnector _dataConnect;
final FirebaseAuth _firebaseAuth;
final ExampleConnector _dataConnect;
/// Creates an [AuthRepositoryImpl] with the real dependencies.
AuthRepositoryImpl({
required firebase.FirebaseAuth firebaseAuth,
required dc.ExampleConnector dataConnect,
}) : _firebaseAuth = firebaseAuth,
_dataConnect = dataConnect;
required FirebaseAuth firebaseAuth,
required ExampleConnector dataConnect,
}) : _firebaseAuth = firebaseAuth,
_dataConnect = dataConnect;
@override
Future<domain.User> signInWithEmail({
@@ -91,23 +91,25 @@ class AuthRepositoryImpl implements AuthRepositoryInterface {
// Client-specific business logic:
// 1. Create a `Business` entity.
// 2. Create a `User` entity associated with the business.
final createBusinessResponse = await _dataConnect.createBusiness(
businessName: companyName,
userId: firebaseUser.uid,
rateGroup: dc.BusinessRateGroup.STANDARD,
status: dc.BusinessStatus.PENDING,
).execute();
final createBusinessResponse = await _dataConnect
.createBusiness(
businessName: companyName,
userId: firebaseUser.uid,
rateGroup: BusinessRateGroup.STANDARD,
status: BusinessStatus.PENDING,
)
.execute();
final businessData = createBusinessResponse.data?.business_insert;
if (businessData == null) {
await firebaseUser.delete(); // Rollback if business creation fails
throw Exception('Business creation failed after Firebase user registration.');
throw Exception(
'Business creation failed after Firebase user registration.',
);
}
final createUserResponse = await _dataConnect.createUser(
id: firebaseUser.uid,
role: dc.UserBaseRole.USER,
)
final createUserResponse = await _dataConnect
.createUser(id: firebaseUser.uid, role: UserBaseRole.USER)
.email(email)
.userRole('BUSINESS')
.execute();
@@ -116,15 +118,16 @@ class AuthRepositoryImpl implements AuthRepositoryInterface {
if (newUserData == null) {
await firebaseUser.delete(); // Rollback if user profile creation fails
// TO-DO: Also delete the created Business if this fails
throw Exception('User profile creation failed after Firebase user registration.');
throw Exception(
'User profile creation failed after Firebase user registration.',
);
}
return _getUserProfile(
firebaseUserId: firebaseUser.uid,
fallbackEmail: firebaseUser.email ?? email,
);
} on firebase.FirebaseAuthException catch (e) {
} on FirebaseAuthException catch (e) {
if (e.code == 'weak-password') {
throw Exception('The password provided is too weak.');
} else if (e.code == 'email-already-in-use') {
@@ -133,7 +136,9 @@ class AuthRepositoryImpl implements AuthRepositoryInterface {
throw Exception('Sign-up error: ${e.message}');
}
} catch (e) {
throw Exception('Failed to sign up and create user data: ${e.toString()}');
throw Exception(
'Failed to sign up and create user data: ${e.toString()}',
);
}
}
@@ -148,14 +153,18 @@ class AuthRepositoryImpl implements AuthRepositoryInterface {
@override
Future<domain.User> signInWithSocial({required String provider}) {
throw UnimplementedError('Social authentication with $provider is not yet implemented.');
throw UnimplementedError(
'Social authentication with $provider is not yet implemented.',
);
}
Future<domain.User> _getUserProfile({
required String firebaseUserId,
required String? fallbackEmail,
}) async {
final response = await _dataConnect.getUserById(id: firebaseUserId).execute();
final response = await _dataConnect
.getUserById(id: firebaseUserId)
.execute();
final user = response.data?.user;
if (user == null) {
throw Exception('Authenticated user profile not found in database.');
@@ -166,10 +175,6 @@ class AuthRepositoryImpl implements AuthRepositoryInterface {
throw Exception('User email is missing in profile data.');
}
return domain.User(
id: user.id,
email: email,
role: user.role.stringValue,
);
return domain.User(id: user.id, email: email, role: user.role.stringValue);
}
}

View File

@@ -20,9 +20,13 @@ dependencies:
# Architecture Packages
design_system:
path: ../../../../design_system
path: ../../../design_system
core_localization:
path: ../../../core_localization
krow_data_connect:
path: ../../../data_connect
krow_domain:
path: ../../../domain
dev_dependencies:
flutter_test: