Squash merge de la branche develop dans master : un seul commit sur master pour regrouper la livraison liée au ticket #50 (affichage dynamique des CGU et de la politique de confidentialité à l'inscription) ainsi que la documentation et les ajustements associés. Frontend (P'titsPas) : modale de validation bloquante avec onglets CGU / confidentialité, chargement des PDF depuis l'API des documents légaux actifs, affichage via pdfx (PdfViewPinch et barre de progression latérale sur le web, repli PdfView sous Windows). Branchement dans le flux d'inscription (écran de présentation), enrichissement du UserService et correction des chemins média pour les URL absolues. Documentation: jeux de fichiers juridiques (markdown et PDF de référence), réorganisation (dossier docs/juridique, archives, renommage du briefing), mises à jour index, liste de tickets et décisions projet. Scripts et métadonnées mineures (Gitea, pubspec, index web). Made-with: Cursor
84 lines
3.3 KiB
Dart
84 lines
3.3 KiB
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) {
|
||
return '';
|
||
}
|
||
final u = pathOrUrl.trim();
|
||
if (u.startsWith('http://') || u.startsWith('https://')) {
|
||
return u;
|
||
}
|
||
final base = baseUrl.replaceAll(RegExp(r'/+$'), '');
|
||
// Le back renvoie parfois des chemins déjà préfixés `/api/v1/...` (ex. documents
|
||
// légaux). Ne pas les coller à [baseUrl] sous peine de doubler `/api/v1`.
|
||
if (u.startsWith('/api/')) {
|
||
final origin = apiOrigin.replaceAll(RegExp(r'/+$'), '');
|
||
return '$origin$u';
|
||
}
|
||
return u.startsWith('/') ? '$base$u' : '$base/$u';
|
||
}
|
||
|
||
// 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',
|
||
};
|
||
}
|