UserApiController
extends AbstractController
in package
Contrôleur d'API dédié au compte utilisateur.
Il couvre la consultation et la mise à jour du profil de l'utilisateur authentifié
(informations d'identité, coordonnées, photo de profil), la suppression définitive
du compte via AccountDeletionService, ainsi que l'activation administrateur
des comptes entreprise. L'authentification s'effectue par jeton JWT (bearerAuth) ;
chaque action porte son propre contrôle d'accès.
Préfixe de route : /api/users. Aucun rôle exigé au niveau de la classe.
Attributes
- #[Route]
- '/api/users'
- $name: 'api_users_'
- #[Tag]
- $name: 'Users'
- $description: 'Gestion des utilisateurs'
Table of Contents
Properties
- $accountDeletionService : AccountDeletionService
- $entityManager : EntityManagerInterface
- $logger : LoggerInterface
- $uploaderService : UploaderService
Methods
- __construct() : mixed
- activateBusiness() : JsonResponse
- Active le compte d'un utilisateur entreprise (action d'administration).
- deleteAccount() : JsonResponse
- Supprime définitivement le compte de l'utilisateur authentifié.
- getProfile() : JsonResponse
- Retourne le profil de l'utilisateur authentifié.
- updateProfile() : JsonResponse
- Met à jour le profil de l'utilisateur authentifié.
Properties
$accountDeletionService read-only
private
AccountDeletionService
$accountDeletionService
$entityManager read-only
private
EntityManagerInterface
$entityManager
$logger read-only
private
LoggerInterface
$logger
$uploaderService read-only
private
UploaderService
$uploaderService
Methods
__construct()
public
__construct(EntityManagerInterface $entityManager, UploaderService $uploaderService, AccountDeletionService $accountDeletionService, LoggerInterface $logger) : mixed
Parameters
- $entityManager : EntityManagerInterface
-
Gestionnaire d'entités Doctrine, utilisé pour persister l'activation des comptes entreprise.
- $uploaderService : UploaderService
-
Service d'upload utilisé pour stocker la photo de profil.
- $accountDeletionService : AccountDeletionService
-
Service encapsulant la suppression et l'anonymisation d'un compte.
- $logger : LoggerInterface
-
Journalisation des échecs de suppression de compte.
activateBusiness()
Active le compte d'un utilisateur entreprise (action d'administration).
public
activateBusiness(int $id, UserRepository $userRepository) : JsonResponse
Recherche l'utilisateur ciblé, refuse l'opération s'il n'est rattaché à aucune
entreprise (getCompany() vide), puis positionne son indicateur activated à
true et persiste la modification. L'appel est idempotent : réactiver un compte
déjà actif renvoie le même message de succès.
Route : /api/users/business/activate/{id} (POST), nom api_users_activate_business. Requiert ROLE_ADMIN.
Réponses : 200 compte activé, 400 utilisateur sans entreprise rattachée,
404 utilisateur inexistant, 403 appelant sans ROLE_ADMIN, 401 requête non authentifiée.
Parameters
- $id : int
-
Identifiant de l'utilisateur entreprise à activer.
- $userRepository : UserRepository
-
Dépôt utilisé pour retrouver l'utilisateur.
Attributes
- #[IsGranted]
- 'ROLE_ADMIN'
- #[Post]
- $path: '/api/users/business/activate/{id}'
- $description: 'Permet à un administrateur d\'activer un compte entreprise'
- $summary: 'Active un compte entreprise'
- $security: [['bearerAuth' => []]]
- $tags: ['Users']
- $parameters: [new OA\Parameter(name: 'id', description: 'ID de l\'utilisateur entreprise à activer', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))]
- $responses: [new OA\Response(response: 200, description: 'Compte entreprise activé avec succès', content: new OA\JsonContent(properties: [new OA\Property(property: 'message', type: 'string', example: 'Compte entreprise activé avec succès')])), new OA\Response(response: 404, description: 'Utilisateur non trouvé'), new OA\Response(response: 403, description: 'Accès refusé - Administrateur requis')]
- #[Route]
- '/business/activate/{id}'
- $name: 'activate_business'
- $methods: ['POST']
Return values
JsonResponse —Message de confirmation ou message d'erreur sous la clé error.
deleteAccount()
Supprime définitivement le compte de l'utilisateur authentifié.
public
deleteAccount() : JsonResponse
Délègue l'intégralité du traitement à AccountDeletionService::deleteAccount(), qui supprime le compte et anonymise les données historiques associées. Toute exception levée est interceptée, journalisée (message, ligne, fichier) puis convertie en réponse 500 : aucune erreur technique n'est exposée à l'appelant. L'opération est irréversible.
Route : /api/users/profile (DELETE), nom api_users_delete_account. Requiert IS_AUTHENTICATED_FULLY.
Réponses : 200 suppression effectuée, 401 requête non authentifiée, 500 échec de la suppression (exception interceptée et journalisée).
Attributes
- #[Delete]
- $path: '/api/users/profile'
- $description: "Supprime définitivement le compte de l'utilisateur connecté. Cette action est irréversible et anonymise les données historiques."
- $summary: "Supprimer mon compte"
- $security: [['bearerAuth' => []]]
- $tags: ['Users']
- $responses: [new OA\Response(response: 200, description: 'Compte supprimé avec succès', content: new OA\JsonContent(properties: [new OA\Property(property: 'message', type: 'string', example: 'Votre compte a été supprimé avec succès')])), new OA\Response(response: 401, description: 'Non authentifié'), new OA\Response(response: 500, description: 'Erreur interne lors de la suppression')]
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
- #[Route]
- '/profile'
- $name: 'delete_account'
- $methods: ['DELETE']
Return values
JsonResponse —Message de confirmation, ou {"error": …} en cas d'échec.
getProfile()
Retourne le profil de l'utilisateur authentifié.
public
getProfile() : JsonResponse
Construit manuellement la charge utile à partir de l'utilisateur porté par le jeton :
aucun groupe de sérialisation n'est employé. Le champ roles est renvoyé bien qu'il
ne figure pas dans le schéma OpenApi déclaré sur la méthode.
Route : /api/users/profile (GET), nom api_users_profile. Requiert IS_AUTHENTICATED_FULLY.
Réponses : 200 profil renvoyé, 401 requête non authentifiée (jeton absent ou invalide).
Attributes
- #[Get]
- $path: '/api/users/profile'
- $description: 'Récupère les informations du profil de l\'utilisateur actuellement connecté'
- $summary: 'Récupère le profil de l\'utilisateur connecté'
- $security: [['bearerAuth' => []]]
- $tags: ['Users']
- $responses: [new OA\Response(response: 200, description: 'Profil utilisateur récupéré avec succès', content: new OA\JsonContent(properties: [new OA\Property(property: 'id', type: 'integer', example: 1), new OA\Property(property: 'email', type: 'string', example: 'user@example.com'), new OA\Property(property: 'name', type: 'string', example: 'John Doe'), new OA\Property(property: 'phone_number', type: 'string', example: '+33123456789'), new OA\Property(property: 'isActivated', type: 'boolean', example: true), new OA\Property(property: 'position', type: 'string', example: 'Directeur'), new OA\Property(property: 'website', type: 'string', example: 'https://example.com'), new OA\Property(property: 'profil_img', type: 'string', example: 'profile.jpg')])), new OA\Response(response: 401, description: 'Non authentifié')]
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
- #[Route]
- '/profile'
- $name: 'profile'
- $methods: ['GET']
Return values
JsonResponse —Objet JSON {id, email, name, phone_number, isActivated, position, website, profil_img, roles}.
updateProfile()
Met à jour le profil de l'utilisateur authentifié.
public
updateProfile(Request $request, UserRepository $userRepository, ValidatorInterface $validator, EntityManagerInterface $entityManager) : JsonResponse
Fusionne les paramètres de formulaire (multipart/form-data, ce qui autorise le
tunnel _method) avec un éventuel corps JSON, puis applique champ par champ les
clés name, phone_number, position et website — seules les clés réellement
présentes sont écrites, une chaîne vide écrase donc la valeur existante.
L'email, s'il est fourni et non vide, est nettoyé, validé par la contrainte
Email puis vérifié en unicité contre les autres comptes avant affectation.
Un fichier profil_img déclenche la suppression physique de l'ancienne image dans
le répertoire profile_user_directory puis l'upload de la nouvelle via
UploaderService::uploadFile(). L'entité est enfin validée globalement avant
flush().
Route : /api/users/profile (POST), nom api_users_update_profile. Requiert IS_AUTHENTICATED_FULLY.
Corps attendu (multipart ou JSON, toutes les clés optionnelles) :
{"name": "string — nom affiché", "phone_number": "string — téléphone", "position": "string — fonction", "website": "string — URL du site", "email": "string — nouvel email, validé et unique", "profil_img": "file — image de profil (multipart uniquement)"}
Réponses : 200 profil enregistré, 400 email invalide ({"error": …}), 400 email déjà
utilisé par un autre compte ({"error": …}), 400 violations de contraintes sur l'entité
({"errors": [...]}), 401 requête non authentifiée.
Parameters
- $request : Request
-
Requête HTTP portant les champs de formulaire, le JSON et le fichier.
- $userRepository : UserRepository
-
Dépôt utilisé pour contrôler l'unicité de l'email.
- $validator : ValidatorInterface
-
Validateur appliqué à l'email puis à l'entité complète.
- $entityManager : EntityManagerInterface
-
Gestionnaire d'entités utilisé pour le
flush()final.
Attributes
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
- #[Post]
- $path: '/api/users/profile'
- $description: "Met à jour le profil."
- $summary: "Met à jour le profil de l'utilisateur"
- $security: [['bearerAuth' => []]]
- $requestBody: new OA\RequestBody(required: true, content: new OA\MediaType(mediaType: 'multipart/form-data', schema: new OA\Schema(properties: [new OA\Property(property: 'name', type: 'string', example: 'Naruto Uzumaki'), new OA\Property(property: 'phone_number', type: 'string', example: '+33612345678'), new OA\Property(property: 'position', type: 'string', example: 'Hokage'), new OA\Property(property: 'website', type: 'string', example: 'https://konoha.jp'), new OA\Property(property: 'email', type: 'string', format: 'email', example: 'naruto@gmail.com'), new OA\Property(property: 'profil_img', type: 'string', format: 'binary'), new OA\Property(property: '_method', type: 'string', example: 'PUT')])))
- $tags: ['Users']
- $responses: [new OA\Response(response: 200, description: 'Profil mis à jour avec succès'), new OA\Response(response: 400, description: 'Données invalides ou email déjà utilisé'), new OA\Response(response: 401, description: 'Non authentifié')]
- #[Route]
- '/profile'
- $name: 'update_profile'
- $methods: ['POST']
Return values
JsonResponse —Message de confirmation et sous-objet user (id, email, name, profil_img), ou erreurs de validation.