From faa50f637c9bf503e46dec898dd906b733fcf90f Mon Sep 17 00:00:00 2001 From: Julien Martin Date: Fri, 17 Jul 2026 13:19:09 +0200 Subject: [PATCH] fix(#138): enrichir les noms des responsables sur GET enfant. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GET /enfants/:id ne joint pas parent.user ; on complète les noms via GET parent pour l'affichage des liens (ex. ouverture depuis la fiche AM). Co-authored-by: Cursor --- frontend/lib/models/enfant_admin_model.dart | 41 +++++++++++++++++++++ frontend/lib/services/user_service.dart | 40 +++++++++++++++++++- 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/frontend/lib/models/enfant_admin_model.dart b/frontend/lib/models/enfant_admin_model.dart index 8eaf815..e07e5b0 100644 --- a/frontend/lib/models/enfant_admin_model.dart +++ b/frontend/lib/models/enfant_admin_model.dart @@ -37,6 +37,34 @@ class EnfantAdminModel { return '$fn $ln'; } + EnfantAdminModel copyWith({ + String? id, + String? firstName, + String? lastName, + String? gender, + String? birthDate, + String? dueDate, + String? status, + String? photoUrl, + bool? consentPhoto, + bool? isMultiple, + List? parentLinks, + }) { + return EnfantAdminModel( + id: id ?? this.id, + firstName: firstName ?? this.firstName, + lastName: lastName ?? this.lastName, + gender: gender ?? this.gender, + birthDate: birthDate ?? this.birthDate, + dueDate: dueDate ?? this.dueDate, + status: status ?? this.status, + photoUrl: photoUrl ?? this.photoUrl, + consentPhoto: consentPhoto ?? this.consentPhoto, + isMultiple: isMultiple ?? this.isMultiple, + parentLinks: parentLinks ?? this.parentLinks, + ); + } + factory EnfantAdminModel.fromJson(Map json) { final linksRaw = json['parentLinks'] as List?; final links = []; @@ -106,6 +134,13 @@ class EnfantParentLink { EnfantParentLink({required this.parentId, this.parentName}); + EnfantParentLink copyWith({String? parentId, String? parentName}) { + return EnfantParentLink( + parentId: parentId ?? this.parentId, + parentName: parentName ?? this.parentName, + ); + } + factory EnfantParentLink.fromJson(Map json) { final parentId = (json['parentId'] ?? json['id_parent'] ?? '').toString(); @@ -116,6 +151,12 @@ class EnfantParentLink { if (user is Map) { final u = AppUser.fromJson(user); name = u.fullName.isNotEmpty ? u.fullName : u.email; + } else { + // Parfois le parent est aplati (prenom/nom) sans nested user. + final prenom = (parent['prenom'] ?? parent['first_name'] ?? '').toString().trim(); + final nom = (parent['nom'] ?? parent['last_name'] ?? '').toString().trim(); + final flat = '$prenom $nom'.trim(); + if (flat.isNotEmpty) name = flat; } } return EnfantParentLink( diff --git a/frontend/lib/services/user_service.dart b/frontend/lib/services/user_service.dart index b16e89f..f190463 100644 --- a/frontend/lib/services/user_service.dart +++ b/frontend/lib/services/user_service.dart @@ -460,7 +460,40 @@ class UserService { if (response.statusCode != 200) { throw Exception(_extractErrorMessage(response.body, 'Erreur chargement enfant')); } - return EnfantAdminModel.fromJson(jsonDecode(response.body) as Map); + final enfant = EnfantAdminModel.fromJson( + jsonDecode(response.body) as Map, + ); + // GET /enfants/:id ne joint pas toujours parent.user → noms manquants. + return enrichEnfantParentNames(enfant); + } + + /// Complète [parentName] via GET parent quand l'API n'a pas fourni le nested user. + static Future enrichEnfantParentNames( + EnfantAdminModel enfant, + ) async { + final links = enfant.parentLinks; + if (links.isEmpty) return enfant; + if (links.every((l) => (l.parentName ?? '').trim().isNotEmpty)) { + return enfant; + } + + final enriched = await Future.wait( + links.map((link) async { + if ((link.parentName ?? '').trim().isNotEmpty) return link; + final id = link.parentId.trim(); + if (id.isEmpty) return link; + try { + final parent = await getParent(id); + final name = parent.user.fullName.trim(); + if (name.isEmpty) return link; + return link.copyWith(parentName: name); + } catch (_) { + return link; + } + }), + ); + + return enfant.copyWith(parentLinks: enriched); } static Future updateEnfant({ @@ -475,7 +508,10 @@ class UserService { if (response.statusCode != 200) { throw Exception(_extractErrorMessage(response.body, 'Erreur mise à jour enfant')); } - return EnfantAdminModel.fromJson(jsonDecode(response.body) as Map); + final enfant = EnfantAdminModel.fromJson( + jsonDecode(response.body) as Map, + ); + return enrichEnfantParentNames(enfant); } static Future deleteEnfant(String enfantId) async {