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.
101 lines
2.6 KiB
Dart
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');
|
|
}
|
|
}
|