Skip to content

Commit

Permalink
[Feature] - Ajoute des filtres multilingue dans la base cim-11 et les…
Browse files Browse the repository at this point in the history
… allergies (#30)
  • Loading branch information
Xusifob authored Feb 19, 2025
1 parent a972892 commit a0b748f
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 8 deletions.
28 changes: 25 additions & 3 deletions src/ApiPlatform/Filter/AllergenFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter;
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use ApiPlatform\Metadata\Operation;
use App\Entity\Allergen;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\Query\Expr\Orx;
use Doctrine\ORM\QueryBuilder;
use Exception;

Expand Down Expand Up @@ -37,20 +40,39 @@ protected function filterProperty(
return;
}

$this->addSearchFilter($queryBuilder, $value);
$this->addSearchFilter($queryBuilder, $value, $context['languages'] ?? []);
}

/**
* @throws Exception
*/
protected function addSearchFilter(QueryBuilder $queryBuilder, ?string $value): QueryBuilder
protected function addSearchFilter(QueryBuilder $queryBuilder, ?string $value, array $languages = []): QueryBuilder
{
$alias = $queryBuilder->getRootAliases()[0];

// Generate a unique parameter name to avoid collisions with other filters
$end = $this->queryNameGenerator->generateParameterName('search');

$queryBuilder->andWhere("$alias.name LIKE :$end OR $alias.group LIKE :$end");
$defaultLanguage = (new Allergen())->getDefaultLanguage();

if (in_array($defaultLanguage, $languages) || !$languages) {
$queryBuilder->andWhere("$alias.name LIKE :$end OR $alias.group LIKE :$end");
}

foreach ($languages as $language) {
if ($language !== $defaultLanguage) {
$queryBuilder
->leftJoin("$alias.translations", "tr_$language", Join::WITH, "tr_$language.lang = :tr_$language");

$or = [
"tr_$language.field = 'name' AND tr_$language.translation LIKE :$end",
"tr_$language.field = 'group' AND tr_$language.translation LIKE :$end",
];

$queryBuilder->andWhere(new Orx($or));
$queryBuilder->setParameter("tr_$language", $language);
}
}

$value = $this->cleanValue($value);

Expand Down
30 changes: 27 additions & 3 deletions src/ApiPlatform/Filter/Cim11Filter.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
use ApiPlatform\Doctrine\Orm\Filter\AbstractFilter;
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use ApiPlatform\Metadata\Operation;
use App\Entity\Cim11;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\Query\Expr\Orx;
use Doctrine\ORM\QueryBuilder;
use Exception;

Expand Down Expand Up @@ -38,7 +41,7 @@ protected function filterProperty(
}

if ('search' === $property) {
$this->addSearchFilter($queryBuilder, $value);
$this->addSearchFilter($queryBuilder, $value, $context['languages'] ?? []);

return;
}
Expand Down Expand Up @@ -67,7 +70,7 @@ protected function addIdsFilter(QueryBuilder $queryBuilder, string|array|null $v
/**
* @throws Exception
*/
protected function addSearchFilter(QueryBuilder $queryBuilder, ?string $value): QueryBuilder
protected function addSearchFilter(QueryBuilder $queryBuilder, ?string $value, array $languages = []): QueryBuilder
{
$alias = $queryBuilder->getRootAliases()[0];

Expand All @@ -79,7 +82,28 @@ protected function addSearchFilter(QueryBuilder $queryBuilder, ?string $value):

$exact = $this->queryNameGenerator->generateParameterName('exact');

$queryBuilder->andWhere("$alias.code = :$exact OR $alias.name LIKE :$full OR $alias.code LIKE :$start OR $alias.synonyms LIKE :$full");
$defaultLanguage = (new Cim11())->getDefaultLanguage();

if (in_array($defaultLanguage, $languages)) {
$queryBuilder->andWhere("$alias.code = :$exact OR $alias.name LIKE :$full OR $alias.code LIKE :$start OR $alias.synonyms LIKE :$full");
}

foreach ($languages as $language) {
if ($language !== $defaultLanguage) {
$queryBuilder
->leftJoin("$alias.translations", "tr_$language", Join::WITH, "tr_$language.lang = :tr_$language");

$or = [
"$alias.code = :$exact",
"$alias.code LIKE :$start",
"tr_$language.field = 'name' AND tr_$language.translation LIKE :$full",
"tr_$language.field = 'synonyms' AND tr_$language.translation LIKE :$full",
];

$queryBuilder->andWhere(new Orx($or));
$queryBuilder->setParameter("tr_$language", $language);
}
}

$value = $this->cleanValue($value);

Expand Down
2 changes: 2 additions & 0 deletions src/DataFixtures/LoadAllergens.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ public function load(ObjectManager $manager): void
$entity2->setCode('c209');
$entity2->setGroup('Médicaments');
$entity2->setName('Chymopapaïne');
$entity2->setTranslation('en', 'name', 'Chymopapain');
$entity2->setTranslation('en', 'group', 'Drugs');
$entity2->setImportId('import_1');
$this->em->persist($entity2);

Expand Down
36 changes: 34 additions & 2 deletions tests/Functional/AllergenTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class AllergenTest extends ApiTestCase
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
*/
public function testSearchData()
public function testSearchData() : void
{
$data = $this->get('allergens', ['search' => 'Chymopapa']);

Expand All @@ -27,6 +27,38 @@ public function testSearchData()
$this->assertEquals('Médicaments', $data['hydra:member'][0]['group']);

$this->assertCount(1, $data['hydra:member']);

$data = $this->get('allergens', ['search' => 'Chymopapa'],false,[
'Accept-Language' => 'en'
]);

$this->assertResponseStatusCodeSame(Response::HTTP_OK);

$this->assertEquals('Chymopapain', $data['hydra:member'][0]['name']);
$this->assertEquals('c209', $data['hydra:member'][0]['code']);
$this->assertEquals('Drugs', $data['hydra:member'][0]['group']);

$this->assertCount(1, $data['hydra:member']);


$data = $this->get('allergens', ['search' => 'Chymopapaïne'],false,[
'Accept-Language' => 'en'
]);

$this->assertResponseStatusCodeSame(Response::HTTP_OK);
$this->assertCount(0,$data['hydra:member']);

$data = $this->get('allergens', ['search' => 'Chymopapain'],false,[
'Accept-Language' => 'en'
]);

$this->assertResponseStatusCodeSame(Response::HTTP_OK);

$this->assertEquals('Chymopapain', $data['hydra:member'][0]['name']);
$this->assertEquals('c209', $data['hydra:member'][0]['code']);
$this->assertEquals('Drugs', $data['hydra:member'][0]['group']);

$this->assertCount(1, $data['hydra:member']);
}

/**
Expand All @@ -35,7 +67,7 @@ public function testSearchData()
* @throws ServerExceptionInterface
* @throws TransportExceptionInterface
*/
public function testGetData()
public function testGetData() : void
{
$data = $this->get('allergens/c209');

Expand Down

0 comments on commit a0b748f

Please sign in to comment.