From d291424380eca1f92494c9809c69405f39c41111 Mon Sep 17 00:00:00 2001 From: Colin Murphy Date: Wed, 5 Nov 2025 18:49:18 +0000 Subject: [PATCH 1/3] Set default config on activation. Adds logic to set a default configuration when the plugin is activated, ensuring initial settings are present. Refactors ConfigurationHelper to remove unnecessary filters. Updates tests to verify default configuration is set on activation. Also ensures plugin constants are defined before activation/deactivation hooks are registered. --- .../Admin/Settings/ConfigurationHelper.php | 9 ++- plugins/wpgraphql-logging/src/Plugin.php | 41 +++++++++++++ .../tests/wpunit/Core/PluginTest.php | 46 ++++++++++++++- .../wpgraphql-logging/wpgraphql-logging.php | 58 ++++++++++--------- 4 files changed, 123 insertions(+), 31 deletions(-) diff --git a/plugins/wpgraphql-logging/src/Admin/Settings/ConfigurationHelper.php b/plugins/wpgraphql-logging/src/Admin/Settings/ConfigurationHelper.php index 52563624..2f87d3bb 100644 --- a/plugins/wpgraphql-logging/src/Admin/Settings/ConfigurationHelper.php +++ b/plugins/wpgraphql-logging/src/Admin/Settings/ConfigurationHelper.php @@ -139,14 +139,14 @@ public function clear_cache(): void { * Get the option key for the settings. */ public function get_option_key(): string { - return (string) apply_filters( 'wpgraphql_logging_settings_key', WPGRAPHQL_LOGGING_SETTINGS_KEY ); + return WPGRAPHQL_LOGGING_SETTINGS_KEY; } /** * Get the settings group for caching. */ public function get_settings_group(): string { - return (string) apply_filters( 'wpgraphql_logging_settings_group_settings_group', WPGRAPHQL_LOGGING_SETTINGS_GROUP ); + return WPGRAPHQL_LOGGING_SETTINGS_GROUP; } /** @@ -185,21 +185,26 @@ protected function load_config(): void { $cache_duration = (int) apply_filters( 'wpgraphql_logging_config_cache_duration', self::CACHE_DURATION ); + // Try to get from wp_cache first (in-memory cache). $cached_config = wp_cache_get( $option_key, self::CACHE_GROUP ); if ( is_array( $cached_config ) ) { $this->config = $cached_config; return; } + // Try to get from the WordPress object cache (could be Redis, Memcached, etc.). $cached_config = wp_cache_get( $option_key, $this->get_settings_group() ); if ( is_array( $cached_config ) ) { $this->config = $cached_config; + // Store in our custom cache group for faster access next time. wp_cache_set( $option_key, $cached_config, self::CACHE_GROUP, $cache_duration ); return; } + // Load from database. $this->config = $this->get_option_value( $option_key, [] ); + // Cache the result in both cache groups. wp_cache_set( $option_key, $this->config, self::CACHE_GROUP, $cache_duration ); wp_cache_set( $option_key, $this->config, $this->get_settings_group(), $cache_duration ); } diff --git a/plugins/wpgraphql-logging/src/Plugin.php b/plugins/wpgraphql-logging/src/Plugin.php index 463aebdb..3bcce3c6 100644 --- a/plugins/wpgraphql-logging/src/Plugin.php +++ b/plugins/wpgraphql-logging/src/Plugin.php @@ -5,9 +5,12 @@ namespace WPGraphQL\Logging; use WPGraphQL\Logging\Admin\Settings\ConfigurationHelper; +use WPGraphQL\Logging\Admin\Settings\Fields\Tab\BasicConfigurationTab; +use WPGraphQL\Logging\Admin\Settings\Fields\Tab\DataManagementTab; use WPGraphQL\Logging\Admin\SettingsPage; use WPGraphQL\Logging\Admin\ViewLogsPage; use WPGraphQL\Logging\Events\EventManager; +use WPGraphQL\Logging\Events\Events; use WPGraphQL\Logging\Events\QueryEventLifecycle; use WPGraphQL\Logging\Logger\Api\LogServiceInterface; use WPGraphQL\Logging\Logger\Scheduler\DataDeletionScheduler; @@ -117,6 +120,44 @@ public static function get_log_service(): LogServiceInterface { public static function activate(): void { $log_service = self::get_log_service(); $log_service->activate(); + self::set_default_configuration(); + } + + /** + * Set the default configuration for the plugin on activation. + */ + public static function set_default_configuration(): void { + $configuration = ConfigurationHelper::get_instance(); + $option_key = $configuration->get_option_key(); + $option_value = get_option( $option_key, [] ); + if ( ! empty( $option_value ) ) { + return; + } + + $option_value = [ + BasicConfigurationTab::get_name() => [ + BasicConfigurationTab::ENABLED => true, + BasicConfigurationTab::EXCLUDE_QUERY => '__schema,GetSeedNode', // Exclude introspection and GetSeedNode queries. + BasicConfigurationTab::DATA_SAMPLING => '10', + BasicConfigurationTab::EVENT_LOG_SELECTION => [ + Events::PRE_REQUEST, + Events::BEFORE_GRAPHQL_EXECUTION, + Events::BEFORE_RESPONSE_RETURNED, + Events::REQUEST_DATA, + Events::REQUEST_RESULTS, + Events::RESPONSE_HEADERS_TO_SEND, + ], + BasicConfigurationTab::LOG_RESPONSE => false, + ], + DataManagementTab::get_name() => [ + DataManagementTab::DATA_DELETION_ENABLED => true, + DataManagementTab::DATA_RETENTION_DAYS => 7, + DataManagementTab::DATA_SANITIZATION_ENABLED => true, + DataManagementTab::DATA_SANITIZATION_METHOD => 'recommended', + ], + ]; + + update_option( $option_key, $option_value ); } /** diff --git a/plugins/wpgraphql-logging/tests/wpunit/Core/PluginTest.php b/plugins/wpgraphql-logging/tests/wpunit/Core/PluginTest.php index 7020bbc8..d7f36d34 100644 --- a/plugins/wpgraphql-logging/tests/wpunit/Core/PluginTest.php +++ b/plugins/wpgraphql-logging/tests/wpunit/Core/PluginTest.php @@ -8,7 +8,11 @@ use lucatume\WPBrowser\TestCase\WPTestCase; use ReflectionClass; use WPGraphQL\Logging\Events\EventManager; - +use WPGraphQL\Logging\Logger\Database\WordPressDatabaseEntity; +use WPGraphQL\Logging\Admin\Settings\Fields\Tab\BasicConfigurationTab; +use WPGraphQL\Logging\Admin\Settings\Fields\Tab\DataManagementTab; +use WPGraphQL\Logging\Events\Events; +use WPGraphQL\Logging\Admin\Settings\ConfigurationHelper; /** * Test for the Plugin @@ -55,6 +59,46 @@ public function test_clone_method_throws_error() { $this->assertInstanceOf( Plugin::class, $clone ); } + public function test_plugin_activate() { + $plugin = Plugin::init(); + $plugin::activate(); + + // Verify that the datatbase has been created + global $wpdb; + $table_name = WordPressDatabaseEntity::get_table_name(); + $table_exists = $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $table_name ) ); + $this->assertNotEmpty( $table_exists ); + $this->assertEquals( $table_exists, $table_name ); + + // Verify that the default configuration has been set + $configuration = ConfigurationHelper::get_instance(); + $option_value = $configuration->get_option_value( WPGRAPHQL_LOGGING_SETTINGS_KEY ); + $this->assertNotEmpty( $option_value ); + $default_configuration = [ + BasicConfigurationTab::get_name() => [ + BasicConfigurationTab::ENABLED => true, + BasicConfigurationTab::EXCLUDE_QUERY => '__schema,GetSeedNode', // Exclude introspection and GetSeedNode queries. + BasicConfigurationTab::DATA_SAMPLING => '10', + BasicConfigurationTab::EVENT_LOG_SELECTION => [ + Events::PRE_REQUEST, + Events::BEFORE_GRAPHQL_EXECUTION, + Events::BEFORE_RESPONSE_RETURNED, + Events::REQUEST_DATA, + Events::REQUEST_RESULTS, + Events::RESPONSE_HEADERS_TO_SEND, + ], + BasicConfigurationTab::LOG_RESPONSE => false, + ], + DataManagementTab::get_name() => [ + DataManagementTab::DATA_DELETION_ENABLED => true, + DataManagementTab::DATA_RETENTION_DAYS => 7, + DataManagementTab::DATA_SANITIZATION_ENABLED => true, + DataManagementTab::DATA_SANITIZATION_METHOD => 'recommended', + ], + ]; + $this->assertEquals( $option_value, $default_configuration ); + } + public function test_wakeup_method_throws_error() { $reflection = new ReflectionClass( Plugin::class ); $plugin = $reflection->newInstanceWithoutConstructor(); diff --git a/plugins/wpgraphql-logging/wpgraphql-logging.php b/plugins/wpgraphql-logging/wpgraphql-logging.php index e6cbf8b6..dffbd58a 100644 --- a/plugins/wpgraphql-logging/wpgraphql-logging.php +++ b/plugins/wpgraphql-logging/wpgraphql-logging.php @@ -43,34 +43,6 @@ return; } -if ( file_exists( __DIR__ . '/activation.php' ) ) { - require_once __DIR__ . '/activation.php'; - // @phpstan-ignore-next-line - register_activation_hook( __FILE__, 'wpgraphql_logging_activation_callback' ); -} - -if ( file_exists( __DIR__ . '/deactivation.php' ) ) { - require_once __DIR__ . '/deactivation.php'; - // @phpstan-ignore-next-line - register_deactivation_hook( __FILE__, 'wpgraphql_logging_deactivation_callback' ); -} - - -// phpcs:enable Generic.Metrics.CyclomaticComplexity.TooHigh -// phpcs:enable SlevomatCodingStandard.Complexity.Cognitive.ComplexityTooHigh - -if ( ! function_exists( 'wpgraphql_logging_init' ) ) { - /** - * Initializes plugin. - */ - function wpgraphql_logging_init(): void { - wpgraphql_logging_constants(); - wpgraphql_logging_plugin_init(); - wpgraphql_logging_plugin_admin_notice_correct_build(); - wpgraphql_logging_plugin_admin_notice_min_php_version(); - } -} - if ( ! function_exists( 'wpgraphql_logging_constants' ) ) { /** * Define plugin constants. @@ -99,6 +71,36 @@ function wpgraphql_logging_constants(): void { } } +// Define constants early - needed for activation/deactivation hooks. +wpgraphql_logging_constants(); + +if ( file_exists( __DIR__ . '/activation.php' ) ) { + require_once __DIR__ . '/activation.php'; + // @phpstan-ignore-next-line + register_activation_hook( __FILE__, 'wpgraphql_logging_activation_callback' ); +} + +if ( file_exists( __DIR__ . '/deactivation.php' ) ) { + require_once __DIR__ . '/deactivation.php'; + // @phpstan-ignore-next-line + register_deactivation_hook( __FILE__, 'wpgraphql_logging_deactivation_callback' ); +} + + +// phpcs:enable Generic.Metrics.CyclomaticComplexity.TooHigh +// phpcs:enable SlevomatCodingStandard.Complexity.Cognitive.ComplexityTooHigh + +if ( ! function_exists( 'wpgraphql_logging_init' ) ) { + /** + * Initializes plugin. + */ + function wpgraphql_logging_init(): void { + wpgraphql_logging_plugin_init(); + wpgraphql_logging_plugin_admin_notice_correct_build(); + wpgraphql_logging_plugin_admin_notice_min_php_version(); + } +} + if ( ! function_exists( 'wpgraphql_logging_plugin_init' ) ) { /** * Initialize the WPGraphQL Logging plugin. From 21e6abb64748a0109d3dce8dbd7da16d1e1b7b66 Mon Sep 17 00:00:00 2001 From: Colin Murphy Date: Wed, 5 Nov 2025 18:59:10 +0000 Subject: [PATCH 2/3] Updated plugin tests for activation to ensure config is only set when there is no existing config. --- .../tests/wpunit/Core/PluginTest.php | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/plugins/wpgraphql-logging/tests/wpunit/Core/PluginTest.php b/plugins/wpgraphql-logging/tests/wpunit/Core/PluginTest.php index d7f36d34..21ddfeaa 100644 --- a/plugins/wpgraphql-logging/tests/wpunit/Core/PluginTest.php +++ b/plugins/wpgraphql-logging/tests/wpunit/Core/PluginTest.php @@ -60,6 +60,17 @@ public function test_clone_method_throws_error() { } public function test_plugin_activate() { + + // Delet configuration option + $configuration = ConfigurationHelper::get_instance(); + $option_key = $configuration->get_option_key(); + delete_option( $option_key ); + + // Verify that the configuration option has been deleted + $option_value = get_option( $option_key ); + $this->assertEmpty( $option_value ); + + $plugin = Plugin::init(); $plugin::activate(); @@ -71,7 +82,6 @@ public function test_plugin_activate() { $this->assertEquals( $table_exists, $table_name ); // Verify that the default configuration has been set - $configuration = ConfigurationHelper::get_instance(); $option_value = $configuration->get_option_value( WPGRAPHQL_LOGGING_SETTINGS_KEY ); $this->assertNotEmpty( $option_value ); $default_configuration = [ @@ -99,6 +109,26 @@ public function test_plugin_activate() { $this->assertEquals( $option_value, $default_configuration ); } + public function test_plugin_activate_when_configuration_already_exists() { + $configuration = ConfigurationHelper::get_instance(); + $option_key = $configuration->get_option_key(); + $default_configuration = [ + BasicConfigurationTab::get_name() => [ + BasicConfigurationTab::ENABLED => true, + ], + ]; + update_option( $option_key, $default_configuration ); + + + $plugin = Plugin::init(); + $plugin::activate(); + + // Verify that the default configuration has not been set + $configuration = ConfigurationHelper::get_instance(); + $option_value = $configuration->get_option_value( WPGRAPHQL_LOGGING_SETTINGS_KEY ); + $this->assertEquals( $option_value, $default_configuration ); + } + public function test_wakeup_method_throws_error() { $reflection = new ReflectionClass( Plugin::class ); $plugin = $reflection->newInstanceWithoutConstructor(); From 8156902a1f4cc9dae655129abb788056bf9f76cc Mon Sep 17 00:00:00 2001 From: Colin Murphy Date: Wed, 5 Nov 2025 19:00:52 +0000 Subject: [PATCH 3/3] Added Changeset --- .changeset/nice-clocks-shave.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/nice-clocks-shave.md diff --git a/.changeset/nice-clocks-shave.md b/.changeset/nice-clocks-shave.md new file mode 100644 index 00000000..3544028e --- /dev/null +++ b/.changeset/nice-clocks-shave.md @@ -0,0 +1,5 @@ +--- +"@wpengine/wpgraphql-logging-wordpress-plugin": patch +--- + +chore: Add default configuration on plugin activation if no configuration already exists.