PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.13.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.13.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 years ago Assets 2 years ago Pages 3 years ago PostTypes 2 years ago Shortcodes 2 years ago Sitemap 2 years ago Templates 2 years ago Users 3 years ago ActionsService.php 3 years ago CompatibilityService.php 2 years ago HealthService.php 2 years ago LineItemStateService.php 2 years ago PluginService.php 3 years ago PluginServiceProvider.php 2 years ago RecaptchaValidationService.php 2 years ago StateService.php 2 years ago ThemeService.php 2 years ago ThemeServiceProvider.php 3 years ago TranslationsServiceProvider.php 3 years ago
HealthService.php
197 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 'value' => ! empty( $total_failed ) ? sprintf( __( '%d Unprocessed webhooks', 'surecart' ), $total_failed ) : __( 'Working', 'surecart' ),
57 'private' => false,
58 ),
59 ),
60 );
61 return $debug_info;
62 }
63
64 /**
65 * Register tests for the Status Page
66 *
67 * @param array $tests List of tests.
68 *
69 * @return array
70 */
71 public function tests( $tests ) {
72 $tests['async']['surecart_api_test'] = array(
73 'label' => __( 'SureCart', 'surecart' ) . ' ' . __( 'API connectivity', 'surecart' ),
74 'test' => rest_url( 'surecart/v1/site-health/api-connectivity' ),
75 'has_rest' => true,
76 'async_direct_test' => [ $this, 'apiTest' ],
77 );
78
79 $is_localhost = ( new Server( get_home_url() ) )->isLocalHost();
80 if ( ! $is_localhost ) {
81 $tests['direct']['surecart_webhook_test'] = array(
82 'label' => __( 'SureCart', 'neve' ) . ' ' . __( 'Webhooks Processing', 'surecart' ),
83 'test' => [ $this, 'webhooksProcessingTest' ],
84 );
85 $tests['async']['surecart_webhooks_test'] = array(
86 'label' => __( 'SureCart', 'surecart' ) . ' ' . __( 'Webhooks Connection', 'surecart' ),
87 'test' => rest_url( 'surecart/v1/site-health/webhooks' ),
88 'has_rest' => true,
89 'async_direct_test' => [ $this, 'webhooksTest' ],
90 );
91 }
92
93 return $tests;
94 }
95
96 /**
97 * Neve API test pretty response
98 *
99 * @return array
100 */
101 public function apiTest() {
102 $account = Account::find();
103
104 return array(
105 'label' => __( 'SureCart', 'surecart' ) . ' ' . __( 'API connectivity', 'surecart' ),
106 'status' => $account->id ? 'good' : 'critical',
107 'badge' => array(
108 'label' => __( 'SureCart', 'surecart' ),
109 'color' => $account->id ? 'blue' : 'red',
110 ),
111 'description' => sprintf(
112 '<p>%s</p>',
113 $account->id ? __( 'API for is reachable.', 'surecart' ) : __( 'API for is not reachable.', 'surecart' )
114 ),
115 'actions' => '',
116 'test' => 'surecart_api_test',
117 );
118 }
119
120 /**
121 * Check that webhooks are processing normally.
122 *
123 * @return array
124 */
125 public function webhooksProcessingTest() {
126 $total_failed = IncomingWebhook::whereNull( 'processed_at' )->andWhere( 'created_at', '<', ( new \DateTime() )->modify( '-30 minutes' )->format( 'Y-m-d H:i:s' ) )->count();
127 $has_errors = ! empty( $total_failed );
128
129 return array(
130 'label' => $has_errors ? __( 'SureCart Webhooks Processing Error', 'surecart' ) : __( 'SureCart Webhooks Processing', 'surecart' ),
131 'status' => $has_errors ? 'critical' : 'good',
132 'badge' => array(
133 'label' => __( 'SureCart', 'surecart' ),
134 'color' => $has_errors ? 'red' : 'blue',
135 ),
136 'description' => sprintf(
137 '<p>%s</p>',
138 $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' )
139 ),
140 'actions' => $has_errors ? sprintf(
141 '<a href="%s" class="button" target="_blank">%s</a>',
142 esc_url( admin_url( 'admin.php?page=sc-settings&tab=connection' ) ),
143 __( 'Troubleshoot Connection', 'surecart' )
144 ) : '',
145 'test' => 'surecart_webhooks_processing_test',
146 );
147 }
148
149 /**
150 * Neve API test pretty response
151 *
152 * @return array
153 */
154 public function webhooksTest() {
155 // clear account cache.
156 \SureCart::account()->clearCache();
157
158 $webhook = RegisteredWebhook::get();
159
160 // Defaults.
161 $description = __( 'Webhooks are working normally.', 'surecart' );
162 $label = __( 'SureCart', 'surecart' ) . ' ' . __( 'Webhooks', 'surecart' );
163 $status = 'good';
164
165 if ( empty( $webhook->enabled ) ) {
166 $status = 'critical';
167 $label = __( 'SureCart', 'surecart' ) . ' ' . __( 'webhook is disabled.', 'surecart' );
168 $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' );
169 } elseif ( ! empty( $webhook->erroring_grace_period_ends_at ) ) {
170 $status = 'critical';
171 $label = __( 'SureCart', 'surecart' ) . ' ' . __( 'webhook connection is being monitored for errors.', 'surecart' );
172 $description = __( 'The SureCart webhook has received repeated errors.', 'surecart' );
173 $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 ) );
174 $description .= ' ' . __( 'Please troubleshoot the issue if integrations are important to your store.', 'surecart' );
175 }
176
177 return array(
178 'label' => $label,
179 'status' => $status,
180 'badge' => array(
181 'label' => __( 'SureCart', 'surecart' ),
182 'color' => 'critical' === $status ? 'red' : 'blue',
183 ),
184 'description' => sprintf(
185 '<p>%s</p>',
186 $description
187 ),
188 'actions' => 'critical' === $status ? sprintf(
189 '<a href="%s" class="button" target="_blank">%s</a>',
190 esc_url( untrailingslashit( SURECART_APP_URL ) . '/developer' ),
191 __( 'Troubleshoot Connection', 'surecart' )
192 ) : '',
193 'test' => 'surecart_webhooks_test',
194 );
195 }
196 }
197