From 67720c40d26f0ecb487c78b3791dae4e2ea400e7 Mon Sep 17 00:00:00 2001 From: Daniel Subiabre Date: Sun, 7 Sep 2025 18:24:56 +0200 Subject: [PATCH] Add MoneyTotalStateProvider --- config/services.yaml | 4 ++ src/State/MoneyTotalStateProvider.php | 88 +++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 src/State/MoneyTotalStateProvider.php diff --git a/config/services.yaml b/config/services.yaml index 0587b3d..d7d9d2c 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -96,6 +96,10 @@ services: $hosts: - 'peertube.plataformess.org' + App\State\MoneyTotalStateProvider: + arguments: + - !tagged 'api_platform.doctrine.orm.query_extension.collection' + App\Money\MoneyService: arguments: - '%env(CURRENCY_DEFAULT)%' diff --git a/src/State/MoneyTotalStateProvider.php b/src/State/MoneyTotalStateProvider.php new file mode 100644 index 0000000..5638201 --- /dev/null +++ b/src/State/MoneyTotalStateProvider.php @@ -0,0 +1,88 @@ +getClass(); + if (($options = $operation->getStateOptions()) && $options instanceof Options && $options->getEntityClass()) { + $entityClass = $options->getEntityClass(); + } + + $totalizer = $this->totalizerLocator->get($entityClass); + + return $totalizer->totalize($this->getItems($entityClass, $operation, $uriVariables, $context)); + } + + private function getItems( + string $entityClass, + Operation $operation, + array $uriVariables = [], + array $context = [], + ): iterable { + /** @var EntityManagerInterface $manager */ + $manager = $this->managerRegistry->getManagerForClass($entityClass); + + $repository = $manager->getRepository($entityClass); + if (!method_exists($repository, 'createQueryBuilder')) { + throw new RuntimeException('The repository class must have a "createQueryBuilder" method.'); + } + + $queryBuilder = $repository->createQueryBuilder('o'); + $queryNameGenerator = new QueryNameGenerator(); + + $this->handleLinks($queryBuilder, $uriVariables, $queryNameGenerator, $context, $entityClass, $operation); + + foreach ($this->collectionExtensions as $extension) { + $extension->applyToCollection($queryBuilder, $queryNameGenerator, $entityClass, $operation, $context); + + if ($extension instanceof QueryResultCollectionExtensionInterface && $extension->supportsResult($entityClass, $operation, $context)) { + foreach ($extension->getResult($queryBuilder, $entityClass, $operation, $context) as $item) { + $manager->detach($item); + + yield $item; + } + + return; + } + } + + foreach ($queryBuilder->getQuery()->toIterable() as $item) { + $manager->detach($item); + + yield $item; + } + } +}