diff --git a/server/web_app/src/Controller/ItemController.php b/server/web_app/src/Controller/ItemController.php index cb5feb7846493d72ad8bf392d59afa06058a2cdd..19583fc1ff8da07214a89f5e87bb4afc97d41042 100644 --- a/server/web_app/src/Controller/ItemController.php +++ b/server/web_app/src/Controller/ItemController.php @@ -85,7 +85,8 @@ final class ItemController extends AbstractController 'max' => $max, 'sortBy' => $sortBy, 'sort' => $sort, - 'onlyBought' => $onlyBought + 'onlyBought' => $onlyBought, + 'path' => 'src/Controller/ItemController.php', ]); } diff --git a/server/web_app/src/Controller/UserController.php b/server/web_app/src/Controller/UserController.php index 2226a94e2f282b50eab134ae31c0a55f694938b2..2cca27f8b8df67f622635e42a7fc186b2701ce9a 100644 --- a/server/web_app/src/Controller/UserController.php +++ b/server/web_app/src/Controller/UserController.php @@ -95,13 +95,63 @@ final class UserController extends AbstractController implements UserControllerI } #[Route('', methods: ['GET'])] - public function getAllUsers(): JsonResponse + public function getAllUsers(Request $req): JsonResponse { - $users = $this->userRepository->findAllUsers(); - $userArray = array_map(fn($user) => ['id' => $user->getId(), 'username' => $user->getUserName(), 'mail' => $user->getEmail(), 'createdAt' => $user->getCreatedAt()], $users); + // Validate and sanitize query parameters + $roleParam = $req->query->get('userRole', null); + $userRole = null; + + // Convert string to enum if valid + if ($roleParam !== null && in_array($roleParam, UserRole::getValues(), true)) { + $userRole = UserRole::from($roleParam); + } + + $isBlocked = filter_var($req->query->get('isBlocked', null), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); + + // Validate "sortBy" to allow only 'createdAt' or 'username' + $allowedSortBy = ['createdAt', 'username']; + $sortBy = $req->query->get('sortBy', 'createdAt'); + if (!in_array($sortBy, $allowedSortBy, true)) { + $sortBy = 'createdAt'; + } + + // Validate "sort" to allow only 'asc' or 'desc' + $allowedSort = ['asc', 'desc']; + $sort = strtolower($req->query->get('sort', 'asc')); + if (!in_array($sort, $allowedSort, true)) { + $sort = 'asc'; + } + + // Validate "max" as a positive integer (default: 10) + $max = filter_var($req->query->get('max', 10), FILTER_VALIDATE_INT, ["options" => ["min_range" => 1]]) ?: 10; + + // Validate "page" as a positive integer (default: 1) + $page = filter_var($req->query->get('page', 1), FILTER_VALIDATE_INT, ["options" => ["min_range" => 1]]) ?: 1; + + // Fetch users from repository with filters + $users = $this->userRepository->findAllUsersFiltered($userRole, $isBlocked, $sortBy, $sort, $max, $page); + + if (!$users) { + return new JsonResponse(['error' => 'No users found'], Response::HTTP_NOT_FOUND); + } + + $userArray = array_map(fn($user) => [ + 'id' => $user->getId(), + 'username' => $user->getUserName(), + 'mail' => $user->getEmail(), + 'role' => $user->getRoles(), + 'isBlocked' => $user->isBlocked(), + 'createdAt' => $user->getCreatedAt() + ], $users); return $this->json([ 'users' => $userArray, + 'page' => $page, + 'max' => $max, + 'sortBy' => $sortBy, + 'sort' => $sort, + 'userRole' => $userRole, + 'isBlocked' => $isBlocked, 'path' => 'src/Controller/UserController.php', ]); } diff --git a/server/web_app/src/Interface/UserControllerInterface.php b/server/web_app/src/Interface/UserControllerInterface.php index a8dbe3ba8c91f3d05bb2740da3b133a3824f6e39..92a41838ddc07c2083948d10982a3d3160436dbb 100644 --- a/server/web_app/src/Interface/UserControllerInterface.php +++ b/server/web_app/src/Interface/UserControllerInterface.php @@ -8,7 +8,7 @@ interface UserControllerInterface { public function createUser(Request $req): Response; - public function getAllUsers(): Response; + public function getAllUsers(Request $req): Response; public function getUserById(int $userId): Response; diff --git a/server/web_app/src/Repository/UserRepository.php b/server/web_app/src/Repository/UserRepository.php index af2a91ad9abc667742333c8af803aaa7f830a86a..332c0f0879a166693702777f3c574e2d71e6ec92 100644 --- a/server/web_app/src/Repository/UserRepository.php +++ b/server/web_app/src/Repository/UserRepository.php @@ -54,29 +54,27 @@ class UserRepository extends ServiceEntityRepository ->getResult(); } + public function findAllUsersFiltered(?UserRole $userRole, ?bool $isBlocked, string $sortBy, string $sort, int $max, int $page) + { + $queryBuilder = $this->createQueryBuilder('u'); + + // Filter by userRole if provided + if ($userRole) { + $queryBuilder->andWhere('u.role LIKE :role') + ->setParameter('role', $userRole->value); + } - // /** - // * @return User[] Returns an array of User objects - // */ - // public function findByExampleField($value): array - // { - // return $this->createQueryBuilder('u') - // ->andWhere('u.exampleField = :val') - // ->setParameter('val', $value) - // ->orderBy('u.id', 'ASC') - // ->setMaxResults(10) - // ->getQuery() - // ->getResult() - // ; - // } + // Filter by isBlocked if provided + if (!is_null($isBlocked)) { + $queryBuilder->andWhere('u.isBlocked = :isBlocked') + ->setParameter('isBlocked', $isBlocked); + } - // public function findOneBySomeField($value): ?User - // { - // return $this->createQueryBuilder('u') - // ->andWhere('u.exampleField = :val') - // ->setParameter('val', $value) - // ->getQuery() - // ->getOneOrNullResult() - // ; - // } + // Apply sorting + $queryBuilder->orderBy("u.$sortBy", $sort) + ->setMaxResults($max) + ->setFirstResult(($page - 1) * $max); + + return $queryBuilder->getQuery()->getResult(); + } }