Skip to content

Commit e7f9ba3

Browse files
committed
B2B-2658: Implement GraphQL Resolver Cache for Customer query
- proper exception handling
1 parent 0806105 commit e7f9ba3

File tree

4 files changed

+46
-26
lines changed

4 files changed

+46
-26
lines changed

app/code/Magento/GraphQlResolverCache/Model/Plugin/Resolver/Cache.php

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
use Magento\Framework\GraphQl\Query\ResolverInterface;
1515
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1616
use Magento\Framework\Serialize\SerializerInterface;
17+
use Magento\GraphQlResolverCache\Model\Resolver\Result\CacheKey\CalculationException;
1718
use Magento\GraphQlResolverCache\Model\Resolver\Result\CacheKey\Calculator\ProviderInterface;
1819
use Magento\GraphQlResolverCache\Model\Resolver\Result\ResolverIdentityClassProvider;
1920
use Magento\GraphQlResolverCache\Model\Resolver\Result\Type as GraphQlResolverCache;
2021
use Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessorInterface;
22+
use Psr\Log\LoggerInterface;
2123

2224
/**
2325
* Plugin to cache resolver result where applicable
@@ -56,6 +58,11 @@ class Cache
5658
*/
5759
private ProviderInterface $keyCalculatorProvider;
5860

61+
/**
62+
* @var LoggerInterface
63+
*/
64+
private $logger;
65+
5966
/**
6067
* @param GraphQlResolverCache $graphQlResolverCache
6168
* @param SerializerInterface $serializer
@@ -70,14 +77,16 @@ public function __construct(
7077
CacheState $cacheState,
7178
ResolverIdentityClassProvider $resolverIdentityClassProvider,
7279
ValueProcessorInterface $valueProcessor,
73-
ProviderInterface $keyCalculatorProvider
80+
ProviderInterface $keyCalculatorProvider,
81+
LoggerInterface $logger
7482
) {
7583
$this->graphQlResolverCache = $graphQlResolverCache;
7684
$this->serializer = $serializer;
7785
$this->cacheState = $cacheState;
7886
$this->resolverIdentityClassProvider = $resolverIdentityClassProvider;
7987
$this->valueProcessor = $valueProcessor;
8088
$this->keyCalculatorProvider = $keyCalculatorProvider;
89+
$this->logger = $logger;
8190
}
8291

8392
/**
@@ -116,8 +125,20 @@ public function aroundResolve(
116125
}
117126

118127
// Cache key provider may base cache key on the parent resolver value
119-
// $value is hydrated on key calculation if needed
120-
$cacheKey = $this->prepareCacheIdentifier($subject, $args, $value);
128+
// $value is processed on key calculation if needed
129+
try {
130+
$cacheKey = $this->prepareCacheIdentifier($subject, $args, $value);
131+
} catch (CalculationException $e) {
132+
$this->logger->warning(
133+
sprintf(
134+
"Unable to obtain cache key for %s resolver results, proceeding to invoke resolver."
135+
. "Original exception message: %s ",
136+
get_class($subject),
137+
$e->getMessage()
138+
)
139+
);
140+
return $this->executeResolver($proceed, $field, $context, $info, $value, $args);
141+
}
121142

122143
$cachedResult = $this->graphQlResolverCache->load($cacheKey);
123144

@@ -180,6 +201,7 @@ private function executeResolver(
180201
* @param array|null $value
181202
*
182203
* @return string
204+
* @throws CalculationException
183205
*/
184206
private function prepareCacheIdentifier(
185207
ResolverInterface $resolver,
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\GraphQlResolverCache\Model\Resolver\Result\CacheKey;
9+
10+
class CalculationException extends \Exception
11+
{
12+
13+
}

app/code/Magento/GraphQlResolverCache/Model/Resolver/Result/CacheKey/Calculator.php

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@
77

88
namespace Magento\GraphQlResolverCache\Model\Resolver\Result\CacheKey;
99

10-
use Exception;
1110
use Magento\Framework\ObjectManagerInterface;
1211
use Magento\GraphQl\Model\Query\ContextFactoryInterface;
1312
use Magento\GraphQlResolverCache\Model\Resolver\Result\ValueProcessorInterface;
14-
use Psr\Log\LoggerInterface;
1513

1614
/**
1715
* Calculates cache key for the resolver results.
@@ -33,11 +31,6 @@ class Calculator
3331
*/
3432
private $factorProviderInstances;
3533

36-
/**
37-
* @var LoggerInterface
38-
*/
39-
private $logger;
40-
4134
/**
4235
* @var ObjectManagerInterface
4336
*/
@@ -49,20 +42,17 @@ class Calculator
4942
private ValueProcessorInterface $valueProcessor;
5043

5144
/**
52-
* @param LoggerInterface $logger
5345
* @param ContextFactoryInterface $contextFactory
5446
* @param ObjectManagerInterface $objectManager
5547
* @param ValueProcessorInterface $valueProcessor
5648
* @param string[] $factorProviders
5749
*/
5850
public function __construct(
59-
LoggerInterface $logger,
6051
ContextFactoryInterface $contextFactory,
6152
ObjectManagerInterface $objectManager,
6253
ValueProcessorInterface $valueProcessor,
6354
array $factorProviders = []
6455
) {
65-
$this->logger = $logger;
6656
$this->contextFactory = $contextFactory;
6757
$this->factorProviders = $factorProviders;
6858
$this->objectManager = $objectManager;
@@ -75,6 +65,8 @@ public function __construct(
7565
* @param array|null $parentData
7666
*
7767
* @return string|null
68+
*
69+
* @throws CalculationException
7870
*/
7971
public function calculateCacheKey(?array $parentData = null): ?string
8072
{
@@ -86,9 +78,8 @@ public function calculateCacheKey(?array $parentData = null): ?string
8678
$factors = $this->getFactors($parentData);
8779
$keysString = strtoupper(implode('|', array_values($factors)));
8880
return hash('sha256', $keysString);
89-
} catch (Exception $e) {
90-
$this->logger->warning("Unable to obtain cache key for resolver results. " . $e->getMessage());
91-
return null;
81+
} catch (\Throwable $e) {
82+
throw new CalculationException($e->getMessage(), $e->getCode(), $e);
9283
}
9384
}
9485

dev/tests/integration/testsuite/Magento/GraphQlResolverCache/Model/Resolver/Result/Cache/KeyCalculatorTest.php

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
namespace Magento\GraphQlResolverCache\Model\Resolver\Result\Cache;
99

1010
use Magento\GraphQl\Model\Query\ContextFactoryInterface;
11+
use Magento\GraphQlResolverCache\Model\Resolver\Result\CacheKey\CalculationException;
1112
use Magento\GraphQlResolverCache\Model\Resolver\Result\CacheKey\Calculator;
1213
use Magento\GraphQlResolverCache\Model\Resolver\Result\CacheKey\ParentValueFactorProviderInterface;
1314
use Magento\GraphQlResolverCache\Model\Resolver\Result\CacheKey\GenericFactorProviderInterface;
@@ -46,17 +47,11 @@ public function setUp(): void
4647
*
4748
* @return void
4849
*/
49-
public function testKeyCalculatorErrorLogging()
50+
public function testKeyCalculatorException()
5051
{
52+
$this->expectException(CalculationException::class);
53+
$this->expectExceptionMessage("Test message");
5154
$exceptionMessage = "Test message";
52-
$loggerMock = $this->getMockBuilder(LoggerInterface::class)
53-
->onlyMethods(['warning'])
54-
->disableOriginalConstructor()
55-
->getMockForAbstractClass();
56-
57-
$loggerMock->expects($this->once())
58-
->method('warning')
59-
->with("Unable to obtain cache key for resolver results. " . $exceptionMessage);
6055

6156
$mock = $this->getMockBuilder(GenericFactorProviderInterface::class)
6257
->disableOriginalConstructor()
@@ -75,7 +70,6 @@ public function testKeyCalculatorErrorLogging()
7570
$keyCalculator = $this->objectManager->create(
7671
Calculator::class,
7772
[
78-
'logger' => $loggerMock,
7973
'factorProviders' => [
8074
'test' => 'TestFactorProviderMock'
8175
]

0 commit comments

Comments
 (0)