From f87ed32f6f3a0184a9ff170bd3f5b0308e688812 Mon Sep 17 00:00:00 2001 From: maurine Date: Mon, 16 Mar 2026 10:16:31 +0100 Subject: [PATCH 1/3] Actualisation README Ajout de la documentation d'installation pour Tailwind --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dce1968..c1767a0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ - # Plateforme web pour les adhérents KAZ ## Objectif @@ -11,6 +10,7 @@ Cette application web permet aux adhérents de l'association KAZ de gérer leur ## Architecture technique - **Frontend** : [Twig](https://twig.symfony.com/) + [Tailwind CSS](https://tailwindcss.com/) +- **Documentation installation Tailwind** : [Plus d'infos ici](https://tailwindcss.com/docs/installation/framework-guides/symfony) - **Backend** : PHP 8.4 / [Symfony](https://symfony.com/) - **Base de données** : [PostgreSQL](https://www.postgresql.org/) - **Intégration** : Communication via API avec les outils de KAZ (notamment OpenLDAP). From e7e6d7c1af437a55e4ce3ed442f4934df42e683a Mon Sep 17 00:00:00 2001 From: MLeveque Date: Sun, 29 Mar 2026 13:45:07 +0200 Subject: [PATCH 2/3] =?UTF-8?q?feat(api=20kaz):=20Connexion=20=C3=A0=20l'a?= =?UTF-8?q?pi=20kaz.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Suppression des migrations, templates et configurations inutiles (ex. `compose.override.yaml`). - Mise à jour de l'entité `User` : - Renommage des attributs pour correspondre aux conventions (`emailDeSecours` → `alternateEmail`, etc.). - Implémentation d'un mapper `updateFromKazUser` pour synchroniser les données depuis l'API Kaz. - Refactorisation des migrations pour aligner les changements de schéma. - Mise à jour du formulaire utilisateur et des fixtures en conséquence. - Ajout du template Twig `profil_infos.html.twig` pour afficher les informations utilisateur. (A supprimer) --- [all | 0 compose.override.yaml | 18 ------ compose.yaml | 24 -------- migrations/Version20260313104837.php | 34 ----------- migrations/Version20260313151403.php | 2 +- migrations/Version20260316103235.php | 4 +- migrations/Version20260316114715.php | 4 +- src/Controller/UserController.php | 50 ++++++++++------ src/DataFixtures/AppFixtures.php | 70 ++++++++++++++-------- src/Entity/User.php | 66 +++++++++++++------- src/Form/UserProfileType.php | 2 +- src/{Services => Service}/FileUploader.php | 2 +- src/Service/KazApiService.php | 19 +++--- templates/user/index.html.twig | 6 +- templates/user/profil_infos.html.twig | 11 ++++ true], | 0 16 files changed, 153 insertions(+), 159 deletions(-) delete mode 100644 [all delete mode 100644 compose.override.yaml delete mode 100644 migrations/Version20260313104837.php rename src/{Services => Service}/FileUploader.php (93%) create mode 100644 templates/user/profil_infos.html.twig delete mode 100644 true], diff --git a/[all b/[all deleted file mode 100644 index e69de29..0000000 diff --git a/compose.override.yaml b/compose.override.yaml deleted file mode 100644 index 8dc54de..0000000 --- a/compose.override.yaml +++ /dev/null @@ -1,18 +0,0 @@ - -services: -###> doctrine/doctrine-bundle ### - database: - ports: - - "5432" -###< doctrine/doctrine-bundle ### - -###> symfony/mailer ### - mailer: - image: axllent/mailpit - ports: - - "1025" - - "8025" - environment: - MP_SMTP_AUTH_ACCEPT_ANY: 1 - MP_SMTP_AUTH_ALLOW_INSECURE: 1 -###< symfony/mailer ### diff --git a/compose.yaml b/compose.yaml index 2e5a766..1ac1ffc 100644 --- a/compose.yaml +++ b/compose.yaml @@ -25,29 +25,5 @@ services: environment: MP_SMTP_AUTH_ACCEPT_ANY: 1 MP_SMTP_AUTH_ALLOW_INSECURE: 1 - -###> doctrine/doctrine-bundle ### - database: - image: postgres:${POSTGRES_VERSION:-16}-alpine - environment: - POSTGRES_DB: ${POSTGRES_DB:-app} - # You should definitely change the password in production - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-!ChangeMe!} - POSTGRES_USER: ${POSTGRES_USER:-app} - healthcheck: - test: ["CMD", "pg_isready", "-d", "${POSTGRES_DB:-app}", "-U", "${POSTGRES_USER:-app}"] - timeout: 5s - retries: 5 - start_period: 60s - volumes: - - database_data:/var/lib/postgresql/data:rw - # You may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data! - # - ./docker/db/data:/var/lib/postgresql/data:rw -###< doctrine/doctrine-bundle ### - volumes: database_data: - -###> doctrine/doctrine-bundle ### - database_data: -###< doctrine/doctrine-bundle ### diff --git a/migrations/Version20260313104837.php b/migrations/Version20260313104837.php deleted file mode 100644 index 79724c7..0000000 --- a/migrations/Version20260313104837.php +++ /dev/null @@ -1,34 +0,0 @@ -addSql('CREATE TABLE "user" (id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, role VARCHAR(255) NOT NULL, mail VARCHAR(255) NOT NULL, mail_quota VARCHAR(255) NOT NULL, mail_de_secours VARCHAR(255) NOT NULL, identifiant_kaz VARCHAR(255) NOT NULL, quota VARCHAR(255) NOT NULL, has_nextcloud_access BOOLEAN NOT NULL, nextcloud_quota VARCHAR(255) NOT NULL, has_mobilizon BOOLEAN NOT NULL, has_agora_access BOOLEAN NOT NULL, PRIMARY KEY (id))'); - $this->addSql('CREATE TABLE messenger_messages (id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, body TEXT NOT NULL, headers TEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, available_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, delivered_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY (id))'); - $this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0E3BD61CE16BA31DBBF396750 ON messenger_messages (queue_name, available_at, delivered_at, id)'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('DROP TABLE "user"'); - $this->addSql('DROP TABLE messenger_messages'); - } -} diff --git a/migrations/Version20260313151403.php b/migrations/Version20260313151403.php index b8d74ca..de8ff23 100644 --- a/migrations/Version20260313151403.php +++ b/migrations/Version20260313151403.php @@ -20,7 +20,7 @@ final class Version20260313151403 extends AbstractMigration public function up(Schema $schema): void { // this up() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE TABLE "user" (id UUID NOT NULL, email VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, email_quota VARCHAR(255) NOT NULL, email_de_secours VARCHAR(255) NOT NULL, identifiant_kaz VARCHAR(255) NOT NULL, quota VARCHAR(255) NOT NULL, has_nextcloud_access BOOLEAN NOT NULL, nextcloud_quota VARCHAR(255) NOT NULL, has_mobilizon BOOLEAN NOT NULL, has_agora_access BOOLEAN NOT NULL, lastname VARCHAR(255) NOT NULL, firstname VARCHAR(255) NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE TABLE "user" (id UUID NOT NULL, email VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, email_quota VARCHAR(255) NOT NULL, alternate_email VARCHAR(255) NOT NULL, identifiant_kaz VARCHAR(255) NOT NULL, quota VARCHAR(255) NOT NULL, has_nextcloud_access BOOLEAN NOT NULL, nextcloud_quota VARCHAR(255) NOT NULL, has_mobilizon BOOLEAN NOT NULL, has_agora_access BOOLEAN NOT NULL, lastname VARCHAR(255) NOT NULL, firstname VARCHAR(255) NOT NULL, PRIMARY KEY (id))'); $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_EMAIL ON "user" (email)'); $this->addSql('CREATE TABLE messenger_messages (id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, body TEXT NOT NULL, headers TEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, available_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, delivered_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY (id))'); $this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0E3BD61CE16BA31DBBF396750 ON messenger_messages (queue_name, available_at, delivered_at, id)'); diff --git a/migrations/Version20260316103235.php b/migrations/Version20260316103235.php index f4942a0..4094fd5 100644 --- a/migrations/Version20260316103235.php +++ b/migrations/Version20260316103235.php @@ -20,12 +20,12 @@ final class Version20260316103235 extends AbstractMigration public function up(Schema $schema): void { // this up() migration is auto-generated, please modify it to your needs - $this->addSql('ALTER TABLE "user" ALTER email_de_secours DROP NOT NULL'); + $this->addSql('ALTER TABLE "user" ALTER alternate_email DROP NOT NULL'); } public function down(Schema $schema): void { // this down() migration is auto-generated, please modify it to your needs - $this->addSql('ALTER TABLE "user" ALTER email_de_secours SET NOT NULL'); + $this->addSql('ALTER TABLE "user" ALTER alternate_email SET NOT NULL'); } } diff --git a/migrations/Version20260316114715.php b/migrations/Version20260316114715.php index 39c2cf5..d0ff32d 100644 --- a/migrations/Version20260316114715.php +++ b/migrations/Version20260316114715.php @@ -24,7 +24,7 @@ final class Version20260316114715 extends AbstractMigration $this->addSql('ALTER TABLE "user" ADD first_name VARCHAR(255) NOT NULL'); $this->addSql('ALTER TABLE "user" DROP lastname'); $this->addSql('ALTER TABLE "user" DROP firstname'); - $this->addSql('ALTER TABLE "user" ALTER email_de_secours SET NOT NULL'); + $this->addSql('ALTER TABLE "user" ALTER alternate_email SET NOT NULL'); $this->addSql('ALTER TABLE "user" ALTER identifiant_kaz SET NOT NULL'); $this->addSql('ALTER TABLE "user" ALTER quota SET NOT NULL'); $this->addSql('ALTER TABLE "user" ALTER has_nextcloud_access SET NOT NULL'); @@ -39,7 +39,7 @@ final class Version20260316114715 extends AbstractMigration $this->addSql('ALTER TABLE "user" ADD firstname VARCHAR(255) NOT NULL'); $this->addSql('ALTER TABLE "user" DROP last_name'); $this->addSql('ALTER TABLE "user" DROP first_name'); - $this->addSql('ALTER TABLE "user" ALTER email_de_secours DROP NOT NULL'); + $this->addSql('ALTER TABLE "user" ALTER alternate_email DROP NOT NULL'); $this->addSql('ALTER TABLE "user" ALTER identifiant_kaz DROP NOT NULL'); $this->addSql('ALTER TABLE "user" ALTER quota DROP NOT NULL'); $this->addSql('ALTER TABLE "user" ALTER has_nextcloud_access DROP NOT NULL'); diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 1c5033c..972912f 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -27,7 +27,7 @@ class UserController extends AbstractController * Permet de vérifier si un utilisateur existe dans le ldap. * * @param string $email L'adresse e-mail de l'utilisateur. - * @param KazApiService $apiClient Le service utilisé pour récupérer les données utilisateur. + * @param KazApiService $apiKazService Le service utilisé pour récupérer les données utilisateur. * * @return Response La page index utilisateur rendue. * @throws ClientExceptionInterface @@ -37,29 +37,32 @@ class UserController extends AbstractController * @throws TransportExceptionInterface */ -# #[Route('/user/{email}', name: 'app_user', methods: ['GET'])] -# public function index(string $email, KazApiService $apiClient): Response -# { -# $exist = $apiClient->getUserData($email); -# -# return $this->render('user/index.html.twig', [ -# 'exist' => $exist, -# ]); -# } + #[Route('/user/{email}', name: 'app_user_by_mail', methods: ['GET'])] + public function index(string $email, KazApiService $apiKazService): Response + { + $user = $apiKazService->getUserData($email); + return $this->render('user/profil_infos.html.twig', [ + 'user' => $user, + ]); + } -/* TODO : Param l'API avec un Serializer pour la lecture du fichier JSON ? */ + /* TODO : Param l'API avec un Serializer pour la lecture du fichier JSON ? */ #[Route('/mon-profil', name: 'app_user', methods: ['GET', 'POST'])] #[IsGranted('ROLE_USER')] public function showProfile( Request $request, EntityManagerInterface $entityManager, - FileUploader $fileUploader + FileUploader $fileUploader, + KazApiService $apiKazService ): Response { # Récupération de l'utilisateur actuellement connecté $user = $this->getUser(); - /* Utilisation des fixtures pour vérifier la mise en page. - TODO: modifier pour que ça communique avec l'API */ + $kazUser = $apiKazService->getUserData($user->getEmail()); + + $user = $user->updateFromKazUser($kazUser); + + //TODO: modifier pour que ça communique avec l'API */ # Création du formulaire lié à l'utilisateur connecté $form = $this->createForm(UserProfileType::class, $user); @@ -82,6 +85,22 @@ class UserController extends AbstractController $user->setPhoto($newFilename); } + $alternateEmail = $form->get('alternateEmail')->getData(); + $regexEmail = '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/'; + if(isset($alternateEmail) && preg_match($regexEmail, $alternateEmail)) { + $user->setAlternateEmail($form->get('alternateEmail')->getData()); + } else { + $alternateEmail->addError(new FormError('L\'adresse e-mail n\'est pas valide.')); + } + + $telephone = $form->get('telephone')->getData(); + $regexTelephone = '/^[0-9\+\s\.\-\(\)]+$/'; + if(isset($telephone) && preg_match($regexTelephone, $telephone)) { + $user->setTelephone($telephone); + } else { + $telephone->addError(new FormError('Le numéro de téléphone n\'est pas valide.')); + } + # Sauvegarde en base de données $entityManager->flush(); @@ -105,9 +124,6 @@ class UserController extends AbstractController EntityManagerInterface $entityManager ): Response { - # Récupération de l'utilisateur actuellement connecté - $user = $this->getUser(); - # Création du formulaire $form = $this->createForm(ChangePasswordType::class); diff --git a/src/DataFixtures/AppFixtures.php b/src/DataFixtures/AppFixtures.php index 7788357..cf35c5b 100644 --- a/src/DataFixtures/AppFixtures.php +++ b/src/DataFixtures/AppFixtures.php @@ -42,37 +42,55 @@ class AppFixtures extends Fixture $user->setNextcloudQuota($faker->numberBetween(1, 20) . 'G'); $user->setQuota($faker->numberBetween(1, 10) . 'G'); $user->setEmailQuota('1G'); - $user->setEmailDeSecours($faker->unique()->safeEmail()); + $user->setAlternateEmail($faker->unique()->safeEmail()); $user->setHasAgoraAccess($faker->boolean(70)); // 70% de chance d'avoir accès $user->setHasMobilizon($faker->boolean(50)); $user->setHasNextcloudAccess($faker->boolean(90)); $user->setIdentifiantKaz($faker->uuid()); - } - - // Création d'un compte de test fixe - $admin = new User(); - $admin->setEmail('admin@kaz.bzh'); - $admin->setRoles(['ROLE_USER', 'ROLE_ADMIN', 'ROLE_ORGANISATION']); - $admin->setPassword($this->hasher->hashPassword($admin, 'password')); - $admin->setFirstName('Admin'); - $admin->setLastName('KAZ'); - - // Remplissage des champs obligatoires restants pour éviter les erreurs SQL - $admin->setEmailDeSecours('secours@kaz.bzh'); - $admin->setIdentifiantKaz('ADMIN-KAZ-001'); - $admin->setQuota('5G'); - $admin->setEmailQuota('1G'); - $admin->setNextcloudQuota('10G'); - $admin->setHasNextcloudAccess(true); - $admin->setHasMobilizon(true); - $admin->setHasAgoraAccess(true); - - $manager->persist($admin); - # Préparation de l'enregistrement de l'objet en base de données $manager->persist($user); - - # Exécution réelle des requêtes SQL (envoi vers la base), une fois la bouche finie - $manager->flush(); } + + // Création d'un compte de test fixe + $admin = new User(); + $admin->setEmail('admin@kaz.bzh'); + $admin->setRoles(['ROLE_USER', 'ROLE_ADMIN', 'ROLE_ORGANISATION']); + $admin->setPassword($this->hasher->hashPassword($admin, 'password')); + $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'); + $admin->setEmailQuota('1G'); + $admin->setNextcloudQuota('10G'); + $admin->setHasNextcloudAccess(true); + $admin->setHasMobilizon(true); + $admin->setHasAgoraAccess(true); + + $manager->persist($admin); + + // Création d'un compte de test fixe + $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'); + $melvin->setEmailQuota('1G'); + $melvin->setNextcloudQuota('10G'); + $melvin->setHasNextcloudAccess(true); + $melvin->setHasMobilizon(true); + $melvin->setHasAgoraAccess(true); + + $manager->persist($melvin); + + # Exécution réelle des requêtes SQL (envoi vers la base), une fois la bouche finie + $manager->flush(); + } } diff --git a/src/Entity/User.php b/src/Entity/User.php index 8bb39ff..88e6bf1 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -12,14 +12,16 @@ use Symfony\Component\Uid\Uuid; #[ORM\Entity(repositoryClass: UserRepository::class)] #[ORM\Table(name: '`user`')] -#[ORM\UniqueConstraint(name: 'UNIQ_IDENTIFIER_EMAIL', fields: ['email'])] #[UniqueEntity(fields: ['email'], message: 'There is already an account with this email')] class User implements UserInterface, PasswordAuthenticatedUserInterface { + + public const string EMAIL_QUOTA_DEFAULT = '1G'; + #[ORM\Id] #[ORM\GeneratedValue(strategy: 'CUSTOM')] #[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')] - #[ORM\Column(type: 'uuid', unique: true)] + #[ORM\Column(type: 'uuid', unique: true, name: 'id')] private ?Uuid $id; #[ORM\Column(length: 180, unique: true)] @@ -28,51 +30,56 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface /** * @var list The user roles */ - #[ORM\Column] + #[ORM\Column(name: 'roles')] private array $roles = []; /** * @var ?string The hashed password */ - #[ORM\Column] + #[ORM\Column(name: 'password')] private ?string $password = null; - #[ORM\Column(length: 255)] - private ?string $emailQuota = '1G'; + #[ORM\Column(length: 255, name: 'email_quota')] + private ?string $emailQuota = null; - #[ORM\Column(length: 255)] - private ?string $emailDeSecours = null; + #[ORM\Column(length: 255, name: 'alternate_email')] + private ?string $alternateEmail = null; - #[ORM\Column(length: 255)] + #[ORM\Column(length: 255, name: 'identifiant_kaz')] private ?string $identifiantKaz = null; - #[ORM\Column(length: 255)] + #[ORM\Column(length: 255, name: 'quota')] private ?string $quota = null; - #[ORM\Column] + #[ORM\Column(name: 'has_nextcloud_access')] private ?bool $hasNextcloudAccess = null; - #[ORM\Column(length: 255)] + #[ORM\Column(length: 255, name: 'nextcloud_quota')] private ?string $nextcloudQuota = null; - #[ORM\Column] + #[ORM\Column(name: 'has_mobilizon')] private ?bool $hasMobilizon = null; - #[ORM\Column] + #[ORM\Column(name: 'has_agora_access')] private ?bool $hasAgoraAccess = null; - #[ORM\Column(length: 255)] + #[ORM\Column(length: 255, name: 'last_name')] private ?string $lastName = null; - #[ORM\Column(length: 255)] + #[ORM\Column(length: 255, name: 'first_name')] private ?string $firstName = null; - #[ORM\Column(length: 255, nullable: true)] + // TODO: Modifier "photo" par "image" + #[ORM\Column(length: 255, nullable: true, name: 'photo')] private ?string $photo = null; - #[ORM\Column(length: 20, nullable: true)] + #[ORM\Column(length: 20, nullable: true, name: 'telephone')] private ?string $telephone = null; + public function __construct() { + $this->emailQuota = self::EMAIL_QUOTA_DEFAULT; + } + public function getId(): ?Uuid { return $this->id; @@ -175,14 +182,14 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface return $this; } - public function getEmailDeSecours(): ?string + public function getAlternateEmail(): ?string { - return $this->emailDeSecours; + return $this->alternateEmail; } - public function setEmailDeSecours(string $emailDeSecours): static + public function setAlternateEmail(string $alternateEmail): static { - $this->emailDeSecours = $emailDeSecours; + $this->alternateEmail = $alternateEmail; return $this; } @@ -306,4 +313,19 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface return $this; } + + public function updateFromKazUser($kazUser) : User + { + $this->setEmail($kazUser['mail']); + // Création du firstname et lastname + $name = explode(' ', $kazUser['sn']); + $this->setFirstName($name[0]); + // Récupération des valeurs du tableau moins la première + $aLastname = array_slice($name, 1); + $this->setLastName(implode(' ', $aLastname)); + + //TODO: Ajouter les champs manquants de l'objet User dans l'api kaz. + + return $this; + } } diff --git a/src/Form/UserProfileType.php b/src/Form/UserProfileType.php index 8307cae..566ca32 100644 --- a/src/Form/UserProfileType.php +++ b/src/Form/UserProfileType.php @@ -31,7 +31,7 @@ class UserProfileType extends AbstractType 'label' => 'E-mail', 'disabled' => true, ]) - ->add('emailDeSecours', EmailType::class, ['label' => 'E-mail de secours']) + ->add('alternateEmail', EmailType::class, ['label' => 'E-mail de secours']) ->add('telephone', TelType::class, [ 'label'=>'Téléphone', 'required' => false, diff --git a/src/Services/FileUploader.php b/src/Service/FileUploader.php similarity index 93% rename from src/Services/FileUploader.php rename to src/Service/FileUploader.php index d5675ca..627af1d 100644 --- a/src/Services/FileUploader.php +++ b/src/Service/FileUploader.php @@ -34,7 +34,7 @@ class FileUploader public function delete(?string $fileName): void { if ($fileName) { - $filePath = $this->getTargetDirectory() . '/' . $fileName; + $filePath = $this->getTargetDirectory() . 'FileUploader.php/' . $fileName; if (file_exists($filePath)) { unlink($filePath); } diff --git a/src/Service/KazApiService.php b/src/Service/KazApiService.php index 54fb8cc..e754325 100644 --- a/src/Service/KazApiService.php +++ b/src/Service/KazApiService.php @@ -14,12 +14,18 @@ use Symfony\Contracts\HttpClient\HttpClientInterface; class KazApiService { private ?string $token = null; + private HttpClientInterface $httpClient; public function __construct( private readonly HttpClientInterface $kazApiClient, private readonly string $apiUser, private readonly string $apiPassword - ) {} + ) { + $this->httpClient = $kazApiClient->withOptions([ + 'auth_basic' => [$apiUser, $apiPassword] + ]); + + } /** * Récupère le token JWT via l'authentification Basic @@ -37,16 +43,14 @@ class KazApiService return $this->token; } - $response = $this->kazApiClient->request('POST', '/get_token', [ - 'auth_basic' => [$this->apiUser, $this->apiPassword] - ]); + $response = $this->httpClient->request('GET', '/get_token'); if ($response->getStatusCode() !== 200) { - throw new Exception('Impossible de récupérer le token JWT'); + throw new Exception('Impossible de récupérer le token JWT'.$response->getStatusCode()); } $data = $response->toArray(); - $this->token = $data['token']; // Ajustez la clé selon le format de votre API + $this->token = $data['access_token']; // Ajustez la clé selon le format de votre API return $this->token; } @@ -68,7 +72,6 @@ class KazApiService public function getUserData(string $email): array { $options['headers']['Authorization'] = 'Bearer ' . $this->getToken(); - $response = $this->kazApiClient->request('GET', "/ldap/user/$email", $options); if ($response->getStatusCode() !== 200) { @@ -77,4 +80,4 @@ class KazApiService return $response->toArray(); } -} \ No newline at end of file +} diff --git a/templates/user/index.html.twig b/templates/user/index.html.twig index efb8b16..aacef5f 100644 --- a/templates/user/index.html.twig +++ b/templates/user/index.html.twig @@ -110,15 +110,15 @@ {# Champ E-mail de secours #}
- {{ form_label(form.emailDeSecours, 'E-mail de secours :', { + {{ form_label(form.alternateEmail, 'E-mail de secours :', { 'label_attr': {'class': 'block text-sm font-semibold text-text'} }) }} - {{ form_widget(form.emailDeSecours, { + {{ form_widget(form.alternateEmail, { 'attr': {'class': 'w-full px-4 py-3 border border-gris-clair rounded-lg focus:outline-none focus:border-bouton focus:ring-1 focus:ring-bouton placeholder-gris-moyen transition-shadow'} }) }} {# Implémentation d'un message d'errer en cas de problème #}
- {{ form_errors(form.emailDeSecours) }} + {{ form_errors(form.alternateEmail) }}
diff --git a/templates/user/profil_infos.html.twig b/templates/user/profil_infos.html.twig new file mode 100644 index 0000000..cc4c326 --- /dev/null +++ b/templates/user/profil_infos.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}Accueil | {{ parent() }}{% endblock %} + +{% block body %} +
+
+ Identifiant : {{ user.identifiantKaz }} +
+
+{% endblock %} diff --git a/true], b/true], deleted file mode 100644 index e69de29..0000000 From 3821006ef366018b0703750efaf7b81bb1772c6c Mon Sep 17 00:00:00 2001 From: MLeveque Date: Sun, 29 Mar 2026 13:47:07 +0200 Subject: [PATCH 3/3] =?UTF-8?q?feat(api=20kaz):=20Connexion=20=C3=A0=20l'a?= =?UTF-8?q?pi=20kaz.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Suppression des migrations, templates et configurations inutiles (ex. `compose.override.yaml`). - Mise à jour de l'entité `User` : - Renommage des attributs pour correspondre aux conventions (`emailDeSecours` → `alternateEmail`, etc.). - Implémentation d'un mapper `updateFromKazUser` pour synchroniser les données depuis l'API Kaz. - Refactorisation des migrations pour aligner les changements de schéma. - Mise à jour du formulaire utilisateur et des fixtures en conséquence. - Ajout du template Twig `profil_infos.html.twig` pour afficher les informations utilisateur. (A supprimer) --- migrations/Version20260328101039.php | 35 ++++++++++++++++++++++++++++ migrations/Version20260328101220.php | 35 ++++++++++++++++++++++++++++ migrations/Version20260329084928.php | 35 ++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 migrations/Version20260328101039.php create mode 100644 migrations/Version20260328101220.php create mode 100644 migrations/Version20260329084928.php diff --git a/migrations/Version20260328101039.php b/migrations/Version20260328101039.php new file mode 100644 index 0000000..3c11da4 --- /dev/null +++ b/migrations/Version20260328101039.php @@ -0,0 +1,35 @@ +addSql('CREATE TABLE "user" (id UUID NOT NULL, email VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, email_quota VARCHAR(255) NOT NULL, alternate_email VARCHAR(255) NOT NULL, identifiant_kaz VARCHAR(255) NOT NULL, quota VARCHAR(255) NOT NULL, has_nextcloud_access BOOLEAN NOT NULL, nextcloud_quota VARCHAR(255) NOT NULL, has_mobilizon BOOLEAN NOT NULL, has_agora_access BOOLEAN NOT NULL, last_name VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, photo VARCHAR(255) DEFAULT NULL, telephone VARCHAR(20) DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_EMAIL ON "user" (email)'); + $this->addSql('CREATE TABLE messenger_messages (id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, body TEXT NOT NULL, headers TEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, available_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, delivered_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0E3BD61CE16BA31DBBF396750 ON messenger_messages (queue_name, available_at, delivered_at, id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('DROP TABLE "user"'); + $this->addSql('DROP TABLE messenger_messages'); + } +} diff --git a/migrations/Version20260328101220.php b/migrations/Version20260328101220.php new file mode 100644 index 0000000..d51320f --- /dev/null +++ b/migrations/Version20260328101220.php @@ -0,0 +1,35 @@ +addSql('CREATE TABLE "user" (id UUID NOT NULL, email VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, email_quota VARCHAR(255) NOT NULL, alternate_email VARCHAR(255) NOT NULL, identifiant_kaz VARCHAR(255) NOT NULL, quota VARCHAR(255) NOT NULL, has_nextcloud_access BOOLEAN NOT NULL, nextcloud_quota VARCHAR(255) NOT NULL, has_mobilizon BOOLEAN NOT NULL, has_agora_access BOOLEAN NOT NULL, last_name VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, photo VARCHAR(255) DEFAULT NULL, telephone VARCHAR(20) DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_EMAIL ON "user" (email)'); + $this->addSql('CREATE TABLE messenger_messages (id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, body TEXT NOT NULL, headers TEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, available_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, delivered_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0E3BD61CE16BA31DBBF396750 ON messenger_messages (queue_name, available_at, delivered_at, id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('DROP TABLE "user"'); + $this->addSql('DROP TABLE messenger_messages'); + } +} diff --git a/migrations/Version20260329084928.php b/migrations/Version20260329084928.php new file mode 100644 index 0000000..aa29b31 --- /dev/null +++ b/migrations/Version20260329084928.php @@ -0,0 +1,35 @@ +addSql('CREATE TABLE "user" (id UUID NOT NULL, email VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, email_quota VARCHAR(255) NOT NULL, alternate_email VARCHAR(255) NOT NULL, identifiant_kaz VARCHAR(255) NOT NULL, quota VARCHAR(255) NOT NULL, has_nextcloud_access BOOLEAN NOT NULL, nextcloud_quota VARCHAR(255) NOT NULL, has_mobilizon BOOLEAN NOT NULL, has_agora_access BOOLEAN NOT NULL, last_name VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, photo VARCHAR(255) DEFAULT NULL, telephone VARCHAR(20) DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_IDENTIFIER_EMAIL ON "user" (email)'); + $this->addSql('CREATE TABLE messenger_messages (id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, body TEXT NOT NULL, headers TEXT NOT NULL, queue_name VARCHAR(190) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, available_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, delivered_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_75EA56E0FB7336F0E3BD61CE16BA31DBBF396750 ON messenger_messages (queue_name, available_at, delivered_at, id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('DROP TABLE "user"'); + $this->addSql('DROP TABLE messenger_messages'); + } +}