GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Push — master ( e971c9...6ee139 )
by Leonardo
03:42
created

AbstractQueryExecutionSchemaConfigurator   A

Complexity

Total Complexity 37

Size/Duplication

Total Lines 320
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 4
Bugs 0 Features 0
Metric Value
eloc 137
c 4
b 0
f 0
dl 0
loc 320
ccs 0
cts 105
cp 0
rs 9.44
wmc 37

10 Methods

Rating   Name   Duplication   Size   Complexity  
A executeSchemaConfigurationOptionsDefaultSchemaMode() 0 41 4
A executeSchemaConfigurationOptionsMutationScheme() 0 51 4
A executeSchemaConfigurationItems() 0 5 1
A getUserSettingSchemaConfigurationID() 0 12 2
A executeSchemaConfigurationFieldDeprecationLists() 0 21 5
B getSchemaConfigurationID() 0 43 8
A executeSchemaConfigurationOptions() 0 5 1
A executeSchemaConfigurationAccessControlLists() 0 21 5
A executeSchemaConfiguration() 0 11 3
A executeSchemaConfigurationOptionsNamespacing() 0 41 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace GraphQLAPI\GraphQLAPI\SchemaConfigurators;
6
7
use \WP_Post;
8
use PoP\AccessControl\Schema\SchemaModes;
9
use GraphQLAPI\GraphQLAPI\General\BlockHelpers;
10
use PoP\Engine\Environment as EngineEnvironment;
11
use GraphQLAPI\GraphQLAPI\Facades\ModuleRegistryFacade;
12
use GraphQLAPI\GraphQLAPI\Blocks\SchemaConfigOptionsBlock;
13
use GraphQLAPI\GraphQLAPI\Blocks\SchemaConfigurationBlock;
14
use GraphQLAPI\GraphQLAPI\Facades\UserSettingsManagerFacade;
15
use GraphQLByPoP\GraphQLServer\Configuration\MutationSchemes;
16
use PoP\AccessControl\Environment as AccessControlEnvironment;
17
use PoP\ComponentModel\Facades\Instances\InstanceManagerFacade;
18
use PoP\ComponentModel\Environment as ComponentModelEnvironment;
19
use GraphQLAPI\GraphQLAPI\Blocks\SchemaConfigAccessControlListBlock;
20
use PoP\Engine\ComponentConfiguration as EngineComponentConfiguration;
21
use GraphQLAPI\GraphQLAPI\Blocks\SchemaConfigFieldDeprecationListBlock;
22
use GraphQLByPoP\GraphQLServer\Environment as GraphQLServerEnvironment;
23
use PoP\ComponentModel\ComponentConfiguration\ComponentConfigurationHelpers;
24
use GraphQLAPI\GraphQLAPI\ModuleResolvers\EndpointFunctionalityModuleResolver;
25
use GraphQLAPI\GraphQLAPI\ModuleResolvers\VersioningFunctionalityModuleResolver;
26
use GraphQLAPI\GraphQLAPI\ModuleResolvers\OperationalFunctionalityModuleResolver;
27
use GraphQLAPI\GraphQLAPI\ModuleResolvers\AccessControlFunctionalityModuleResolver;
28
use GraphQLAPI\GraphQLAPI\SchemaConfigurators\AccessControlGraphQLQueryConfigurator;
29
use PoP\AccessControl\ComponentConfiguration as AccessControlComponentConfiguration;
30
use PoP\ComponentModel\ComponentConfiguration as ComponentModelComponentConfiguration;
31
use GraphQLAPI\GraphQLAPI\SchemaConfigurators\FieldDeprecationGraphQLQueryConfigurator;
32
use GraphQLAPI\GraphQLAPI\ModuleResolvers\SchemaConfigurationFunctionalityModuleResolver;
33
use GraphQLByPoP\GraphQLServer\ComponentConfiguration as GraphQLServerComponentConfiguration;
34
35
abstract class AbstractQueryExecutionSchemaConfigurator implements SchemaConfiguratorInterface
36
{
37
    /**
38
     * Extract the items defined in the Schema Configuration,
39
     * and inject them into the service as to take effect in the current GraphQL query
40
     */
41
    public function executeSchemaConfiguration(int $customPostID): void
42
    {
43
        // Check if it enabled by module
44
        $moduleRegistry = ModuleRegistryFacade::getInstance();
45
        if (!$moduleRegistry->isModuleEnabled(SchemaConfigurationFunctionalityModuleResolver::SCHEMA_CONFIGURATION)) {
46
            return;
47
        }
48
49
        if ($schemaConfigurationID = $this->getSchemaConfigurationID($customPostID)) {
50
            // Get that Schema Configuration, and load its settings
51
            $this->executeSchemaConfigurationItems($schemaConfigurationID);
52
        }
53
    }
54
55
    /**
56
     * Return the stored Schema Configuration ID
57
     */
58
    protected function getUserSettingSchemaConfigurationID(): ?int
59
    {
60
        $userSettingsManager = UserSettingsManagerFacade::getInstance();
61
        $schemaConfigurationID = $userSettingsManager->getSetting(
62
            SchemaConfigurationFunctionalityModuleResolver::SCHEMA_CONFIGURATION,
63
            SchemaConfigurationFunctionalityModuleResolver::OPTION_SCHEMA_CONFIGURATION_ID
64
        );
65
        // `null` is stored as OPTION_VALUE_NO_VALUE_ID
66
        if ($schemaConfigurationID == SchemaConfigurationFunctionalityModuleResolver::OPTION_VALUE_NO_VALUE_ID) {
67
            return null;
68
        }
69
        return $schemaConfigurationID;
70
    }
71
72
    /**
73
     * Extract the Schema Configuration ID from the block stored in the post
74
     */
75
    protected function getSchemaConfigurationID(int $customPostID): ?int
76
    {
77
        $instanceManager = InstanceManagerFacade::getInstance();
78
        /**
79
         * @var SchemaConfigurationBlock
80
         */
81
        $block = $instanceManager->getInstance(SchemaConfigurationBlock::class);
82
        $schemaConfigurationBlockDataItem = BlockHelpers::getSingleBlockOfTypeFromCustomPost(
83
            $customPostID,
84
            $block
85
        );
86
        // If there was no schema configuration, then the default one has been selected
87
        // It is not saved in the DB, because it has been set as the default value in
88
        // blocks/schema-configuration/src/index.js
89
        if (is_null($schemaConfigurationBlockDataItem)) {
90
            return $this->getUserSettingSchemaConfigurationID();
91
        }
92
93
        $schemaConfiguration = $schemaConfigurationBlockDataItem['attrs'][SchemaConfigurationBlock::ATTRIBUTE_NAME_SCHEMA_CONFIGURATION];
94
        // Check if $schemaConfiguration is one of the meta options (default, none, inherit)
95
        if ($schemaConfiguration == SchemaConfigurationBlock::ATTRIBUTE_VALUE_SCHEMA_CONFIGURATION_NONE) {
96
            return null;
97
        } elseif ($schemaConfiguration == SchemaConfigurationBlock::ATTRIBUTE_VALUE_SCHEMA_CONFIGURATION_DEFAULT) {
98
            return $this->getUserSettingSchemaConfigurationID();
99
        } elseif ($schemaConfiguration == SchemaConfigurationBlock::ATTRIBUTE_VALUE_SCHEMA_CONFIGURATION_INHERIT) {
100
            // If disabled by module, then return nothing
101
            $moduleRegistry = ModuleRegistryFacade::getInstance();
102
            if (!$moduleRegistry->isModuleEnabled(EndpointFunctionalityModuleResolver::API_HIERARCHY)) {
103
                return null;
104
            }
105
            // Return the schema configuration from the parent, or null if no parent exists
106
            /**
107
             * @var WP_Post|null
108
             */
109
            $customPost = \get_post($customPostID);
110
            if (!is_null($customPost) && $customPost->post_parent) {
111
                return $this->getSchemaConfigurationID($customPost->post_parent);
112
            }
113
            return null;
114
        }
115
        // It is already the ID, or null if blocks returned empty
116
        // (eg: because parent post was trashed)
117
        return $schemaConfiguration;
118
    }
119
120
    /**
121
     * Apply all the settings defined in the Schema Configuration:
122
     * - Options
123
     * - Access Control Lists
124
     * - Field Deprecation Lists
125
     */
126
    protected function executeSchemaConfigurationItems(int $schemaConfigurationID): void
127
    {
128
        $this->executeSchemaConfigurationOptions($schemaConfigurationID);
129
        $this->executeSchemaConfigurationAccessControlLists($schemaConfigurationID);
130
        $this->executeSchemaConfigurationFieldDeprecationLists($schemaConfigurationID);
131
    }
132
133
    /**
134
     * Apply all the settings defined in the Schema Configuration for:
135
     * - Namespacing
136
     * - Mutation Scheme
137
     * - Options
138
     */
139
    protected function executeSchemaConfigurationOptions(int $schemaConfigurationID): void
140
    {
141
        $this->executeSchemaConfigurationOptionsNamespacing($schemaConfigurationID);
142
        $this->executeSchemaConfigurationOptionsMutationScheme($schemaConfigurationID);
143
        $this->executeSchemaConfigurationOptionsDefaultSchemaMode($schemaConfigurationID);
144
    }
145
146
    /**
147
     * Apply the Namespacing settings
148
     */
149
    protected function executeSchemaConfigurationOptionsNamespacing(int $schemaConfigurationID): void
150
    {
151
        // Check if it enabled by module
152
        $moduleRegistry = ModuleRegistryFacade::getInstance();
153
        if (!$moduleRegistry->isModuleEnabled(SchemaConfigurationFunctionalityModuleResolver::SCHEMA_NAMESPACING)) {
154
            return;
155
        }
156
157
        $instanceManager = InstanceManagerFacade::getInstance();
158
        /**
159
         * @var SchemaConfigOptionsBlock
160
         */
161
        $block = $instanceManager->getInstance(SchemaConfigOptionsBlock::class);
162
        $schemaConfigOptionsBlockDataItem = BlockHelpers::getSingleBlockOfTypeFromCustomPost(
163
            $schemaConfigurationID,
164
            $block
165
        );
166
        if (!is_null($schemaConfigOptionsBlockDataItem)) {
167
            /**
168
             * Default value (if not defined in DB): `default`. Then do nothing
169
             */
170
            $useNamespacing = $schemaConfigOptionsBlockDataItem['attrs'][SchemaConfigOptionsBlock::ATTRIBUTE_NAME_USE_NAMESPACING];
171
            // Only execute if it has value "enabled" or "disabled".
172
            // If "default", then the general settings will already take effect, so do nothing
173
            // (And if any other unsupported value, also do nothing)
174
            if (!in_array($useNamespacing, [
175
                    SchemaConfigOptionsBlock::ATTRIBUTE_VALUE_USE_NAMESPACING_ENABLED,
176
                    SchemaConfigOptionsBlock::ATTRIBUTE_VALUE_USE_NAMESPACING_DISABLED,
177
                ])
178
            ) {
179
                return;
180
            }
181
            // Define the settings value through a hook. Execute last so it overrides the default settings
182
            $hookName = ComponentConfigurationHelpers::getHookName(
183
                ComponentModelComponentConfiguration::class,
184
                ComponentModelEnvironment::NAMESPACE_TYPES_AND_INTERFACES
185
            );
186
            \add_filter(
187
                $hookName,
188
                fn () => $useNamespacing == SchemaConfigOptionsBlock::ATTRIBUTE_VALUE_USE_NAMESPACING_ENABLED,
189
                PHP_INT_MAX
190
            );
191
        }
192
    }
193
194
    /**
195
     * Apply the Mutation Scheme settings
196
     */
197
    protected function executeSchemaConfigurationOptionsMutationScheme(int $schemaConfigurationID): void
198
    {
199
        // Check if it enabled by module
200
        $moduleRegistry = ModuleRegistryFacade::getInstance();
201
        if (!$moduleRegistry->isModuleEnabled(OperationalFunctionalityModuleResolver::NESTED_MUTATIONS)) {
202
            return;
203
        }
204
205
        $instanceManager = InstanceManagerFacade::getInstance();
206
        /**
207
         * @var SchemaConfigOptionsBlock
208
         */
209
        $block = $instanceManager->getInstance(SchemaConfigOptionsBlock::class);
210
        $schemaConfigOptionsBlockDataItem = BlockHelpers::getSingleBlockOfTypeFromCustomPost(
211
            $schemaConfigurationID,
212
            $block
213
        );
214
        if (!is_null($schemaConfigOptionsBlockDataItem)) {
215
            /**
216
             * Default value (if not defined in DB): `default`. Then do nothing
217
             */
218
            $mutationScheme = $schemaConfigOptionsBlockDataItem['attrs'][SchemaConfigOptionsBlock::ATTRIBUTE_NAME_MUTATION_SCHEME];
219
            // Only execute if it has value "standard", "nested" or "lean_nested".
220
            // If "default", then the general settings will already take effect, so do nothing
221
            // (And if any other unsupported value, also do nothing)
222
            if (!in_array($mutationScheme, [
223
                    MutationSchemes::STANDARD,
224
                    MutationSchemes::NESTED_WITH_REDUNDANT_ROOT_FIELDS,
225
                    MutationSchemes::NESTED_WITHOUT_REDUNDANT_ROOT_FIELDS,
226
                ])
227
            ) {
228
                return;
229
            }
230
            // Define the settings value through a hook. Execute last so it overrides the default settings
231
            $hookName = ComponentConfigurationHelpers::getHookName(
232
                GraphQLServerComponentConfiguration::class,
233
                GraphQLServerEnvironment::ENABLE_NESTED_MUTATIONS
234
            );
235
            \add_filter(
236
                $hookName,
237
                fn () => $mutationScheme != MutationSchemes::STANDARD,
238
                PHP_INT_MAX
239
            );
240
            $hookName = ComponentConfigurationHelpers::getHookName(
241
                EngineComponentConfiguration::class,
242
                EngineEnvironment::DISABLE_REDUNDANT_ROOT_TYPE_MUTATION_FIELDS
243
            );
244
            \add_filter(
245
                $hookName,
246
                fn () => $mutationScheme == MutationSchemes::NESTED_WITHOUT_REDUNDANT_ROOT_FIELDS,
247
                PHP_INT_MAX
248
            );
249
        }
250
    }
251
252
    /**
253
     * Apply the default Schema mode settings
254
     */
255
    protected function executeSchemaConfigurationOptionsDefaultSchemaMode(int $schemaConfigurationID): void
256
    {
257
        // Check if it enabled by module
258
        $moduleRegistry = ModuleRegistryFacade::getInstance();
259
        if (!$moduleRegistry->isModuleEnabled(SchemaConfigurationFunctionalityModuleResolver::PUBLIC_PRIVATE_SCHEMA)) {
260
            return;
261
        }
262
263
        $instanceManager = InstanceManagerFacade::getInstance();
264
        /**
265
         * @var SchemaConfigOptionsBlock
266
         */
267
        $block = $instanceManager->getInstance(SchemaConfigOptionsBlock::class);
268
        $schemaConfigOptionsBlockDataItem = BlockHelpers::getSingleBlockOfTypeFromCustomPost(
269
            $schemaConfigurationID,
270
            $block
271
        );
272
        if (!is_null($schemaConfigOptionsBlockDataItem)) {
273
            /**
274
             * Default value (if not defined in DB): `default`. Then do nothing
275
             */
276
            $defaultSchemaMode = $schemaConfigOptionsBlockDataItem['attrs'][SchemaConfigOptionsBlock::ATTRIBUTE_NAME_DEFAULT_SCHEMA_MODE];
277
            // Only execute if it has value "public" or "private".
278
            // If "default", then the general settings will already take effect, so do nothing
279
            // (And if any other unsupported value, also do nothing)
280
            if (!in_array($defaultSchemaMode, [
281
                    SchemaModes::PUBLIC_SCHEMA_MODE,
282
                    SchemaModes::PRIVATE_SCHEMA_MODE,
283
                ])
284
            ) {
285
                return;
286
            }
287
            // Define the settings value through a hook. Execute last so it overrides the default settings
288
            $hookName = ComponentConfigurationHelpers::getHookName(
289
                AccessControlComponentConfiguration::class,
290
                AccessControlEnvironment::USE_PRIVATE_SCHEMA_MODE
291
            );
292
            \add_filter(
293
                $hookName,
294
                fn () => $defaultSchemaMode == SchemaModes::PRIVATE_SCHEMA_MODE,
295
                PHP_INT_MAX
296
            );
297
        }
298
    }
299
300
    /**
301
     * Apply all the settings defined in the Schema Configuration for:
302
     * - Access Control Lists
303
     */
304
    protected function executeSchemaConfigurationAccessControlLists(int $schemaConfigurationID): void
305
    {
306
        // Check it is enabled by module
307
        $moduleRegistry = ModuleRegistryFacade::getInstance();
308
        if (!$moduleRegistry->isModuleEnabled(AccessControlFunctionalityModuleResolver::ACCESS_CONTROL)) {
309
            return;
310
        }
311
        $instanceManager = InstanceManagerFacade::getInstance();
312
        /**
313
         * @var SchemaConfigAccessControlListBlock
314
         */
315
        $block = $instanceManager->getInstance(SchemaConfigAccessControlListBlock::class);
316
        $schemaConfigACLBlockDataItem = BlockHelpers::getSingleBlockOfTypeFromCustomPost(
317
            $schemaConfigurationID,
318
            $block
319
        );
320
        if (!is_null($schemaConfigACLBlockDataItem)) {
321
            if ($accessControlLists = $schemaConfigACLBlockDataItem['attrs'][SchemaConfigAccessControlListBlock::ATTRIBUTE_NAME_ACCESS_CONTROL_LISTS]) {
322
                $configurator = new AccessControlGraphQLQueryConfigurator();
323
                foreach ($accessControlLists as $accessControlListID) {
324
                    $configurator->executeSchemaConfiguration($accessControlListID);
325
                }
326
            }
327
        }
328
    }
329
330
    /**
331
     * Apply all the settings defined in the Schema Configuration for:
332
     * - Field Deprecation Lists
333
     */
334
    protected function executeSchemaConfigurationFieldDeprecationLists(int $schemaConfigurationID): void
335
    {
336
        // Check it is enabled by module
337
        $moduleRegistry = ModuleRegistryFacade::getInstance();
338
        if (!$moduleRegistry->isModuleEnabled(VersioningFunctionalityModuleResolver::FIELD_DEPRECATION)) {
339
            return;
340
        }
341
        $instanceManager = InstanceManagerFacade::getInstance();
342
        /**
343
         * @var SchemaConfigFieldDeprecationListBlock
344
         */
345
        $block = $instanceManager->getInstance(SchemaConfigFieldDeprecationListBlock::class);
346
        $schemaConfigFDLBlockDataItem = BlockHelpers::getSingleBlockOfTypeFromCustomPost(
347
            $schemaConfigurationID,
348
            $block
349
        );
350
        if (!is_null($schemaConfigFDLBlockDataItem)) {
351
            if ($fieldDeprecationLists = $schemaConfigFDLBlockDataItem['attrs'][SchemaConfigFieldDeprecationListBlock::ATTRIBUTE_NAME_FIELD_DEPRECATION_LISTS]) {
352
                $configurator = new FieldDeprecationGraphQLQueryConfigurator();
353
                foreach ($fieldDeprecationLists as $fieldDeprecationListID) {
354
                    $configurator->executeSchemaConfiguration($fieldDeprecationListID);
355
                }
356
            }
357
        }
358
    }
359
}
360