Skip to content

Commit d93ef23

Browse files
author
orocrmdeployer
committed
Merge remote-tracking branch 'remotes/dev/master'
2 parents f1be4a2 + ef0b383 commit d93ef23

File tree

5 files changed

+144
-60
lines changed

5 files changed

+144
-60
lines changed

Diff for: src/Oro/Bundle/ApiBundle/Processor/CollectResources/AddExcludedActions.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
class AddExcludedActions implements ProcessorInterface
1818
{
1919
/** the name of the context item to store the configuration of "actions" section */
20-
const ACTIONS_CONFIG_KEY = 'actions_config';
20+
public const ACTIONS_CONFIG_KEY = 'actions_config';
2121

2222
/** @var ConfigLoaderFactory */
2323
protected $configLoaderFactory;

Diff for: src/Oro/Bundle/ApiBundle/Provider/ResourcesCache.php

+6-13
Original file line numberDiff line numberDiff line change
@@ -149,33 +149,26 @@ public function getResourcesWithoutIdentifier(string $version, RequestType $requ
149149
* @param string $version The Data API version
150150
* @param RequestType $requestType The request type, for example "rest", "soap", etc.
151151
* @param ApiResource[] $resources The list of Data API resources
152-
* @param string[] $accessibleResources The list of resources accessible through Data API
152+
* @param array $accessibleResources The resources accessible through Data API
153+
* @param array $excludedActions The actions excluded from Data API
153154
*/
154155
public function saveResources(
155156
string $version,
156157
RequestType $requestType,
157158
array $resources,
158-
array $accessibleResources
159+
array $accessibleResources,
160+
array $excludedActions
159161
): void {
160162
$allResources = [];
161-
$excludedActionsData = [];
162-
$accessibleResourcesData = array_fill_keys($accessibleResources, true);
163163
foreach ($resources as $resource) {
164164
$entityClass = $resource->getEntityClass();
165165
$allResources[$entityClass] = $this->serializeApiResource($resource);
166-
if (!isset($accessibleResourcesData[$entityClass])) {
167-
$accessibleResourcesData[$entityClass] = false;
168-
}
169-
$excludedActions = $resource->getExcludedActions();
170-
if (!empty($excludedActions)) {
171-
$excludedActionsData[$entityClass] = $excludedActions;
172-
}
173166
}
174167

175168
$keyIndex = $this->getCacheKeyIndex($version, $requestType);
176169
$this->cache->save(self::RESOURCES_KEY_PREFIX . $keyIndex, $allResources);
177-
$this->cache->save(self::ACCESSIBLE_RESOURCES_KEY_PREFIX . $keyIndex, $accessibleResourcesData);
178-
$this->cache->save(self::EXCLUDED_ACTIONS_KEY_PREFIX . $keyIndex, $excludedActionsData);
170+
$this->cache->save(self::ACCESSIBLE_RESOURCES_KEY_PREFIX . $keyIndex, $accessibleResources);
171+
$this->cache->save(self::EXCLUDED_ACTIONS_KEY_PREFIX . $keyIndex, $excludedActions);
179172
}
180173

181174
/**

Diff for: src/Oro/Bundle/ApiBundle/Provider/ResourcesProvider.php

+49-18
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ class ResourcesProvider
2121
/** @var ResourcesWithoutIdentifierLoader */
2222
private $resourcesWithoutIdentifierLoader;
2323

24+
/** @var array [request cache key => [ApiResource, ...], ...] */
25+
private $resources = [];
26+
2427
/** @var array [request cache key => [entity class => accessible flag, ...], ...] */
2528
private $accessibleResources = [];
2629

@@ -55,26 +58,53 @@ public function __construct(
5558
*/
5659
public function getResources($version, RequestType $requestType): array
5760
{
58-
$resources = $this->resourcesCache->getResources($version, $requestType);
59-
if (null !== $resources) {
60-
return $resources;
61+
$cacheIndex = $this->getCacheKeyIndex($version, $requestType);
62+
if (array_key_exists($cacheIndex, $this->resources)) {
63+
$resources = $this->resources[$cacheIndex];
64+
} else {
65+
$resources = $this->resourcesCache->getResources($version, $requestType);
66+
if (null === $resources) {
67+
// load data
68+
/** @var CollectResourcesContext $context */
69+
$context = $this->processor->createContext();
70+
$context->setVersion($version);
71+
$context->getRequestType()->set($requestType);
72+
$this->processor->process($context);
73+
74+
// prepare loaded data
75+
/** @var ApiResource[] $resources */
76+
$resources = array_values($context->getResult()->toArray());
77+
$accessibleResources = array_fill_keys($context->getAccessibleResources(), true);
78+
$excludedActions = [];
79+
foreach ($resources as $resource) {
80+
$entityClass = $resource->getEntityClass();
81+
if (!isset($accessibleResources[$entityClass])) {
82+
$accessibleResources[$entityClass] = false;
83+
}
84+
$resourceExcludedActions = $resource->getExcludedActions();
85+
if (!empty($resourceExcludedActions)) {
86+
$excludedActions[$entityClass] = $resourceExcludedActions;
87+
}
88+
}
89+
90+
// add data to memory cache
91+
$this->resources[$cacheIndex] = $resources;
92+
$this->accessibleResources[$cacheIndex] = $accessibleResources;
93+
$this->excludedActions[$cacheIndex] = $excludedActions;
94+
95+
// save data to the cache
96+
$this->resourcesCache->saveResources(
97+
$version,
98+
$requestType,
99+
$resources,
100+
$accessibleResources,
101+
$excludedActions
102+
);
103+
} else {
104+
$this->resources[$cacheIndex] = $resources;
105+
}
61106
}
62107

63-
/** @var CollectResourcesContext $context */
64-
$context = $this->processor->createContext();
65-
$context->setVersion($version);
66-
$context->getRequestType()->set($requestType);
67-
68-
$this->processor->process($context);
69-
70-
$resources = array_values($context->getResult()->toArray());
71-
$this->resourcesCache->saveResources(
72-
$version,
73-
$requestType,
74-
$resources,
75-
$context->getAccessibleResources()
76-
);
77-
78108
return $resources;
79109
}
80110

@@ -191,6 +221,7 @@ public function isResourceWithoutIdentifier($entityClass, $version, RequestType
191221
*/
192222
public function clearCache(): void
193223
{
224+
$this->resources = [];
194225
$this->accessibleResources = [];
195226
$this->excludedActions = [];
196227
$this->resourcesWithoutIdentifier = [];

Diff for: src/Oro/Bundle/ApiBundle/Tests/Unit/Provider/ResourcesCacheTest.php

+14-10
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,16 @@ public function testSave()
146146
$resource3 = new ApiResource('Test\Entity3');
147147
$resource3->setExcludedActions(['create']);
148148

149+
$accessibleResources = [
150+
'Test\Entity1' => true,
151+
'Test\Entity2' => false,
152+
'Test\Entity3' => true
153+
];
154+
$excludedActions = [
155+
'Test\Entity2' => ['get', 'get_list'],
156+
'Test\Entity3' => ['create']
157+
];
158+
149159
$this->cache->expects(self::at(0))
150160
->method('save')
151161
->with(
@@ -160,27 +170,21 @@ public function testSave()
160170
->method('save')
161171
->with(
162172
'accessible_1.2rest',
163-
[
164-
'Test\Entity1' => true,
165-
'Test\Entity2' => false,
166-
'Test\Entity3' => true
167-
]
173+
$accessibleResources
168174
);
169175
$this->cache->expects(self::at(2))
170176
->method('save')
171177
->with(
172178
'excluded_actions_1.2rest',
173-
[
174-
'Test\Entity2' => ['get', 'get_list'],
175-
'Test\Entity3' => ['create']
176-
]
179+
$excludedActions
177180
);
178181

179182
$this->resourcesCache->saveResources(
180183
'1.2',
181184
new RequestType(['rest']),
182185
[$resource1, $resource2, $resource3],
183-
['Test\Entity1', 'Test\Entity3']
186+
$accessibleResources,
187+
$excludedActions
184188
);
185189
}
186190

Diff for: src/Oro/Bundle/ApiBundle/Tests/Unit/Provider/ResourcesProviderTest.php

+74-18
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,11 @@ public function testGetResourcesNoCache()
4646
new ApiResource('Test\Entity1'),
4747
new ApiResource('Test\Entity3')
4848
];
49-
$expectedAccessibleResources = ['Test\Entity3'];
49+
$expectedAccessibleResources = [
50+
'Test\Entity1' => false,
51+
'Test\Entity3' => true
52+
];
53+
$expectedExcludedActions = [];
5054

5155
$this->processor->expects(self::once())
5256
->method('process')
@@ -67,7 +71,13 @@ function (CollectResourcesContext $context) use ($version, $requestType) {
6771
->willReturn(null);
6872
$this->resourcesCache->expects(self::once())
6973
->method('saveResources')
70-
->with($version, self::identicalTo($requestType), $expectedResources, $expectedAccessibleResources);
74+
->with(
75+
$version,
76+
self::identicalTo($requestType),
77+
$expectedResources,
78+
$expectedAccessibleResources,
79+
$expectedExcludedActions
80+
);
7181

7282
self::assertEquals(
7383
$expectedResources,
@@ -142,7 +152,11 @@ public function testGetAccessibleResourcesWhenCacheDoesNotExist()
142152
new ApiResource('Test\Entity1'),
143153
new ApiResource('Test\Entity3')
144154
];
145-
$expectedAccessibleResources = ['Test\Entity3'];
155+
$expectedAccessibleResources = [
156+
'Test\Entity1' => false,
157+
'Test\Entity3' => true
158+
];
159+
$expectedExcludedActions = [];
146160

147161
$this->processor->expects(self::once())
148162
->method('process')
@@ -167,15 +181,17 @@ function (CollectResourcesContext $context) use ($version, $requestType) {
167181
->willReturn(null);
168182
$this->resourcesCache->expects(self::at(2))
169183
->method('saveResources')
170-
->with($version, self::identicalTo($requestType), $expectedResources, $expectedAccessibleResources);
184+
->with(
185+
$version,
186+
self::identicalTo($requestType),
187+
$expectedResources,
188+
$expectedAccessibleResources,
189+
$expectedExcludedActions
190+
);
171191
$this->resourcesCache->expects(self::at(3))
172192
->method('getAccessibleResources')
173193
->with($version, self::identicalTo($requestType))
174194
->willReturn($cachedData);
175-
$this->resourcesCache->expects(self::once())
176-
->method('getResourcesWithoutIdentifier')
177-
->with($version, self::identicalTo($requestType))
178-
->willReturn([]);
179195

180196
self::assertEquals(
181197
['Test\Entity3'],
@@ -250,7 +266,11 @@ public function testIsResourceAccessibleWhenCacheDoesNotExist()
250266
new ApiResource('Test\Entity1'),
251267
new ApiResource('Test\Entity3')
252268
];
253-
$expectedAccessibleResources = ['Test\Entity3'];
269+
$expectedAccessibleResources = [
270+
'Test\Entity1' => false,
271+
'Test\Entity3' => true
272+
];
273+
$expectedExcludedActions = [];
254274

255275
$this->processor->expects(self::once())
256276
->method('process')
@@ -275,15 +295,17 @@ function (CollectResourcesContext $context) use ($version, $requestType) {
275295
->willReturn(null);
276296
$this->resourcesCache->expects(self::at(2))
277297
->method('saveResources')
278-
->with($version, self::identicalTo($requestType), $expectedResources, $expectedAccessibleResources);
298+
->with(
299+
$version,
300+
self::identicalTo($requestType),
301+
$expectedResources,
302+
$expectedAccessibleResources,
303+
$expectedExcludedActions
304+
);
279305
$this->resourcesCache->expects(self::at(3))
280306
->method('getAccessibleResources')
281307
->with($version, self::identicalTo($requestType))
282308
->willReturn($cachedData);
283-
$this->resourcesCache->expects(self::once())
284-
->method('getResourcesWithoutIdentifier')
285-
->with($version, self::identicalTo($requestType))
286-
->willReturn([]);
287309

288310
self::assertFalse(
289311
$this->resourcesProvider->isResourceAccessible('Test\Entity1', $version, $requestType)
@@ -358,7 +380,11 @@ public function testIsResourceKnownWhenCacheDoesNotExist()
358380
new ApiResource('Test\Entity1'),
359381
new ApiResource('Test\Entity3')
360382
];
361-
$expectedAccessibleResources = ['Test\Entity3'];
383+
$expectedAccessibleResources = [
384+
'Test\Entity1' => false,
385+
'Test\Entity3' => true
386+
];
387+
$expectedExcludedActions = [];
362388

363389
$this->processor->expects(self::once())
364390
->method('process')
@@ -383,7 +409,13 @@ function (CollectResourcesContext $context) use ($version, $requestType) {
383409
->willReturn(null);
384410
$this->resourcesCache->expects(self::at(2))
385411
->method('saveResources')
386-
->with($version, self::identicalTo($requestType), $expectedResources, $expectedAccessibleResources);
412+
->with(
413+
$version,
414+
self::identicalTo($requestType),
415+
$expectedResources,
416+
$expectedAccessibleResources,
417+
$expectedExcludedActions
418+
);
387419
$this->resourcesCache->expects(self::at(3))
388420
->method('getAccessibleResources')
389421
->with($version, self::identicalTo($requestType))
@@ -446,7 +478,13 @@ public function testGetResourceExcludeActionsWhenCacheDoesNotExist()
446478
$resource3 = new ApiResource('Test\Entity3');
447479
$resource3->addExcludedAction('delete');
448480
$expectedResources = [$resource1, $resource3];
449-
$expectedAccessibleResources = ['Test\Entity3'];
481+
$expectedAccessibleResources = [
482+
'Test\Entity1' => false,
483+
'Test\Entity3' => true
484+
];
485+
$expectedExcludedActions = [
486+
'Test\Entity3' => ['delete']
487+
];
450488

451489
$this->processor->expects(self::once())
452490
->method('process')
@@ -474,7 +512,13 @@ function (CollectResourcesContext $context) use ($version, $requestType) {
474512
->willReturn(null);
475513
$this->resourcesCache->expects(self::at(2))
476514
->method('saveResources')
477-
->with($version, self::identicalTo($requestType), $expectedResources, $expectedAccessibleResources);
515+
->with(
516+
$version,
517+
self::identicalTo($requestType),
518+
$expectedResources,
519+
$expectedAccessibleResources,
520+
$expectedExcludedActions
521+
);
478522
$this->resourcesCache->expects(self::at(3))
479523
->method('getExcludedActions')
480524
->with($version, self::identicalTo($requestType))
@@ -621,6 +665,10 @@ public function testClearCache()
621665
$version = '1.2.3';
622666
$requestType = new RequestType([RequestType::REST, RequestType::JSON_API]);
623667

668+
$this->resourcesCache->expects(self::exactly(2))
669+
->method('getResources')
670+
->with($version, self::identicalTo($requestType))
671+
->willReturn([new ApiResource('Test\Entity1')]);
624672
$this->resourcesCache->expects(self::exactly(2))
625673
->method('getAccessibleResources')
626674
->with($version, self::identicalTo($requestType))
@@ -637,6 +685,10 @@ public function testClearCache()
637685
->method('clear');
638686

639687
// warmup the local cache
688+
self::assertEquals(
689+
[new ApiResource('Test\Entity1')],
690+
$this->resourcesProvider->getResources($version, $requestType)
691+
);
640692
self::assertTrue(
641693
$this->resourcesProvider->isResourceAccessible('Test\Entity1', $version, $requestType)
642694
);
@@ -652,6 +704,10 @@ public function testClearCache()
652704
$this->resourcesProvider->clearCache();
653705

654706
// check that clearCache method clears the local cache
707+
self::assertEquals(
708+
[new ApiResource('Test\Entity1')],
709+
$this->resourcesProvider->getResources($version, $requestType)
710+
);
655711
self::assertTrue(
656712
$this->resourcesProvider->isResourceAccessible('Test\Entity1', $version, $requestType)
657713
);

0 commit comments

Comments
 (0)