PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 4.5.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v4.5.0
4.5.1 4.5.0 4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / app / src / WordPress / HealthService.php
surecart / app / src / WordPress Last commit date
Admin 2 months ago Assets 2 weeks ago CLI 2 years ago Cache 2 weeks ago Pages 10 months ago PostTypes 2 months ago Posts 1 year ago Shortcodes 1 month ago Taxonomies 1 year ago Templates 1 year ago Users 2 months ago ActionsService.php 3 years ago CompatibilityService.php 4 months ago CurrencyService.php 4 months ago GoogleMapApiService.php 2 months ago HealthService.php 2 months ago LineItemStateService.php 2 years ago PluginActionLinksService.php 1 year ago PluginService.php 1 year ago PluginServiceProvider.php 1 year ago RecaptchaValidationService.php 2 years ago StateService.php 7 months ago ThemeService.php 4 months ago ThemeServiceProvider.php 7 months ago TranslationsServiceProvider.php 3 months ago UpgradeNoticeService.php 1 year ago
HealthService.php
209 lines
1 <?php
2
3 namespace SureCart\WordPress;
4
5 use SureCart\Models\Account;
6 use SureCart\Models\ApiToken;
7 use SureCart\Models\IncomingWebhook;
8 use SureCart\Models\RegisteredWebhook;
9 use SureCart\Support\Server;
10
11 class HealthService {
12 /**
13 * Bootstrap the service.
14 *
15 * @return void
16 */
17 public function bootstrap() {
18 add_filter( 'debug_information', [ $this, 'debugInfo' ] );
19 add_filter( 'site_status_tests', [ $this, 'tests' ] );
20 }
21
22 /**
23 * Add debug information.
24 *
25 * @param array $debug_info Debug List.
26 *
27 * @return array
28 */
29 public function debugInfo( $debug_info ) {
30 $total_failed = IncomingWebhook::whereNull( 'processed_at' )->andWhere( 'created_at', '<', ( new \DateTime() )->modify( '-30 minutes' )->format( 'Y-m-d H:i:s' ) )->count();
31 $debug_info['surecart'] = array(
32 'label' => __( 'SureCart', 'surecart' ),
33 'fields' => array(
34 'api' => array(
35 'label' => __( 'API Connectivity', 'surecart' ),
36 'value' => (bool) ApiToken::get() ? __( 'Connected', 'surecart' ) : __( 'Not connected', 'surecart' ),
37 'private' => false,
38 ),
39 'store_id' => array(
40 'label' => __( 'Store ID', 'surecart' ),
41 'value' => \SureCart::account()->id,
42 'private' => false,
43 ),
44 'url' => array(
45 'label' => __( 'Store URL', 'surecart' ),
46 'value' => \SureCart::account()->url,
47 'private' => false,
48 ),
49 'webhook_url' => array(
50 'label' => __( 'Registered Webhook URL', 'surecart' ),
51 'value' => RegisteredWebhook::registration()->get()->url ?? __( 'Not registered', 'surecart' ),
52 'private' => false,
53 ),
54 'webhooks_processing' => array(
55 'label' => __( 'Webhooks Processing', 'surecart' ),
56 // translators: %d is the number of unprocessed webhooks.
57 'value' => ! empty( $total_failed ) ? sprintf( __( '%d Unprocessed webhooks', 'surecart' ), $total_failed ) : __( 'Working', 'surecart' ),
58 'private' => false,
59 ),
60 'encryption_key' => array(
61 'label' => __( 'Encryption Key', 'surecart' ),
62 'value' => defined( 'SURECART_ENCRYPTION_KEY' ) ? __( 'Defined', 'surecart' ) : __( 'Not defined', 'surecart' ),
63 'private' => false,
64 ),
65 'number_formatter' => array(
66 'label' => __( 'Number Formatter', 'surecart' ),
67 'value' => class_exists( 'NumberFormatter' ) ? __( 'Defined', 'surecart' ) : __( 'Not defined', 'surecart' ),
68 'private' => false,
69 ),
70 ),
71 );
72 return $debug_info;
73 }
74
75 /**
76 * Register tests for the Status Page
77 *
78 * @param array $tests List of tests.
79 *
80 * @return array
81 */
82 public function tests( $tests ) {
83 $tests['async']['surecart_api_test'] = array(
84 'label' => __( 'SureCart', 'surecart' ) . ' ' . __( 'API connectivity', 'surecart' ),
85 'test' => rest_url( 'surecart/v1/site-health/api-connectivity' ),
86 'has_rest' => true,
87 'async_direct_test' => [ $this, 'apiTest' ],
88 );
89
90 $is_localhost = ( new Server( get_home_url() ) )->isLocalHost();
91 if ( ! $is_localhost ) {
92 $tests['direct']['surecart_webhook_test'] = array(
93 'label' => __( 'SureCart', 'surecart' ) . ' ' . __( 'Webhooks Processing', 'surecart' ),
94 'test' => [ $this, 'webhooksProcessingTest' ],
95 );
96 $tests['async']['surecart_webhooks_test'] = array(
97 'label' => __( 'SureCart', 'surecart' ) . ' ' . __( 'Webhooks Connection', 'surecart' ),
98 'test' => rest_url( 'surecart/v1/site-health/webhooks' ),
99 'has_rest' => true,
100 'async_direct_test' => [ $this, 'webhooksTest' ],
101 );
102 }
103
104 return $tests;
105 }
106
107 /**
108 * Neve API test pretty response
109 *
110 * @return array
111 */
112 public function apiTest() {
113 $account = Account::find();
114
115 return array(
116 'label' => __( 'SureCart', 'surecart' ) . ' ' . __( 'API connectivity', 'surecart' ),
117 'status' => ! empty( $account->id ) ? 'good' : 'critical',
118 'badge' => array(
119 'label' => __( 'SureCart', 'surecart' ),
120 'color' => ! empty( $account->id ) ? 'blue' : 'red',
121 ),
122 'description' => sprintf(
123 '<p>%s</p>',
124 ! empty( $account->id ) ? __( 'The SureCart API is reachable.', 'surecart' ) : __( 'The SureCart API is not reachable.', 'surecart' )
125 ),
126 'actions' => '',
127 'test' => 'surecart_api_test',
128 );
129 }
130
131 /**
132 * Check that webhooks are processing normally.
133 *
134 * @return array
135 */
136 public function webhooksProcessingTest() {
137 $total_failed = IncomingWebhook::whereNull( 'processed_at' )->andWhere( 'created_at', '<', ( new \DateTime() )->modify( '-30 minutes' )->format( 'Y-m-d H:i:s' ) )->count();
138 $has_errors = ! empty( $total_failed );
139
140 return array(
141 'label' => $has_errors ? __( 'SureCart Webhooks Processing Error', 'surecart' ) : __( 'SureCart Webhooks Processing', 'surecart' ),
142 'status' => $has_errors ? 'critical' : 'good',
143 'badge' => array(
144 'label' => __( 'SureCart', 'surecart' ),
145 'color' => $has_errors ? 'red' : 'blue',
146 ),
147 'description' => sprintf(
148 '<p>%s</p>',
149 // translators: %d is the number of failed webhooks.
150 $has_errors ? sprintf( __( '%d of your webhooks failed to process on your site. Please check your error logs to make sure errors did not occur in webhook processing.', 'surecart' ), (int) $total_failed ) : __( 'Webhook processing is working normally.', 'surecart' )
151 ),
152 'actions' => $has_errors ? sprintf(
153 '<a href="%s" class="button" target="_blank">%s</a>',
154 esc_url( admin_url( 'admin.php?page=sc-settings&tab=connection' ) ),
155 __( 'Troubleshoot Connection', 'surecart' )
156 ) : '',
157 'test' => 'surecart_webhooks_processing_test',
158 );
159 }
160
161 /**
162 * Neve API test pretty response
163 *
164 * @return array
165 */
166 public function webhooksTest() {
167 // clear account cache.
168 \SureCart::account()->clearCache();
169
170 $webhook = RegisteredWebhook::get();
171
172 // Defaults.
173 $description = __( 'Webhooks are working normally.', 'surecart' );
174 $label = __( 'SureCart', 'surecart' ) . ' ' . __( 'Webhooks', 'surecart' );
175 $status = 'good';
176
177 if ( empty( $webhook->enabled ) ) {
178 $status = 'critical';
179 $label = __( 'SureCart', 'surecart' ) . ' ' . __( 'webhook is disabled.', 'surecart' );
180 $description = __( 'The SureCart webhook is currently disabled which can cause issues with integrations. This can happen automatically due to repeated errors, or could have been disabled manually. Please re-enable the webhook and troubleshoot the issue if integrations are important to your store.', 'surecart' );
181 } elseif ( ! empty( $webhook->erroring_grace_period_ends_at ) ) {
182 $status = 'critical';
183 $label = __( 'SureCart', 'surecart' ) . ' ' . __( 'webhook connection is being monitored for errors.', 'surecart' );
184 $description = __( 'The SureCart webhook has received repeated errors.', 'surecart' );
185 $description .= ' ' . $webhook->erroring_grace_period_ends_at > time() ? sprintf( wp_kses( 'These errors will automatically attempt to be retried, however, we will disable this in <strong>%s</strong> if it continues to fail.', 'surecart' ), human_time_diff( $webhook->erroring_grace_period_ends_at ) ) : sprintf( wp_kses( 'It was automatically disabled %s ago.', 'surecart' ), human_time_diff( $webhook->erroring_grace_period_ends_at ) );
186 $description .= ' ' . __( 'Please troubleshoot the issue if integrations are important to your store.', 'surecart' );
187 }
188
189 return array(
190 'label' => $label,
191 'status' => $status,
192 'badge' => array(
193 'label' => __( 'SureCart', 'surecart' ),
194 'color' => 'critical' === $status ? 'red' : 'blue',
195 ),
196 'description' => sprintf(
197 '<p>%s</p>',
198 $description
199 ),
200 'actions' => 'critical' === $status ? sprintf(
201 '<a href="%s" class="button" target="_blank">%s</a>',
202 esc_url( untrailingslashit( SURECART_APP_URL ) . '/developer?switch_account_id=' . \SureCart::account()->id ),
203 __( 'Troubleshoot Connection', 'surecart' )
204 ) : '',
205 'test' => 'surecart_webhooks_test',
206 );
207 }
208 }
209