Bon checkpoint + Refactoring

This commit is contained in:
DahoudG
2024-11-08 20:30:23 +00:00
parent 19f6efa995
commit 1e888f41e8
21 changed files with 721 additions and 223 deletions

View File

@@ -28,6 +28,71 @@ class EventRemoteDataSource {
}
}
/// Récupérer les événements créés par un utilisateur spécifique et ses amis.
/// Cette méthode envoie une requête POST au serveur pour obtenir la liste des événements créés
/// par l'utilisateur spécifié et ses amis, en utilisant l'identifiant de l'utilisateur.
///
/// [userId] : L'identifiant de l'utilisateur pour lequel récupérer les événements.
/// Retourne une liste de modèles d'événements [EventModel].
Future<List<EventModel>> getEventsCreatedByUserAndFriends(String userId) async {
// Log de début de la méthode pour signaler l'initialisation de la récupération des événements
print('[LOG] Démarrage de la récupération des événements créés par l\'utilisateur ID: $userId et ses amis.');
// Construction de l'URL de l'API pour la requête POST
final url = Uri.parse('${Urls.baseUrl}/events/created-by-user-and-friends');
print('[LOG] URL construite pour la requête: $url');
// Création de l'en-tête de la requête, spécifiant que le contenu est en JSON
final headers = {'Content-Type': 'application/json'};
print('[LOG] En-têtes de la requête: $headers');
// Construction du corps de la requête en JSON, incluant l'identifiant de l'utilisateur
final body = jsonEncode({'userId': userId});
print('[LOG] Corps de la requête JSON: $body');
// Envoi de la requête POST au serveur pour récupérer les événements
final response = await client.post(url, headers: headers, body: body);
print('[LOG] Requête POST envoyée au serveur.');
// Vérification et log de l'état de la réponse reçue
print('[LOG] Statut de la réponse HTTP: ${response.statusCode}');
// Gestion de la réponse en fonction du code de statut
if (response.statusCode == 200) {
// Déchiffrement du JSON reçu si le code de statut est 200 (OK)
final List<dynamic> jsonResponse = json.decode(response.body);
print('[LOG] Réponse JSON complète reçue (taille: ${jsonResponse.length}) :');
// Affichage détaillé de chaque événement
for (var i = 0; i < jsonResponse.length; i++) {
final event = jsonResponse[i];
print('[LOG] Événement $i :');
print(' - ID: ${event['id']}');
print(' - Titre: ${event['title']}');
print(' - Description: ${event['description']}');
print(' - Date de début: ${event['startDate']}');
print(' - Date de fin: ${event['endDate']}');
print(' - Localisation: ${event['location']}');
print(' - Catégorie: ${event['category']}');
print(' - Lien: ${event['link']}');
print(' - URL de l\'image: ${event['imageUrl']}');
print(' - Statut: ${event['status']}');
}
// Transformation du JSON en une liste d'objets EventModel
List<EventModel> events = jsonResponse.map((event) => EventModel.fromJson(event)).toList();
print('[LOG] Conversion JSON -> List<EventModel> réussie. Nombre d\'événements: ${events.length}');
// Retourne la liste d'événements si tout s'est bien passé
return events;
} else {
// Log et gestion de l'erreur en cas de statut HTTP autre que 200
print('[ERROR] Erreur lors de la récupération des événements: ${response.body}');
throw ServerException('[ERROR] Échec de récupération des événements créés par l\'utilisateur $userId et ses amis.');
}
}
/// Créer un nouvel événement via l'API.
Future<EventModel> createEvent(EventModel event) async {
print('Création d\'un nouvel événement avec les données: ${event.toJson()}');

View File

@@ -2,13 +2,13 @@ class EventModel {
final String id;
final String title;
final String description;
final String startDate; // Utiliser startDate au lieu de date, si c'est ce que l'API retourne
final String startDate;
final String location;
final String category;
final String link;
final String? imageUrl; // Nullable
final String? imageUrl;
final String creatorEmail;
final List<dynamic> participants; // Si participants est une liste simple
final List<dynamic> participants;
final String status;
final int reactionsCount;
final int commentsCount;
@@ -32,25 +32,60 @@ class EventModel {
});
factory EventModel.fromJson(Map<String, dynamic> json) {
print('[LOG] Création de l\'EventModel depuis JSON');
// Utiliser les valeurs par défaut si une clé est absente
final String id = json['id'] ?? 'ID Inconnu';
final String title = json['title'] ?? 'Titre Inconnu';
final String description = json['description'] ?? 'Description Inconnue';
final String startDate = json['startDate'] ?? 'Date de début Inconnue';
final String location = json['location'] ?? 'Localisation Inconnue';
final String category = json['category'] ?? 'Catégorie Inconnue';
final String link = json['link'] ?? 'Lien Inconnu';
final String? imageUrl = json['imageUrl'];
final String creatorEmail = json['creatorEmail'] ?? 'Email Inconnu';
final List<dynamic> participants = json['participants'] ?? [];
final String status = json['status'] ?? 'ouvert';
final int reactionsCount = json['reactionsCount'] ?? 0;
final int commentsCount = json['commentsCount'] ?? 0;
final int sharesCount = json['sharesCount'] ?? 0;
print('[LOG] Champs extraits depuis JSON :');
print(' - ID: $id');
print(' - Titre: $title');
print(' - Description: $description');
print(' - Date de début: $startDate');
print(' - Localisation: $location');
print(' - Catégorie: $category');
print(' - Lien: $link');
print(' - URL de l\'image: ${imageUrl ?? "Aucune"}');
print(' - Email du créateur: $creatorEmail');
print(' - Participants: ${participants.length} participants');
print(' - Statut: $status');
print(' - Nombre de réactions: $reactionsCount');
print(' - Nombre de commentaires: $commentsCount');
print(' - Nombre de partages: $sharesCount');
return EventModel(
id: json['id'],
title: json['title'],
description: json['description'],
startDate: json['startDate'], // Vérifier si c'est bien startDate
location: json['location'],
category: json['category'],
link: json['link'] ?? '',
imageUrl: json['imageUrl'], // Peut être null
creatorEmail: json['creatorEmail'], // Email du créateur
participants: json['participants'] ?? [], // Gérer les participants
status: json['status'] ?? 'ouvert', // Par défaut à "ouvert" si non fourni
reactionsCount: json['reactionsCount'] ?? 0,
commentsCount: json['commentsCount'] ?? 0,
sharesCount: json['sharesCount'] ?? 0,
id: id,
title: title,
description: description,
startDate: startDate,
location: location,
category: category,
link: link,
imageUrl: imageUrl,
creatorEmail: creatorEmail,
participants: participants,
status: status,
reactionsCount: reactionsCount,
commentsCount: commentsCount,
sharesCount: sharesCount,
);
}
Map<String, dynamic> toJson() {
print('[LOG] Conversion de EventModel en JSON');
return {
'id': id,
'title': title,

View File

@@ -30,7 +30,11 @@ class FriendsProvider with ChangeNotifier {
/// [userId] : L'identifiant unique de l'utilisateur.
/// [loadMore] : Indique s'il s'agit d'une demande de chargement supplémentaire pour la pagination.
///
/// En cas d'erreur, logue l'exception et gère l'état `isLoading`.
/// Cette méthode :
/// - Vérifie si un chargement est déjà en cours.
/// - Initialise ou poursuit la pagination.
/// - Exclut l'utilisateur lui-même de la liste.
/// - Gère les erreurs et logue chaque étape pour une traçabilité complète.
Future<void> fetchFriends(String userId, {bool loadMore = false}) async {
if (_isLoading) {
_logger.w('[LOG] Chargement déjà en cours, annulation de la nouvelle demande.');
@@ -39,10 +43,10 @@ class FriendsProvider with ChangeNotifier {
_isLoading = true;
notifyListeners();
_logger.i('[LOG] Début du chargement des amis.');
_logger.i('[LOG] Début du chargement des amis pour l\'utilisateur $userId.');
// Réinitialisation uniquement si ce n'est pas un chargement supplémentaire
if (!loadMore) {
// Réinitialisation de la liste et de la pagination si ce n'est pas un chargement supplémentaire
_friendsList = [];
_currentPage = 0;
_hasMore = true;
@@ -57,9 +61,16 @@ class FriendsProvider with ChangeNotifier {
_hasMore = false;
_logger.i('[LOG] Fin de liste atteinte, plus d\'amis à charger.');
} else {
_friendsList.addAll(newFriends);
for (var friend in newFriends) {
if (friend.friendId != userId) {
_friendsList.add(friend);
_logger.i("[LOG] Ajout de l'ami : ID = ${friend.friendId}, Nom = ${friend.friendFirstName} ${friend.friendLastName}");
} else {
_logger.w("[WARN] Exclusion de l'utilisateur lui-même de la liste d'amis : ${friend.friendId}");
}
}
_currentPage++;
_logger.i('[LOG] Amis ajoutés à la liste. Page actuelle : $_currentPage');
_logger.i('[LOG] Page suivante préparée pour le prochain chargement, page actuelle : $_currentPage');
}
} catch (e) {
_logger.e('[ERROR] Erreur lors de la récupération des amis : $e');

View File

@@ -17,26 +17,31 @@ class UserProvider with ChangeNotifier {
visitedPlacesCount: 0,
);
bool _isEmailDisplayedElsewhere = false; // Ajout de la propriété pour contrôler l'affichage de l'email
/// Getter pour l'objet utilisateur.
User get user => _user;
/// Getter pour vérifier si l'email est affiché ailleurs.
bool get isEmailDisplayedElsewhere => _isEmailDisplayedElsewhere;
/// Méthode pour définir l'état d'affichage de l'email.
void setEmailDisplayedElsewhere(bool value) {
_isEmailDisplayedElsewhere = value;
debugPrint("[LOG] isEmailDisplayedElsewhere mis à jour : $_isEmailDisplayedElsewhere");
notifyListeners();
}
/// Méthode pour définir les informations de l'utilisateur.
/// Logue les informations fournies et notifie les listeners des changements.
///
/// [user] : L'objet utilisateur contenant toutes les informations.
void setUser(User user) {
debugPrint("[LOG] Tentative de définition des informations de l'utilisateur : ${user.toString()}");
_user = user;
debugPrint("[LOG] Informations utilisateur définies : ${_user.toString()}");
// Notifie les widgets écoutant ce provider qu'une modification a eu lieu.
notifyListeners();
}
/// Méthode pour mettre à jour des statistiques de l'utilisateur.
/// Cette méthode met à jour individuellement des attributs spécifiques comme le nombre d'amis ou d'événements.
void updateStatistics({
int? eventsCount,
int? friendsCount,
@@ -59,12 +64,10 @@ class UserProvider with ChangeNotifier {
);
debugPrint("[LOG] Nouvelles statistiques utilisateur : ${_user.toString()}");
notifyListeners();
}
/// Méthode pour réinitialiser les informations de l'utilisateur.
/// Les valeurs sont loguées avant et après la réinitialisation.
void resetUser() {
debugPrint("[LOG] Réinitialisation des informations de l'utilisateur.");
debugPrint("[LOG] Valeurs avant réinitialisation : ${_user.toString()}");
@@ -83,7 +86,6 @@ class UserProvider with ChangeNotifier {
);
debugPrint("[LOG] Informations utilisateur réinitialisées : ${_user.toString()}");
notifyListeners();
}
}

View File

@@ -33,11 +33,15 @@ class FriendsRepositoryImpl implements FriendsRepository {
if (response.statusCode == 200) {
_logger.i("[LOG] Liste des amis récupérée avec succès.");
final List<dynamic> friendsJson = json.decode(response.body);
_logger.i("[LOG] Nombre d'amis récupérés : ${friendsJson.length}");
_logger.i("[LOG] Nombre d'amis récupérés (excluant l'utilisateur lui-même) : ${friendsJson.length}");
return friendsJson.map((json) => Friend.fromJson(json as Map<String, dynamic>)).toList();
return friendsJson.map((json) {
_logger.i("[LOG] Conversion JSON -> Friend : $json");
final friend = Friend.fromJson(json as Map<String, dynamic>);
_logger.i("[LOG] Création d'un objet Friend : ID = ${friend.friendId}, Nom = ${friend.friendFirstName} ${friend.friendLastName}");
return friend;
}).toList();
} else {
_logger.e("[ERROR] Échec de la récupération des amis. Code HTTP : ${response.statusCode}");
return [];
@@ -56,7 +60,7 @@ class FriendsRepositoryImpl implements FriendsRepository {
@override
Future<void> addFriend(Friend friend) async {
try {
_logger.i("[LOG] Tentative d'ajout de l'ami : ${friend.firstName} ${friend.lastName}");
_logger.i("[LOG] Tentative d'ajout de l'ami : ${friend.friendFirstName} ${friend.friendLastName}");
final uri = Uri.parse('${Urls.baseUrl}/friends/send');
final response = await client.post(