feat: création services singleton et renommage Box
Services créés: ✅ CurrentUserService singleton pour utilisateur connecté ✅ CurrentAmicaleService singleton pour amicale courante ✅ ApiService transformé en singleton Box Hive: ✅ Renommage users -> user (plus logique) ✅ Migration automatique des données ✅ Services intégrés dans main.dart État: Services créés, prêt pour refactorisation repositories
This commit is contained in:
@@ -49,9 +49,8 @@ class UserRepository extends ChangeNotifier {
|
||||
}
|
||||
|
||||
// Utilisation de getters lazy pour n'accéder aux boîtes que lorsque nécessaire
|
||||
Box<UserModel> get _userBox => Hive.box<UserModel>(AppKeys.usersBoxName);
|
||||
Box<AmicaleModel> get _amicaleBox =>
|
||||
Hive.box<AmicaleModel>(AppKeys.amicaleBoxName);
|
||||
Box<UserModel> get _userBox => Hive.box<UserModel>(AppKeys.userBoxName);
|
||||
Box<AmicaleModel> get _amicaleBox => Hive.box<AmicaleModel>(AppKeys.amicaleBoxName);
|
||||
|
||||
// Getters pour les autres boîtes qui vérifient si elles sont ouvertes avant accès
|
||||
Box<OperationModel> get _operationBox {
|
||||
@@ -118,10 +117,7 @@ class UserRepository extends ChangeNotifier {
|
||||
bool _isLoading = false;
|
||||
|
||||
UserRepository(this._apiService,
|
||||
{SyncService? syncService,
|
||||
OperationRepository? operationRepository,
|
||||
SectorRepository? sectorRepository,
|
||||
PassageRepository? passageRepository})
|
||||
{SyncService? syncService, OperationRepository? operationRepository, SectorRepository? sectorRepository, PassageRepository? passageRepository})
|
||||
: _syncService = syncService,
|
||||
_operationRepository = operationRepository,
|
||||
_sectorRepository = sectorRepository,
|
||||
@@ -160,7 +156,7 @@ class UserRepository extends ChangeNotifier {
|
||||
if (user.role is String) {
|
||||
return int.tryParse(user.role as String) ?? 1;
|
||||
} else {
|
||||
return user.role as int;
|
||||
return user.role;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,15 +164,13 @@ class UserRepository extends ChangeNotifier {
|
||||
UserModel? _getCurrentUserFromStorage() {
|
||||
try {
|
||||
// Vérifier d'abord si la boîte est ouverte
|
||||
if (!Hive.isBoxOpen(AppKeys.usersBoxName)) {
|
||||
if (!Hive.isBoxOpen(AppKeys.userBoxName)) {
|
||||
debugPrint('Boîte users non ouverte, tentative d\'ouverture...');
|
||||
return null; // Retourner null plutôt que d'essayer d'ouvrir ici
|
||||
}
|
||||
|
||||
// Chercher un utilisateur avec une session active
|
||||
final activeUsers = _userBox.values
|
||||
.where((user) => user.sessionId != null && user.sessionId!.isNotEmpty)
|
||||
.toList();
|
||||
final activeUsers = _userBox.values.where((user) => user.sessionId != null && user.sessionId!.isNotEmpty).toList();
|
||||
|
||||
// S'il y a des utilisateurs actifs, retourner le premier
|
||||
if (activeUsers.isNotEmpty) {
|
||||
@@ -185,8 +179,7 @@ class UserRepository extends ChangeNotifier {
|
||||
|
||||
return null;
|
||||
} catch (e) {
|
||||
debugPrint(
|
||||
'Erreur lors de la récupération de l\'utilisateur depuis le stockage: $e');
|
||||
debugPrint('Erreur lors de la récupération de l\'utilisateur depuis le stockage: $e');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -218,8 +211,7 @@ class UserRepository extends ChangeNotifier {
|
||||
}
|
||||
|
||||
// Login API PHP
|
||||
Future<Map<String, dynamic>> loginAPI(String username, String password,
|
||||
{required String type}) async {
|
||||
Future<Map<String, dynamic>> loginAPI(String username, String password, {required String type}) async {
|
||||
try {
|
||||
return await _apiService.login(username, password, type: type);
|
||||
} catch (e) {
|
||||
@@ -229,19 +221,11 @@ class UserRepository extends ChangeNotifier {
|
||||
}
|
||||
|
||||
// Register API PHP - Uniquement pour les administrateurs
|
||||
Future<Map<String, dynamic>> registerAPI(String email, String name,
|
||||
String amicaleName, String postalCode, String cityName) async {
|
||||
Future<Map<String, dynamic>> registerAPI(String email, String name, String amicaleName, String postalCode, String cityName) async {
|
||||
try {
|
||||
final Map<String, dynamic> data = {
|
||||
'email': email,
|
||||
'name': name,
|
||||
'amicale_name': amicaleName,
|
||||
'postal_code': postalCode,
|
||||
'city_name': cityName
|
||||
};
|
||||
final Map<String, dynamic> data = {'email': email, 'name': name, 'amicale_name': amicaleName, 'postal_code': postalCode, 'city_name': cityName};
|
||||
|
||||
final response =
|
||||
await _apiService.post(AppKeys.registerEndpoint, data: data);
|
||||
final response = await _apiService.post(AppKeys.registerEndpoint, data: data);
|
||||
return response.data;
|
||||
} catch (e) {
|
||||
debugPrint('Erreur register API: $e');
|
||||
@@ -270,20 +254,16 @@ class UserRepository extends ChangeNotifier {
|
||||
}
|
||||
|
||||
// Méthode d'inscription (uniquement pour les administrateurs)
|
||||
Future<bool> register(String email, String password, String name,
|
||||
String amicaleName, String postalCode, String cityName) async {
|
||||
Future<bool> register(String email, String password, String name, String amicaleName, String postalCode, String cityName) async {
|
||||
_isLoading = true;
|
||||
notifyListeners();
|
||||
|
||||
try {
|
||||
// Enregistrer l'administrateur via l'API
|
||||
final apiResult =
|
||||
await registerAPI(email, name, amicaleName, postalCode, cityName);
|
||||
final apiResult = await registerAPI(email, name, amicaleName, postalCode, cityName);
|
||||
|
||||
// Créer l'administrateur local
|
||||
final int userId = apiResult['user_id'] is String
|
||||
? int.parse(apiResult['user_id'])
|
||||
: apiResult['user_id'];
|
||||
final int userId = apiResult['user_id'] is String ? int.parse(apiResult['user_id']) : apiResult['user_id'];
|
||||
final now = DateTime.now();
|
||||
final newAdmin = UserModel(
|
||||
id: userId,
|
||||
@@ -316,8 +296,7 @@ class UserRepository extends ChangeNotifier {
|
||||
}
|
||||
|
||||
// Login complet avec suivi de progression
|
||||
Future<bool> login(String username, String password,
|
||||
{required String type}) async {
|
||||
Future<bool> login(String username, String password, {required String type}) async {
|
||||
_isLoading = true;
|
||||
_updateLoadingState(LoadingState.initial.copyWith(
|
||||
message: 'Connexion en cours...',
|
||||
@@ -346,8 +325,7 @@ class UserRepository extends ChangeNotifier {
|
||||
await Hive.deleteBoxFromDisk(boxName);
|
||||
debugPrint('Nettoyage: Box $boxName supprimée');
|
||||
} catch (e) {
|
||||
debugPrint(
|
||||
'Erreur lors de la suppression de la boîte non référencée $boxName: $e');
|
||||
debugPrint('Erreur lors de la suppression de la boîte non référencée $boxName: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -361,8 +339,7 @@ class UserRepository extends ChangeNotifier {
|
||||
|
||||
// Sur le web, utiliser notre méthode sécurisée pour nettoyer les boîtes Hive
|
||||
if (kIsWeb) {
|
||||
await HiveWebFix.safeCleanHiveBoxes(
|
||||
excludeBoxes: [AppKeys.usersBoxName]);
|
||||
await HiveWebFix.safeCleanHiveBoxes(excludeBoxes: [AppKeys.userBoxName]);
|
||||
}
|
||||
// Sur iOS, nettoyer les fichiers Hive directement
|
||||
else if (!kIsWeb && Platform.isIOS) {
|
||||
@@ -403,8 +380,7 @@ class UserRepository extends ChangeNotifier {
|
||||
// Si le statut n'est pas 'success', retourner false
|
||||
if (status != 'success') {
|
||||
debugPrint('Échec de connexion: $message');
|
||||
_updateLoadingState(
|
||||
LoadingState.error(message ?? 'Échec de connexion'));
|
||||
_updateLoadingState(LoadingState.error(message ?? 'Échec de connexion'));
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -421,8 +397,7 @@ class UserRepository extends ChangeNotifier {
|
||||
});
|
||||
|
||||
// Si la clé 'user' existe, examiner son contenu
|
||||
if (apiResult['user'] != null &&
|
||||
apiResult['user'] is Map<String, dynamic>) {
|
||||
if (apiResult['user'] != null && apiResult['user'] is Map<String, dynamic>) {
|
||||
debugPrint('Détails utilisateur:');
|
||||
final userDetails = apiResult['user'] as Map<String, dynamic>;
|
||||
userDetails.forEach((key, value) {
|
||||
@@ -430,8 +405,7 @@ class UserRepository extends ChangeNotifier {
|
||||
});
|
||||
|
||||
// Construire un UserModel à partir des données utilisateur
|
||||
final user = _processUserData(
|
||||
userDetails, apiResult['session_id'], apiResult['session_expiry']);
|
||||
final user = _processUserData(userDetails, apiResult['session_id'], apiResult['session_expiry']);
|
||||
|
||||
// Supprimer les anciennes références à interface et utiliser directement le rôle
|
||||
await saveUser(user);
|
||||
@@ -463,8 +437,7 @@ class UserRepository extends ChangeNotifier {
|
||||
|
||||
if (apiResult['clients'] is List) {
|
||||
clientsList = apiResult['clients'] as List<dynamic>;
|
||||
} else if (apiResult['clients'] is Map &&
|
||||
apiResult['clients'].containsKey('data')) {
|
||||
} else if (apiResult['clients'] is Map && apiResult['clients'].containsKey('data')) {
|
||||
clientsList = apiResult['clients']['data'] as List<dynamic>;
|
||||
} else {
|
||||
debugPrint('Format de données de clients non reconnu');
|
||||
@@ -529,8 +502,7 @@ class UserRepository extends ChangeNotifier {
|
||||
));
|
||||
|
||||
// Traitement des membres
|
||||
if (apiResult.containsKey('membres') ||
|
||||
apiResult.containsKey('members')) {
|
||||
if (apiResult.containsKey('membres') || apiResult.containsKey('members')) {
|
||||
final membresData = apiResult['membres'] ?? apiResult['members'];
|
||||
if (membresData != null) {
|
||||
await _processMembres(membresData);
|
||||
@@ -547,8 +519,7 @@ class UserRepository extends ChangeNotifier {
|
||||
// Traitement des associations utilisateurs-secteurs
|
||||
if (apiResult.containsKey('users_sectors')) {
|
||||
await _processUserSectors(apiResult['users_sectors']);
|
||||
debugPrint(
|
||||
'Nombre d\'associations utilisateurs-secteurs chargées: ${_userSectorBox.length}');
|
||||
debugPrint('Nombre d\'associations utilisateurs-secteurs chargées: ${_userSectorBox.length}');
|
||||
}
|
||||
|
||||
// Vérification finale du remplissage des boîtes
|
||||
@@ -570,8 +541,7 @@ class UserRepository extends ChangeNotifier {
|
||||
for (final userSector in _userSectorBox.values) {
|
||||
if (displayCount < 5) {
|
||||
// Limiter à 5 pour éviter de surcharger la console
|
||||
debugPrint(
|
||||
' User ${userSector.id} (${userSector.firstName}) -> Secteur ${userSector.fkSector} (${userSector.name})');
|
||||
debugPrint(' User ${userSector.id} (${userSector.firstName}) -> Secteur ${userSector.fkSector} (${userSector.name})');
|
||||
displayCount++;
|
||||
} else {
|
||||
debugPrint(' ... et ${userSectorCount - 5} autres associations');
|
||||
@@ -591,27 +561,21 @@ class UserRepository extends ChangeNotifier {
|
||||
if (apiResult.containsKey('passages')) {
|
||||
if (apiResult['passages'] is List) {
|
||||
passagesCountInResponse = (apiResult['passages'] as List).length;
|
||||
} else if (apiResult['passages'] is Map &&
|
||||
apiResult['passages'].containsKey('data')) {
|
||||
passagesCountInResponse =
|
||||
(apiResult['passages']['data'] as List).length;
|
||||
} else if (apiResult['passages'] is Map && apiResult['passages'].containsKey('data')) {
|
||||
passagesCountInResponse = (apiResult['passages']['data'] as List).length;
|
||||
}
|
||||
}
|
||||
|
||||
int passagesCountInBox = _passageBox.length;
|
||||
debugPrint(
|
||||
'Nombre de passages dans la réponse API: $passagesCountInResponse');
|
||||
debugPrint('Nombre de passages dans la réponse API: $passagesCountInResponse');
|
||||
debugPrint('Nombre de passages dans la Hive Box: $passagesCountInBox');
|
||||
|
||||
// Si les nombres ne correspondent pas, attendre un peu et revérifier
|
||||
if (passagesCountInResponse > 0 &&
|
||||
passagesCountInBox < passagesCountInResponse) {
|
||||
debugPrint(
|
||||
'Attente supplémentaire pour finaliser le chargement des passages...');
|
||||
if (passagesCountInResponse > 0 && passagesCountInBox < passagesCountInResponse) {
|
||||
debugPrint('Attente supplémentaire pour finaliser le chargement des passages...');
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
passagesCountInBox = _passageBox.length;
|
||||
debugPrint(
|
||||
'Après attente: Nombre de passages dans la Hive Box: $passagesCountInBox');
|
||||
debugPrint('Après attente: Nombre de passages dans la Hive Box: $passagesCountInBox');
|
||||
}
|
||||
|
||||
// Étape 12: Chargement terminé (100%)
|
||||
@@ -652,7 +616,7 @@ class UserRepository extends ChangeNotifier {
|
||||
await Hive.openBox<OperationModel>(boxName);
|
||||
} else if (boxName == AppKeys.sectorsBoxName) {
|
||||
await Hive.openBox<SectorModel>(boxName);
|
||||
} else if (boxName == AppKeys.usersBoxName) {
|
||||
} else if (boxName == AppKeys.userBoxName) {
|
||||
await Hive.openBox<UserModel>(boxName);
|
||||
} else if (boxName == AppKeys.membresBoxName) {
|
||||
await Hive.openBox<MembreModel>(boxName);
|
||||
@@ -696,15 +660,13 @@ class UserRepository extends ChangeNotifier {
|
||||
await Hive.deleteBoxFromDisk(boxName);
|
||||
debugPrint('Nettoyage: Box $boxName supprimée');
|
||||
} catch (e) {
|
||||
debugPrint(
|
||||
'Erreur lors de la suppression de la boîte non référencée $boxName: $e');
|
||||
debugPrint('Erreur lors de la suppression de la boîte non référencée $boxName: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// Sur le web, utiliser notre méthode sécurisée pour nettoyer les boîtes Hive
|
||||
if (kIsWeb) {
|
||||
await HiveWebFix.safeCleanHiveBoxes(
|
||||
excludeBoxes: [AppKeys.usersBoxName]);
|
||||
await HiveWebFix.safeCleanHiveBoxes(excludeBoxes: [AppKeys.userBoxName]);
|
||||
}
|
||||
// Sur iOS, nettoyer les fichiers Hive directement
|
||||
else if (Platform.isIOS) {
|
||||
@@ -758,8 +720,7 @@ class UserRepository extends ChangeNotifier {
|
||||
try {
|
||||
await Hive.deleteBoxFromDisk(boxName);
|
||||
} catch (deleteError) {
|
||||
debugPrint(
|
||||
'Impossible de supprimer la boîte $boxName: $deleteError');
|
||||
debugPrint('Impossible de supprimer la boîte $boxName: $deleteError');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -854,15 +815,13 @@ class UserRepository extends ChangeNotifier {
|
||||
|
||||
// Si la boîte contient des éléments, c'est anormal après recréation
|
||||
if (count > 0) {
|
||||
debugPrint(
|
||||
'ATTENTION: La boîte $boxName contient encore des données après recréation');
|
||||
debugPrint('ATTENTION: La boîte $boxName contient encore des données après recréation');
|
||||
// Essayer de vider la boîte une dernière fois
|
||||
await box.clear();
|
||||
debugPrint('Vidage forcé de la boîte $boxName effectué');
|
||||
}
|
||||
} catch (typeError) {
|
||||
debugPrint(
|
||||
'Erreur de typage lors de la vérification de $boxName: $typeError');
|
||||
debugPrint('Erreur de typage lors de la vérification de $boxName: $typeError');
|
||||
|
||||
// Tentative alternative sans typage spécifique
|
||||
try {
|
||||
@@ -872,17 +831,14 @@ class UserRepository extends ChangeNotifier {
|
||||
|
||||
if (count > 0) {
|
||||
await box.clear();
|
||||
debugPrint(
|
||||
'Vidage forcé de la boîte $boxName (sans typage) effectué');
|
||||
debugPrint('Vidage forcé de la boîte $boxName (sans typage) effectué');
|
||||
}
|
||||
} catch (e2) {
|
||||
debugPrint(
|
||||
'Impossible de vérifier la boîte $boxName même sans typage: $e2');
|
||||
debugPrint('Impossible de vérifier la boîte $boxName même sans typage: $e2');
|
||||
}
|
||||
}
|
||||
} else {
|
||||
debugPrint(
|
||||
'Boîte $boxName non ouverte, impossible de vérifier l\'intégrité');
|
||||
debugPrint('Boîte $boxName non ouverte, impossible de vérifier l\'intégrité');
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('Erreur lors de la vérification de la boîte $boxName: $e');
|
||||
@@ -891,8 +847,7 @@ class UserRepository extends ChangeNotifier {
|
||||
|
||||
debugPrint('Vérification d\'intégrité terminée');
|
||||
} catch (e) {
|
||||
debugPrint(
|
||||
'Erreur lors de la vérification d\'intégrité des boîtes Hive: $e');
|
||||
debugPrint('Erreur lors de la vérification d\'intégrité des boîtes Hive: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -906,7 +861,7 @@ class UserRepository extends ChangeNotifier {
|
||||
'''
|
||||
var request = indexedDB.deleteDatabase("geosector_app");
|
||||
request.onsuccess = function() { console.log("IndexedDB nettoyé avec succès"); };
|
||||
request.onerror = function() { console.log("Erreur lors du nettoyage d\'IndexedDB"); };
|
||||
request.onerror = function() { console.log("Erreur lors du nettoyage d'IndexedDB"); };
|
||||
'''
|
||||
]);
|
||||
await Future.delayed(const Duration(milliseconds: 500));
|
||||
@@ -932,7 +887,7 @@ class UserRepository extends ChangeNotifier {
|
||||
for (var entry in entries) {
|
||||
final name = entry.path.split('/').last;
|
||||
// Ne pas supprimer la boîte des utilisateurs
|
||||
if (!name.contains(AppKeys.usersBoxName)) {
|
||||
if (!name.contains(AppKeys.userBoxName)) {
|
||||
debugPrint('Suppression de: ${entry.path}');
|
||||
if (entry is Directory) {
|
||||
await entry.delete(recursive: true);
|
||||
@@ -957,7 +912,7 @@ class UserRepository extends ChangeNotifier {
|
||||
try {
|
||||
debugPrint('Nettoyage des fichiers Hive sur Android...');
|
||||
final appDir = await getApplicationDocumentsDirectory();
|
||||
final hiveDir = Directory('${appDir.path}');
|
||||
final hiveDir = Directory(appDir.path);
|
||||
|
||||
if (await hiveDir.exists()) {
|
||||
debugPrint('Recherche des fichiers Hive dans: ${hiveDir.path}');
|
||||
@@ -968,8 +923,7 @@ class UserRepository extends ChangeNotifier {
|
||||
for (var entry in entries) {
|
||||
final name = entry.path.split('/').last;
|
||||
// Ne supprimer que les fichiers Hive, mais pas la boîte des utilisateurs
|
||||
if (name.endsWith('.hive') &&
|
||||
!name.contains(AppKeys.usersBoxName)) {
|
||||
if (name.endsWith('.hive') && !name.contains(AppKeys.userBoxName)) {
|
||||
debugPrint('Suppression du fichier Hive: ${entry.path}');
|
||||
if (entry is File) {
|
||||
await entry.delete();
|
||||
@@ -985,23 +939,19 @@ class UserRepository extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
debugPrint(
|
||||
'Nettoyage des fichiers Hive sur Android terminé. $filesDeleted fichiers supprimés.');
|
||||
debugPrint('Nettoyage des fichiers Hive sur Android terminé. $filesDeleted fichiers supprimés.');
|
||||
} else {
|
||||
debugPrint('Répertoire d\'application non trouvé');
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint(
|
||||
'Erreur lors du nettoyage des fichiers Hive sur Android: $e');
|
||||
debugPrint('Erreur lors du nettoyage des fichiers Hive sur Android: $e');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Méthode de connexion avec affichage d'un overlay de chargement avec progression
|
||||
/// Cette méthode remplace AuthService.login et utilise le nouvel overlay avec barre de progression
|
||||
Future<bool> loginWithUI(
|
||||
BuildContext context, String username, String password,
|
||||
{required String type}) async {
|
||||
Future<bool> loginWithUI(BuildContext context, String username, String password, {required String type}) async {
|
||||
try {
|
||||
// Réinitialiser l'état de chargement
|
||||
_updateLoadingState(LoadingState.initial.copyWith(
|
||||
@@ -1019,7 +969,7 @@ class UserRepository extends ChangeNotifier {
|
||||
);
|
||||
|
||||
// Écouter les changements d'état pour mettre à jour l'overlay
|
||||
final listener = () {
|
||||
listener() {
|
||||
if (_progressOverlay != null) {
|
||||
// Mettre à jour l'overlay avec les nouvelles valeurs
|
||||
LoadingProgressOverlayUtils.update(
|
||||
@@ -1029,7 +979,7 @@ class UserRepository extends ChangeNotifier {
|
||||
stepDescription: _loadingState.stepDescription,
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Ajouter l'écouteur
|
||||
addListener(listener);
|
||||
@@ -1164,24 +1114,21 @@ class UserRepository extends ChangeNotifier {
|
||||
String? lastUsername;
|
||||
int? lastRole;
|
||||
UserModel? lastUser;
|
||||
if (Hive.isBoxOpen(AppKeys.usersBoxName) && _userBox.isNotEmpty) {
|
||||
if (Hive.isBoxOpen(AppKeys.userBoxName) && _userBox.isNotEmpty) {
|
||||
try {
|
||||
// Récupérer l'utilisateur actuel ou le dernier utilisateur connecté
|
||||
lastUser = getCurrentUser() ?? _userBox.values.first;
|
||||
if (lastUser != null) {
|
||||
lastUsername = lastUser.username;
|
||||
lastUsername = lastUser.username;
|
||||
|
||||
// Convertir le rôle en int si nécessaire
|
||||
if (lastUser.role is String) {
|
||||
lastRole = int.tryParse(lastUser.role as String) ?? 0;
|
||||
} else {
|
||||
lastRole = lastUser.role as int;
|
||||
}
|
||||
|
||||
debugPrint(
|
||||
'Username sauvegardé pour pré-remplissage: $lastUsername');
|
||||
debugPrint('Rôle sauvegardé pour pré-remplissage: $lastRole');
|
||||
// Convertir le rôle en int si nécessaire
|
||||
if (lastUser.role is String) {
|
||||
lastRole = int.tryParse(lastUser.role as String) ?? 0;
|
||||
} else {
|
||||
lastRole = lastUser.role;
|
||||
}
|
||||
|
||||
debugPrint('Username sauvegardé pour pré-remplissage: $lastUsername');
|
||||
debugPrint('Rôle sauvegardé pour pré-remplissage: $lastRole');
|
||||
} catch (e) {
|
||||
debugPrint('Erreur lors de la sauvegarde du username et du rôle: $e');
|
||||
}
|
||||
@@ -1189,7 +1136,7 @@ class UserRepository extends ChangeNotifier {
|
||||
|
||||
// 1. Vider toutes les boîtes sans les fermer
|
||||
debugPrint('Vidage des boîtes Hive...');
|
||||
if (Hive.isBoxOpen(AppKeys.usersBoxName)) {
|
||||
if (Hive.isBoxOpen(AppKeys.userBoxName)) {
|
||||
try {
|
||||
await _userBox.clear();
|
||||
debugPrint('Boîte users vidée');
|
||||
@@ -1200,16 +1147,14 @@ class UserRepository extends ChangeNotifier {
|
||||
id: lastUser?.id ?? DateTime.now().millisecondsSinceEpoch,
|
||||
email: lastUser?.email ?? '',
|
||||
username: lastUsername,
|
||||
role: lastRole ??
|
||||
0, // Conserver le rôle pour la vérification dans la page de login
|
||||
role: lastRole ?? 0, // Conserver le rôle pour la vérification dans la page de login
|
||||
createdAt: DateTime.now(),
|
||||
lastSyncedAt: DateTime.now(),
|
||||
isActive: false,
|
||||
isSynced: false,
|
||||
);
|
||||
await _userBox.put(minimalUser.id, minimalUser);
|
||||
debugPrint(
|
||||
'Utilisateur minimal créé pour pré-remplissage du username avec rôle: $lastRole');
|
||||
debugPrint('Utilisateur minimal créé pour pré-remplissage du username avec rôle: $lastRole');
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('Erreur lors du vidage de la boîte users: $e');
|
||||
@@ -1266,8 +1211,7 @@ class UserRepository extends ChangeNotifier {
|
||||
await _chatConversationBox.clear();
|
||||
debugPrint('Boîte chat_conversations vidée');
|
||||
} catch (e) {
|
||||
debugPrint(
|
||||
'Erreur lors du vidage de la boîte chat_conversations: $e');
|
||||
debugPrint('Erreur lors du vidage de la boîte chat_conversations: $e');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1319,15 +1263,15 @@ class UserRepository extends ChangeNotifier {
|
||||
|
||||
try {
|
||||
// Vérifier si la boîte est ouverte avant de tenter de la fermer
|
||||
if (Hive.isBoxOpen(AppKeys.usersBoxName)) {
|
||||
if (Hive.isBoxOpen(AppKeys.userBoxName)) {
|
||||
debugPrint('Fermeture de la boîte users...');
|
||||
try {
|
||||
await Hive.box<UserModel>(AppKeys.usersBoxName).close();
|
||||
await Hive.box<UserModel>(AppKeys.userBoxName).close();
|
||||
debugPrint('Boîte users fermée avec succès');
|
||||
} catch (e) {
|
||||
debugPrint('Erreur lors de la fermeture de la boîte users: $e');
|
||||
// Ne pas continuer avec la suppression si la fermeture a échoué
|
||||
throw e;
|
||||
rethrow;
|
||||
}
|
||||
|
||||
// Attendre un peu pour s'assurer que la fermeture est terminée
|
||||
@@ -1336,27 +1280,24 @@ class UserRepository extends ChangeNotifier {
|
||||
// Supprimer la boîte du disque seulement si la fermeture a réussi
|
||||
debugPrint('Suppression de la boîte users du disque...');
|
||||
try {
|
||||
await Hive.deleteBoxFromDisk(AppKeys.usersBoxName);
|
||||
await Hive.deleteBoxFromDisk(AppKeys.userBoxName);
|
||||
debugPrint('Boîte users supprimée du disque avec succès');
|
||||
} catch (e) {
|
||||
debugPrint('Erreur lors de la suppression de la boîte users: $e');
|
||||
// Ne pas continuer avec la réouverture si la suppression a échoué
|
||||
throw e;
|
||||
rethrow;
|
||||
}
|
||||
} else {
|
||||
debugPrint(
|
||||
'La boîte users est déjà fermée, tentative de suppression directe...');
|
||||
debugPrint('La boîte users est déjà fermée, tentative de suppression directe...');
|
||||
try {
|
||||
await Hive.deleteBoxFromDisk(AppKeys.usersBoxName);
|
||||
await Hive.deleteBoxFromDisk(AppKeys.userBoxName);
|
||||
debugPrint('Boîte users supprimée du disque avec succès');
|
||||
} catch (e) {
|
||||
debugPrint(
|
||||
'Erreur lors de la suppression directe de la boîte users: $e');
|
||||
debugPrint('Erreur lors de la suppression directe de la boîte users: $e');
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint(
|
||||
'Erreur lors du processus de nettoyage de la boîte users: $e');
|
||||
debugPrint('Erreur lors du processus de nettoyage de la boîte users: $e');
|
||||
// Continuer malgré l'erreur, mais ne pas tenter de réouvrir la boîte
|
||||
return;
|
||||
}
|
||||
@@ -1366,12 +1307,11 @@ class UserRepository extends ChangeNotifier {
|
||||
|
||||
// Rouvrir la boîte (elle sera vide)
|
||||
debugPrint('Réouverture de la boîte users (vide)...');
|
||||
await Hive.openBox<UserModel>(AppKeys.usersBoxName);
|
||||
await Hive.openBox<UserModel>(AppKeys.userBoxName);
|
||||
|
||||
// Vérifier que la boîte est bien vide
|
||||
final checkUsers = _userBox.values.toList();
|
||||
debugPrint(
|
||||
'Après approche radicale: ${checkUsers.length} utilisateurs restants');
|
||||
debugPrint('Après approche radicale: ${checkUsers.length} utilisateurs restants');
|
||||
|
||||
// Forcer la réinitialisation du cache
|
||||
_cachedCurrentUser = null;
|
||||
@@ -1486,8 +1426,7 @@ class UserRepository extends ChangeNotifier {
|
||||
return;
|
||||
}
|
||||
|
||||
final unsyncedUsers =
|
||||
_userBox.values.where((user) => !user.isSynced).toList();
|
||||
final unsyncedUsers = _userBox.values.where((user) => !user.isSynced).toList();
|
||||
|
||||
if (unsyncedUsers.isEmpty) {
|
||||
return;
|
||||
@@ -1605,9 +1544,7 @@ class UserRepository extends ChangeNotifier {
|
||||
List<AmicaleModel> getAllClients() {
|
||||
try {
|
||||
_ensureBoxIsOpen(AppKeys.amicaleBoxName);
|
||||
return _amicaleBox.values
|
||||
.where((amicale) => amicale.fkType == 1)
|
||||
.toList();
|
||||
return _amicaleBox.values.where((amicale) => amicale.fkType == 1).toList();
|
||||
} catch (e) {
|
||||
debugPrint('Erreur lors de la récupération des clients: $e');
|
||||
return [];
|
||||
@@ -1814,25 +1751,21 @@ class UserRepository extends ChangeNotifier {
|
||||
// Méthode pour traiter les données des associations utilisateurs-secteurs reçues de l'API
|
||||
Future<void> _processUserSectors(dynamic userSectorsData) async {
|
||||
try {
|
||||
debugPrint(
|
||||
'Traitement des données des associations utilisateurs-secteurs...');
|
||||
debugPrint('Traitement des données des associations utilisateurs-secteurs...');
|
||||
|
||||
// Vérifier que les données sont au bon format
|
||||
if (userSectorsData == null) {
|
||||
debugPrint(
|
||||
'Aucune donnée d\'association utilisateur-secteur à traiter');
|
||||
debugPrint('Aucune donnée d\'association utilisateur-secteur à traiter');
|
||||
return;
|
||||
}
|
||||
|
||||
List<dynamic> userSectorsList;
|
||||
if (userSectorsData is List) {
|
||||
userSectorsList = userSectorsData;
|
||||
} else if (userSectorsData is Map &&
|
||||
userSectorsData.containsKey('data')) {
|
||||
} else if (userSectorsData is Map && userSectorsData.containsKey('data')) {
|
||||
userSectorsList = userSectorsData['data'] as List<dynamic>;
|
||||
} else {
|
||||
debugPrint(
|
||||
'Format de données d\'associations utilisateurs-secteurs non reconnu');
|
||||
debugPrint('Format de données d\'associations utilisateurs-secteurs non reconnu');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1844,26 +1777,21 @@ class UserRepository extends ChangeNotifier {
|
||||
for (final userSectorData in userSectorsList) {
|
||||
try {
|
||||
final userSector = UserSectorModel.fromJson(userSectorData);
|
||||
await _userSectorBox.put(
|
||||
'${userSector.id}_${userSector.fkSector}', userSector);
|
||||
await _userSectorBox.put('${userSector.id}_${userSector.fkSector}', userSector);
|
||||
count++;
|
||||
} catch (e) {
|
||||
debugPrint(
|
||||
'Erreur lors du traitement d\'une association utilisateur-secteur: $e');
|
||||
debugPrint('Erreur lors du traitement d\'une association utilisateur-secteur: $e');
|
||||
}
|
||||
}
|
||||
|
||||
debugPrint(
|
||||
'$count associations utilisateurs-secteurs traitées et stockées');
|
||||
debugPrint('$count associations utilisateurs-secteurs traitées et stockées');
|
||||
} catch (e) {
|
||||
debugPrint(
|
||||
'Erreur lors du traitement des associations utilisateurs-secteurs: $e');
|
||||
debugPrint('Erreur lors du traitement des associations utilisateurs-secteurs: $e');
|
||||
}
|
||||
}
|
||||
|
||||
// Méthode pour traiter les données utilisateur reçues de l'API
|
||||
UserModel _processUserData(
|
||||
Map<String, dynamic> userData, String? sessionId, String? sessionExpiry) {
|
||||
UserModel _processUserData(Map<String, dynamic> userData, String? sessionId, String? sessionExpiry) {
|
||||
debugPrint('Traitement des données utilisateur: ${userData.toString()}');
|
||||
|
||||
// Convertir l'ID en int, qu'il soit déjà int ou string
|
||||
@@ -1884,20 +1812,15 @@ class UserRepository extends ChangeNotifier {
|
||||
|
||||
// Convertir fk_entite en int si présent
|
||||
final dynamic rawFkEntite = userData['fk_entite'];
|
||||
final int? fkEntite = rawFkEntite != null
|
||||
? (rawFkEntite is String ? int.parse(rawFkEntite) : rawFkEntite as int)
|
||||
: null;
|
||||
final int? fkEntite = rawFkEntite != null ? (rawFkEntite is String ? int.parse(rawFkEntite) : rawFkEntite as int) : null;
|
||||
|
||||
// Convertir fk_titre en int si présent
|
||||
final dynamic rawFkTitre = userData['fk_titre'];
|
||||
final int? fkTitre = rawFkTitre != null
|
||||
? (rawFkTitre is String ? int.parse(rawFkTitre) : rawFkTitre as int)
|
||||
: null;
|
||||
final int? fkTitre = rawFkTitre != null ? (rawFkTitre is String ? int.parse(rawFkTitre) : rawFkTitre as int) : null;
|
||||
|
||||
// Traiter les dates si présentes
|
||||
DateTime? dateNaissance;
|
||||
if (userData['date_naissance'] != null &&
|
||||
userData['date_naissance'] != '') {
|
||||
if (userData['date_naissance'] != null && userData['date_naissance'] != '') {
|
||||
try {
|
||||
dateNaissance = DateTime.parse(userData['date_naissance']);
|
||||
} catch (e) {
|
||||
@@ -1929,8 +1852,7 @@ class UserRepository extends ChangeNotifier {
|
||||
isActive: true,
|
||||
isSynced: true,
|
||||
sessionId: sessionId,
|
||||
sessionExpiry:
|
||||
sessionExpiry != null ? DateTime.parse(sessionExpiry) : null,
|
||||
sessionExpiry: sessionExpiry != null ? DateTime.parse(sessionExpiry) : null,
|
||||
sectName: userData['sect_name'],
|
||||
fkEntite: fkEntite,
|
||||
fkTitre: fkTitre,
|
||||
|
||||
Reference in New Issue
Block a user