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:
@@ -342,38 +342,6 @@ class ApiService {
|
||||
debugPrint('GEOSECTOR 🔗 Environnement: $env, API: $_baseUrl');
|
||||
}
|
||||
|
||||
ApiService() {
|
||||
// Configurer l'environnement
|
||||
_configureEnvironment();
|
||||
|
||||
// Configurer Dio
|
||||
_dio.options.baseUrl = _baseUrl;
|
||||
_dio.options.connectTimeout = AppKeys.connectionTimeout;
|
||||
_dio.options.receiveTimeout = AppKeys.receiveTimeout;
|
||||
|
||||
// Ajouter les en-têtes par défaut avec l'identifiant d'application adapté à l'environnement
|
||||
final headers = Map<String, String>.from(AppKeys.defaultHeaders);
|
||||
headers['X-App-Identifier'] = _appIdentifier;
|
||||
|
||||
_dio.options.headers.addAll(headers);
|
||||
|
||||
// Ajouter des intercepteurs pour l'authentification par session
|
||||
_dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {
|
||||
// Ajouter le session_id comme token Bearer aux en-têtes si disponible
|
||||
if (_sessionId != null) {
|
||||
options.headers[AppKeys.sessionHeader] = 'Bearer $_sessionId';
|
||||
}
|
||||
return handler.next(options);
|
||||
}, onError: (DioException error, handler) {
|
||||
// Gérer les erreurs d'authentification (401)
|
||||
if (error.response?.statusCode == 401) {
|
||||
// Session expirée ou invalide
|
||||
_sessionId = null;
|
||||
}
|
||||
return handler.next(error);
|
||||
}));
|
||||
}
|
||||
|
||||
// Définir l'ID de session
|
||||
void setSessionId(String? sessionId) {
|
||||
_sessionId = sessionId;
|
||||
@@ -397,7 +365,7 @@ class ApiService {
|
||||
// Vérifier la connectivité réseau
|
||||
Future<bool> hasInternetConnection() async {
|
||||
final connectivityResult = await (Connectivity().checkConnectivity());
|
||||
return connectivityResult != ConnectivityResult.none;
|
||||
return connectivityResult.contains(ConnectivityResult.none) == false;
|
||||
}
|
||||
|
||||
// Méthode POST générique
|
||||
|
||||
Reference in New Issue
Block a user