Skip to content

Commit bfd3250

Browse files
authored
Merge pull request #1 from gmbcode/addusername
feat : Added username storage logic
2 parents 9b8a58e + a1932ea commit bfd3250

File tree

9 files changed

+329
-115
lines changed

9 files changed

+329
-115
lines changed
Lines changed: 164 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -1,177 +1,222 @@
11
import 'package:azt/features/auth/domain/entities/app_user.dart';
22
import 'package:azt/features/auth/domain/repos/auth_repo.dart';
3+
import 'package:azt/features/auth/domain/repos/user_repo.dart';
34
import 'package:firebase_auth/firebase_auth.dart';
45
import 'package:google_sign_in/google_sign_in.dart';
56
import 'package:flutter/foundation.dart' show kIsWeb;
6-
import 'package:cloud_firestore/cloud_firestore.dart';
77

8-
class FirebaseAuthRepo implements AuthRepo{
8+
class FirebaseAuthRepo implements AuthRepo {
99
//firebase access
1010
final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
11+
final UserRepo userRepo;
1112

1213

14+
FirebaseAuthRepo({required this.userRepo});
15+
1316
//LOGIN with email,pass
1417
@override
1518
Future<AppUser?> loginWithEmailPassword(String email, String password) async {
16-
try{
19+
try {
1720
//try to sign in
1821
UserCredential userCredential = await firebaseAuth
19-
.signInWithEmailAndPassword(email: email, password: password);
22+
.signInWithEmailAndPassword(email: email, password: password);
23+
24+
// Fetch username from UserRepo
25+
final username = await userRepo.getUserUsername(userCredential.user!.uid);
2026

2127
//create user
22-
AppUser user = AppUser(uid: userCredential.user!.uid, email: email,emailVerified: userCredential.user!.emailVerified);
28+
AppUser user = AppUser(
29+
uid: userCredential.user!.uid,
30+
email: email,
31+
emailVerified: userCredential.user!.emailVerified,
32+
name: username,
33+
);
2334

2435
//return user
2536
return user;
2637

27-
} on FirebaseAuthException catch (e){
28-
switch (e.code) {
29-
case 'invalid-email':
30-
throw Exception('The email address is not valid.');
31-
case 'user-disabled':
32-
throw Exception('This user has been disabled.');
33-
case 'user-not-found':
34-
throw Exception('No user found for that email.');
35-
case 'wrong-password':
36-
throw Exception('Wrong password provided for that user.');
37-
case 'too-many-requests':
38-
throw Exception('Too many attempts. Try again later.');
39-
case 'network-request-failed':
40-
throw Exception('Please connect to internet and try again later');
41-
default:
42-
throw Exception('Login failed. ${e.message ?? 'Please try again.'}');
43-
}
38+
} on FirebaseAuthException catch (e) {
39+
switch (e.code) {
40+
case 'invalid-email':
41+
throw Exception('The email address is not valid.');
42+
case 'user-disabled':
43+
throw Exception('This user has been disabled.');
44+
case 'user-not-found':
45+
throw Exception('No user found for that email.');
46+
case 'wrong-password':
47+
throw Exception('Wrong password provided for that user.');
48+
case 'too-many-requests':
49+
throw Exception('Too many attempts. Try again later.');
50+
case 'network-request-failed':
51+
throw Exception('Please connect to internet and try again later');
52+
default:
53+
throw Exception('Login failed. ${e.message ?? 'Please try again.'}');
54+
}
4455
}
4556
//catch errors
46-
catch(e){
57+
catch (e) {
4758
throw Exception('Login failed: $e');
4859
}
4960
}
5061

5162
//REGISTER
5263
@override
5364
Future<AppUser?> registerWithEmailPassword(String name, String email, String password) async {
54-
try{
55-
65+
try {
5666
//attempt signup
5767
UserCredential userCredential = await firebaseAuth
58-
.createUserWithEmailAndPassword(email: email, password: password);
68+
.createUserWithEmailAndPassword(email: email, password: password);
69+
5970

6071
//create user
61-
AppUser user = AppUser(uid: userCredential.user!.uid, email: email,emailVerified: userCredential.user!.emailVerified);
72+
AppUser user = AppUser(
73+
uid: userCredential.user!.uid,
74+
email: email,
75+
emailVerified: userCredential.user!.emailVerified,
76+
name: name,
77+
);
6278

6379
//return user
6480
return user;
65-
} on FirebaseAuthException catch(e){
81+
} on FirebaseAuthException catch (e) {
6682
switch (e.code) {
67-
case 'invalid-email':
68-
throw Exception('The email address is not valid.');
69-
case 'email-already-in-use':
70-
throw Exception('Email address is already in use');
71-
case 'too-many-requests':
72-
throw Exception('Too many attempts. Try again later.');
73-
case 'network-request-failed':
74-
throw Exception('Please connect to internet and try again later');
75-
default:
76-
throw Exception('Registration failed. ${e.message ?? 'Please try again.'}');
77-
}
78-
}
79-
catch(e){
83+
case 'invalid-email':
84+
throw Exception('The email address is not valid.');
85+
case 'email-already-in-use':
86+
throw Exception('Email address is already in use');
87+
case 'too-many-requests':
88+
throw Exception('Too many attempts. Try again later.');
89+
case 'network-request-failed':
90+
throw Exception('Please connect to internet and try again later');
91+
default:
92+
throw Exception('Registration failed. ${e.message ?? 'Please try again.'}');
93+
}
94+
} catch (e) {
8095
throw Exception('Registration failed: $e');
8196
}
8297
}
83-
98+
8499
//DELETE ACC
85100
@override
86101
Future<void> deleteAccount() async {
87-
try{
88-
102+
try {
89103
//get current user
90104
final user = firebaseAuth.currentUser;
91105

92106
//check for null
93-
if (user==null) throw Exception('No user found..');
107+
if (user == null) throw Exception('No user found..');
108+
109+
//delete from firestore
110+
await userRepo.deleteUserData(user.uid);
94111

95112
//try to delete acc
96113
await user.delete();
97114

98115
//logout
99116
await logout();
100-
}
101-
catch(e){
117+
} catch (e) {
102118
throw Exception("Failed to delete user.. : $e");
103119
}
104120
}
105-
106121

107122
// GET CURRENT USER
108123
@override
109-
Future<AppUser?> getCurrentUser() async{
124+
Future<AppUser?> getCurrentUser() async {
110125
//get current logged in user from db
111126
final firebaseUser = firebaseAuth.currentUser;
112127
//no logged in user
113128
if (firebaseUser == null) return null;
114129

115-
//logged in user
116-
return AppUser(uid: firebaseUser.uid, email: firebaseUser.email!,emailVerified: firebaseUser.emailVerified);
130+
//get username from userrepo
131+
try {
132+
final username = await userRepo.getUserUsername(firebaseUser.uid) ;
133+
134+
return AppUser(
135+
uid: firebaseUser.uid,
136+
email: firebaseUser.email!,
137+
emailVerified: firebaseUser.emailVerified,
138+
name: username,
139+
);
140+
} catch (e) {
141+
// If fetch fails, return without username
142+
return AppUser(
143+
uid: firebaseUser.uid,
144+
email: firebaseUser.email!,
145+
emailVerified: firebaseUser.emailVerified,
146+
);
147+
}
117148
}
118-
119149

120150
//LOGOUT
121151
@override
122152
Future<void> logout() async {
123153
await firebaseAuth.signOut();
124-
125154
}
126-
127155

128156
//RESET PASSWORD
129157
@override
130158
Future<String> sendPasswordResetEmail(String email) async {
131-
try{
159+
try {
132160
await firebaseAuth.sendPasswordResetEmail(email: email);
133161
return "Password reset email sent!";
134-
}
135-
catch(e){
162+
} catch (e) {
136163
return "An error occured: $e";
137164
}
138165
}
139-
166+
140167
@override
141168
Future<AppUser?> signInWithGoogle() async {
142-
try {
143-
final GoogleAuthProvider googleProvider = GoogleAuthProvider();
144-
googleProvider.addScope('email');
145-
googleProvider.addScope('profile');
146-
147-
UserCredential userCredential;
148-
149-
if (!kIsWeb) {
150-
// Mobile platforms
151-
userCredential = await FirebaseAuth.instance.signInWithProvider(googleProvider);
152-
} else {
153-
// Web platform - use signInWithPopup instead
154-
userCredential = await FirebaseAuth.instance.signInWithPopup(googleProvider);
169+
try {
170+
final GoogleAuthProvider googleProvider = GoogleAuthProvider();
171+
googleProvider.addScope('email');
172+
googleProvider.addScope('profile');
173+
174+
UserCredential userCredential;
175+
176+
if (!kIsWeb) {
177+
// Mobile platforms
178+
userCredential = await FirebaseAuth.instance.signInWithProvider(googleProvider);
179+
} else {
180+
// Web platform - use signInWithPopup instead
181+
userCredential = await FirebaseAuth.instance.signInWithPopup(googleProvider);
182+
}
183+
184+
// user cancelled sign-in
185+
if (userCredential.user == null) return null;
186+
187+
// firebase user
188+
final firebaseUser = userCredential.user!;
189+
190+
//check if user already exists
191+
final userData = await userRepo.getUserData(firebaseUser.uid);
192+
193+
String username = '';
194+
if (userData == null) {
195+
//extract username from email
196+
username = firebaseUser.email?.split('@')[0] ?? '';
197+
await userRepo.saveUserData(
198+
firebaseUser.uid,
199+
firebaseUser.email ?? '',
200+
username,
201+
);
202+
} else {
203+
//if already existing user
204+
username = userData['username'] ?? '';
205+
}
206+
207+
AppUser appUser = AppUser(
208+
uid: firebaseUser.uid,
209+
email: firebaseUser.email ?? '',
210+
emailVerified: firebaseUser.emailVerified,
211+
name: username,
212+
);
213+
return appUser;
214+
} catch (e) {
215+
print(e);
216+
return null;
155217
}
156-
157-
// user cancelled sign-in
158-
if (userCredential.user == null) return null;
159-
160-
// firebase user
161-
final firebaseUser = userCredential.user!;
162-
163-
AppUser appUser = AppUser(
164-
uid: firebaseUser.uid,
165-
email: firebaseUser.email ?? '',
166-
emailVerified: firebaseUser.emailVerified, //Should be set to true by default after gsignin
167-
);
168-
return appUser;
169-
}
170-
catch (e) {
171-
print(e);
172-
return null;
173218
}
174-
}
219+
175220
Future<void> sendEmailVerification() async {
176221
try {
177222
final user = firebaseAuth.currentUser;
@@ -182,25 +227,35 @@ class FirebaseAuthRepo implements AuthRepo{
182227
throw Exception('Failed to send verification email: $e');
183228
}
184229
}
230+
185231
Future<AppUser?> reloadUser() async {
186-
try {
187-
final user = firebaseAuth.currentUser;
188-
if (user == null) return null;
189-
190-
// Reload user data from Firebase
191-
await user.reload();
192-
193-
// Get the updated user
194-
final updatedUser = firebaseAuth.currentUser;
195-
if (updatedUser == null) return null;
196-
197-
return AppUser(
198-
uid: updatedUser.uid,
199-
email: updatedUser.email!,
200-
emailVerified: updatedUser.emailVerified,
201-
);
202-
} catch (e) {
203-
throw Exception('Failed to reload user: $e');
232+
try {
233+
final user = firebaseAuth.currentUser;
234+
if (user == null) return null;
235+
236+
//reload from firestore
237+
await user.reload();
238+
239+
//get updated user
240+
final updatedUser = firebaseAuth.currentUser;
241+
if (updatedUser == null) return null;
242+
243+
//get username from repo
244+
String username = '';
245+
try {
246+
username = await userRepo.getUserUsername(updatedUser.uid);
247+
} catch (e) {
248+
//fetch fail then continue without username
249+
}
250+
251+
return AppUser(
252+
uid: updatedUser.uid,
253+
email: updatedUser.email!,
254+
emailVerified: updatedUser.emailVerified,
255+
name: username,
256+
);
257+
} catch (e) {
258+
throw Exception('Failed to reload user: $e');
259+
}
204260
}
205-
}
206-
}
261+
}

0 commit comments

Comments
 (0)