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..a730e85 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,23 +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]); - } - - $criteria = new Criteria(); - $criteria - ->orWhere($criteria->expr()->eq('migratedId', $id)) - ->orWhere($criteria->expr()->contains('dedupedIds', $id)) - ->setMaxResults(1); - - $user = $this->userRepository->matching($criteria)->first(); - - $this->userCache[$id] = $user->getId(); - - return $user; + return $this->userRepository->findPumped($record['user']); } private function getProject(array $record): ?Project @@ -420,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 ''; } 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 { 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);