Bon checkpoint + Refactoring
This commit is contained in:
@@ -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()}');
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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');
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user