Completed
Push — instant-search-master ( e67c60...e24956 )
by
unknown
11:28 queued 04:53
created

Health::on_jetpack_upgraded()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
nc 3
nop 0
dl 0
loc 9
rs 9.9666
c 0
b 0
f 0
1
<?php
2
/**
3
 * Health class.
4
 *
5
 * @package automattic/jetpack-sync
6
 */
7
8
namespace Automattic\Jetpack\Sync;
9
10
/**
11
 * Health class.
12
 */
13
class Health {
14
15
	/**
16
	 * Prefix of the blog lock transient.
17
	 *
18
	 * @access public
19
	 *
20
	 * @var string
21
	 */
22
	const STATUS_OPTION = 'sync_health_status';
23
24
	/**
25
	 * Status key in option array.
26
	 *
27
	 * @access public
28
	 *
29
	 * @var string
30
	 */
31
	const OPTION_STATUS_KEY = 'status';
32
33
	/**
34
	 * Timestamp key in option array.
35
	 *
36
	 * @access public
37
	 *
38
	 * @var string
39
	 */
40
	const OPTION_TIMESTAMP_KEY = 'timestamp';
41
42
	/**
43
	 * Unknown status code.
44
	 *
45
	 * @access public
46
	 *
47
	 * @var string
48
	 */
49
	const STATUS_UNKNOWN = 'unknown';
50
51
	/**
52
	 * Disabled status code.
53
	 *
54
	 * @access public
55
	 *
56
	 * @var string
57
	 */
58
	const STATUS_DISABLED = 'disabled';
59
60
	/**
61
	 * Out of sync status code.
62
	 *
63
	 * @access public
64
	 *
65
	 * @var string
66
	 */
67
	const STATUS_OUT_OF_SYNC = 'out_of_sync';
68
69
	/**
70
	 * In sync status code.
71
	 *
72
	 * @access public
73
	 *
74
	 * @var string
75
	 */
76
	const STATUS_IN_SYNC = 'in_sync';
77
78
	/**
79
	 * If sync is active, Health-related hooks will be initialized after plugins are loaded.
80
	 */
81
	public static function init() {
82
		add_action( 'jetpack_full_sync_end', array( __ClASS__, 'full_sync_end_update_status' ), 10, 2 );
83
	}
84
85
	/**
86
	 * Gets health status code.
87
	 *
88
	 * @return string Sync Health Status
89
	 */
90
	public static function get_status() {
91
		$status = \Jetpack_Options::get_option( self::STATUS_OPTION );
92
93 View Code Duplication
		if ( false === $status || ! is_array( $status ) || empty( $status[ self::OPTION_STATUS_KEY ] ) ) {
94
			return self::STATUS_UNKNOWN;
95
		}
96
97
		switch ( $status[ self::OPTION_STATUS_KEY ] ) {
98
			case self::STATUS_DISABLED:
99
			case self::STATUS_OUT_OF_SYNC:
100
			case self::STATUS_IN_SYNC:
101
				return $status[ self::OPTION_STATUS_KEY ];
102
			default:
103
				return self::STATUS_UNKNOWN;
104
		}
105
106
	}
107
108
	/**
109
	 * When the Jetpack plugin is upgraded, set status to disabled if sync is not enabled,
110
	 * or to unknown, if the status has never been set before.
111
	 */
112
	public static function on_jetpack_upgraded() {
113
		if ( ! Settings::is_sync_enabled() ) {
114
			self::update_status( self::STATUS_DISABLED );
115
			return;
116
		}
117
		if ( false === self::is_status_defined() ) {
118
			self::update_status( self::STATUS_UNKNOWN );
119
		}
120
	}
121
122
	/**
123
	 * When the Jetpack plugin is activated, set status to disabled if sync is not enabled,
124
	 * or to unknown.
125
	 */
126
	public static function on_jetpack_activated() {
127
		if ( ! Settings::is_sync_enabled() ) {
128
			self::update_status( self::STATUS_DISABLED );
129
			return;
130
		}
131
		self::update_status( self::STATUS_UNKNOWN );
132
	}
133
134
	/**
135
	 * Updates sync health status with either a valid status, or an unknown status.
136
	 *
137
	 * @param string $status Sync Status.
138
	 *
139
	 * @return bool True if an update occoured, or false if the status didn't change.
140
	 */
141
	public static function update_status( $status ) {
142
		if ( self::get_status() === $status ) {
143
			return false;
144
		}
145
		// Default Status Option.
146
		$new_status = array(
147
			self::OPTION_STATUS_KEY    => self::STATUS_UNKNOWN,
148
			self::OPTION_TIMESTAMP_KEY => microtime( true ),
149
		);
150
151
		switch ( $status ) {
152
			case self::STATUS_DISABLED:
153
			case self::STATUS_OUT_OF_SYNC:
154
			case self::STATUS_IN_SYNC:
155
				$new_status[ self::OPTION_STATUS_KEY ] = $status;
156
				break;
157
		}
158
159
		\Jetpack_Options::update_option( self::STATUS_OPTION, $new_status );
160
		return true;
161
	}
162
163
	/**
164
	 * Check if Status has been previously set.
165
	 *
166
	 * @return bool is a Status defined
167
	 */
168
	public static function is_status_defined() {
169
		$status = \Jetpack_Options::get_option( self::STATUS_OPTION );
170
171 View Code Duplication
		if ( false === $status || ! is_array( $status ) || empty( $status[ self::OPTION_STATUS_KEY ] ) ) {
172
			return false;
173
		} else {
174
			return true;
175
		}
176
	}
177
178
	/**
179
	 * Update Sync Status if Full Sync ended of Posts
180
	 *
181
	 * @param string $checksum The checksum that's currently being processed.
182
	 * @param array  $range The ranges of object types being processed.
183
	 */
184
	public static function full_sync_end_update_status( $checksum, $range ) {
185
		if ( isset( $range['posts'] ) ) {
186
			self::update_status( self::STATUS_IN_SYNC );
187
		}
188
	}
189
190
}
191