class-wc-rest-connect-packages-controller.php
6.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( class_exists( 'WC_REST_Connect_Packages_Controller' ) ) {
return;
}
class WC_REST_Connect_Packages_Controller extends WC_REST_Connect_Base_Controller {
protected $rest_base = 'connect/packages';
/**
* @var WC_Connect_Package_Settings
*/
protected $package_settings;
public function __construct( WC_Connect_API_Client $api_client, WC_Connect_Service_Settings_Store $settings_store, WC_Connect_Logger $logger, WC_Connect_Service_Schemas_Store $service_schemas_store ) {
parent::__construct( $api_client, $settings_store, $logger );
$this->package_settings = new WC_Connect_Package_Settings(
$settings_store,
$service_schemas_store
);
}
public function get() {
return new WP_REST_Response(
array_merge(
array( 'success' => true ),
$this->package_settings->get()
),
200
);
}
/**
* Update the existing custom and predefined packages.
*
* @param WP_REST_Request $request The request body contains the custom/predefined packages to replace.
* @return WP_REST_Response
*/
public function put( $request ) {
$packages = $request->get_json_params();
$this->settings_store->update_packages( $packages['custom'] );
$this->settings_store->update_predefined_packages( $packages['predefined'] );
return new WP_REST_Response( array( 'success' => true ), 200 );
}
/**
* Create custom and/or predefined packages.
*
* @param WP_REST_Request $request The request body contains the custom/predefined packages to create.
* @return WP_Error|WP_REST_Response
*/
public function post( $request ) {
$packages = $request->get_json_params();
$custom_packages = isset( $packages['custom'] ) ? $packages['custom'] : array();
$predefined_packages = isset( $packages['predefined'] ) ? $packages['predefined'] : array();
// Handle new custom packages. The custom packages are structured as an array of packages as dictionaries.
if ( ! empty( $custom_packages ) ) {
// Validate that the new custom packages have unique names.
$map_package_name = function( $package ) {
return $package['name'];
};
$custom_package_names = array_map( $map_package_name, $custom_packages );
$unique_custom_package_names = array_unique( $custom_package_names );
if ( count( $unique_custom_package_names ) < count( $custom_package_names ) ) {
$duplicate_package_names = array_diff_assoc( $custom_package_names, $unique_custom_package_names );
$error = array(
'code' => 'duplicate_custom_package_names',
'message' => __( 'The new custom package names are not unique.' ),
'data' => array( 'package_names' => array_values( $duplicate_package_names ) ),
);
return new WP_REST_Response( $error, 400 );
}
// Validate that the new custom packages do not have the same names as existing custom packages.
$existing_custom_packages = $this->settings_store->get_packages();
$existing_custom_package_names = array_map( $map_package_name, $existing_custom_packages );
$duplicate_package_names = array_intersect( $existing_custom_package_names, $custom_package_names );
if ( ! empty( $duplicate_package_names ) ) {
$error = array(
'code' => 'duplicate_custom_package_names_of_existing_packages',
'message' => __( 'At least one of the new custom packages has the same name as existing packages.' ),
'data' => array( 'package_names' => array_values( $duplicate_package_names ) ),
);
return new WP_REST_Response( $error, 400 );
}
// If no duplicate custom packages, create the given packages.
$this->settings_store->create_packages( $custom_packages );
}
// Handle new predefined packages. The predefined packages are structured as a dictionary from carrier name to
// an array of package names.
if ( ! empty( $predefined_packages ) ) {
$duplicate_package_names_by_carrier = array();
// Validate that the new predefined packages have unique names for each carrier.
foreach ( $predefined_packages as $carrier => $package_names ) {
$unique_package_names = array_unique( $package_names );
if ( count( $unique_package_names ) < count( $package_names ) ) {
$duplicate_package_names = array_diff_assoc( $package_names, $unique_package_names );
$duplicate_package_names_by_carrier[ $carrier ] = array_values( $duplicate_package_names );
}
}
if ( ! empty( $duplicate_package_names_by_carrier ) ) {
$error = array(
'code' => 'duplicate_predefined_package_names',
'message' => __( 'The new predefined package names are not unique.' ),
'data' => array( 'package_names_by_carrier' => $duplicate_package_names_by_carrier ),
);
return new WP_REST_Response( $error, 400 );
}
// Validate that the new predefined packages for each carrier do not have the same names as existing predefined packages.
$existing_predefined_packages = $this->settings_store->get_predefined_packages();
if ( ! empty( $existing_predefined_packages ) ) {
foreach ( $existing_predefined_packages as $carrier => $existing_package_names ) {
$new_package_names = isset( $predefined_packages[ $carrier ] ) ? $predefined_packages[ $carrier ] : array();
$duplicate_package_names = array_intersect( $existing_package_names, $new_package_names );
if ( ! empty( $duplicate_package_names ) ) {
$duplicate_package_names_by_carrier[ $carrier ] = array_values( $duplicate_package_names );
}
}
}
if ( ! empty( $duplicate_package_names_by_carrier ) ) {
$error = array(
'code' => 'duplicate_predefined_package_names_of_existing_packages',
'message' => __( 'At least one of the new predefined packages has the same name as existing packages.' ),
'data' => array( 'package_names_by_carrier' => $duplicate_package_names_by_carrier ),
);
return new WP_REST_Response( $error, 400 );
}
// If no duplicate predefined packages, create the given packages.
$this->settings_store->create_predefined_packages( $predefined_packages );
}
return new WP_REST_Response( array( 'success' => true ), 200 );
}
}