mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-10-05 21:09:43 +00:00
Introduced a new API endpoint `/api/1.0/main/address-reference/postal-code/search` for searching postal codes matching a query string. Implemented `PostalCodeForAddressReferenceApiController` to handle requests and integrated with `PostalCodeForAddressReferenceRepository`. Enhanced repository to include `country_name` in results by decoding JSON data. Updated API specifications accordingly.
70 lines
2.1 KiB
PHP
70 lines
2.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
* Chill is a software for social workers
|
|
*
|
|
* For the full copyright and license information, please view
|
|
* the LICENSE file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Chill\MainBundle\Repository;
|
|
|
|
use Doctrine\DBAL\Connection;
|
|
|
|
final readonly class PostalCodeForAddressReferenceRepository implements PostalCodeForAddressReferenceRepositoryInterface
|
|
{
|
|
public function __construct(private Connection $connection) {}
|
|
|
|
public function findPostalCode(string $search, int $firstResult = 0, int $maxResults = 50): iterable
|
|
{
|
|
$terms = $this->buildTermsFromSearchString($search);
|
|
if ([] === $terms) {
|
|
return [];
|
|
}
|
|
|
|
$qb = $this->connection->createQueryBuilder();
|
|
|
|
$qb->from('chill_main_postal_code', 'cmpc')
|
|
->join('cmpc', 'view_chill_main_address_reference', 'vcmar', 'vcmar.postcode_id = cmpc.id')
|
|
->join('vcmar', 'country', 'country', condition: 'cmpc.country_id = country.id')
|
|
->setFirstResult($firstResult)
|
|
->setMaxResults($maxResults)
|
|
;
|
|
|
|
$qb->select(
|
|
'DISTINCT ON (cmpc.code, cmpc.label) cmpc.id AS postcode_id',
|
|
'cmpc.code AS code',
|
|
'cmpc.label AS label',
|
|
'country.id AS country_id',
|
|
'country.countrycode AS country_code',
|
|
'country.name AS country_name'
|
|
);
|
|
|
|
$paramId = 0;
|
|
|
|
foreach ($terms as $term) {
|
|
$qb->andWhere('vcmar.address like ?');
|
|
$qb->setParameter(++$paramId, "%{$term}%");
|
|
}
|
|
|
|
$result = $qb->executeQuery();
|
|
|
|
foreach ($result->iterateAssociative() as $row) {
|
|
yield [...$row, 'country_name' => json_decode($row['country_name'], true, 512, JSON_THROW_ON_ERROR)];
|
|
}
|
|
}
|
|
|
|
private function buildTermsFromSearchString(string $search): array
|
|
{
|
|
return array_filter(
|
|
array_map(
|
|
static fn (string $term) => trim($term),
|
|
explode(' ', $search)
|
|
),
|
|
static fn (string $term) => '' !== $term
|
|
);
|
|
}
|
|
}
|