PluginProbe
Booktics – Appointment Booking Calendar for Service Businesses / 1.0.25
Booktics – Appointment Booking Calendar for Service Businesses v1.0.25
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.25, at core/settings/controllers/settings-controller.php

258 lines 8.3 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 Settings::update( $params );
181
182 $settings = Settings::get();
183 $settings = apply_filters( 'booktics_rest_settings', $settings );
184 $settings = $this->format_settings_for_response( $settings );
185
186 return $this->response( $settings, __( 'Settings updated successfully.', 'booktics' ) );
187 }
188
189 /**
190 * Get public settings
191 */
192 public function get_public_item( $request ) {
193 $all = Settings::get();
194 $allowed = [
195 'primary_color',
196 'secondary_color',
197 'currency',
198 'currency_symbol_position',
199 'currency_decimals',
200 'currency_price_separator',
201 'enable_stripe_payment',
202 'enable_paypal_payment',
203 'enable_local_payment',
204 'enable_woocommerce_payment',
205 'wc_show_billing_fields',
206 'wc_thankyou_page',
207 'stripe_publishable_key',
208 'show_end_time',
209 'calendar_locale',
210 'allow_customer_rescheduling',
211 'allow_customer_cancellation',
212 'reschedule_restriction',
213 'cancellation_restriction',
214 ];
215
216 $public = array_intersect_key( $all, array_flip( $allowed ) );
217 $public = apply_filters( 'booktics_rest_public_settings', $public );
218
219 return $this->response( $public, __( 'Public settings fetched successfully.', 'booktics' ) );
220 }
221
222 /**
223 * Check if a given request has access to get items.
224 *
225 * @param WP_REST_Request $request Full data about the request.
226 *
227 * @return bool
228 */
229 public function get_public_item_permissions_check( $request ): bool {
230 return true;
231 }
232
233 /**
234 * Check if a given request has access to get items.
235 *
236 * @param WP_REST_Request $request Full data about the request.
237 *
238 * @return bool
239 */
240 public function stripe_disconnect_permissions_check( $request ): bool {
241 return current_user_can( 'manage_options' );
242 }
243
244 /**
245 * Disconnect Stripe account by clearing account ID
246 *
247 * @param $request
248 *
249 * @return WP_HTTP_Response
250 */
251 public function stripe_disconnect( $request ) {
252 Settings::update( 'stripe_account_id', '' );
253 Settings::update( 'stripe_account_type', '' );
254
255 return $this->response( array(), __( 'Successfully disconnected Stripe account.', 'booktics' ) );
256 }
257 }
258