Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
UserApiController
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
2 / 2
2
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 autocomplete
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5/** @license For full copyright and license information, please see the LICENSE.md file. */
6
7namespace App\Modules\User\Presentation\Api;
8
9defined('AMMONLY_APP') || exit('Direct script access is forbidden.');
10
11use App\Modules\User\Domain\Repository\UserRepositoryInterface;
12use App\Shared\Infrastructure\Http\ApiResponseTrait;
13use Psr\Http\Message\ResponseFactoryInterface;
14use Psr\Http\Message\ResponseInterface;
15use Psr\Http\Message\ServerRequestInterface;
16
17/**
18 * User REST API Controller.
19 *
20 * Exposes /api/v1/users/autocomplete JSON endpoint.
21 *
22 * @package App\Modules\User\Presentation\Api
23 */
24final readonly class UserApiController
25{
26    use ApiResponseTrait;
27
28    /**
29     * UserApiController constructor.
30     *
31     * @param ResponseFactoryInterface $responseFactory PSR-7 Response factory.
32     * @param UserRepositoryInterface $userRepository User domain repository.
33     */
34    public function __construct(
35        private ResponseFactoryInterface $responseFactory,
36        private UserRepositoryInterface $userRepository
37    ) {
38    }
39
40    /**
41     * Handles API request for user autocomplete suggestions.
42     *
43     * @param ServerRequestInterface $request PSR-7 Server request.
44     * @return ResponseInterface PSR-7 JSON response.
45     */
46    public function autocomplete(ServerRequestInterface $request): ResponseInterface
47    {
48        $queryParams = $request->getQueryParams();
49        $query = trim((string)($queryParams['q'] ?? ''));
50        $limit = max(1, min(50, (int)($queryParams['limit'] ?? 10)));
51
52        $matches = $this->userRepository->searchAutocomplete($query, $limit);
53
54        return $this->jsonStatusResponse(
55            $this->responseFactory,
56            true,
57            'User autocomplete suggestions fetched successfully',
58            $matches
59        );
60    }
61}