Skip to content

Commit f7920ae

Browse files
authored
Merge branch 'v1.8' into v1.8-1
2 parents 2d2858d + 484e14e commit f7920ae

22 files changed

+1702
-801
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: Build
2+
3+
on:
4+
workflow_call:
5+
inputs:
6+
node-version:
7+
description: Version of Node to use
8+
default: "20.x"
9+
pnpm-version:
10+
description: Version of pnpm to use
11+
default: "10.8.0"
12+
13+
jobs:
14+
setup:
15+
name: Setup
16+
runs-on: ubuntu-latest
17+
steps:
18+
- name: 🏗 Checkout code
19+
uses: actions/checkout@v4
20+
21+
- name: 🏗 Setup pnpm
22+
uses: pnpm/action-setup@v4
23+
with:
24+
version: ${{ inputs.pnpm-version }}

.github/workflows/wp-engine.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ name: Deploy to WP Engine
22

33
on:
44
push:
5-
branches:
6-
- main
75

86
jobs:
97
build:
387 KB
Binary file not shown.

assets/img/wcpos-icon.png

8.98 KB
Loading

assets/img/wcpos-pro-icon.png

40.8 KB
Loading

assets/js/indexeddb.worker.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

includes/API.php

Lines changed: 78 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
* @author Paul Kilmurray <[email protected]>
66
*
77
* @see http://wcpos.com
8-
* @package WCPOS\WooCommercePOS
98
*/
109

1110
namespace WCPOS\WooCommercePOS;
@@ -17,10 +16,6 @@
1716
use WP_REST_Response;
1817
use WP_REST_Server;
1918

20-
21-
/**
22-
*
23-
*/
2419
class API {
2520
/**
2621
* WCPOS REST API namespaces and endpoints.
@@ -62,7 +57,7 @@ public function __construct() {
6257
/**
6358
* Register routes for all controllers.
6459
*/
65-
public function register_routes() {
60+
public function register_routes(): void {
6661
/**
6762
* Filter the list of controller classes used in the WooCommerce POS REST API.
6863
*
@@ -73,27 +68,27 @@ public function register_routes() {
7368
* @since 1.5.0
7469
*
7570
* @param array $controllers Associative array of controller identifiers to their corresponding class names.
76-
* - 'auth' => Fully qualified name of the class handling authentication.
77-
* - 'settings' => Fully qualified name of the class handling settings.
78-
* - 'stores' => Fully qualified name of the class handling stores management.
79-
* - 'products' => Fully qualified name of the class handling products.
80-
* - 'product_variations' => Fully qualified name of the class handling product variations.
81-
* - 'orders' => Fully qualified name of the class handling orders.
82-
* - 'customers' => Fully qualified name of the class handling customers.
83-
* - 'product_tags' => Fully qualified name of the class handling product tags.
84-
* - 'product_categories' => Fully qualified name of the class handling product categories.
85-
* - 'taxes' => Fully qualified name of the class handling taxes.
86-
* - 'shipping_methods' => Fully qualified name of the class handling shipping methods.
87-
* - 'tax_classes' => Fully qualified name of the class handling tax classes.
88-
* - 'order_statuses' => Fully qualified name of the class handling order statuses.
71+
* - 'auth' => Fully qualified name of the class handling authentication.
72+
* - 'settings' => Fully qualified name of the class handling settings.
73+
* - 'cashier' => Fully qualified name of the class handling cashier management.
74+
* - 'products' => Fully qualified name of the class handling products.
75+
* - 'product_variations' => Fully qualified name of the class handling product variations.
76+
* - 'orders' => Fully qualified name of the class handling orders.
77+
* - 'customers' => Fully qualified name of the class handling customers.
78+
* - 'product_tags' => Fully qualified name of the class handling product tags.
79+
* - 'product_categories' => Fully qualified name of the class handling product categories.
80+
* - 'taxes' => Fully qualified name of the class handling taxes.
81+
* - 'shipping_methods' => Fully qualified name of the class handling shipping methods.
82+
* - 'tax_classes' => Fully qualified name of the class handling tax classes.
83+
* - 'order_statuses' => Fully qualified name of the class handling order statuses.
8984
*/
9085
$classes = apply_filters(
9186
'woocommerce_pos_rest_api_controllers',
9287
array(
9388
// woocommerce pos rest api controllers.
9489
'auth' => API\Auth::class,
9590
'settings' => API\Settings::class,
96-
'stores' => API\Stores::class,
91+
'cashier' => API\Cashier::class,
9792

9893
// extend WC REST API controllers.
9994
'products' => API\Products_Controller::class,
@@ -102,6 +97,7 @@ public function register_routes() {
10297
'customers' => API\Customers_Controller::class,
10398
'product_tags' => API\Product_Tags_Controller::class,
10499
'product_categories' => API\Product_Categories_Controller::class,
100+
'product_brands' => API\Product_Brands_Controller::class,
105101
'taxes' => API\Taxes_Controller::class,
106102
'shipping_methods' => API\Shipping_Methods_Controller::class,
107103
'tax_classes' => API\Tax_Classes_Controller::class,
@@ -197,7 +193,7 @@ public function rest_authentication_errors( $errors ) {
197193
/**
198194
* Extract the Authorization Bearer token from the request.
199195
*
200-
* @return string|false
196+
* @return false|string
201197
*/
202198
public function get_auth_header() {
203199
// Check if HTTP_AUTHORIZATION is set in $_SERVER
@@ -222,7 +218,7 @@ public function get_auth_header() {
222218
/**
223219
* Adds info to the WP REST API index response.
224220
* - UUID
225-
* - Version Info
221+
* - Version Info.
226222
*
227223
* @param WP_REST_Response $response Response data.
228224
*
@@ -234,11 +230,20 @@ public function rest_index( WP_REST_Response $response ): WP_REST_Response {
234230
$uuid = Uuid::uuid4()->toString();
235231
update_option( 'woocommerce_pos_uuid', $uuid );
236232
}
237-
$response->data['uuid'] = $uuid;
238-
$response->data['wp_version'] = get_bloginfo( 'version' );
239-
$response->data['wc_version'] = WC()->version;
233+
$response->data['uuid'] = $uuid;
234+
$response->data['wp_version'] = get_bloginfo( 'version' );
235+
$response->data['wc_version'] = WC()->version;
240236
$response->data['wcpos_version'] = VERSION;
241-
$response->data['use_jwt_as_param'] = woocommerce_pos_get_settings( 'tools', 'use_jwt_as_param' );
237+
238+
// Add wcpos authentication endpoint
239+
if ( ! isset( $response->data['authentication'] ) ) {
240+
$response->data['authentication'] = array();
241+
}
242+
$response->data['authentication']['wcpos'] = array(
243+
'endpoints' => array(
244+
'authorization' => home_url( 'wcpos-auth' ),
245+
),
246+
);
242247

243248
/**
244249
* Remove the routes from the response.
@@ -289,44 +294,6 @@ public function rest_pre_dispatch( $result, $server, $request ) {
289294
return $result;
290295
}
291296

292-
/**
293-
* Some servers have a limit on the number of include/exclude we can use in a request.
294-
* Worst thing is there is often no error message, the request returns an empty response.
295-
*
296-
* For example, WP Engine has a limit of 1024 characters?
297-
* https://wpengine.com/support/using-dev-tools/#Long_Queries_in_wp_db
298-
*
299-
* @TODO - For long queries, I should find a better solution than this.
300-
*
301-
* @param string|array $param_value
302-
* @param int $max_length
303-
* @return array
304-
*/
305-
private function shorten_param_array( $param_value, $max_length ) {
306-
$param_array = is_array( $param_value ) ? $param_value : explode( ',', $param_value );
307-
$param_string = implode( ',', $param_array );
308-
309-
if ( strlen( $param_string ) > $max_length ) {
310-
shuffle( $param_array ); // Shuffle to randomize
311-
312-
$new_param_string = '';
313-
$random_param_array = array();
314-
315-
foreach ( $param_array as $id ) {
316-
if ( strlen( $new_param_string . $id ) < $max_length ) {
317-
$new_param_string .= $id . ',';
318-
$random_param_array[] = $id;
319-
} else {
320-
break; // Stop when maximum length is reached
321-
}
322-
}
323-
324-
return $random_param_array;
325-
}
326-
327-
return $param_array;
328-
}
329-
330297
/**
331298
* Filters the REST API dispatch request result.
332299
*
@@ -338,13 +305,13 @@ private function shorten_param_array( $param_value, $max_length ) {
338305
* @return mixed
339306
*/
340307
public function rest_dispatch_request( $dispatch_result, $request, $route, $handler ) {
341-
if ( isset( $handler['callback'] ) && is_array( $handler['callback'] ) && isset( $handler['callback'][0] ) ) {
308+
if ( isset( $handler['callback'] ) && \is_array( $handler['callback'] ) && isset( $handler['callback'][0] ) ) {
342309
$controller = $handler['callback'][0];
343310

344311
// Check if the controller object is one of our registered controllers.
345312
foreach ( $this->controllers as $key => $wcpos_controller ) {
346313
if ( $controller === $wcpos_controller ) {
347-
/**
314+
/*
348315
* I'm adding some additional PHP settings before the response. Placing them here so they only apply to the POS API.
349316
*
350317
* - error_reporting(0) - Turn off error reporting
@@ -365,6 +332,7 @@ public function rest_dispatch_request( $dispatch_result, $request, $route, $hand
365332
if ( method_exists( $controller, 'wcpos_dispatch_request' ) ) {
366333
return $controller->wcpos_dispatch_request( $dispatch_result, $request, $route, $handler );
367334
}
335+
368336
break;
369337
}
370338
}
@@ -373,6 +341,45 @@ public function rest_dispatch_request( $dispatch_result, $request, $route, $hand
373341
return $dispatch_result;
374342
}
375343

344+
/**
345+
* Some servers have a limit on the number of include/exclude we can use in a request.
346+
* Worst thing is there is often no error message, the request returns an empty response.
347+
*
348+
* For example, WP Engine has a limit of 1024 characters?
349+
* https://wpengine.com/support/using-dev-tools/#Long_Queries_in_wp_db
350+
*
351+
* @TODO - For long queries, I should find a better solution than this.
352+
*
353+
* @param array|string $param_value
354+
* @param int $max_length
355+
*
356+
* @return array
357+
*/
358+
private function shorten_param_array( $param_value, $max_length ) {
359+
$param_array = \is_array( $param_value ) ? $param_value : explode( ',', $param_value );
360+
$param_string = implode( ',', $param_array );
361+
362+
if ( \strlen( $param_string ) > $max_length ) {
363+
shuffle( $param_array ); // Shuffle to randomize
364+
365+
$new_param_string = '';
366+
$random_param_array = array();
367+
368+
foreach ( $param_array as $id ) {
369+
if ( \strlen( $new_param_string . $id ) < $max_length ) {
370+
$new_param_string .= $id . ',';
371+
$random_param_array[] = $id;
372+
} else {
373+
break; // Stop when maximum length is reached
374+
}
375+
}
376+
377+
return $random_param_array;
378+
}
379+
380+
return $param_array;
381+
}
382+
376383
/**
377384
* Check the Authorization header for a Bearer token.
378385
*
@@ -383,25 +390,26 @@ public function rest_dispatch_request( $dispatch_result, $request, $route, $hand
383390
private function authenticate( $user_id ) {
384391
// check if there is an auth header
385392
$auth_header = $this->get_auth_header();
386-
if ( ! is_string( $auth_header ) ) {
393+
if ( ! \is_string( $auth_header ) ) {
387394
return $user_id;
388395
}
389396

390397
// Extract Bearer token from Authorization Header
391398
list($token) = sscanf( $auth_header, 'Bearer %s' );
392399

393400
if ( $token ) {
394-
$auth_service = Auth::instance();
401+
$auth_service = Auth::instance();
395402
$decoded_token = $auth_service->validate_token( $token );
396403

397404
// Check if validate_token returned WP_Error and user_id is null
398-
if ( is_wp_error( $decoded_token ) && $user_id === null ) {
399-
return $decoded_token;
405+
if ( is_wp_error( $decoded_token ) && null === $user_id ) {
406+
return $decoded_token;
400407
}
401408

402409
// If the token is valid, set the user_id
403410
if ( ! is_wp_error( $decoded_token ) ) {
404411
$user_id = $decoded_token->data->user->id;
412+
405413
return absint( $user_id );
406414
}
407415
}

0 commit comments

Comments
 (0)