EmployeeApiController
extends AbstractController
in package
Contrôleur d'API de gestion des employés rattachés à un compte entreprise.
Il expose un CRUD complet sur les employés (liste paginée, détail avec les cartes de
visite associées, création, mise à jour, suppression). La liste et la création
exigent en plus que l'utilisateur authentifié dispose d'une entreprise et d'un compte
activé ; le détail, la mise à jour et la suppression s'appuient sur un contrôle de
propriété avec dérogation pour ROLE_ADMIN.
Préfixe de route : /api/employees. Toutes les actions exigent IS_AUTHENTICATED_FULLY
(jeton JWT bearerAuth).
Attributes
- #[Route]
- '/api/employees'
- $name: 'api_employees_'
- #[Tag]
- $name: 'Employees'
- $description: 'Gestion des employés'
Table of Contents
Properties
- $entityManager : EntityManagerInterface
- $validator : ValidatorInterface
Methods
- __construct() : mixed
- create() : JsonResponse
- Crée un employé pour l'entreprise de l'utilisateur.
- delete() : JsonResponse
- Supprime un employé de l'entreprise.
- list() : JsonResponse
- Retourne la liste paginée des employés de l'entreprise de l'utilisateur.
- show() : JsonResponse
- Retourne le détail d'un employé et ses cartes de visite.
- update() : JsonResponse
- Met à jour un employé existant.
Properties
$entityManager read-only
private
EntityManagerInterface
$entityManager
$validator read-only
private
ValidatorInterface
$validator
Methods
__construct()
public
__construct(EntityManagerInterface $entityManager, ValidatorInterface $validator) : mixed
Parameters
- $entityManager : EntityManagerInterface
-
Gestionnaire d'entités Doctrine, utilisé pour les dépôts, la persistance et la suppression.
- $validator : ValidatorInterface
-
Validateur appliqué à l'entité Employee avant écriture.
create()
Crée un employé pour l'entreprise de l'utilisateur.
public
create(Request $request) : JsonResponse
Exige un compte entreprise activé, puis contrôle la présence non vide des champs
firstname, lastname et email. L'unicité de l'email est vérifiée dans le
périmètre de l'utilisateur courant uniquement. Les champs phone, position et
department sont optionnels et valorisés à null s'ils sont absents. L'entité est
validée avant persistance.
Remarque : l'employé créé n'est pas explicitement rattaché à l'utilisateur courant dans cette méthode, alors que les contrôles de doublon et les autres actions s'appuient sur cette association.
Route : /api/employees (POST), nom api_employees_create. Requiert IS_AUTHENTICATED_FULLY.
Corps attendu : {"firstname": "string — obligatoire", "lastname": "string — obligatoire", "email": "string — obligatoire, unique pour l'entreprise", "phone": "string — optionnel", "position": "string — optionnel", "department": "string — optionnel"}
Réponses : 201 employé créé ({message, employee_id}), 400 champ obligatoire manquant
ou vide, 400 email déjà utilisé par un employé, 400 violations de contraintes
({"errors": [...]}), 403 utilisateur sans entreprise ou compte non activé,
401 requête non authentifiée.
Parameters
- $request : Request
-
Requête HTTP dont le corps JSON décrit l'employé à créer.
Attributes
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
- #[Post]
- $path: '/api/employees'
- $description: 'Crée un nouvel employé pour l\'entreprise'
- $summary: 'Crée un nouvel employé'
- $security: [['bearerAuth' => []]]
- $requestBody: new OA\RequestBody(required: true, content: new OA\JsonContent(required: ['firstname', 'lastname', 'email'], properties: [new OA\Property(property: 'firstname', type: 'string', example: 'John'), new OA\Property(property: 'lastname', type: 'string', example: 'Doe'), new OA\Property(property: 'email', type: 'string', example: 'john@example.com'), new OA\Property(property: 'phone', type: 'string', example: '+33123456789'), new OA\Property(property: 'position', type: 'string', example: 'Développeur'), new OA\Property(property: 'department', type: 'string', example: 'IT')]))
- $tags: ['Employees']
- $responses: [new OA\Response(response: 201, description: 'Employé créé avec succès', content: new OA\JsonContent(properties: [new OA\Property(property: 'message', type: 'string', example: 'Employé créé avec succès'), new OA\Property(property: 'employee_id', type: 'integer', example: 1)])), new OA\Response(response: 400, description: 'Données invalides'), new OA\Response(response: 401, description: 'Non authentifié'), new OA\Response(response: 403, description: 'Accès refusé - Compte entreprise requis')]
- #[Route]
- ''
- $name: 'create'
- $methods: ['POST']
Return values
JsonResponse —Message de confirmation et identifiant du nouvel employé, ou erreurs.
delete()
Supprime un employé de l'entreprise.
public
delete(int $id, EmployeeRepository $employeeRepository) : JsonResponse
Après contrôle de propriété (avec dérogation ROLE_ADMIN), l'entité est retirée
définitivement de la base. Aucune vérification préalable des cartes de visite
rattachées n'est effectuée : leur sort dépend de la configuration des cascades
Doctrine sur l'association.
Route : /api/employees/{id} (DELETE), nom api_employees_delete. Requiert IS_AUTHENTICATED_FULLY.
Réponses : 200 employé supprimé, 403 employé appartenant à un autre utilisateur (hors administrateur), 404 employé inexistant, 401 requête non authentifiée.
Parameters
- $id : int
-
Identifiant de l'employé à supprimer.
- $employeeRepository : EmployeeRepository
-
Dépôt utilisé pour retrouver l'employé.
Attributes
- #[Delete]
- $path: '/api/employees/{id}'
- $description: 'Supprime un employé de l\'entreprise'
- $summary: 'Supprime un employé'
- $security: [['bearerAuth' => []]]
- $tags: ['Employees']
- $parameters: [new OA\Parameter(name: 'id', description: 'ID de l\'employé à supprimer', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))]
- $responses: [new OA\Response(response: 200, description: 'Employé supprimé avec succès', content: new OA\JsonContent(properties: [new OA\Property(property: 'message', type: 'string', example: 'Employé supprimé avec succès')])), new OA\Response(response: 404, description: 'Employé non trouvé'), new OA\Response(response: 403, description: 'Accès refusé')]
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
- #[Route]
- '/{id}'
- $name: 'delete'
- $methods: ['DELETE']
Return values
JsonResponse —Message de confirmation, ou message d'erreur sous la clé error.
list()
Retourne la liste paginée des employés de l'entreprise de l'utilisateur.
public
list(Request $request, EmployeeRepository $employeeRepository) : JsonResponse
Exige d'abord que l'utilisateur possède une entreprise et un compte activé.
Les employés sont ensuite filtrés sur l'utilisateur courant et triés par
created_at décroissant ; page est ramené à 1 au minimum et limit est borné
à l'intervalle [1, 50] (défaut 10). Pour chaque employé, le nombre de cartes de
visite associées est calculé en comptant la collection businessCardAizes.
Route : /api/employees (GET), nom api_employees_list. Requiert IS_AUTHENTICATED_FULLY.
Paramètres de requête : page (optionnel, défaut 1), limit (optionnel, défaut 10, plafonné à 50).
Réponses : 200 liste renvoyée, 403 utilisateur sans entreprise ou compte non activé, 401 requête non authentifiée.
Parameters
- $request : Request
-
Requête HTTP portant les paramètres de pagination.
- $employeeRepository : EmployeeRepository
-
Dépôt utilisé pour la recherche et le comptage.
Attributes
- #[Get]
- $path: '/api/employees'
- $description: 'Récupère la liste des employés de l\'entreprise de l\'utilisateur connecté'
- $summary: 'Liste les employés de l\'entreprise'
- $security: [['bearerAuth' => []]]
- $tags: ['Employees']
- $parameters: [new OA\Parameter(name: 'page', description: 'Numéro de page', in: 'query', required: false, schema: new OA\Schema(type: 'integer', default: 1)), new OA\Parameter(name: 'limit', description: 'Nombre d\'éléments par page', in: 'query', required: false, schema: new OA\Schema(type: 'integer', default: 10))]
- $responses: [new OA\Response(response: 200, description: 'Liste des employés récupérée avec succès', content: new OA\JsonContent(properties: [new OA\Property(property: 'employees', type: 'array', items: new OA\Items(properties: [new OA\Property(property: 'id', type: 'integer', example: 1), new OA\Property(property: 'firstname', type: 'string', example: 'John'), new OA\Property(property: 'lastname', type: 'string', example: 'Doe'), new OA\Property(property: 'email', type: 'string', example: 'john@example.com'), new OA\Property(property: 'phone', type: 'string', example: '+33123456789'), new OA\Property(property: 'position', type: 'string', example: 'Développeur'), new OA\Property(property: 'department', type: 'string', example: 'IT'), new OA\Property(property: 'created_at', type: 'string', format: 'date-time'), new OA\Property(property: 'business_cards_count', type: 'integer', example: 2)])), new OA\Property(property: 'pagination', properties: [new OA\Property(property: 'current_page', type: 'integer'), new OA\Property(property: 'total_pages', type: 'integer'), new OA\Property(property: 'total_items', type: 'integer'), new OA\Property(property: 'items_per_page', type: 'integer')], type: 'object')])), new OA\Response(response: 401, description: 'Non authentifié'), new OA\Response(response: 403, description: 'Accès refusé - Compte entreprise requis')]
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
- #[Route]
- ''
- $name: 'list'
- $methods: ['GET']
Return values
JsonResponse —Objet JSON {employees: list<array<string, mixed>>, pagination: array<string, int|float>}.
show()
Retourne le détail d'un employé et ses cartes de visite.
public
show(int $id, EmployeeRepository $employeeRepository) : JsonResponse
L'employé est chargé par sa clé primaire, puis un contrôle de propriété est
appliqué : seul l'utilisateur propriétaire, ou un porteur de ROLE_ADMIN, y a
accès. La charge utile inclut la liste complète, non paginée, des cartes de visite
rattachées à l'employé. Contrairement à
EmployeeApiController::list(), aucune vérification du statut entreprise
ou d'activation n'est effectuée ici.
Route : /api/employees/{id} (GET), nom api_employees_show. Requiert IS_AUTHENTICATED_FULLY.
Réponses : 200 employé renvoyé, 403 employé appartenant à un autre utilisateur (hors administrateur), 404 employé inexistant, 401 requête non authentifiée.
Parameters
- $id : int
-
Identifiant de l'employé, issu du chemin.
- $employeeRepository : EmployeeRepository
-
Dépôt utilisé pour retrouver l'employé.
Attributes
- #[Get]
- $path: '/api/employees/{id}'
- $description: 'Récupère les détails d\'un employé spécifique'
- $summary: 'Récupère un employé par son ID'
- $security: [['bearerAuth' => []]]
- $tags: ['Employees']
- $parameters: [new OA\Parameter(name: 'id', description: 'ID de l\'employé', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))]
- $responses: [new OA\Response(response: 200, description: 'Détails de l\'employé', content: new OA\JsonContent(properties: [new OA\Property(property: 'id', type: 'integer', example: 1), new OA\Property(property: 'firstname', type: 'string', example: 'John'), new OA\Property(property: 'lastname', type: 'string', example: 'Doe'), new OA\Property(property: 'email', type: 'string', example: 'john@example.com'), new OA\Property(property: 'phone', type: 'string', example: '+33123456789'), new OA\Property(property: 'position', type: 'string', example: 'Développeur'), new OA\Property(property: 'department', type: 'string', example: 'IT'), new OA\Property(property: 'created_at', type: 'string', format: 'date-time'), new OA\Property(property: 'business_cards', type: 'array', items: new OA\Items(properties: [new OA\Property(property: 'id', type: 'integer'), new OA\Property(property: 'firstname', type: 'string'), new OA\Property(property: 'lastname', type: 'string'), new OA\Property(property: 'email', type: 'string'), new OA\Property(property: 'phone', type: 'string'), new OA\Property(property: 'position', type: 'string'), new OA\Property(property: 'created_at', type: 'string', format: 'date-time')]))])), new OA\Response(response: 404, description: 'Employé non trouvé'), new OA\Response(response: 403, description: 'Accès refusé')]
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
- #[Route]
- '/{id}'
- $name: 'show'
- $methods: ['GET']
Return values
JsonResponse —Objet JSON {id, firstname, lastname, email, phone, position, department, created_at, business_cards} ou message d'erreur.
update()
Met à jour un employé existant.
public
update(int $id, Request $request, EmployeeRepository $employeeRepository) : JsonResponse
Après contrôle de propriété (avec dérogation ROLE_ADMIN), seuls les champs
réellement présents dans le corps JSON sont appliqués : la requête se comporte
comme une mise à jour partielle malgré le verbe PUT. La modification de l'email
déclenche une vérification d'unicité restreinte aux autres employés du même
utilisateur, l'employé courant étant exclu de la requête. L'entité est validée
avant flush().
Route : /api/employees/{id} (PUT), nom api_employees_update. Requiert IS_AUTHENTICATED_FULLY.
Corps attendu (toutes les clés optionnelles) : {"firstname": "string", "lastname": "string", "email": "string — contrôlé en unicité", "phone": "string", "position": "string", "department": "string"}
Réponses : 200 employé mis à jour, 400 email déjà utilisé par un autre employé,
400 violations de contraintes ({"errors": [...]}), 403 employé appartenant à un
autre utilisateur (hors administrateur), 404 employé inexistant,
401 requête non authentifiée.
Parameters
- $id : int
-
Identifiant de l'employé à mettre à jour.
- $request : Request
-
Requête HTTP dont le corps JSON porte les champs à modifier.
- $employeeRepository : EmployeeRepository
-
Dépôt utilisé pour retrouver l'employé.
Attributes
- #[IsGranted]
- 'IS_AUTHENTICATED_FULLY'
- #[Put]
- $path: '/api/employees/{id}'
- $description: 'Met à jour les informations d\'un employé'
- $summary: 'Met à jour un employé'
- $security: [['bearerAuth' => []]]
- $requestBody: new OA\RequestBody(required: true, content: new OA\JsonContent(properties: [new OA\Property(property: 'firstname', type: 'string', example: 'John'), new OA\Property(property: 'lastname', type: 'string', example: 'Doe'), new OA\Property(property: 'email', type: 'string', example: 'john@example.com'), new OA\Property(property: 'phone', type: 'string', example: '+33123456789'), new OA\Property(property: 'position', type: 'string', example: 'Développeur Senior'), new OA\Property(property: 'department', type: 'string', example: 'IT')]))
- $tags: ['Employees']
- $parameters: [new OA\Parameter(name: 'id', description: 'ID de l\'employé à mettre à jour', in: 'path', required: true, schema: new OA\Schema(type: 'integer'))]
- $responses: [new OA\Response(response: 200, description: 'Employé mis à jour avec succès', content: new OA\JsonContent(properties: [new OA\Property(property: 'message', type: 'string', example: 'Employé mis à jour avec succès')])), new OA\Response(response: 400, description: 'Données invalides'), new OA\Response(response: 404, description: 'Employé non trouvé'), new OA\Response(response: 403, description: 'Accès refusé')]
- #[Route]
- '/{id}'
- $name: 'update'
- $methods: ['PUT']
Return values
JsonResponse —Message de confirmation, ou erreurs de validation / d'accès.