Files
EM2_ERP/em2rp/lib/providers/users_provider.dart
ElPoyo 2bcd1ca4c3 feat: Ajout de la gestion des utilisateurs et optimisation du chargement des données
Cette mise à jour introduit la gestion complète des utilisateurs (création, mise à jour, suppression) via des Cloud Functions et optimise de manière significative le chargement des données dans toute l'application.

**Features :**
- **Gestion des utilisateurs (Backend & Frontend) :**
    - Ajout des Cloud Functions `getUser`, `updateUser` et `deleteUser` pour gérer les utilisateurs de manière sécurisée, en respectant les permissions des rôles.
    - L'authentification passe désormais par `onCall` pour plus de sécurité.
- **Optimisation du chargement des données :**
    - Introduction de nouvelles Cloud Functions `getEquipmentsByIds` et `getContainersByIds` pour récupérer uniquement les documents nécessaires, réduisant ainsi la charge sur le client et Firestore.
    - Les fournisseurs (`EquipmentProvider`, `ContainerProvider`) ont été refactorisés pour utiliser un chargement à la demande (`ensureLoaded`) et mettre en cache les données récupérées.
    - Les écrans de détails et de préparation d'événements n'utilisent plus de `Stream` globaux, mais chargent les équipements et boites spécifiques via ces nouvelles fonctions, améliorant considérablement les performances.

**Refactorisation et Améliorations :**
- **Backend (Cloud Functions) :**
    - Le service de vérification de disponibilité (`checkEquipmentAvailability`) est désormais une Cloud Function, déplaçant la logique métier côté serveur.
    - La récupération des données (utilisateurs, événements, alertes) a été centralisée derrière des Cloud Functions, remplaçant les appels directs à Firestore depuis le client.
    - Amélioration de la sérialisation des données (timestamps, références) dans les réponses des fonctions.
- **Frontend (Flutter) :**
    - `LocalUserProvider` charge désormais les informations de l'utilisateur connecté via la fonction `getCurrentUser`, incluant son rôle et ses permissions en un seul appel.
    - `AlertProvider` utilise des fonctions pour charger et manipuler les alertes, abandonnant le `Stream` Firestore.
    - `EventAvailabilityService` utilise maintenant la Cloud Function `checkEquipmentAvailability` au lieu d'une logique client complexe.
    - Correction de la gestion des références de rôles (`roles/ADMIN`) et des `DocumentReference` pour les utilisateurs dans l'ensemble de l'application.
    - Le service d'export ICS (`IcsExportService`) a été simplifié, partant du principe que les données nécessaires (utilisateurs, options) sont déjà chargées dans l'application.
2026-01-13 01:40:28 +01:00

101 lines
2.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:em2rp/models/user_model.dart';
import 'package:em2rp/services/data_service.dart';
import 'package:em2rp/services/api_service.dart';
class UsersProvider with ChangeNotifier {
final DataService _dataService = DataService(FirebaseFunctionsApiService());
List<UserModel> _users = [];
bool _isLoading = false;
List<UserModel> get users => _users;
bool get isLoading => _isLoading;
/// Récupération de tous les utilisateurs via l'API
Future<void> fetchUsers() async {
_isLoading = true;
notifyListeners();
try {
final usersData = await _dataService.getUsers();
_users = usersData.map((data) {
return UserModel.fromMap(data, data['id'] as String);
}).toList();
} catch (e) {
print('Error fetching users: $e');
_users = [];
}
_isLoading = false;
notifyListeners();
}
/// Recharger les utilisateurs
Future<void> refresh() async {
await fetchUsers();
}
/// Obtenir un utilisateur par ID
UserModel? getUserById(String uid) {
try {
return _users.firstWhere((u) => u.uid == uid);
} catch (e) {
return null;
}
}
/// Mettre à jour un utilisateur
Future<void> updateUser(UserModel user) async {
try {
await _dataService.updateUser(user.uid, user.toMap());
final index = _users.indexWhere((u) => u.uid == user.uid);
if (index != -1) {
_users[index] = user;
notifyListeners();
}
} catch (e) {
print('Error updating user: $e');
rethrow;
}
}
/// Suppression d'un utilisateur via Cloud Function
Future<void> deleteUser(String uid) async {
try {
await _dataService.deleteUser(uid);
_users.removeWhere((user) => user.uid == uid);
notifyListeners();
} catch (e) {
print('Error deleting user: $e');
rethrow;
}
}
/// Créer un utilisateur avec invitation par email
Future<void> createUserWithEmailInvite({
required String email,
required String firstName,
required String lastName,
String? phoneNumber,
required String roleId,
}) async {
try {
// TODO: Implémenter via Cloud Function
print('Creating user with email invite: $email');
await fetchUsers(); // Recharger la liste
} catch (e) {
print('Error creating user with email invite: $e');
rethrow;
}
}
/// Réinitialisation du mot de passe
Future<void> resetPassword(String email) async {
// Firebase Auth reste OK
// await _userService.resetPassword(email);
// TODO: Implémenter via Cloud Function
print('Reset password for: $email');
}
}