From 2060147b63eaea13ea0c34a54c9e210eff2f50a2 Mon Sep 17 00:00:00 2001 From: Daniel Subiabre Date: Wed, 25 Feb 2026 13:05:15 +0100 Subject: [PATCH 1/3] feat: add repository function to find by deduped ids --- config/packages/doctrine.yaml | 3 ++- src/Benzina/InvestsPump.php | 13 +++++-------- src/Repository/DedupedTrait.php | 21 +++++++++++++++++++++ src/Repository/User/UserRepository.php | 3 +++ 4 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 src/Repository/DedupedTrait.php diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml index ce94e57..eca9e03 100644 --- a/config/packages/doctrine.yaml +++ b/config/packages/doctrine.yaml @@ -34,7 +34,8 @@ doctrine: is_bundle: false dql: string_functions: - instr: DoctrineExtensions\Query\Mysql\Instr + INSTR: DoctrineExtensions\Query\Mysql\Instr + JSON_CONTAINS: DoctrineExtensions\Query\Mysql\JsonContains controller_resolver: auto_mapping: false diff --git a/src/Benzina/InvestsPump.php b/src/Benzina/InvestsPump.php index 78d6944..706eb02 100644 --- a/src/Benzina/InvestsPump.php +++ b/src/Benzina/InvestsPump.php @@ -215,13 +215,10 @@ class InvestsPump implements PumpInterface return $this->userRepository->find($this->userCache[$id]); } - $criteria = new Criteria(); - $criteria - ->orWhere($criteria->expr()->eq('migratedId', $id)) - ->orWhere($criteria->expr()->contains('dedupedIds', $id)) - ->setMaxResults(1); - - $user = $this->userRepository->matching($criteria)->first(); + $user = $this->userRepository->findOneBy(['migratedId' => $id]); + if (!$user) { + $user = $this->userRepository->findDeduped([$id]); + } $this->userCache[$id] = $user->getId(); @@ -282,7 +279,7 @@ class InvestsPump implements PumpInterface $originId = $origin->getId(); $projectId = $target->getId(); - $cacheKey = $projectId.'-'.$originId; + $cacheKey = $projectId . '-' . $originId; if (isset($this->supportCache[$cacheKey])) { return $this->supportRepository->find($this->supportCache[$cacheKey]); diff --git a/src/Repository/DedupedTrait.php b/src/Repository/DedupedTrait.php new file mode 100644 index 0000000..b868551 --- /dev/null +++ b/src/Repository/DedupedTrait.php @@ -0,0 +1,21 @@ +createQueryBuilder('u'); + + return $queryBuilder + ->where('u.deduped = 1') + ->andWhere('JSON_CONTAINS(u.dedupedIds, :val) = 1') + ->setParameter('val', \json_encode($dedupedIds)) + ->getQuery() + ->getOneOrNullResult(); + } +} diff --git a/src/Repository/User/UserRepository.php b/src/Repository/User/UserRepository.php index c69fb9c..73e724a 100644 --- a/src/Repository/User/UserRepository.php +++ b/src/Repository/User/UserRepository.php @@ -4,6 +4,7 @@ namespace App\Repository\User; use App\Entity\Accounting\Accounting; use App\Entity\User\User; +use App\Repository\DedupedTrait; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; use Symfony\Component\Security\Core\Exception\UnsupportedUserException; @@ -22,6 +23,8 @@ use Symfony\Component\Security\Core\User\PasswordUpgraderInterface; */ class UserRepository extends ServiceEntityRepository implements PasswordUpgraderInterface { + use DedupedTrait; + public function __construct(ManagerRegistry $registry) { parent::__construct($registry, User::class); From 8e96c8b7071063ec6ad374e5ad4265d2f42d7ce0 Mon Sep 17 00:00:00 2001 From: Daniel Subiabre Date: Wed, 25 Feb 2026 14:34:54 +0100 Subject: [PATCH 2/3] feat: add PumpedUserRepository --- src/Benzina/InvestsPump.php | 24 ++------------ src/Benzina/PumpedUserRepository.php | 32 +++++++++++++++++++ src/Filter/GatewayFilter.php | 2 -- src/Filter/ResourceVersionResourceFilter.php | 4 +-- .../ResourceVersionResourceIdFilter.php | 4 +-- 5 files changed, 37 insertions(+), 29 deletions(-) create mode 100644 src/Benzina/PumpedUserRepository.php diff --git a/src/Benzina/InvestsPump.php b/src/Benzina/InvestsPump.php index 706eb02..3724790 100644 --- a/src/Benzina/InvestsPump.php +++ b/src/Benzina/InvestsPump.php @@ -27,9 +27,7 @@ use App\Repository\Project\ProjectRepository; use App\Repository\Project\RewardRepository; use App\Repository\Project\SupportRepository; use App\Repository\TipjarRepository; -use App\Repository\User\UserRepository; use App\Service\Gateway\CheckoutService; -use Doctrine\Common\Collections\Criteria; use Goteo\Benzina\Pump\ArrayPumpTrait; use Goteo\Benzina\Pump\DoctrinePumpTrait; use Goteo\Benzina\Pump\PumpInterface; @@ -58,9 +56,6 @@ class InvestsPump implements PumpInterface private ?int $tipjarCache = null; - /** @var array */ - private array $userCache = []; - /** @var array */ private array $projectCache = []; @@ -71,7 +66,7 @@ class InvestsPump implements PumpInterface private array $rewardCache = []; public function __construct( - private UserRepository $userRepository, + private PumpedUserRepository $userRepository, private ProjectRepository $projectRepository, private SupportRepository $supportRepository, private TipjarRepository $tipjarRepository, @@ -209,20 +204,7 @@ class InvestsPump implements PumpInterface private function getUser(array $record): ?User { - $id = $record['user']; - - if (isset($this->userCache[$id])) { - return $this->userRepository->find($this->userCache[$id]); - } - - $user = $this->userRepository->findOneBy(['migratedId' => $id]); - if (!$user) { - $user = $this->userRepository->findDeduped([$id]); - } - - $this->userCache[$id] = $user->getId(); - - return $user; + return $this->userRepository->findPumped($record['user']); } private function getProject(array $record): ?Project @@ -279,7 +261,7 @@ class InvestsPump implements PumpInterface $originId = $origin->getId(); $projectId = $target->getId(); - $cacheKey = $projectId . '-' . $originId; + $cacheKey = $projectId.'-'.$originId; if (isset($this->supportCache[$cacheKey])) { return $this->supportRepository->find($this->supportCache[$cacheKey]); diff --git a/src/Benzina/PumpedUserRepository.php b/src/Benzina/PumpedUserRepository.php new file mode 100644 index 0000000..f26cbdc --- /dev/null +++ b/src/Benzina/PumpedUserRepository.php @@ -0,0 +1,32 @@ + */ + private array $userCache = []; + + public function findPumped(string $id): ?User + { + if (isset($this->userCache[$id])) { + return $this->find($this->userCache[$id]); + } + + $user = $this->findOneBy(['migratedId' => $id]); + if (!$user) { + $user = $this->findDeduped([$id]); + } + + if (!$user) { + return null; + } + + $this->userCache[$id] = $user->getId(); + + return $user; + } +} diff --git a/src/Filter/GatewayFilter.php b/src/Filter/GatewayFilter.php index 2e4fbce..b3861cc 100644 --- a/src/Filter/GatewayFilter.php +++ b/src/Filter/GatewayFilter.php @@ -63,8 +63,6 @@ final class GatewayFilter extends AbstractFilter $queryBuilder ->andWhere($queryBuilder->expr()->eq($aliasedField, $parameterName)) ->setParameter($parameterName, $this->getGatewayName($values[0])); - - return; } private function getGatewayName(mixed $value): string diff --git a/src/Filter/ResourceVersionResourceFilter.php b/src/Filter/ResourceVersionResourceFilter.php index 95573bf..39844de 100644 --- a/src/Filter/ResourceVersionResourceFilter.php +++ b/src/Filter/ResourceVersionResourceFilter.php @@ -32,9 +32,7 @@ final class ResourceVersionResourceFilter extends AbstractFilter string $resourceClass, ?Operation $operation = null, array $context = [], - ): void { - return; - } + ): void {} public function getDescription(string $resourceClass): array { diff --git a/src/Filter/ResourceVersionResourceIdFilter.php b/src/Filter/ResourceVersionResourceIdFilter.php index e7521bc..79efa95 100644 --- a/src/Filter/ResourceVersionResourceIdFilter.php +++ b/src/Filter/ResourceVersionResourceIdFilter.php @@ -18,9 +18,7 @@ final class ResourceVersionResourceIdFilter extends AbstractFilter string $resourceClass, ?Operation $operation = null, array $context = [], - ): void { - return; - } + ): void {} public function getDescription(string $resourceClass): array { From e4e9645730328093f593d4ea0a384899f633689a Mon Sep 17 00:00:00 2001 From: Daniel Subiabre Date: Wed, 25 Feb 2026 14:36:46 +0100 Subject: [PATCH 3/3] feat: improve order of gateways in switch by most common ones --- src/Benzina/InvestsPump.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Benzina/InvestsPump.php b/src/Benzina/InvestsPump.php index 3724790..a730e85 100644 --- a/src/Benzina/InvestsPump.php +++ b/src/Benzina/InvestsPump.php @@ -399,18 +399,18 @@ class InvestsPump implements PumpInterface private function getCheckoutGateway(array $record): string { switch ($record['method']) { - case 'stripe_subscription': - return StripeGateway::getName(); - case 'pool': - return WalletGateway::getName(); - case 'paypal': - return PaypalGateway::getName(); case 'tpv': return CecaGateway::getName(); + case 'paypal': + return PaypalGateway::getName(); + case 'pool': + return WalletGateway::getName(); case 'cash': return CashGateway::getName(); case 'drop': return DropGateway::getName(); + case 'stripe_subscription': + return StripeGateway::getName(); default: return ''; }