feat: mise à jour du profil utilisateur et intégration API Kaz (synchro des données, gestion des erreurs et succès) + divers correctifs (liens externes, simplifications de commentaires)

This commit is contained in:
2026-04-04 12:53:48 +02:00
parent 7a25779c9c
commit 7400d0d418
8 changed files with 100 additions and 30 deletions

View File

@@ -58,7 +58,7 @@ class UserController extends AbstractController
// Initialisation de la variable $userData
$user = $user->updateFromKazUser($kazUser);
} catch (Exception $e) {
$this->addFlash('error', 'Impossible de charger vos données.');
$this->addFlash('error', 'Impossible de charger vos données.' . $e->getMessage());
}
// Création du formulaire lié à l'utilisateur connecté
@@ -80,6 +80,21 @@ class UserController extends AbstractController
$newFilename = $fileUploader->upload($imageFile);
$user->setImage($newFilename);
}
// --- Fin gestion de l'image de profil ---
// Synchronisation des données avec l'API
$kazUser = [
'telephone' => $form->get('telephone')->getData(),
'alternateEmail' => $form->get('alternateEmail')->getData(),
];
try {
$apiKazService->updateUserData($user->getEmail(), $kazUser);
$this->addFlash('success', 'Votre profil a été mis à jour avec succès !');
} catch (Exception $e) {
$this->addFlash('error', 'Impossible de mettre à jour votre profil' . $e->getMessage());
}
// Sauvegarde en base de données
$entityManager->flush();

View File

@@ -10,35 +10,36 @@ use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class AppFixtures extends Fixture
{
# Initialisation de l'outil de hachage de Symfony
// Initialisation de l'outil de hachage de Symfony
private UserPasswordHasherInterface $hasher;
# Injection de dépendance pour récupérer le service de sécurité
// Injection de dépendance pour récupérer le service de sécurité
public function __construct(UserPasswordHasherInterface $hasher)
{
$this->hasher = $hasher;
}
# Méthode principale qui génère les données en base
// Méthode principale qui génère des données de test en BDD locale
public function load(ObjectManager $manager): void
{
# Initialisation de Faker en français
// --- Création de 10 utilisateurs avec Faker --- //
// Initialisation de Faker en français
$faker = Factory::create('fr_FR');
# Boucle pour créer 10 utilisateurs
// Boucle pour créer 10 utilisateurs
for ($i = 0; $i < 10; $i++) {
# Instanciation d'un nouvel utilisateur (Adhérent)
// Instanciation d'un nouvel utilisateur (Adhérent)
$user = new User();
# Attribution d'un email aléatoire et unique
// Attribution d'un email aléatoire et unique
$user->setEmail($faker->unique()->safeEmail());
# Définition des droits d'accès de l'utilisateur
// Définition des droits d'accès de l'utilisateur
$user->setRoles(['ROLE_USER', 'ROLE_ORGANISATION']);
# Hachage sécurisé du mot de passe "password"
// Hachage sécurisé du mot de passe "password"
$user->setPassword($this->hasher->hashPassword($user, 'password'));
# Définition d'un NOM et Prénom
// Définition d'un NOM et Prénom
$user->setFirstname($faker->firstName());
$user->setLastname($faker->lastName());
# autres fixtures à modifier plus tard
// autres fixtures à modifier plus tard
$user->setNextcloudQuota($faker->numberBetween(1, 20) . 'G');
$user->setQuota($faker->numberBetween(1, 10) . 'G');
$user->setEmailQuota('1G');
@@ -47,7 +48,7 @@ class AppFixtures extends Fixture
$user->setHasMobilizon($faker->boolean(50));
$user->setHasNextcloudAccess($faker->boolean(90));
$user->setIdentifiantKaz($faker->uuid());
# Préparation de l'enregistrement de l'objet en base de données
// Préparation de l'enregistrement de l'objet en base de données
$manager->persist($user);
}
@@ -56,10 +57,9 @@ class AppFixtures extends Fixture
$admin->setEmail('admin@kaz.bzh');
$admin->setRoles(['ROLE_USER', 'ROLE_ADMIN', 'ROLE_ORGANISATION']);
$admin->setPassword($this->hasher->hashPassword($admin, 'password'));
// Remplissage des champs obligatoires restants pour éviter les erreurs SQL
$admin->setFirstName('Admin');
$admin->setLastName('KAZ');
// Remplissage des champs obligatoires restants pour éviter les erreurs SQL
$admin->setAlternateEmail('secours@kaz.bzh');
$admin->setIdentifiantKaz('ADMIN-KAZ-001');
$admin->setQuota('5G');
@@ -71,14 +71,13 @@ class AppFixtures extends Fixture
$manager->persist($admin);
// Création d'un compte de test fixe
// Création d'un compte de test fixe présent dans le LDAP
$melvin = new User();
$melvin->setEmail('melvin.leveque@kazkouil.fr');
$melvin->setRoles(['ROLE_USER', 'ROLE_ADMIN', 'ROLE_ORGANISATION']);
$melvin->setPassword($this->hasher->hashPassword($melvin, 'password'));
$melvin->setFirstName('');
$melvin->setLastName('');
$melvin->setAlternateEmail('');
$melvin->setIdentifiantKaz('MELVIN-KAZ-001');
$melvin->setQuota('5G');
@@ -90,7 +89,24 @@ class AppFixtures extends Fixture
$manager->persist($melvin);
# Exécution réelle des requêtes SQL (envoi vers la base), une fois la bouche finie
// Création d'un compte de test fixe présent dans le LDAP pour ma présentation
$toto = new User();
$toto->setEmail('toto@kazkouil.fr');
$toto->setRoles(['ROLE_USER', 'ROLE_ADMIN', 'ROLE_ORGANISATION']);
$toto->setPassword($this->hasher->hashPassword($toto, 'password'));
$toto->setFirstName('');
$toto->setLastName('');
$toto->setAlternateEmail('');
$toto->setIdentifiantKaz('');
$toto->setQuota('5G');
$toto->setEmailQuota('1G');
$toto->setNextcloudQuota('10G');
$toto->setHasNextcloudAccess(true);
$toto->setHasMobilizon(true);
$toto->setHasAgoraAccess(true);
$manager->persist($toto);
// Exécution réelle des requêtes SQL (envoi vers la base), une fois la bouche finie
$manager->flush();
}
}

View File

@@ -336,4 +336,27 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface
return $this;
}
// Fonction qui permet de convertir les données de l'API vers $kazUser
public function convertToKazUser() : array
{
$fullName = implode(' ', array_filter([
$this->getFirstName(),
$this->getLastName()
]));
return [
'mail' => $this->getEmail(),
'sn' => $fullName,
'mailDeSecours' => $this->getAlternateEmail(),
'mailQuota' => $this->getEmailQuota(),
'agoraEnabled' => $this->hasAgoraAccess(),
'mobilizonEnabled' => $this->hasMobilizon(),
'nextcloudEnabled' => $this->hasNextcloudAccess(),
'nextcloudQuota' => $this->getNextcloudQuota(),
'quota' => $this->getQuota(),
'identifiantKaz' => $this->getIdentifiantKaz(),
'telephone' => $this->getTelephone(),
];
}
}

View File

@@ -90,7 +90,7 @@ class UserProfileType extends AbstractType
new Image(
maxSize: '8M',
extensions: ['jpg', 'jpeg', 'png', 'gif'],
extensionsMessage: 'Veuillez déposer une image JPG, JPEG, GIF ou PNG valide',)
extensionsMessage: 'Veuillez déposer une image JPG, JPEG, GIF ou PNG valide')
],
])
;

View File

@@ -4,6 +4,8 @@ namespace App\Service;
use Exception;
use Symfony\Component\Mime\Part\DataPart;
use Symfony\Component\Mime\Part\Multipart\FormDataPart;
use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\DecodingExceptionInterface;
use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface;
@@ -80,4 +82,18 @@ class KazApiService
return $response->toArray();
}
/**
* Envoie les nouvelles données saisies par l'utilisateur vers l'API
*/
public function updateUserData(string $email, array $kazUser): void
{
$options['headers']['Authorization'] = 'Bearer ' . $this->getToken();
$options['body'] = json_encode($kazUser);
// $response = $this->kazApiClient->request('PUT', "/ldap/user/add/$email", $options);
if ($response->getStatusCode() !== 200) {
throw new Exception('Erreur lors de l\'appel API : ' . $response->getStatusCode());
}
}
}