Refactor filters to support "me" as a user option.

Replaced `PickUserDynamicType` with `PickUserOrMeDynamicType` across filters to enable handling of the "me" option. Introduced normalization and denormalization methods for "me" and adjusted all relevant queries and test cases to accommodate this enhancement.
This commit is contained in:
2025-04-25 11:24:33 +02:00
parent e1404bf16d
commit 3f5ce5f841
15 changed files with 155 additions and 55 deletions

View File

@@ -14,7 +14,7 @@ namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickUserDynamicType;
use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType;
use Chill\MainBundle\Repository\UserRepositoryInterface;
use Chill\MainBundle\Templating\Entity\UserRender;
use Doctrine\ORM\QueryBuilder;
@@ -31,11 +31,11 @@ final readonly class ActivityUsersFilter implements FilterInterface
return null;
}
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void
{
$orX = $qb->expr()->orX();
foreach ($data['accepted_users'] as $key => $user) {
foreach ($this->userOrMe($data['accepted_users'], $exportGenerationContext) as $key => $user) {
$orX->add($qb->expr()->isMemberOf(':activity_users_filter_u'.$key, 'activity.users'));
$qb->setParameter('activity_users_filter_u'.$key, $user);
}
@@ -50,7 +50,7 @@ final readonly class ActivityUsersFilter implements FilterInterface
public function buildForm(FormBuilderInterface $builder): void
{
$builder->add('accepted_users', PickUserDynamicType::class, [
$builder->add('accepted_users', PickUserOrMeDynamicType::class, [
'multiple' => true,
'label' => 'Users',
]);
@@ -63,12 +63,12 @@ final readonly class ActivityUsersFilter implements FilterInterface
public function normalizeFormData(array $formData): array
{
return ['accepted_users' => $this->normalizeDoctrineEntity($formData['accepted_users'])];
return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])];
}
public function denormalizeFormData(array $formData, int $fromVersion): array
{
return ['accepted_users' => $this->denormalizeDoctrineEntity($formData['accepted_users'], $this->userRepository)];
return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)];
}
public function getFormDefaultData(): array
@@ -80,7 +80,7 @@ final readonly class ActivityUsersFilter implements FilterInterface
{
$users = [];
foreach ($data['accepted_users'] as $u) {
foreach ($this->userOrMe($data['accepted_users'], $context) as $u) {
$users[] = $this->userRender->renderString($u, []);
}

View File

@@ -37,7 +37,7 @@ class ByCreatorFilter implements FilterInterface
->andWhere(
$qb->expr()->in('activity.createdBy', ':users')
)
->setParameter('users', $data['accepted_users']);
->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext));
}
public function applyOn(): string
@@ -47,7 +47,7 @@ class ByCreatorFilter implements FilterInterface
public function buildForm(FormBuilderInterface $builder): void
{
$builder->add('accepted_users', PickUserDynamicType::class, [
$builder->add('accepted_users', PickUserOrMeDynamicType::class, [
'multiple' => true,
]);
}
@@ -59,12 +59,12 @@ class ByCreatorFilter implements FilterInterface
public function normalizeFormData(array $formData): array
{
return ['accepted_users' => $this->normalizeDoctrineEntity($formData['accepted_users'])];
return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])];
}
public function denormalizeFormData(array $formData, int $fromVersion): array
{
return ['accepted_users' => $this->denormalizeDoctrineEntity($formData['accepted_users'], $this->userRepository)];
return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)];
}
public function getFormDefaultData(): array
@@ -76,7 +76,7 @@ class ByCreatorFilter implements FilterInterface
{
$users = [];
foreach ($data['accepted_users'] as $u) {
foreach ($this->userOrMe($data['accepted_users'], $context) as $u) {
$users[] = $this->userRender->renderString($u, []);
}

View File

@@ -14,7 +14,7 @@ namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickUserDynamicType;
use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType;
use Chill\MainBundle\Repository\UserRepositoryInterface;
use Chill\MainBundle\Templating\Entity\UserRender;
use Doctrine\ORM\Query\Expr\Andx;
@@ -32,7 +32,7 @@ final readonly class UserFilter implements FilterInterface
return null;
}
public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void
public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void
{
$where = $qb->getDQLPart('where');
@@ -45,7 +45,7 @@ final readonly class UserFilter implements FilterInterface
}
$qb->add('where', $where);
$qb->setParameter('users', $data['accepted_users']);
$qb->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext));
}
public function applyOn(): string
@@ -55,7 +55,7 @@ final readonly class UserFilter implements FilterInterface
public function buildForm(FormBuilderInterface $builder): void
{
$builder->add('accepted_users', PickUserDynamicType::class, [
$builder->add('accepted_users', PickUserOrMeDynamicType::class, [
'multiple' => true,
'label' => 'Creators',
]);
@@ -68,12 +68,12 @@ final readonly class UserFilter implements FilterInterface
public function normalizeFormData(array $formData): array
{
return ['accepted_users' => $this->normalizeDoctrineEntity($formData['accepted_users'])];
return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])];
}
public function denormalizeFormData(array $formData, int $fromVersion): array
{
return ['accepted_users' => $this->denormalizeDoctrineEntity($formData['accepted_users'], $this->userRepository)];
return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)];
}
public function getFormDefaultData(): array
@@ -85,7 +85,7 @@ final readonly class UserFilter implements FilterInterface
{
$users = [];
foreach ($data['accepted_users'] as $u) {
foreach ($this->userOrMe($data['accepted_users'], $context) as $u) {
$users[] = $this->userRender->renderString($u, []);
}