PluginProbe
Timetics – Appointment Booking Calendar & Scheduling / 1.0.0
Timetics – Appointment Booking Calendar & Scheduling v1.0.0
1.0.61 1.0.60 1.0.59 1.0.58 1.0.57 1.0.56 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.19 1.0.2 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 All 62 releases
timetics / core / customers / api-customer.php

api-customer.php in Timetics – Appointment Booking Calendar & Scheduling 1.0.0, at core/customers/api-customer.php

457 lines 12.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Api Customer
4 *
5 * @package Timetics
6 */
7 namespace Timetics\Core\Customers;
8
9 use Timetics\Base\Api;
10 use Timetics\Utils\Singleton;
11 use WP_HTTP_Response;
12 use WP_User_Query;
13
14 /**
15 * Class Api_customer
16 */
17 class Api_Customer extends Api {
18 use Singleton;
19
20 /**
21 * Store namespace
22 *
23 * @var string
24 */
25 protected $namespace = 'timetics/v1';
26
27 /**
28 * Store rest base
29 *
30 * @var string
31 */
32 protected $rest_base = 'customers';
33
34 /**
35 * Register rest route
36 *
37 * @return void
38 */
39 public function register_routes() {
40 register_rest_route(
41 $this->namespace, $this->rest_base, [
42 [
43 'methods' => \WP_REST_Server::READABLE,
44 'callback' => [ $this, 'get_items' ],
45 'permission_callback' => function () {
46 return current_user_can( 'manage_timetics' );
47 },
48 ],
49 [
50 'methods' => \WP_REST_Server::CREATABLE,
51 'callback' => [ $this, 'create_item' ],
52 'permission_callback' => function () {
53 return current_user_can( 'manage_timetics' );
54 },
55 ],
56 [
57 'methods' => \WP_REST_Server::DELETABLE,
58 'callback' => [ $this, 'bulk_delete' ],
59 'permission_callback' => function () {
60 return current_user_can( 'manage_timetics' );
61 },
62 ],
63 ]
64 );
65
66 /**
67 * Register route
68 *
69 * @var void
70 */
71 register_rest_route(
72 $this->namespace, '/' . $this->rest_base . '/(?P<customer_id>[\d]+)', [
73 [
74 'methods' => \WP_REST_Server::READABLE,
75 'callback' => [ $this, 'get_item' ],
76 'permission_callback' => function () {
77 return current_user_can( 'manage_timetics' );
78 },
79 ],
80 [
81 'methods' => \WP_REST_Server::EDITABLE,
82 'callback' => [ $this, 'update_item' ],
83 'permission_callback' => function () {
84 return current_user_can( 'manage_timetics' );
85 },
86 ],
87 [
88 'methods' => \WP_REST_Server::DELETABLE,
89 'callback' => [ $this, 'delete_item' ],
90 'permission_callback' => function () {
91 return current_user_can( 'manage_timetics' );
92 },
93 ],
94 ]
95 );
96
97 register_rest_route(
98 $this->namespace, $this->rest_base . '/search', [
99 [
100 'methods' => \WP_REST_Server::READABLE,
101 'callback' => [ $this, 'search_items' ],
102 'permission_callback' => function () {
103 return current_user_can( 'edit_posts' );
104 },
105 ],
106 ]
107 );
108 }
109 /**
110 * Get all customers
111 *
112 * @param WP_Rest_Request $request
113 *
114 * @return JSON
115 */
116 public function get_items( $request ) {
117 $per_page = ! empty( $request['per_page'] ) ? intval( $request['per_page'] ) : 20;
118 $paged = ! empty( $request['paged'] ) ? intval( $request['paged'] ) : 1;
119
120 $customer = Customer::all(
121 [
122 'number' => $per_page,
123 'paged' => $paged,
124 ]
125 );
126
127 $items = [];
128
129 foreach ( $customer['items'] as $item ) {
130 $items[] = $this->prepare_item( $item->ID );
131 }
132
133 $data = [
134 'success' => 1,
135 'data' => [
136 'total' => $customer['total'],
137 'items' => $items,
138 ],
139 ];
140
141 return rest_ensure_response( $data );
142 }
143
144 /**
145 * Get single customer
146 *
147 * @param WP_Rest_Requesr $request
148 *
149 * @return JSON Single customer data
150 */
151 public function get_item( $request ) {
152 $customer_id = (int) $request['customer_id'];
153 $customer = new Customer( $customer_id );
154
155 if ( ! $customer->is_customer() ) {
156 return [
157 'status_code' => 404,
158 'message' => __( 'Invalid customer id.', 'timetics' ),
159 'data' => [],
160 ];
161 }
162
163 $response = [
164 'status_code' => 200,
165 'data' => $this->prepare_item( $customer ),
166 ];
167
168 return rest_ensure_response( $response );
169 }
170
171 /**
172 * Search customer
173 *
174 * @return JSON
175 */
176 public function search_items( $request ) {
177
178 // Prepare search args.
179 $per_page = ! empty( $request['per_page'] ) ? intval( $request['per_page'] ) : 20;
180 $paged = ! empty( $request['paged'] ) ? intval( $request['paged'] ) : 1;
181 $search = ! empty( $request['search'] ) ? sanitize_text_field( $request['search'] ) : '';
182
183 // Get search.
184 $users = new WP_User_Query(
185 array(
186 'role' => 'timetics-customer',
187 'number' => $per_page,
188 'paged' => $paged,
189
190 // @codingStandardsIgnoreStart
191 'meta_query' => array(
192 'relation' => 'OR',
193 array(
194 'key' => '_timetics_customer_first_name',
195 'value' => $search,
196 'compare' => 'LIKE',
197 ),
198 array(
199 'key' => '_timetics_customer_last_name',
200 'value' => $search,
201 'compare' => 'LIKE',
202 ),
203 array(
204 'key' => '_timetics_customer_email',
205 'value' => $search,
206 'compare' => 'LIKE',
207 ),
208 array(
209 'key' => '_timetics_customer_phone',
210 'value' => $search,
211 'compare' => 'LIKE',
212 ),
213 ),
214 // @codingStandardsIgnoreEnd
215 )
216 );
217
218 // Prepare items for response.
219 $items = [];
220
221 foreach ( $users->get_results() as $item ) {
222 $items[] = $this->prepare_item( $item->ID );
223 }
224
225 $data = [
226 'success' => 1,
227 'status' => 200,
228 'data' => [
229 'total' => $users->get_total(),
230 'items' => $items,
231 ],
232 ];
233
234 return rest_ensure_response( $data );
235 }
236
237 /**
238 * Create Customer
239 *
240 * @param WP_Rest_Request $request
241 *
242 * @return JSON | WP_Error
243 */
244 public function create_item( $request ) {
245 return $this->save_customer( $request );
246 }
247
248 /**
249 * Update customer
250 *
251 * @param WP_Rest_Request $request
252 *
253 * @return JSON | WP_Error
254 */
255 public function update_item( $request ) {
256 $customer_id = (int) $request['customer_id'];
257 $customer = new Customer( $customer_id );
258
259 if ( ! $customer->is_customer() ) {
260 $data = [
261 'status_code' => 404,
262 'message' => __( 'Invalid customer id.', 'timetics' ),
263 'data' => [],
264 ];
265
266 return new WP_HTTP_Response( $data, 404 );
267 }
268
269 return $this->save_customer( $request, $customer_id );
270 }
271
272 /**
273 * Delete customer
274 *
275 * @param WP_Rest_Request $request
276 *
277 * @return JSON
278 */
279 public function delete_item( $request ) {
280 $customer_id = (int) $request['customer_id'];
281 $customer = new Customer( $customer_id );
282
283 if ( ! $customer->is_customer() ) {
284 $data = [
285 'status_code' => 404,
286 'message' => __( 'Invalid customer id.', 'timetics' ),
287 'data' => [],
288 ];
289
290 return new WP_HTTP_Response( $data, 404 );
291 }
292
293 $customer->delete();
294
295 $response = [
296 'status_code' => 200,
297 'message' => __( 'Successfully deleted customer', 'timetics' ),
298 'data' => [],
299 ];
300
301 return rest_ensure_response( $response );
302 }
303
304 /**
305 * Delete multiples
306 *
307 * @param WP_Rest_Request $request
308 *
309 * @return JSON
310 */
311 public function bulk_delete( $request ) {
312 $customers = json_decode( $request->get_body(), true );
313
314 foreach ( $customers as $customer ) {
315 $customer = new customer( $customer );
316
317 if ( ! $customer->is_customer() ) {
318 $data = [
319 'success' => 1,
320 'status' => 404,
321 'message' => __( 'Invalid customer id.', 'timetics' ),
322 'data' => [],
323 ];
324
325 return new WP_HTTP_Response( $data, 404 );
326 }
327
328 $customer->delete();
329 }
330
331 return [
332 'success' => 1,
333 'status' => 200,
334 'message' => __( 'Successfully deleted customer', 'timetics' ),
335 'data' => [
336 'items' => $customers,
337 ],
338 ];
339 }
340
341 /**
342 * Save customer
343 *
344 * @param WP_Rest_Request $request
345 * @param integer $id [$id description]
346 *
347 * @return JSON | WP_Error
348 */
349 public function save_customer( $request, $id = 0 ) {
350 $data = json_decode( $request->get_body(), true );
351
352 $first_name = ! empty( $data['first_name'] ) ? $data['first_name'] : '';
353 $last_name = ! empty( $data['last_name'] ) ? $data['last_name'] : '';
354 $email = ! empty( $data['email'] ) ? $data['email'] : '';
355 $phone = ! empty( $data['phone'] ) ? $data['phone'] : '';
356 $image = ! empty( $data['image'] ) ? intval( $data['image'] ) : '';
357 $action = $id ? 'updated' : 'created';
358
359 // Validate input data.
360 $validate = $this->validate(
361 $data, [
362 'first_name',
363 'last_name',
364 'email',
365 ]
366 );
367
368 if ( is_wp_error( $validate ) ) {
369 $data = [
370 'success' => 0,
371 'status_code' => 409,
372 'message' => $validate->get_error_messages(),
373 'data' => [],
374 ];
375
376 return new WP_HTTP_Response( $data, 409 );
377 }
378
379 // Save customer data.
380 $customer = new Customer( $id );
381
382 $customer->set_props(
383 [
384 'first_name' => $first_name,
385 'last_name' => $last_name,
386 'email' => $email,
387 'user_name' => $this->generate_username( $email ),
388 'phone' => $phone,
389 'image' => $image,
390 ]
391 );
392
393 $customer->save();
394
395 if ( is_wp_error( $customer->error ) ) {
396 return [
397 'success' => 0,
398 'status' => 409,
399 'message' => $customer->error->get_error_message(),
400 'data' => [],
401 ];
402 }
403 // Prepare for response.
404 $item = $this->prepare_item( $customer );
405
406 $data = [
407 'success' => 1,
408 'status' => 200,
409 /* translators: Action */
410 'message' => sprintf( __( 'Successfully %s customer', 'timetics' ), $action ),
411 'data' => $item,
412 ];
413
414 return rest_ensure_response( $data );
415 }
416
417 /**
418 * Generate username from email
419 *
420 * @param string $email
421 *
422 * @return string
423 */
424 public function generate_username( $email ) {
425 $username = strtok( $email, '@' );
426
427 if ( username_exists( $username ) ) {
428 $username = $username . wp_rand( 10, 100 );
429 }
430
431 return $username;
432 }
433
434 /**
435 * Prepare item
436 *
437 * @param integer | customer $customer_id customer Id
438 *
439 * @return array customer data
440 */
441 public function prepare_item( $customer ) {
442 $customer = new Customer( $customer );
443
444 return [
445 'id' => $customer->get_id(),
446 'full_name' => $customer->get_display_name(),
447 'first_name' => $customer->get_first_name(),
448 'last_name' => $customer->get_last_name(),
449 'email' => $customer->get_email(),
450 'phone' => $customer->get_phone(),
451 'image' => $customer->get_image(),
452 'total_booking' => $customer->get_total_booking(),
453 ];
454 }
455
456 }
457