Squash merge de develop vers master. Livrables principaux (ticket #101 et mise au point associée) : - Branchement du formulaire d'inscription parent sur POST /api/v1/auth/register/parent - Payload DTO (parents, enfants, photos base64, CGU) et services Auth - Parcours gestionnaire : cartes dossiers, wizard validation famille, images authentifiées - Scripts d'inscription test (Martin, Durand/Rousseau, Lecomte) ; .gitignore .cursor/ Inclut également les ajustements develop fusionnés dans ce lot (inscription AM, champs relais, etc.). Closes #101 Made-with: Cursor
91 lines
3.4 KiB
Dart
91 lines
3.4 KiB
Dart
import 'package:flutter/foundation.dart';
|
||
import 'package:p_tits_pas/config/env.dart';
|
||
|
||
class ApiConfig {
|
||
/// Aligné sur [Env.apiBaseUrl] (`--dart-define=API_BASE_URL=...`) pour que les images `/uploads/...` visent le même hôte que l’API.
|
||
static String get baseUrl {
|
||
final root = Env.apiBaseUrl.replaceAll(RegExp(r'/+$'), '');
|
||
return '$root/api/v1';
|
||
}
|
||
|
||
/// Origine (schéma + hôte + port) dérivée de [baseUrl], pour préfixer les chemins `/uploads/...`.
|
||
static String get apiOrigin {
|
||
final uri = Uri.parse(baseUrl);
|
||
if (uri.hasScheme && uri.host.isNotEmpty) {
|
||
return '${uri.scheme}://${uri.authority}';
|
||
}
|
||
return baseUrl.replaceAll(RegExp(r'/api/v1/?.*'), '');
|
||
}
|
||
|
||
/// URL absolue pour une image renvoyée par l’API (chemin type `/uploads/...`).
|
||
/// On préfixe avec [baseUrl] (…/api/v1), pas seulement l’hôte : Traefik n’expose souvent que `/api`.
|
||
static String absoluteMediaUrl(String? pathOrUrl) {
|
||
if (pathOrUrl == null || pathOrUrl.trim().isEmpty) {
|
||
if (kDebugMode) {
|
||
debugPrint('[PetitsPas/media] absoluteMediaUrl: entrée vide (null ou "")');
|
||
}
|
||
return '';
|
||
}
|
||
final u = pathOrUrl.trim();
|
||
if (u.startsWith('http://') || u.startsWith('https://')) {
|
||
if (kDebugMode) {
|
||
debugPrint('[PetitsPas/media] absoluteMediaUrl: déjà absolu → $u');
|
||
}
|
||
return u;
|
||
}
|
||
final base = baseUrl.replaceAll(RegExp(r'/+$'), '');
|
||
final out = u.startsWith('/') ? '$base$u' : '$base/$u';
|
||
if (kDebugMode) {
|
||
debugPrint(
|
||
'[PetitsPas/media] absoluteMediaUrl: base=$base | chemin brut="$u" → "$out"',
|
||
);
|
||
}
|
||
return out;
|
||
}
|
||
|
||
// Auth endpoints
|
||
static const String login = '/auth/login';
|
||
static const String register = '/auth/register';
|
||
static const String registerParent = '/auth/register/parent';
|
||
static const String registerAM = '/auth/register/am';
|
||
static const String refreshToken = '/auth/refresh';
|
||
static const String authMe = '/auth/me';
|
||
static const String changePasswordRequired = '/auth/change-password-required';
|
||
|
||
// Users endpoints
|
||
static const String users = '/users';
|
||
static const String userProfile = '/users/profile';
|
||
static const String userChildren = '/users/children';
|
||
static const String gestionnaires = '/gestionnaires';
|
||
static const String parents = '/parents';
|
||
static const String assistantesMaternelles = '/assistantes-maternelles';
|
||
static const String relais = '/relais';
|
||
static const String dossiers = '/dossiers';
|
||
|
||
// Configuration (admin)
|
||
static const String configuration = '/configuration';
|
||
static const String configurationSetupStatus = '/configuration/setup/status';
|
||
static const String configurationSetupComplete =
|
||
'/configuration/setup/complete';
|
||
static const String configurationTestSmtp = '/configuration/test-smtp';
|
||
static const String configurationBulk = '/configuration/bulk';
|
||
|
||
// Dashboard endpoints
|
||
static const String dashboard = '/dashboard';
|
||
static const String events = '/events';
|
||
static const String contracts = '/contracts';
|
||
static const String conversations = '/conversations';
|
||
static const String notifications = '/notifications';
|
||
|
||
// Headers
|
||
static Map<String, String> get headers => {
|
||
'Content-Type': 'application/json',
|
||
'Accept': 'application/json',
|
||
};
|
||
|
||
static Map<String, String> authHeaders(String token) => {
|
||
...headers,
|
||
'Authorization': 'Bearer $token',
|
||
};
|
||
}
|