Passed
Push — master ( 495efb...ace576 )
by Brian
06:14 queued 01:46
created

Controller   A

Complexity

Total Complexity 32

Size/Duplication

Total Lines 186
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 60
c 1
b 0
f 0
dl 0
loc 186
rs 9.84
wmc 32

13 Methods

Rating   Name   Duplication   Size   Complexity  
A instance() 0 6 2
A schedule_migration() 0 6 3
A init() 0 3 2
A maybe_hook_migration() 0 6 3
A get_migration_config_object() 0 19 6
A display_migration_notice() 0 2 1
A has_custom_datastore() 0 2 1
A get_logger_class() 0 8 2
A __construct() 0 3 1
A hook() 0 9 1
A get_store_class() 0 8 3
A hook_admin_notices() 0 5 3
A allow_migration() 0 10 4
1
<?php
2
3
namespace Action_Scheduler\Migration;
4
5
use Action_Scheduler\WP_CLI\Migration_Command;
6
use Action_Scheduler\WP_CLI\ProgressBar;
7
8
/**
9
 * Class Controller
10
 *
11
 * The main plugin/initialization class for migration to custom tables.
12
 *
13
 * @package Action_Scheduler\Migration
14
 *
15
 * @since 3.0.0
16
 *
17
 * @codeCoverageIgnore
18
 */
19
class Controller {
20
	private static $instance;
21
22
	/** @var Action_Scheduler\Migration\Scheduler */
0 ignored issues
show
Bug introduced by
The type Action_Scheduler\Migrati...ler\Migration\Scheduler was not found. Did you mean Action_Scheduler\Migration\Scheduler? If so, make sure to prefix the type with \.
Loading history...
23
	private $migration_scheduler;
24
25
	/** @var string */
26
	private $store_classname;
27
28
	/** @var string */
29
	private $logger_classname;
30
31
	/** @var bool */
32
	private $migrate_custom_store;
33
34
	/**
35
	 * Controller constructor.
36
	 *
37
	 * @param Scheduler $migration_scheduler Migration scheduler object.
38
	 */
39
	protected function __construct( Scheduler $migration_scheduler ) {
40
		$this->migration_scheduler = $migration_scheduler;
0 ignored issues
show
Documentation Bug introduced by
It seems like $migration_scheduler of type Action_Scheduler\Migration\Scheduler is incompatible with the declared type Action_Scheduler\Migrati...ler\Migration\Scheduler of property $migration_scheduler.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
41
		$this->store_classname     = '';
42
	}
43
44
	/**
45
	 * Set the action store class name.
46
	 *
47
	 * @param string $class Classname of the store class.
48
	 *
49
	 * @return string
50
	 */
51
	public function get_store_class( $class ) {
52
		if ( \ActionScheduler_DataController::is_migration_complete() ) {
53
			return \ActionScheduler_DataController::DATASTORE_CLASS;
54
		} elseif ( \ActionScheduler_Store::DEFAULT_CLASS !== $class ) {
55
			$this->store_classname = $class;
56
			return $class;
57
		} else {
58
			return 'ActionScheduler_HybridStore';
59
		}
60
	}
61
62
	/**
63
	 * Set the action logger class name.
64
	 *
65
	 * @param string $class Classname of the logger class.
66
	 *
67
	 * @return string
68
	 */
69
	public function get_logger_class( $class ) {
70
		\ActionScheduler_Store::instance();
71
72
		if ( $this->has_custom_datastore() ) {
73
			$this->logger_classname = $class;
74
			return $class;
75
		} else {
76
			return \ActionScheduler_DataController::LOGGER_CLASS;
77
		}
78
	}
79
80
	/**
81
	 * Get flag indicating whether a custom datastore is in use.
82
	 *
83
	 * @return bool
84
	 */
85
	public function has_custom_datastore() {
86
		return (bool) $this->store_classname;
87
	}
88
89
	/**
90
	 * Set up the background migration process
91
	 *
92
	 * @return void
93
	 */
94
	public function schedule_migration() {
95
		if ( \ActionScheduler_DataController::is_migration_complete() || $this->migration_scheduler->is_migration_scheduled() ) {
96
			return;
97
		}
98
99
		$this->migration_scheduler->schedule_migration();
100
	}
101
102
	/**
103
	 * Get the default migration config object
104
	 *
105
	 * @return ActionScheduler\Migration\Config
0 ignored issues
show
Bug introduced by
The type Action_Scheduler\Migrati...eduler\Migration\Config was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
106
	 */
107
	public function get_migration_config_object() {
108
		static $config = null;
109
110
		if ( ! $config ) {
111
			$source_store  = $this->store_classname ? new $this->store_classname() : new \ActionScheduler_wpPostStore();
112
			$source_logger = $this->logger_classname ? new $this->logger_classname() : new \ActionScheduler_wpCommentLogger();
113
114
			$config = new Config();
115
			$config->set_source_store( $source_store );
116
			$config->set_source_logger( $source_logger );
117
			$config->set_destination_store( new \ActionScheduler_DBStoreMigrator() );
118
			$config->set_destination_logger( new \ActionScheduler_DBLogger() );
119
120
			if ( defined( 'WP_CLI' ) && WP_CLI ) {
0 ignored issues
show
Bug introduced by
The constant Action_Scheduler\Migration\WP_CLI was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
121
				$config->set_progress_bar( new ProgressBar( '', 0 ) );
122
			}
123
		}
124
125
		return apply_filters( 'action_scheduler/migration_config', $config );
126
	}
127
128
	/**
129
	 * Hook dashboard migration notice.
130
	 */
131
	public function hook_admin_notices() {
132
		if ( ! $this->allow_migration() || \ActionScheduler_DataController::is_migration_complete() ) {
133
			return;
134
		}
135
		add_action( 'admin_notices', array( $this, 'display_migration_notice' ), 10, 0 );
136
	}
137
138
	/**
139
	 * Show a dashboard notice that migration is in progress.
140
	 */
141
	public function display_migration_notice() {
142
		printf( '<div class="notice notice-warning"><p>%s</p></div>', __( 'Action Scheduler migration in progress. The list of scheduled actions may be incomplete.', 'action-scheduler' ) );
143
	}
144
145
	/**
146
	 * Add store classes. Hook migration.
147
	 */
148
	private function hook() {
149
		add_filter( 'action_scheduler_store_class', array( $this, 'get_store_class' ), 100, 1 );
150
		add_filter( 'action_scheduler_logger_class', array( $this, 'get_logger_class' ), 100, 1 );
151
		add_action( 'init', array( $this, 'maybe_hook_migration' ) );
152
		add_action( 'shutdown', array( $this, 'schedule_migration' ), 0, 0 );
153
154
		// Action Scheduler may be displayed as a Tools screen or WooCommerce > Status administration screen
155
		add_action( 'load-tools_page_action-scheduler', array( $this, 'hook_admin_notices' ), 10, 0 );
156
		add_action( 'load-woocommerce_page_wc-status', array( $this, 'hook_admin_notices' ), 10, 0 );
157
	}
158
159
	/**
160
	 * Possibly hook the migration scheduler action.
161
	 *
162
	 * @author Jeremy Pry
163
	 */
164
	public function maybe_hook_migration() {
165
		if ( ! $this->allow_migration() || \ActionScheduler_DataController::is_migration_complete() ) {
166
			return;
167
		}
168
169
		$this->migration_scheduler->hook();
170
	}
171
172
	/**
173
	 * Allow datastores to enable migration to AS tables.
174
	 */
175
	public function allow_migration() {
176
		if ( ! \ActionScheduler_DataController::dependencies_met() ) {
177
			return false;
178
		}
179
180
		if ( null === $this->migrate_custom_store ) {
181
			$this->migrate_custom_store = apply_filters( 'action_scheduler_migrate_data_store', false );
182
		}
183
184
		return ( ! $this->has_custom_datastore() ) || $this->migrate_custom_store;
185
	}
186
187
	/**
188
	 * Proceed with the migration if the dependencies have been met.
189
	 */
190
	public static function init() {
191
		if ( \ActionScheduler_DataController::dependencies_met() ) {
192
			self::instance()->hook();
193
		}
194
	}
195
196
	/**
197
	 * Singleton factory.
198
	 */
199
	public static function instance() {
200
		if ( ! isset( self::$instance ) ) {
201
			self::$instance = new static( new Scheduler() );
202
		}
203
204
		return self::$instance;
205
	}
206
}
207