feat(auth): restore authenticated user profile

This commit is contained in:
SaidSoighiri94
2026-07-23 14:39:35 +02:00
parent dc208fa13a
commit 36224f30ee
8 changed files with 276 additions and 76 deletions
@@ -0,0 +1,90 @@
class AuthenticatedProfile {
const AuthenticatedProfile({
required this.id,
required this.nom,
required this.prenom,
required this.email,
required this.classe,
required this.roleCode,
required this.roleLabel,
required this.campusId,
required this.campusNom,
required this.campusVille,
});
final int id;
final String nom;
final String prenom;
final String email;
final String? classe;
final String roleCode;
final String roleLabel;
final int campusId;
final String campusNom;
final String campusVille;
factory AuthenticatedProfile.fromApi(dynamic reponse) {
if (reponse is! Map || reponse["data"] is! Map) {
throw const FormatException("Profil utilisateur invalide.");
}
final data = reponse["data"] as Map;
final role = data["role"];
final campus = data["campus"];
if (role is! Map || campus is! Map) {
throw const FormatException("Role ou campus utilisateur invalide.");
}
final id = data["id"];
final campusId = campus["id"];
if (id is! int || campusId is! int) {
throw const FormatException("Identifiant utilisateur invalide.");
}
final classe = data["classe"];
if (classe != null && classe is! String) {
throw const FormatException("Classe utilisateur invalide.");
}
return AuthenticatedProfile(
id: id,
nom: _requiredString(data, "nom"),
prenom: _requiredString(data, "prenom"),
email: _requiredString(data, "email"),
classe: classe as String?,
roleCode: _requiredString(role, "code"),
roleLabel: _requiredString(role, "libelle"),
campusId: campusId,
campusNom: _requiredString(campus, "nom"),
campusVille: _requiredString(campus, "ville"),
);
}
String get fullName => "$prenom $nom";
String get initials {
final first = prenom.trim().isEmpty ? "" : prenom.trim()[0];
final last = nom.trim().isEmpty ? "" : nom.trim()[0];
return "$first$last".toUpperCase();
}
String get campusTag => "$campusNom · $campusVille";
String get subtitle {
final details = <String>[roleLabel];
final studentClass = classe?.trim();
if (studentClass != null && studentClass.isNotEmpty) {
details.add(studentClass);
}
details.add(campusTag);
return details.join(" · ");
}
static String _requiredString(Map source, String key) {
final value = source[key];
if (value is! String || value.trim().isEmpty) {
throw FormatException("Champ utilisateur invalide : $key.");
}
return value.trim();
}
}