Skip to content

Commit

Permalink
finished sources, edited frontend and profile
Browse files Browse the repository at this point in the history
  • Loading branch information
adelp13 committed Feb 2, 2025
1 parent 59d1f14 commit 8a299fa
Show file tree
Hide file tree
Showing 9 changed files with 554 additions and 68 deletions.
69 changes: 67 additions & 2 deletions backend/controllers/auth.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,82 @@ RouterPlus authRouter() {
final user = await getUser(req);
if (user != null) {
//print("User Data: ${user.toJson()}");
print(user.createdAt);
//print(user.createdAt);
return {
'id': user.id,
'name': user.userMetadata?['name'],
'email': user.email,
'lastSignIn': user.lastSignInAt,
'createdAt': user.createdAt,
'photoUrl': user.userMetadata?['photoUrl'],
};
}
return {'error': 'User not found'};
});

router.get('/users/<userId>', (Request req, String userId) async {
final user = await getUser(req);
final response = await supabase.auth.admin.getUserById(userId);
final userData = response.user;

if (userData != null) {
//print(userData);
return {
'id': userData.id,
'name': userData.userMetadata?['name'],
'photoUrl': userData.userMetadata?['photoUrl'],
'email': userData.email,
'lastSignIn': userData.lastSignInAt,
'createdAt': userData.createdAt,
};
}
return {'error': 'User not found'};
});

router.get('/users', (Request req) async {
final response = await supabase.auth.admin.listUsers();

final users = response.map((user) => {
'id': user.id,
'name': user.userMetadata?['name'] ?? 'Unknown',
'email': user.email,
}).toList();

return users;
});

router.post('/updateUser', (Request req) async {
final body = await req.body.asJson;
validateFromBody(body, fields: ['name', 'photoUrl']);

final user = await getUser(req);
if (user == null) {
return {'error': 'User not found'};
}

try {
final response = await supabase.auth.admin.updateUserById(
user.id,
attributes: AdminUserAttributes(
userMetadata: {
'name': body['name'],
'photoUrl': body['photoUrl'],
},
),
);

final updatedUser = response.user;
return {
'id': updatedUser?.id,
'name': updatedUser?.userMetadata?['name'],
'photoUrl': updatedUser?.userMetadata?['photoUrl'],
};
} catch (e) {
return {'error': 'Failed to update metadata: $e'};
}
});


router.post('/login', (Request req) async {
final body = await req.body.asJson;
validateFromBody(body, fields:
Expand All @@ -54,6 +118,7 @@ RouterPlus authRouter() {
'password',
'name',
'isGuest',
'photoUrl',
]
);

Expand All @@ -62,7 +127,7 @@ RouterPlus authRouter() {
final response = await supabase.auth.admin.createUser(AdminUserAttributes(
email: body['email'],
password: body['password'],
userMetadata: {'name': body['name'], 'isGuest': body['isGuest']},
userMetadata: {'name': body['name'], 'isGuest': body['isGuest'], 'photoUrl': body['photoUrl']},
emailConfirm: true,
));
final User? user = response.user;
Expand Down
3 changes: 3 additions & 0 deletions lib/Auth/guest_account.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,15 @@ Future<void> createGuestUser() async {
final email = '$name${_generateRandomString()}@gmail.com';
final password = _generateRandomString();

const String defaultPhotoUrl = 'https://www.gravatar.com/avatar/00000000000000000000000000000000?d=mp&f=y';

try {
await AuthService.instance.signup(
name : name,
email : email,
password: password,
isGuest : true,
photoUrl : defaultPhotoUrl,
);
await AuthService.instance.login(
email : email,
Expand Down
2 changes: 2 additions & 0 deletions lib/Auth/signup_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@ class SignUpBloc extends Bloc<SignUpEvent, SignUpState> {
throw Exception('The passwords don\'t match.');
}

const String defaultPhotoUrl = 'https://www.gravatar.com/avatar/00000000000000000000000000000000?d=mp&f=y';
try {
await AuthService.instance.signup(
name : body['name']!,
email : body['email']!,
password: body['password']!,
photoUrl: defaultPhotoUrl,
);
}
catch (e) {
Expand Down
12 changes: 11 additions & 1 deletion lib/Library.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import 'Main.dart';
import 'UserSystem.dart';
import 'ProfilePage.dart';
import 'Menu.dart';
import 'UserListPage.dart';

class Library<MT extends MediaType> extends StatefulWidget {
late final bool isWishlist;
Expand Down Expand Up @@ -445,10 +446,19 @@ class LibraryState<MT extends MediaType> extends State<Library> {
icon: const Icon(Icons.dark_mode),
tooltip: 'Toggle dark mode',
),
TextButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => UserListPage()),
);
},
style: navigationButton(context).filledButtonTheme.style,
child: Text('See Users'),
),
TextButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => ProfilePage()),
MaterialPageRoute(builder: (context) => ProfilePage(userId: UserSystem.instance.getCurrentUserId())),
);
},
style: navigationButton(context)
Expand Down
21 changes: 17 additions & 4 deletions lib/Menu.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import 'Models/tv_series.dart';
import 'package:flutter/material.dart';
import 'package:adaptive_theme/adaptive_theme.dart';
import 'ProfilePage.dart';
import 'UserListPage.dart';

class MenuPage extends StatelessWidget {
const MenuPage({super.key});
Expand Down Expand Up @@ -95,6 +96,7 @@ class MenuState extends State<Menu> {

@override
Widget build(BuildContext context) {
String userIdToNavigate = UserSystem.instance.getCurrentUserId();
MenuMediaType currentRendering = MenuMediaType.Game;
Map<MenuMediaType, bool> hoverState = {
for (var type in MenuMediaType.values) type: false
Expand All @@ -113,14 +115,25 @@ class MenuState extends State<Menu> {
icon: const Icon(Icons.dark_mode),
tooltip: 'Toggle dark mode',
),
IconButton(
TextButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => ProfilePage()),
MaterialPageRoute(builder: (context) => UserListPage()),
);
},
style: navigationButton(context).filledButtonTheme.style,
child: Text('See Users'),
),
TextButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => ProfilePage(userId: UserSystem.instance.getCurrentUserId())),
);
},
icon: const Icon(Icons.account_circle),
tooltip: 'Go to Profile',
style: navigationButton(context)
.filledButtonTheme
.style,
child: Text(UserSystem.instance.currentUserData!['name']),
),
IconButton(
onPressed: () async {
Expand Down
Loading

0 comments on commit 8a299fa

Please sign in to comment.