feat: refactorisation majeure - DataLoadingService + UserRepository simplifié
✅ NOUVEAU SERVICE CRÉÉ: - DataLoadingService: gère tout le chargement des données au login - Sépare les responsabilités: UserRepository se concentre sur l'auth - Simplification massive du code de connexion ✅ USERREPOSITORY REFACTORISÉ: - Suppression de toute la logique de chargement de données (déplacée vers DataLoadingService) - Délégation complète aux services singleton (CurrentUserService, CurrentAmicaleService) - Constructeur ultra-simplifié (plus d'injection ApiService) - Méthodes d'auth optimisées et clarifiées ✅ REPOSITORIES SIMPLIFIÉS: - AmicaleRepository: constructeur sans paramètres, ApiService.instance - ClientRepository: même pattern de simplification - MembreRepository: suppression injection, getters sécurisés - OperationRepository: utilisation ApiService.instance - PassageRepository: simplification massive, nouveau pattern - SectorRepository: optimisation et nouvelle structure ✅ ARCHITECTURE SINGLETONS: - ApiService: pattern singleton thread-safe - CurrentUserService: gestion utilisateur connecté + persistence Hive (Box user) - CurrentAmicaleService: gestion amicale courante + auto-sync - Box Hive 'users' renommée en 'user' avec migration automatique ✅ APP.DART & MAIN.DART: - Suppression injections multiples dans repositories - Intégration des services singleton dans main.dart - Router simplifié avec CurrentUserService État: Architecture singleton opérationnelle, prêt pour tests et widgets
This commit is contained in:
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:geosector_app/core/theme/app_theme.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
||||
import 'package:geosector_app/core/services/api_service.dart';
|
||||
import 'package:geosector_app/core/services/current_user_service.dart';
|
||||
import 'package:geosector_app/core/repositories/user_repository.dart';
|
||||
import 'package:geosector_app/core/repositories/operation_repository.dart';
|
||||
import 'package:geosector_app/core/repositories/passage_repository.dart';
|
||||
@@ -16,14 +16,13 @@ import 'package:geosector_app/presentation/auth/login_page.dart';
|
||||
import 'package:geosector_app/presentation/admin/admin_dashboard_page.dart';
|
||||
import 'package:geosector_app/presentation/user/user_dashboard_page.dart';
|
||||
|
||||
// Instances globales des services et repositories
|
||||
final apiService = ApiService();
|
||||
final operationRepository = OperationRepository(apiService);
|
||||
final passageRepository = PassageRepository(apiService);
|
||||
final userRepository = UserRepository(apiService);
|
||||
final sectorRepository = SectorRepository(apiService);
|
||||
final membreRepository = MembreRepository(apiService);
|
||||
final amicaleRepository = AmicaleRepository(apiService);
|
||||
// Instances globales des repositories (plus besoin d'injecter ApiService)
|
||||
final operationRepository = OperationRepository();
|
||||
final passageRepository = PassageRepository();
|
||||
final userRepository = UserRepository();
|
||||
final sectorRepository = SectorRepository();
|
||||
final membreRepository = MembreRepository();
|
||||
final amicaleRepository = AmicaleRepository();
|
||||
final syncService = SyncService(userRepository: userRepository);
|
||||
final connectivityService = ConnectivityService();
|
||||
|
||||
@@ -60,8 +59,7 @@ class GeosectorApp extends StatelessWidget {
|
||||
name: 'login',
|
||||
builder: (context, state) {
|
||||
// Récupérer le type depuis les query parameters ou extra data
|
||||
final type = state.uri.queryParameters['type'] ??
|
||||
(state.extra as Map<String, dynamic>?)?['type'] as String?;
|
||||
final type = state.uri.queryParameters['type'] ?? (state.extra as Map<String, dynamic>?)?['type'] as String?;
|
||||
|
||||
debugPrint('GoRoute: Affichage de LoginPage avec type: $type');
|
||||
return LoginPage(loginType: type);
|
||||
@@ -125,44 +123,37 @@ class GeosectorApp extends StatelessWidget {
|
||||
}
|
||||
|
||||
// Pages publiques qui ne nécessitent pas d'authentification
|
||||
final publicPaths = [
|
||||
'/login',
|
||||
'/login/user',
|
||||
'/login/admin',
|
||||
'/register'
|
||||
];
|
||||
final publicPaths = ['/login', '/login/user', '/login/admin', '/register'];
|
||||
if (publicPaths.any((path) => currentPath.startsWith(path))) {
|
||||
debugPrint(
|
||||
'GoRouter.redirect: Page publique autorisée: $currentPath');
|
||||
debugPrint('GoRouter.redirect: Page publique autorisée: $currentPath');
|
||||
return null;
|
||||
}
|
||||
|
||||
// Vérifier l'authentification pour les pages protégées
|
||||
try {
|
||||
final isAuthenticated = userRepository.isLoggedIn;
|
||||
final currentUser = userRepository.currentUser;
|
||||
// Utiliser le nouveau CurrentUserService
|
||||
final userService = CurrentUserService.instance;
|
||||
final isAuthenticated = userService.isLoggedIn;
|
||||
final currentUser = userService.currentUser;
|
||||
|
||||
debugPrint('GoRouter.redirect: isAuthenticated = $isAuthenticated');
|
||||
debugPrint('GoRouter.redirect: currentUser = ${currentUser?.email}');
|
||||
|
||||
// Si pas authentifié, rediriger vers la splash page
|
||||
if (!isAuthenticated) {
|
||||
debugPrint(
|
||||
'GoRouter.redirect: Non authentifié, redirection vers /');
|
||||
debugPrint('GoRouter.redirect: Non authentifié, redirection vers /');
|
||||
return '/';
|
||||
}
|
||||
|
||||
// Vérifier les permissions pour les pages admin
|
||||
if (currentPath.startsWith('/admin')) {
|
||||
final userRole = userRepository.getUserRole();
|
||||
final isAdmin = userRole > 1; // Admin = rôle 2 ou plus
|
||||
final userRole = userService.userRole;
|
||||
final isAdmin = userService.canAccessAdmin;
|
||||
|
||||
debugPrint(
|
||||
'GoRouter.redirect: userRole = $userRole, isAdmin = $isAdmin');
|
||||
debugPrint('GoRouter.redirect: userRole = $userRole, canAccessAdmin = $isAdmin');
|
||||
|
||||
if (!isAdmin) {
|
||||
debugPrint(
|
||||
'GoRouter.redirect: Pas admin, redirection vers /user');
|
||||
debugPrint('GoRouter.redirect: Pas admin, redirection vers /user');
|
||||
return '/user';
|
||||
}
|
||||
}
|
||||
@@ -171,15 +162,13 @@ class GeosectorApp extends StatelessWidget {
|
||||
debugPrint('GoRouter.redirect: Accès autorisé à $currentPath');
|
||||
return null;
|
||||
} catch (e) {
|
||||
debugPrint(
|
||||
'GoRouter.redirect: Erreur lors de la vérification auth: $e');
|
||||
debugPrint('GoRouter.redirect: Erreur lors de la vérification auth: $e');
|
||||
// En cas d'erreur, rediriger vers la splash page pour sécurité
|
||||
return '/';
|
||||
}
|
||||
},
|
||||
// Listener pour déboguer les changements de route
|
||||
refreshListenable:
|
||||
userRepository, // Écouter les changements dans userRepository
|
||||
refreshListenable: CurrentUserService.instance, // Écouter les changements dans CurrentUserService
|
||||
debugLogDiagnostics: true, // Activer les logs de débogage
|
||||
errorBuilder: (context, state) {
|
||||
debugPrint('GoRouter.errorBuilder: Erreur pour ${state.uri.path}');
|
||||
|
||||
Reference in New Issue
Block a user