PluginProbe
Booktics – Appointment Booking Calendar for Service Businesses / 1.0.29
Booktics – Appointment Booking Calendar for Service Businesses v1.0.29
1.0.29 1.0.28 1.0.27 1.0.26 1.0.25 1.0.24 1.0.23 1.0.22 1.0.21 1.0.20 1.0.19 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.2 1.0.3 All 31 releases
booktics / core / settings / controllers / settings-controller.php

settings-controller.php in Booktics – Appointment Booking Calendar for Service Businesses 1.0.29, at core/settings/controllers/settings-controller.php

282 lines 9.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Booktics\Settings\Controllers;
4
5 if ( ! defined( 'ABSPATH' ) ) {
6 exit;
7 }
8
9 use Booktics\Abstracts\Base_Rest_Controller;
10 use Booktics\Services\Schedule_Manager;
11 use Booktics\Settings\Settings;
12 use WP_Error;
13 use WP_HTTP_Response;
14 use WP_REST_Request;
15 use WP_REST_Server;
16
17 if ( ! function_exists( 'is_plugin_active' ) ) {
18 require_once ABSPATH . 'wp-admin/includes/plugin.php';
19 }
20
21 /**
22 * Settings controller
23 *
24 * @package Booktics/Appointment
25 */
26 class Settings_Controller extends Base_Rest_Controller {
27 /**
28 * Endpoint namespace
29 *
30 * @var string
31 */
32 protected $namespace = 'booktics/v1';
33
34 /**
35 * Route name
36 *
37 * @var string
38 */
39 protected $rest_base = 'settings';
40
41 /**
42 * Register routes
43 *
44 * @return void
45 */
46 public function register_routes(): void {
47 register_rest_route(
48 $this->namespace,
49 '/' . $this->rest_base,
50 array(
51 array(
52 'methods' => WP_REST_Server::READABLE,
53 'callback' => array( $this, 'get_item' ),
54 'args' => array(),
55 'permission_callback' => array( $this, 'get_item_permissions_check' ),
56 ),
57 array(
58 'methods' => WP_REST_Server::EDITABLE,
59 'callback' => array( $this, 'update_item' ),
60 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
61 'permission_callback' => array(
62 $this,
63 'get_item_permissions_check',
64 ),
65 ),
66 'schema' => array( $this, 'get_public_item_schema' ),
67 )
68 );
69
70 register_rest_route(
71 $this->namespace,
72 '/' . $this->rest_base . '/public',
73 array(
74 array(
75 'methods' => WP_REST_Server::READABLE,
76 'callback' => array( $this, 'get_public_item' ),
77 'args' => array(),
78 'permission_callback' => array(
79 $this,
80 'get_public_item_permissions_check',
81 ),
82 ),
83 )
84 );
85
86 register_rest_route(
87 $this->namespace,
88 '/' . $this->rest_base . '/stripe/disconnect',
89 array(
90 array(
91 'methods' => WP_REST_Server::EDITABLE,
92 'callback' => array(
93 $this,
94 'stripe_disconnect',
95 ),
96 'permission_callback' => array(
97 $this,
98 'stripe_disconnect_permissions_check',
99 ),
100 ),
101 )
102 );
103 }
104
105 /**
106 * Check if a given request has access to get items.
107 *
108 * @param WP_REST_Request $request Full data about the request.
109 *
110 * @return WP_Error
111 */
112 public function get_item_permissions_check( $request ): bool {
113 return current_user_can( 'manage_options' );
114 }
115
116 /**
117 * Format settings for API response.
118 *
119 * @param array $settings Settings array.
120 *
121 * @return array
122 */
123 private function format_settings_for_response( array $settings ): array {
124 $settings['reschedule_restriction'] = empty( $settings['reschedule_restriction'] ) ? (object) array() : $settings['reschedule_restriction'];
125 $settings['custom_reschedule_status'] = empty( $settings['custom_reschedule_status'] ) ? (object) array() : $settings['custom_reschedule_status'];
126 $settings['cancellation_restriction'] = empty( $settings['cancellation_restriction'] ) ? (object) array() : $settings['cancellation_restriction'];
127 $settings['stripe_addon_install_status'] = 0;
128 $settings['woocommerce_install_status'] = 0;
129
130 $settings = apply_filters( 'booktics_format_setting_response', $settings );
131
132 return $settings;
133 }
134
135 /**
136 * Get a collection of items.
137 *
138 * @param WP_REST_Request $request Full data about the request.
139 *
140 * @return WP_HTTP_Response
141 */
142 public function get_item( $request ) {
143 $settings = Settings::get();
144 $settings = apply_filters( 'booktics_rest_settings', $settings );
145 $settings = $this->format_settings_for_response( $settings );
146
147 return $this->response( $settings, __( 'Settings fetched successfully.', 'booktics' ) );
148 }
149
150 /**
151 * Update plugin settings.
152 *
153 * @param WP_Rest_Request $request Request object.
154 *
155 * @return WP_HTTP_Response
156 */
157 public function update_item( $request ) {
158 $params = $request->get_params();
159
160 if ( isset( $params['schedule'] ) || isset( $params['custom'] ) || isset( $params['holiday'] ) ) {
161 $input_data = json_decode( $request->get_body(), true );
162 $schedule_manager = Schedule_Manager::make( $input_data );
163 $schedule_manager->save();
164 unset( $params['schedule'], $params['custom'], $params['holiday'] );
165 }
166
167 // Enforce an integer minute value for the reservation hold timeout.
168 if ( isset( $params['pending_reservation_timeout'] ) ) {
169 $minutes = absint( $params['pending_reservation_timeout'] );
170 $params['pending_reservation_timeout'] = $minutes > 0 ? $minutes : 10;
171 }
172
173 // Only the two known destinations are accepted for the post-checkout page.
174 if ( isset( $params['wc_thankyou_page'] ) ) {
175 $params['wc_thankyou_page'] = in_array( $params['wc_thankyou_page'], array( 'woocommerce', 'booktics' ), true )
176 ? $params['wc_thankyou_page']
177 : 'woocommerce';
178 }
179
180 /**
181 * Last chance to clean the settings payload before it is stored.
182 *
183 * Settings::update() writes what it is handed, so a feature adding a
184 * structured key of its own sanitizes it here. schedule, custom and
185 * holiday are not in $params: Schedule_Manager has already saved them.
186 *
187 * @since 1.0.26
188 *
189 * @param array $params Settings payload from the request.
190 */
191 $filtered = apply_filters( 'booktics_settings_update_params', $params );
192
193 if ( ! is_array( $filtered ) ) {
194 _doing_it_wrong(
195 __METHOD__,
196 esc_html__( 'The booktics_settings_update_params filter must return an array.', 'booktics' ),
197 '1.0.26'
198 );
199 $filtered = $params;
200 }
201
202 $params = $filtered;
203
204 Settings::update( $params );
205
206 $settings = Settings::get();
207 $settings = apply_filters( 'booktics_rest_settings', $settings );
208 $settings = $this->format_settings_for_response( $settings );
209
210 return $this->response( $settings, __( 'Settings updated successfully.', 'booktics' ) );
211 }
212
213 /**
214 * Get public settings
215 */
216 public function get_public_item( $request ) {
217 $all = Settings::get();
218 $allowed = [
219 'primary_color',
220 'secondary_color',
221 'currency',
222 'currency_symbol_position',
223 'currency_decimals',
224 'currency_price_separator',
225 'enable_stripe_payment',
226 'enable_paypal_payment',
227 'enable_local_payment',
228 'enable_woocommerce_payment',
229 'wc_show_billing_fields',
230 'wc_thankyou_page',
231 'stripe_publishable_key',
232 'show_end_time',
233 'calendar_locale',
234 'allow_customer_rescheduling',
235 'allow_customer_cancellation',
236 'reschedule_restriction',
237 'cancellation_restriction',
238 ];
239
240 $public = array_intersect_key( $all, array_flip( $allowed ) );
241 $public = apply_filters( 'booktics_rest_public_settings', $public );
242
243 return $this->response( $public, __( 'Public settings fetched successfully.', 'booktics' ) );
244 }
245
246 /**
247 * Check if a given request has access to get items.
248 *
249 * @param WP_REST_Request $request Full data about the request.
250 *
251 * @return bool
252 */
253 public function get_public_item_permissions_check( $request ): bool {
254 return true;
255 }
256
257 /**
258 * Check if a given request has access to get items.
259 *
260 * @param WP_REST_Request $request Full data about the request.
261 *
262 * @return bool
263 */
264 public function stripe_disconnect_permissions_check( $request ): bool {
265 return current_user_can( 'manage_options' );
266 }
267
268 /**
269 * Disconnect Stripe account by clearing account ID
270 *
271 * @param $request
272 *
273 * @return WP_HTTP_Response
274 */
275 public function stripe_disconnect( $request ) {
276 Settings::update( 'stripe_account_id', '' );
277 Settings::update( 'stripe_account_type', '' );
278
279 return $this->response( array(), __( 'Successfully disconnected Stripe account.', 'booktics' ) );
280 }
281 }
282