fix: photos admin — URL via /api/v1/uploads + static Express

- Nest: servir le volume uploads aussi sous /api/v1/uploads (Traefik /api)
- Flutter: _fullPhotoUrl = base API + chemin /uploads/... (plus d’origine site seul)
- EnfantDossier: tolérer photoUrl camelCase

Made-with: Cursor
This commit is contained in:
2026-04-11 16:47:29 +02:00
parent e7f0037ac3
commit 09289882d0
4 changed files with 19 additions and 9 deletions
+1 -1
View File
@@ -203,7 +203,7 @@ class EnfantDossier {
gender: (json['gender'] ?? json['genre'])?.toString(),
status: json['status']?.toString(),
dueDate: json['due_date']?.toString(),
photoUrl: json['photo_url']?.toString(),
photoUrl: (json['photo_url'] ?? json['photoUrl'])?.toString(),
consentPhoto: json['consent_photo'] == true,
);
}
@@ -115,9 +115,8 @@ class _ValidationAmWizardState extends State<ValidationAmWizard> {
if (url == null || url.trim().isEmpty) return '';
final u = url.trim();
if (u.startsWith('http://') || u.startsWith('https://')) return u;
final base = ApiConfig.baseUrl;
final origin = base.replaceAll(RegExp(r'/api/v1.*'), '');
return u.startsWith('/') ? '$origin$u' : '$origin/$u';
final base = ApiConfig.baseUrl.replaceAll(RegExp(r'/+$'), '');
return u.startsWith('/') ? '$base$u' : '$base/$u';
}
Widget _buildPhotoSection(AppUser u) {
@@ -138,9 +138,9 @@ class _ValidationFamilyWizardState extends State<ValidationFamilyWizard> {
if (url == null || url.trim().isEmpty) return '';
final u = url.trim();
if (u.startsWith('http://') || u.startsWith('https://')) return u;
final base = ApiConfig.baseUrl;
final origin = base.replaceAll(RegExp(r'/api/v1.*'), '');
return u.startsWith('/') ? '$origin$u' : '$origin/$u';
// Même origine que lAPI : /uploads est servi par Nest sous /api/v1/uploads/ (Traefik nexpose souvent que /api).
final base = ApiConfig.baseUrl.replaceAll(RegExp(r'/+$'), '');
return u.startsWith('/') ? '$base$u' : '$base/$u';
}
@override