Refactoring + Checkpoint
This commit is contained in:
@@ -77,6 +77,8 @@ class EventRemoteDataSource {
|
||||
print(' - Lien: ${event['link']}');
|
||||
print(' - URL de l\'image: ${event['imageUrl']}');
|
||||
print(' - Statut: ${event['status']}');
|
||||
print(' - prenom du créateur: ${event['creatorFirstName']}');
|
||||
print(' - prenom du créateur: ${event['creatorLastName']}');
|
||||
}
|
||||
|
||||
// Transformation du JSON en une liste d'objets EventModel
|
||||
@@ -92,7 +94,6 @@ class EventRemoteDataSource {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// 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()}');
|
||||
@@ -213,7 +214,7 @@ class EventRemoteDataSource {
|
||||
Future<void> closeEvent(String eventId) async {
|
||||
print('Fermeture de l\'événement avec l\'ID: $eventId');
|
||||
|
||||
final response = await client.post(
|
||||
final response = await client.patch(
|
||||
Uri.parse('${Urls.closeEvent}/$eventId/close'),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
@@ -223,11 +224,10 @@ class EventRemoteDataSource {
|
||||
if (response.statusCode == 200) {
|
||||
print('Événement fermé avec succès');
|
||||
} else if (response.statusCode == 400) {
|
||||
// Si le serveur retourne une erreur 400, vérifiez le corps du message
|
||||
final responseBody = json.decode(response.body);
|
||||
final errorMessage = responseBody['message'] ?? 'Erreur inconnue';
|
||||
print('Erreur lors de la fermeture de l\'événement: $errorMessage');
|
||||
throw ServerExceptionWithMessage(errorMessage); // Utiliser la nouvelle exception ici
|
||||
throw ServerExceptionWithMessage(errorMessage);
|
||||
} else {
|
||||
print('Erreur lors de la fermeture de l\'événement: ${response.body}');
|
||||
throw ServerExceptionWithMessage('Une erreur est survenue lors de la fermeture de l\'événement.');
|
||||
@@ -238,7 +238,7 @@ class EventRemoteDataSource {
|
||||
Future<void> reopenEvent(String eventId) async {
|
||||
print('Réouverture de l\'événement avec l\'ID: $eventId');
|
||||
|
||||
final response = await client.post(
|
||||
final response = await client.patch(
|
||||
Uri.parse('${Urls.reopenEvent}/$eventId/reopen'),
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
);
|
||||
@@ -248,11 +248,13 @@ class EventRemoteDataSource {
|
||||
if (response.statusCode == 200) {
|
||||
print('Événement rouvert avec succès');
|
||||
} else if (response.statusCode == 400) {
|
||||
// Si le serveur retourne une erreur 400, vérifiez le corps du message
|
||||
final responseBody = json.decode(response.body);
|
||||
final errorMessage = responseBody['message'] ?? 'Erreur inconnue';
|
||||
print('Erreur lors de la réouverture de l\'événement: $errorMessage');
|
||||
throw ServerExceptionWithMessage(errorMessage);
|
||||
} else if (response.statusCode == 404) {
|
||||
print('L\'événement n\'a pas été trouvé.');
|
||||
throw ServerExceptionWithMessage('L\'événement n\'existe pas ou a déjà été supprimé.');
|
||||
} else {
|
||||
print('Erreur lors de la réouverture de l\'événement: ${response.body}');
|
||||
throw ServerExceptionWithMessage('Une erreur est survenue lors de la réouverture de l\'événement.');
|
||||
|
||||
@@ -8,8 +8,11 @@ class EventModel {
|
||||
final String link;
|
||||
final String? imageUrl;
|
||||
final String creatorEmail;
|
||||
final String creatorFirstName; // Prénom du créateur
|
||||
final String creatorLastName; // Nom du créateur
|
||||
final String profileImageUrl;
|
||||
final List<dynamic> participants;
|
||||
final String status;
|
||||
String status;
|
||||
final int reactionsCount;
|
||||
final int commentsCount;
|
||||
final int sharesCount;
|
||||
@@ -24,6 +27,9 @@ class EventModel {
|
||||
required this.link,
|
||||
this.imageUrl,
|
||||
required this.creatorEmail,
|
||||
required this.creatorFirstName,
|
||||
required this.creatorLastName,
|
||||
required this.profileImageUrl,
|
||||
required this.participants,
|
||||
required this.status,
|
||||
required this.reactionsCount,
|
||||
@@ -44,8 +50,11 @@ class EventModel {
|
||||
final String link = json['link'] ?? 'Lien Inconnu';
|
||||
final String? imageUrl = json['imageUrl'];
|
||||
final String creatorEmail = json['creatorEmail'] ?? 'Email Inconnu';
|
||||
final String creatorFirstName = json['creatorFirstName']; // Ajout du prénom
|
||||
final String creatorLastName = json['creatorLastName']; // Ajout du nom
|
||||
final String profileImageUrl = json['profileImageUrl']; // Ajout du nom
|
||||
final List<dynamic> participants = json['participants'] ?? [];
|
||||
final String status = json['status'] ?? 'ouvert';
|
||||
String status = json['status'] ?? 'ouvert';
|
||||
final int reactionsCount = json['reactionsCount'] ?? 0;
|
||||
final int commentsCount = json['commentsCount'] ?? 0;
|
||||
final int sharesCount = json['sharesCount'] ?? 0;
|
||||
@@ -60,6 +69,9 @@ class EventModel {
|
||||
print(' - Lien: $link');
|
||||
print(' - URL de l\'image: ${imageUrl ?? "Aucune"}');
|
||||
print(' - Email du créateur: $creatorEmail');
|
||||
print(' - Prénom du créateur: $creatorFirstName');
|
||||
print(' - Nom du créateur: $creatorLastName');
|
||||
print(' - Image de profile du créateur: $profileImageUrl');
|
||||
print(' - Participants: ${participants.length} participants');
|
||||
print(' - Statut: $status');
|
||||
print(' - Nombre de réactions: $reactionsCount');
|
||||
@@ -76,6 +88,9 @@ class EventModel {
|
||||
link: link,
|
||||
imageUrl: imageUrl,
|
||||
creatorEmail: creatorEmail,
|
||||
creatorFirstName: creatorFirstName, // Ajout du prénom
|
||||
creatorLastName: creatorLastName, // Ajout du nom
|
||||
profileImageUrl: profileImageUrl,
|
||||
participants: participants,
|
||||
status: status,
|
||||
reactionsCount: reactionsCount,
|
||||
@@ -96,6 +111,9 @@ class EventModel {
|
||||
'link': link,
|
||||
'imageUrl': imageUrl,
|
||||
'creatorEmail': creatorEmail,
|
||||
'creatorFirstName': creatorFirstName, // Ajout du prénom
|
||||
'creatorLastName': creatorLastName, // Ajout du nom
|
||||
'profileImageUrl': profileImageUrl,
|
||||
'participants': participants,
|
||||
'status': status,
|
||||
'reactionsCount': reactionsCount,
|
||||
|
||||
@@ -4,40 +4,40 @@ import '../../domain/entities/friend.dart';
|
||||
import '../../data/repositories/friends_repository_impl.dart';
|
||||
|
||||
/// [FriendsProvider] est un `ChangeNotifier` qui gère la logique de gestion des amis.
|
||||
/// Il utilise [FriendsRepositoryImpl] pour interagir avec l'API et assure la gestion des états,
|
||||
/// comme le chargement, la pagination et les erreurs éventuelles.
|
||||
/// Il interagit avec le [FriendsRepositoryImpl] pour effectuer des appels API et gérer
|
||||
/// la liste des amis de l'utilisateur, avec une gestion avancée de la pagination,
|
||||
/// du statut des amis et de la gestion des erreurs.
|
||||
class FriendsProvider with ChangeNotifier {
|
||||
final FriendsRepositoryImpl friendsRepository;
|
||||
final Logger _logger = Logger(); // Logger pour suivre toutes les actions.
|
||||
final Logger _logger = Logger(); // Utilisation du logger pour une traçabilité complète des actions.
|
||||
|
||||
// Liste privée des amis récupérée depuis l'API
|
||||
// Liste des amis
|
||||
List<Friend> _friendsList = [];
|
||||
bool _isLoading = false; // Indique si une opération de chargement est en cours
|
||||
bool _hasMore = true; // Indique s'il reste des amis à charger
|
||||
int _currentPage = 0;
|
||||
final int _friendsPerPage = 10; // Nombre d'amis par page pour la pagination
|
||||
bool _isLoading = false; // Indicateur de chargement
|
||||
bool _hasMore = true; // Indicateur de pagination
|
||||
int _currentPage = 0; // Numéro de la page actuelle pour la pagination
|
||||
final int _friendsPerPage = 10; // Nombre d'amis à récupérer par page
|
||||
|
||||
/// Constructeur de [FriendsProvider] qui requiert une instance de [FriendsRepositoryImpl].
|
||||
/// Constructeur de [FriendsProvider] qui nécessite l'instance d'un [FriendsRepositoryImpl].
|
||||
FriendsProvider({required this.friendsRepository});
|
||||
|
||||
// Getters pour accéder aux états depuis l'interface utilisateur
|
||||
// Getters pour accéder à l'état actuel des données
|
||||
bool get isLoading => _isLoading;
|
||||
bool get hasMore => _hasMore;
|
||||
List<Friend> get friendsList => _friendsList;
|
||||
|
||||
/// Récupère la liste paginée des amis pour un utilisateur donné.
|
||||
/// Récupère la liste des amis pour un utilisateur donné avec pagination.
|
||||
///
|
||||
/// [userId] : L'identifiant unique de l'utilisateur.
|
||||
/// [loadMore] : Indique s'il s'agit d'une demande de chargement supplémentaire pour la pagination.
|
||||
/// [userId] : L'identifiant unique de l'utilisateur connecté.
|
||||
/// [loadMore] : Si vrai, charge plus d'amis, sinon recharge la liste depuis le début.
|
||||
///
|
||||
/// 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.
|
||||
/// Cette méthode gère :
|
||||
/// - La pagination de la liste d'amis.
|
||||
/// - L'exclusion de l'utilisateur lui-même.
|
||||
/// - Les erreurs et les logs 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.');
|
||||
_logger.w('[LOG] Une opération de chargement est déjà en cours. Annulation de la nouvelle requête.');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ class FriendsProvider with ChangeNotifier {
|
||||
notifyListeners();
|
||||
_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
|
||||
// Réinitialisation de la pagination si ce n'est pas un chargement supplémentaire
|
||||
if (!loadMore) {
|
||||
_friendsList = [];
|
||||
_currentPage = 0;
|
||||
@@ -57,23 +57,25 @@ class FriendsProvider with ChangeNotifier {
|
||||
_logger.i('[LOG] Chargement de la page $_currentPage des amis pour l\'utilisateur $userId.');
|
||||
final newFriends = await friendsRepository.fetchFriends(userId, _currentPage, _friendsPerPage);
|
||||
|
||||
// Gestion de l'absence de nouveaux amis
|
||||
if (newFriends.isEmpty) {
|
||||
_hasMore = false;
|
||||
_logger.i('[LOG] Fin de liste atteinte, plus d\'amis à charger.');
|
||||
_logger.i('[LOG] Plus d\'amis à charger.');
|
||||
} else {
|
||||
// Ajout des amis à la liste, en excluant l'utilisateur connecté
|
||||
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}");
|
||||
_logger.i("[LOG] Ami ajouté : 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}");
|
||||
_logger.w("[WARN] L'utilisateur connecté est exclu de la liste des amis : ${friend.friendId}");
|
||||
}
|
||||
}
|
||||
_currentPage++;
|
||||
_logger.i('[LOG] Page suivante préparée pour le prochain chargement, page actuelle : $_currentPage');
|
||||
_logger.i('[LOG] Préparation de la page suivante : $_currentPage');
|
||||
}
|
||||
} catch (e) {
|
||||
_logger.e('[ERROR] Erreur lors de la récupération des amis : $e');
|
||||
_logger.e('[ERROR] Erreur lors du chargement des amis : $e');
|
||||
} finally {
|
||||
_isLoading = false;
|
||||
_logger.i('[LOG] Fin du chargement des amis.');
|
||||
@@ -81,16 +83,18 @@ class FriendsProvider with ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
/// Supprime un ami dans l'API et met à jour la liste localement.
|
||||
/// Supprime un ami de la liste locale et de l'API.
|
||||
///
|
||||
/// [friendId] : Identifiant unique de l'ami à supprimer.
|
||||
///
|
||||
/// Loggue chaque étape pour assurer un suivi précis de l'opération.
|
||||
/// Cette méthode :
|
||||
/// - Loggue chaque étape.
|
||||
/// - Enlève l'ami de la liste locale.
|
||||
Future<void> removeFriend(String friendId) async {
|
||||
try {
|
||||
_logger.i('[LOG] Tentative de suppression de l\'ami avec l\'ID : $friendId');
|
||||
await friendsRepository.removeFriend(friendId);
|
||||
_friendsList.removeWhere((friend) => friend.friendId == friendId);
|
||||
_logger.i('[LOG] Suppression de l\'ami avec l\'ID : $friendId');
|
||||
await friendsRepository.removeFriend(friendId); // Appel API pour supprimer l'ami
|
||||
_friendsList.removeWhere((friend) => friend.friendId == friendId); // Suppression locale
|
||||
_logger.i('[LOG] Ami supprimé localement avec succès : $friendId');
|
||||
} catch (e) {
|
||||
_logger.e('[ERROR] Erreur lors de la suppression de l\'ami : $e');
|
||||
@@ -101,31 +105,31 @@ class FriendsProvider with ChangeNotifier {
|
||||
|
||||
/// Récupère les détails d'un ami via l'API.
|
||||
///
|
||||
/// [userId] : L'identifiant de l'utilisateur connecté.
|
||||
/// [friendId] : Identifiant unique de l'ami.
|
||||
/// [userId] : Identifiant de l'utilisateur connecté.
|
||||
/// [friendId] : Identifiant de l'ami dont on souhaite récupérer les détails.
|
||||
///
|
||||
/// Retourne un `Future<Friend?>` contenant les détails ou `null` en cas d'erreur.
|
||||
/// Retourne un `Future<Friend?>` contenant les détails de l'ami ou `null` en cas d'erreur.
|
||||
Future<Friend?> fetchFriendDetails(String userId, String friendId) async {
|
||||
try {
|
||||
_logger.i('[LOG] Tentative de récupération des détails de l\'ami avec l\'ID : $friendId');
|
||||
_logger.i('[LOG] Récupération des détails de l\'ami avec l\'ID : $friendId');
|
||||
final friendDetails = await friendsRepository.getFriendDetails(friendId, userId);
|
||||
|
||||
if (friendDetails != null) {
|
||||
_logger.i('[LOG] Détails de l\'ami récupérés avec succès : ${friendDetails.friendId}');
|
||||
} else {
|
||||
_logger.w('[LOG] Détails de l\'ami introuvables pour l\'ID : $friendId');
|
||||
_logger.w('[WARN] Détails de l\'ami introuvables pour l\'ID : $friendId');
|
||||
}
|
||||
|
||||
return friendDetails;
|
||||
} catch (e) {
|
||||
_logger.e('[ERROR] Exception lors de la récupération des détails de l\'ami : $e');
|
||||
_logger.e('[ERROR] Erreur lors de la récupération des détails de l\'ami : $e');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// Convertit un statut sous forme de chaîne en [FriendStatus].
|
||||
///
|
||||
/// [status] : Le statut sous forme de chaîne.
|
||||
/// [status] : Le statut sous forme de chaîne (par exemple, 'pending', 'accepted').
|
||||
///
|
||||
/// Retourne un [FriendStatus] correspondant, ou `FriendStatus.unknown` si non reconnu.
|
||||
FriendStatus _convertToFriendStatus(String status) {
|
||||
@@ -141,21 +145,21 @@ class FriendsProvider with ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
/// Met à jour le statut d'un ami (par exemple : accepter, bloquer).
|
||||
/// Met à jour le statut d'un ami (ex. accepter, bloquer).
|
||||
///
|
||||
/// [friendId] : Identifiant unique de l'ami.
|
||||
/// [status] : Nouveau statut pour l'ami sous forme de chaîne de caractères.
|
||||
/// [friendId] : Identifiant de l'ami dont on souhaite mettre à jour le statut.
|
||||
/// [status] : Nouveau statut sous forme de chaîne de caractères.
|
||||
///
|
||||
/// Loggue l'action, convertit le statut en `FriendStatus`, et met à jour la liste localement.
|
||||
/// Loggue l'action, met à jour le statut en local et appelle l'API pour mettre à jour le statut.
|
||||
Future<void> updateFriendStatus(String friendId, String status) async {
|
||||
try {
|
||||
_logger.i('[LOG] Tentative de mise à jour du statut de l\'ami avec l\'ID : $friendId');
|
||||
_logger.i('[LOG] Mise à jour du statut de l\'ami avec l\'ID : $friendId');
|
||||
|
||||
// Conversion du `String` en `FriendStatus` pour l'update locale
|
||||
// Conversion du statut sous forme de chaîne en statut spécifique
|
||||
final friendStatus = _convertToFriendStatus(status);
|
||||
await friendsRepository.updateFriendStatus(friendId, status);
|
||||
await friendsRepository.updateFriendStatus(friendId, status); // Mise à jour dans l'API
|
||||
|
||||
// Mise à jour locale de la liste pour afficher le changement de statut
|
||||
// Mise à jour locale de la liste des amis avec le nouveau statut
|
||||
final friendIndex = _friendsList.indexWhere((friend) => friend.friendId == friendId);
|
||||
if (friendIndex != -1) {
|
||||
_friendsList[friendIndex] = _friendsList[friendIndex].copyWith(status: friendStatus);
|
||||
|
||||
Reference in New Issue
Block a user