Skip to content

Commit 4fe5f8f

Browse files
committed
#28569: Multi-store: Missing store codes in relation to a group and website
- Implemented new availableStores query - Code refactor
1 parent 5ea15d1 commit 4fe5f8f

File tree

4 files changed

+103
-50
lines changed

4 files changed

+103
-50
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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\StoreGraphQl\Model\Resolver;
9+
10+
use Magento\Framework\GraphQl\Config\Element\Field;
11+
use Magento\Framework\GraphQl\Query\ResolverInterface;
12+
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
13+
use Magento\StoreGraphQl\Model\Resolver\Store\StoreConfigDataProvider;
14+
15+
/**
16+
* AvailableStores page field resolver, used for GraphQL request processing.
17+
*/
18+
class AvailableStoresResolver implements ResolverInterface
19+
{
20+
/**
21+
* @var StoreConfigDataProvider
22+
*/
23+
private $storeConfigDataProvider;
24+
25+
/**
26+
* @param StoreConfigDataProvider $storeConfigsDataProvider
27+
*/
28+
public function __construct(
29+
StoreConfigDataProvider $storeConfigsDataProvider
30+
) {
31+
$this->storeConfigDataProvider = $storeConfigsDataProvider;
32+
}
33+
34+
/**
35+
* @inheritdoc
36+
*/
37+
public function resolve(
38+
Field $field,
39+
$context,
40+
ResolveInfo $info,
41+
array $value = null,
42+
array $args = null
43+
) {
44+
return $this->storeConfigDataProvider->getAvailableStores();
45+
}
46+
}

app/code/Magento/StoreGraphQl/Model/Resolver/Store/StoreConfigDataProvider.php

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
use Magento\Framework\App\Config\ScopeConfigInterface;
1111
use Magento\Store\Api\Data\StoreConfigInterface;
1212
use Magento\Store\Api\StoreConfigManagerInterface;
13-
use Magento\Store\Api\StoreRepositoryInterface;
1413
use Magento\Store\Model\ScopeInterface;
1514
use Magento\Store\Api\Data\StoreInterface;
1615

@@ -34,27 +33,19 @@ class StoreConfigDataProvider
3433
*/
3534
private $extendedConfigData;
3635

37-
/**
38-
* @var StoreRepositoryInterface
39-
*/
40-
private $storeRepository;
41-
4236
/**
4337
* @param StoreConfigManagerInterface $storeConfigManager
4438
* @param ScopeConfigInterface $scopeConfig
45-
* @param StoreRepositoryInterface $storeRepository
4639
* @param array $extendedConfigData
4740
*/
4841
public function __construct(
4942
StoreConfigManagerInterface $storeConfigManager,
5043
ScopeConfigInterface $scopeConfig,
51-
StoreRepositoryInterface $storeRepository,
5244
array $extendedConfigData = []
5345
) {
5446
$this->storeConfigManager = $storeConfigManager;
5547
$this->scopeConfig = $scopeConfig;
5648
$this->extendedConfigData = $extendedConfigData;
57-
$this->storeRepository = $storeRepository;
5849
}
5950

6051
/**
@@ -66,27 +57,24 @@ public function __construct(
6657
public function getStoreConfigData(StoreInterface $store): array
6758
{
6859
$defaultStoreConfig = $this->storeConfigManager->getStoreConfig($store);
69-
$defaultStoreConfigData = $this->prepareStoreConfigData($defaultStoreConfig);
70-
71-
return $this->addStores($defaultStoreConfigData);
60+
return $this->prepareStoreConfigData($defaultStoreConfig);
7261
}
7362

7463
/**
75-
* Add all stores
64+
* Get available stores
7665
*
77-
* @param array $defaultStoreConfigData
78-
* @return mixed
66+
* @return array
7967
*/
80-
private function addStores($defaultStoreConfigData)
68+
public function getAvailableStores(): array
8169
{
82-
$stores = $this->storeRepository->getList();
70+
$storesConfigData = [];
71+
$storeConfigs = $this->storeConfigManager->getStoreConfigs();
8372

84-
foreach ($stores as $store) {
85-
$storeConfig = $this->storeConfigManager->getStoreConfig($store);
86-
$defaultStoreConfigData['stores'][] = $this->prepareStoreConfigData($storeConfig);
73+
foreach ($storeConfigs as $storeConfig) {
74+
$storesConfigData[] = $this->prepareStoreConfigData($storeConfig);
8775
}
8876

89-
return $defaultStoreConfigData;
77+
return $storesConfigData;
9078
}
9179

9280
/**

app/code/Magento/StoreGraphQl/etc/schema.graphqls

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# See COPYING.txt for license details.
33
type Query {
44
storeConfig : StoreConfig @resolver(class: "Magento\\StoreGraphQl\\Model\\Resolver\\StoreConfigResolver") @doc(description: "The store config query") @cache(cacheable: false)
5+
availableStores: [StoreConfig] @resolver(class: "Magento\\StoreGraphQl\\Model\\Resolver\\AvailableStoresResolver") @doc(description: "Get a list of available store views and their config information.")
56
}
67

78
type Website @doc(description: "Website is deprecated because it is should not be used on storefront. The type contains information about a website") {
@@ -31,5 +32,4 @@ type StoreConfig @doc(description: "The type contains information about a store
3132
secure_base_static_url : String @doc(description: "Secure base static URL for the store")
3233
secure_base_media_url : String @doc(description: "Secure base media URL for the store")
3334
store_name : String @doc(description: "Name of the store")
34-
stores: [StoreConfig] @doc(description: "Contains information about all stores")
3535
}

dev/tests/api-functional/testsuite/Magento/GraphQl/Store/StoreConfigResolverTest.php

Lines changed: 47 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77

88
namespace Magento\GraphQl\Store;
99

10+
use Exception;
1011
use Magento\Framework\App\Config\ScopeConfigInterface;
12+
use Magento\Framework\Exception\NoSuchEntityException;
1113
use Magento\Store\Api\Data\StoreConfigInterface;
1214
use Magento\Store\Api\StoreConfigManagerInterface;
1315
use Magento\Store\Api\StoreRepositoryInterface;
@@ -18,7 +20,7 @@
1820
use Magento\TestFramework\TestCase\GraphQlAbstract;
1921

2022
/**
21-
* Test the GraphQL endpoint's StoreConfigs query
23+
* Test the GraphQL endpoint's StoreConfigs and AvailableStores queries
2224
*/
2325
class StoreConfigResolverTest extends GraphQlAbstract
2426
{
@@ -34,9 +36,9 @@ protected function setUp(): void
3436
/**
3537
* @magentoApiDataFixture Magento/Store/_files/store.php
3638
* @magentoConfigFixture default_store store/information/name Default Store
37-
* @magentoConfigFixture test_store store/information/name Test Store
39+
* @throws NoSuchEntityException
3840
*/
39-
public function testGetStoreConfig()
41+
public function testGetStoreConfig(): void
4042
{
4143
/** @var StoreConfigManagerInterface $defaultStoreConfigsManager */
4244
$defaultStoreConfigsManager = $this->objectManager->get(StoreConfigManagerInterface::class);
@@ -48,12 +50,10 @@ public function testGetStoreConfig()
4850
$store = $storeRepository->getById($storeId);
4951
/** @var StoreConfigInterface $defaultStoreConfig */
5052
$defaultStoreConfig = current($defaultStoreConfigsManager->getStoreConfigs([$store->getCode()]));
51-
/** @var StoreConfigInterface $storeConfigs */
52-
$storeConfigs = $defaultStoreConfigsManager->getStoreConfigs();
5353
$query
5454
= <<<QUERY
5555
{
56-
storeConfig{
56+
storeConfig {
5757
id,
5858
code,
5959
website_id,
@@ -71,36 +71,55 @@ public function testGetStoreConfig()
7171
secure_base_static_url,
7272
secure_base_media_url,
7373
store_name
74-
stores {
75-
id,
76-
code,
77-
website_id,
78-
locale,
79-
base_currency_code,
80-
default_display_currency_code,
81-
timezone,
82-
weight_unit,
83-
base_url,
84-
base_link_url,
85-
base_static_url,
86-
base_media_url,
87-
secure_base_url,
88-
secure_base_link_url,
89-
secure_base_static_url,
90-
secure_base_media_url,
91-
store_name
92-
}
9374
}
9475
}
9576
QUERY;
9677
$response = $this->graphQlQuery($query);
9778
$this->assertArrayHasKey('storeConfig', $response);
9879
$this->validateStoreConfig($defaultStoreConfig, $response['storeConfig']);
80+
}
81+
82+
/**
83+
* @magentoApiDataFixture Magento/Store/_files/store.php
84+
* @magentoConfigFixture default_store store/information/name Default Store
85+
* @magentoConfigFixture test_store store/information/name Test Store
86+
* @throws Exception
87+
*/
88+
public function testAvailableStoreConfigs(): void
89+
{
90+
/** @var StoreConfigManagerInterface $defaultStoreConfigsManager */
91+
$defaultStoreConfigsManager = $this->objectManager->get(StoreConfigManagerInterface::class);
92+
$storeConfigs = $defaultStoreConfigsManager->getStoreConfigs();
93+
94+
$query
95+
= <<<QUERY
96+
{
97+
availableStores {
98+
id,
99+
code,
100+
website_id,
101+
locale,
102+
base_currency_code,
103+
default_display_currency_code,
104+
timezone,
105+
weight_unit,
106+
base_url,
107+
base_link_url,
108+
base_static_url,
109+
base_media_url,
110+
secure_base_url,
111+
secure_base_link_url,
112+
secure_base_static_url,
113+
secure_base_media_url,
114+
store_name
115+
}
116+
}
117+
QUERY;
118+
$response = $this->graphQlQuery($query);
99119

100-
$this->assertArrayHasKey('stores', $response['storeConfig']);
120+
$this->assertArrayHasKey('availableStores', $response);
101121
foreach ($storeConfigs as $key => $storeConfig) {
102-
$this->assertArrayHasKey($key, $response['storeConfig']['stores']);
103-
$this->validateStoreConfig($storeConfig, $response['storeConfig']['stores'][$key]);
122+
$this->validateStoreConfig($storeConfig, $response['availableStores'][$key]);
104123
}
105124
}
106125

0 commit comments

Comments
 (0)