Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
46.88% covered (danger)
46.88%
15 / 32
14.29% covered (danger)
14.29%
1 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
Health
46.88% covered (danger)
46.88%
15 / 32
14.29% covered (danger)
14.29%
1 / 7
118.71
0.00% covered (danger)
0.00%
0 / 1
 init
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 get_status
83.33% covered (warning)
83.33%
5 / 6
0.00% covered (danger)
0.00%
0 / 1
8.30
 on_jetpack_upgraded
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
12
 on_jetpack_activated
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 update_status
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
5
 is_status_defined
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
20
 full_sync_end_update_status
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2/**
3 * Health class.
4 *
5 * @package automattic/jetpack-sync
6 */
7
8namespace Automattic\Jetpack\Sync;
9
10/**
11 * Health class.
12 */
13class 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        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     * When the Jetpack plugin is upgraded, set status to disabled if sync is not enabled,
109     * or to unknown, if the status has never been set before.
110     */
111    public static function on_jetpack_upgraded() {
112        if ( ! Settings::is_sync_enabled() ) {
113            self::update_status( self::STATUS_DISABLED );
114            return;
115        }
116        if ( false === self::is_status_defined() ) {
117            self::update_status( self::STATUS_UNKNOWN );
118        }
119    }
120
121    /**
122     * When the Jetpack plugin is activated, set status to disabled if sync is not enabled,
123     * or to unknown.
124     */
125    public static function on_jetpack_activated() {
126        if ( ! Settings::is_sync_enabled() ) {
127            self::update_status( self::STATUS_DISABLED );
128            return;
129        }
130        self::update_status( self::STATUS_UNKNOWN );
131    }
132
133    /**
134     * Updates sync health status with either a valid status, or an unknown status.
135     *
136     * @param string $status Sync Status.
137     *
138     * @return bool True if an update occoured, or false if the status didn't change.
139     */
140    public static function update_status( $status ) {
141        if ( self::get_status() === $status ) {
142            return false;
143        }
144        // Default Status Option.
145        $new_status = array(
146            self::OPTION_STATUS_KEY    => self::STATUS_UNKNOWN,
147            self::OPTION_TIMESTAMP_KEY => microtime( true ),
148        );
149
150        switch ( $status ) {
151            case self::STATUS_DISABLED:
152            case self::STATUS_OUT_OF_SYNC:
153            case self::STATUS_IN_SYNC:
154                $new_status[ self::OPTION_STATUS_KEY ] = $status;
155                break;
156        }
157
158        \Jetpack_Options::update_option( self::STATUS_OPTION, $new_status );
159        return true;
160    }
161
162    /**
163     * Check if Status has been previously set.
164     *
165     * @return bool is a Status defined
166     */
167    public static function is_status_defined() {
168        $status = \Jetpack_Options::get_option( self::STATUS_OPTION );
169
170        if ( false === $status || ! is_array( $status ) || empty( $status[ self::OPTION_STATUS_KEY ] ) ) {
171            return false;
172        } else {
173            return true;
174        }
175    }
176
177    /**
178     * Update Sync Status if Full Sync ended of Posts
179     *
180     * @param string $checksum The checksum that's currently being processed.
181     * @param array  $range The ranges of object types being processed.
182     */
183    public static function full_sync_end_update_status( $checksum, $range ) {
184        if ( isset( $range['posts'] ) ) {
185            self::update_status( self::STATUS_IN_SYNC );
186        }
187    }
188}