From 18af5c9034c46389541661f45b28f3b2a86b43b6 Mon Sep 17 00:00:00 2001 From: Julien Martin Date: Mon, 9 Feb 2026 22:36:52 +0100 Subject: [PATCH] fix(auth): connexion admin - token snake_case, routes GoRouter, profil (Closes #84) Co-authored-by: Cursor --- frontend/lib/config/app_router.dart | 14 ++++++++++++++ frontend/lib/models/user.dart | 8 ++++++-- frontend/lib/screens/auth/login_screen.dart | 12 +++++++----- frontend/lib/services/auth_service.dart | 21 ++++++++++++--------- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/frontend/lib/config/app_router.dart b/frontend/lib/config/app_router.dart index 7bd6358..d5e2ad6 100644 --- a/frontend/lib/config/app_router.dart +++ b/frontend/lib/config/app_router.dart @@ -19,6 +19,8 @@ import '../screens/auth/am_register_step2_screen.dart'; import '../screens/auth/am_register_step3_screen.dart'; import '../screens/auth/am_register_step4_screen.dart'; import '../screens/home/home_screen.dart'; +import '../screens/administrateurs/admin_dashboardScreen.dart'; +import '../screens/home/parent_screen/ParentDashboardScreen.dart'; import '../screens/unknown_screen.dart'; // --- Provider Instances --- @@ -47,6 +49,18 @@ class AppRouter { path: '/home', builder: (BuildContext context, GoRouterState state) => const HomeScreen(), ), + GoRoute( + path: '/admin-dashboard', + builder: (BuildContext context, GoRouterState state) => const AdminDashboardScreen(), + ), + GoRoute( + path: '/parent-dashboard', + builder: (BuildContext context, GoRouterState state) => const ParentDashboardScreen(), + ), + GoRoute( + path: '/am-dashboard', + builder: (BuildContext context, GoRouterState state) => const HomeScreen(), + ), // --- Parent Registration Flow --- ShellRoute( diff --git a/frontend/lib/models/user.dart b/frontend/lib/models/user.dart index 8091919..29712ac 100644 --- a/frontend/lib/models/user.dart +++ b/frontend/lib/models/user.dart @@ -20,8 +20,12 @@ class AppUser { id: json['id'] as String, email: json['email'] as String, role: json['role'] as String, - createdAt: DateTime.parse(json['createdAt'] as String), - updatedAt: DateTime.parse(json['updatedAt'] as String), + createdAt: json['createdAt'] != null + ? DateTime.parse(json['createdAt'] as String) + : DateTime.now(), + updatedAt: json['updatedAt'] != null + ? DateTime.parse(json['updatedAt'] as String) + : DateTime.now(), changementMdpObligatoire: json['changement_mdp_obligatoire'] as bool? ?? false, ); } diff --git a/frontend/lib/screens/auth/login_screen.dart b/frontend/lib/screens/auth/login_screen.dart index 6d6cfd2..b441062 100644 --- a/frontend/lib/screens/auth/login_screen.dart +++ b/frontend/lib/screens/auth/login_screen.dart @@ -116,21 +116,23 @@ class _LoginPageState extends State with WidgetsBindingObserver { } } - /// Redirige l'utilisateur selon son rôle + /// Redirige l'utilisateur selon son rôle (GoRouter : context.go). void _redirectUserByRole(String role) { + setState(() => _isLoading = false); switch (role.toLowerCase()) { case 'super_admin': + case 'administrateur': case 'gestionnaire': - Navigator.pushReplacementNamed(context, '/admin-dashboard'); + context.go('/admin-dashboard'); break; case 'parent': - Navigator.pushReplacementNamed(context, '/parent-dashboard'); + context.go('/parent-dashboard'); break; case 'assistante_maternelle': - Navigator.pushReplacementNamed(context, '/am-dashboard'); + context.go('/am-dashboard'); break; default: - Navigator.pushReplacementNamed(context, '/home'); + context.go('/home'); } } diff --git a/frontend/lib/services/auth_service.dart b/frontend/lib/services/auth_service.dart index 0acaefb..7a44678 100644 --- a/frontend/lib/services/auth_service.dart +++ b/frontend/lib/services/auth_service.dart @@ -23,13 +23,15 @@ class AuthService { if (response.statusCode == 200 || response.statusCode == 201) { final data = jsonDecode(response.body); - - // Stocker les tokens - await TokenService.saveToken(data['accessToken']); - await TokenService.saveRefreshToken(data['refreshToken']); - - // Récupérer le profil utilisateur pour avoir toutes les infos - final user = await _fetchUserProfile(data['accessToken']); + // API renvoie access_token / refresh_token (snake_case) + final accessToken = data['access_token'] as String? ?? data['accessToken'] as String?; + final refreshToken = data['refresh_token'] as String? ?? data['refreshToken'] as String?; + if (accessToken == null) throw Exception('Token absent dans la réponse serveur'); + + await TokenService.saveToken(accessToken); + await TokenService.saveRefreshToken(refreshToken ?? ''); + + final user = await _fetchUserProfile(accessToken); // Stocker l'utilisateur en cache await _saveCurrentUser(user); @@ -80,8 +82,9 @@ class AuthService { Uri.parse('${ApiConfig.baseUrl}${ApiConfig.changePasswordRequired}'), headers: ApiConfig.authHeaders(token), body: jsonEncode({ - 'currentPassword': currentPassword, - 'newPassword': newPassword, + 'mot_de_passe_actuel': currentPassword, + 'nouveau_mot_de_passe': newPassword, + 'confirmation_mot_de_passe': newPassword, }), );