Files
EM2_ERP/em2rp/lib/models/user_model.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

94 lines
2.6 KiB
Dart

import 'package:cloud_firestore/cloud_firestore.dart';
class UserModel {
final String uid;
final String firstName;
final String lastName;
final String role;
final String profilePhotoUrl;
final String email;
final String phoneNumber;
UserModel({
required this.uid,
required this.firstName,
required this.lastName,
required this.role,
required this.profilePhotoUrl,
required this.email,
required this.phoneNumber,
});
// Convertit une Map (Firestore) en UserModel
factory UserModel.fromMap(Map<String, dynamic> data, String uid) {
String roleString;
final roleField = data['role'];
if (roleField is String) {
// Cas 1 : role est déjà un String (ex: "roles/ADMIN")
roleString = roleField;
} else if (roleField is DocumentReference) {
// Cas 2 : role est une DocumentReference
roleString = roleField.id;
} else if (roleField is Map) {
// Cas 3 : role est un Map sérialisé (ex: {"_path": {"segments": ["roles", "ADMIN"]}})
// On extrait le path
final pathData = roleField['_path'];
if (pathData is Map && pathData['segments'] is List) {
final segments = pathData['segments'] as List;
if (segments.length >= 2) {
roleString = segments[1].toString(); // Ex: "ADMIN"
} else {
roleString = 'USER';
}
} else {
roleString = 'USER';
}
} else {
// Cas par défaut
roleString = 'USER';
}
return UserModel(
uid: uid,
firstName: data['firstName'] ?? '',
lastName: data['lastName'] ?? '',
role: roleString,
profilePhotoUrl: data['profilePhotoUrl'] ?? '',
email: data['email'] ?? '',
phoneNumber: data['phoneNumber'] ?? '',
);
}
// Convertit un UserModel en Map pour Firestore
Map<String, dynamic> toMap() {
return {
'firstName': firstName,
'lastName': lastName,
'role': FirebaseFirestore.instance.collection('roles').doc(role),
'profilePhotoUrl': profilePhotoUrl,
'email': email,
'phoneNumber': phoneNumber,
};
}
UserModel copyWith({
String? firstName,
String? lastName,
String? role,
String? profilePhotoUrl,
String? email,
String? phoneNumber,
}) {
return UserModel(
uid: uid, // L'UID ne change pas
firstName: firstName ?? this.firstName,
lastName: lastName ?? this.lastName,
role: role ?? this.role,
profilePhotoUrl: profilePhotoUrl ?? this.profilePhotoUrl,
email: email ?? this.email,
phoneNumber: phoneNumber ?? this.phoneNumber,
);
}
}